Commit Graph
100 Commits
Author SHA1 Message Date
robbond a599922d9f experiment: confirm live explicit sufficiency closure 2026-08-15 12:43:56 +01:00
robbond abc01b181f experiment: confirm live confirmation-gated state b path 2026-08-15 12:27:08 +01:00
robbond 357be25de5 docs: record confirmation-gated closure enforcement 2026-08-15 11:35:02 +01:00
robbond b181c3ea75 fix(reasoning): enforce confirmation-gated decision closure
- reconcileDecisionClosureOwnership normaliser between reconciliation and validation (Boundary B)
- Strips terminal parent updates without explicit user confirmation; preserves all other proposal work
- Strips parent from resolvedUnknownNodeIds bookkeeping on no-confirmation strip
- Restores reconciler-forced resolved→unknown for synthetic updates too
- Prevents hybrid unknown+value states by nulling newValue in all stripping paths
- No-op update created when reconciler synthesized the entry to prevent downstream errors

Prompt:
- Rule #143 rewritten from evidence-sufficiency to explicit-confirmation gate
- Directs model to use possibleInference for directional conclusions when confirmation absent

Regression preservation:
- 60B.43 lifecycle invariant restored via explicit confirmation phrases in fixture answers
- 60B.49 reconciliation auto-add invariant restored under confirmed closure flow
- Test apparatus fixed: structuralActionRequired required with userSupportedMeaning (validator constraint)

New coverage:
- 10 tests for all 60B.79/80 coverage requirements
- 5 prompt alignment tests for Rule #143
2026-08-15 11:34:39 +01:00
robbond 4988159986 experiment: define closure enforcement boundary 2026-08-15 06:40:24 +01:00
robbond 0e5292c46d experiment: define decision closure ownership policy 2026-08-15 06:21:20 +01:00
robbond d49e3e8e83 experiment: diagnose decision closure ownership 2026-08-15 06:11:13 +01:00
robbond 887a9710c8 experiment: confirm live sufficiency decision detection 2026-08-15 05:59:35 +01:00
robbond 47f42b24cc docs: record sufficiency decision detection fix 2026-08-14 19:04:20 +01:00
robbond 912680b967 fix(reasoning): recognise decision in sufficiency question 2026-08-14 19:04:17 +01:00
robbond 391667777e experiment: confirm live sufficiency confirmation question 2026-08-14 18:24:36 +01:00
robbond 7cfeee140b docs: record sufficiency confirmation question 2026-08-14 18:01:29 +01:00
robbond 8311a176a5 fix(reasoning): ask for missing sufficiency confirmation 2026-08-14 18:01:27 +01:00
robbond c335bf0a9a experiment: define missing sufficiency confirmation question 2026-08-14 17:23:12 +01:00
robbond f70d3d0de9 experiment: test live no-confirmation closure guard 2026-08-14 16:38:11 +01:00
robbond a5b71ad89a experiment: map remaining apply proposal boundaries 2026-08-14 16:27:55 +01:00
robbond 6cb91099c2 experiment: confirm deterministic post-refactor closure path 2026-08-14 16:06:22 +01:00
robbond 1ca5026352 experiment: confirm post-refactor live equivalence 2026-08-14 15:50:59 +01:00
robbond 36b4f47097 refactor(reasoning): extract decision sufficiency 2026-08-14 15:37:24 +01:00
robbond c43decf5d4 experiment: establish live decision closure baseline 2026-08-14 15:12:17 +01:00
robbond 983ebcc836 experiment: define decision sufficiency module boundary 2026-08-14 15:00:48 +01:00
robbond bce05f779b feat(reasoning): integrate explicit decision-sufficiency closure (60B.64)
Add two new capabilities:

1. isUserConfirmationOfNoRemainingUncertainty(answer) — bounded,
   deterministic raw-answer confirmation that no other material uncertainty
   remains after a decision factor has been resolved. Matches an explicit
   phrase family (e.g. 'no remaining material uncertainty', 'no other
   material uncertainties remain') plus two bounded regex patterns, while
   rejecting contradictory wording ('still another material uncertainty',
   'I am not saying...').

2. Decision-sufficiency closure integration point in applyValidatedProposal,
   positioned after post-mutation/post-propagation and before final
   active-target selection. When all represented material factors are
   resolved AND the raw user answer confirms sufficiency, resolves the
   existing parent decision in place (status → 'resolved') and clears
   the active unknown target.

Uses a virtual 'resolved this turn' set because node statuses have not
yet been reconciled at the integration point. Tests cover: exact fixture
wording from 60B.56, bounded paraphrases, absence-of-confirmation
(non-closure), remaining-factors (blockage), contradictory wording
(rejection), negated phrases (rejection), and vague completion language
(exclusion).
2026-08-14 14:21:33 +01:00
robbond 02b7c292a5 experiment: define closure confirmation signal 2026-08-14 13:55:41 +01:00
robbond 7ee9b197ab experiment: define decision closure integration boundary 2026-08-14 13:43:43 +01:00
robbond 100dfa2be5 docs: record decision factor detection 2026-08-14 13:31:30 +01:00
robbond 5ef2b5a3c7 feat(reasoning): detect remaining decision factors 2026-08-14 13:31:28 +01:00
robbond 909edd1019 experiment: define option factor representation contract 2026-08-14 12:30:01 +01:00
robbond 3d7f2cc3dd experiment: define decision factor relationship family 2026-08-14 12:21:28 +01:00
robbond 014c6b72dc experiment: define decision sufficiency evidence 2026-08-14 12:10:25 +01:00
robbond 2394ad4c0c experiment: confirm negative closure live 2026-08-14 11:16:58 +01:00
robbond 54e2e2186b fix(reasoning): reconcile closure selection state 2026-08-14 11:02:00 +01:00
robbond a00112e157 docs: record closure reconciliation consolidation 2026-08-14 11:02:00 +01:00
robbond 998ff2fcb7 experiment: diagnose resolution contract mismatch 2026-08-14 09:51:12 +01:00
robbond 59ededfe06 experiment: test opposite-outcome decision closure 2026-08-14 09:43:51 +01:00
robbond 2b44eea8d8 experiment: confirm clean closure with direct metadata 2026-08-14 09:36:39 +01:00
robbond 831e395511 tooling: expose closure metadata in live harness 2026-08-14 09:30:55 +01:00
robbond fa821a53dd docs: record closure metadata capture 2026-08-14 09:30:55 +01:00
robbond 50ae28b325 experiment: validate clean decision closure live 2026-08-14 09:21:36 +01:00
robbond 6b13e67c05 fix(reasoning): enforce terminal post-mutation eligibility 2026-08-14 09:11:08 +01:00
robbond 34eb0cd4e3 fix(reasoning): exclude terminal nodes from active selector 2026-08-14 09:02:08 +01:00
robbond 865565b7af experiment: define active selector terminal guard 2026-08-14 08:51:19 +01:00
robbond 5c6b3421dd experiment: locate post-mutation question guard 2026-08-14 08:38:23 +01:00
robbond 88a80180b7 experiment: diagnose stale question after resolution 2026-08-14 08:21:22 +01:00
robbond 1331fe94f1 experiment: test customer signing decision closure 2026-08-14 08:10:59 +01:00
robbond bcbcb65020 test(reasoning): add customer signing followup fixture 2026-08-14 08:02:45 +01:00
robbond 870d325d08 docs: record customer signing followup fixture 2026-08-14 08:02:45 +01:00
robbond 89551c5e8c experiment: confirm bare whether runtime path 2026-08-14 07:56:46 +01:00
robbond 0f7babd937 experiment: validate bare whether proposition live 2026-08-14 07:08:29 +01:00
robbond 2996c30578 docs: record bare whether proposition fix 2026-08-14 07:01:23 +01:00
robbond 437aadc587 fix(reasoning): honor explicit whether propositions 2026-08-14 07:01:23 +01:00
robbond 29d565372b experiment: diagnose runtime question formulation path 2026-08-14 06:48:24 +01:00
robbond 9b5942799f experiment: validate uncertainty-over proposition live 2026-08-14 06:38:44 +01:00
robbond 827dc82eeb docs: record uncertainty-over proposition coverage 2026-08-14 06:31:33 +01:00
robbond d26bbfebdf fix(reasoning): support uncertainty-over propositions 2026-08-14 06:31:33 +01:00
robbond 35a5efa804 experiment: validate uncertainty proposition coverage live 2026-08-14 06:23:03 +01:00
robbond f94d47d813 docs: record uncertainty proposition coverage 2026-08-14 06:16:14 +01:00
robbond 1f361e2d93 fix(reasoning): preserve explicit uncertainty propositions 2026-08-14 06:16:14 +01:00
robbond 4e66e1ffbf experiment: validate clean proposition question live 2026-08-13 17:54:04 +01:00
robbond 802eb1cc16 docs: record proposition question formulation fix 2026-08-13 17:45:28 +01:00
robbond f955b875af fix(reasoning): clean proposition question formulation 2026-08-13 17:45:28 +01:00
robbond 4a434bb939 experiment: diagnose proposition question shape 2026-08-13 17:30:50 +01:00
robbond 60036ac495 experiment: validate proposition-specific decision question live 2026-08-13 17:09:17 +01:00
robbond 4767de30f7 docs: record audience question routing fix 2026-08-13 16:58:32 +01:00
robbond 8cca70774c fix(reasoning): narrow decision audience question routing 2026-08-13 16:58:32 +01:00
robbond ea7f227974 experiment: diagnose material-question specificity 2026-08-13 13:15:22 +01:00
robbond 229fbfbfd9 experiment: test decision chain across product launch 2026-08-13 13:04:09 +01:00
robbond 43b9e5a35c experiment: validate bounded structural context admission live 2026-08-13 12:56:20 +01:00
robbond a7ca8d712d docs: record bounded structural context admission 2026-08-13 12:49:42 +01:00
robbond d871a8c5c4 fix(reasoning): scope structural context admission 2026-08-13 12:49:42 +01:00
robbond 7f97268f68 experiment: define structural reasoning-context embedding 2026-08-13 10:26:54 +01:00
robbond 48de8b6ce7 experiment: choose reasoning-pattern inheritance boundary 2026-08-13 10:14:19 +01:00
robbond 32e668969e experiment: diagnose decision-pattern kind mismatch 2026-08-13 09:54:42 +01:00
robbond 3a4dda9daf experiment: validate prerequisite-aware question targeting live 2026-08-13 09:45:13 +01:00
robbond 3c6e436e89 docs: record prerequisite-aware question targeting 2026-08-13 09:36:10 +01:00
robbond 54bc48342b fix(reasoning): preserve ready material question target 2026-08-13 09:36:10 +01:00
robbond 854c3aa002 experiment: choose material-factor question alignment 2026-08-13 07:57:26 +01:00
robbond d1fe4ca087 experiment: diagnose material-factor question targeting 2026-08-13 07:49:37 +01:00
robbond 721f1ccb6e experiment: test materiality rule against real unresolved factor 2026-08-13 07:41:09 +01:00
robbond e8e6986d15 experiment: validate decision materiality rule live 2026-08-13 07:33:52 +01:00
robbond b671681ddc docs: record decision materiality rule 2026-08-13 07:24:18 +01:00
robbond 5ce5e7349b feat(reasoning): add decision materiality rule 2026-08-13 07:24:16 +01:00
robbond 5dcaed39df experiment: diagnose decision sufficiency rule
Read-only inspection of 8 files (prompt-builder.js, schema.js, utils.js,
apply-proposal.js, orchestrator.js, experiment-60b1.md, experiment-60b2.md,
current-handoff.md). No code changes.

Key findings:
- Prompt has no independent materiality/sufficiency rule (Rule 20 says null
  selectedQuestion when 'no consequential unresolved unknown' but doesn't define
  what makes an unknown non-consequential)
- Validator performs structural checks only, no evidence sufficiency evaluation
- No cross-option comparison logic in propagateResolvedChildEvidence
- Schema has no materiality or couldChangeDecision field
- 60B.1 resolved WITH 'no other material differences' cue; 60B.2 continued
  WITHOUT it, despite internally computing ~3.6 month payback

Classification: C — NO SUFFICIENCY RULE + CONTINUATION BIAS
Missing distinction: MATERIALITY / DECISION-RELEVANCE RULE
2026-08-13 07:15:01 +01:00
robbond 306f8392a1 experiment: test independent decision sufficiency 2026-08-13 06:47:10 +01:00
robbond 60a1befff7 experiment: test decision sufficiency on option graph 2026-08-13 06:39:12 +01:00
robbond 18979e229b experiment: test downstream option evidence update 2026-08-13 06:30:24 +01:00
robbond 4c25faaa01 feat(60A.7): add reusable decision-options fixture loading in test harness
- Load decisions-options fixture from committed JSON (tests/fixtures/
  pre-anchored-decision-options.json) instead of inline duplicate
- Add runPreAnchoredSimulationWithFixture() helper for decision-options
  mode tests
- Generalize anchor validation from savings-realism-specific to generic
  unresolved unknown check in reproduce-multi-turn-investigation.mjs
- Add experiment documentation (experiment-60a7.md) and handoff note
- All 63 harness tests pass; no production reasoning code changed
2026-08-13 06:24:12 +01:00
robbond 2016a024c5 experiment: rerun option consequence structure once 2026-08-13 06:08:23 +01:00
robbond 56a04ddd0e experiment: test option-specific consequence structure 2026-08-13 05:53:20 +01:00
robbond 3db6f40fdc experiment: validate native option structure live 2026-08-12 19:49:02 +01:00
robbond 57c9f2205e feat: add 'option' node kind and 'contained_in' edge — 60A.3
Implementation of Candidate B (unknown+option) from decision architecture
design in 60A.2. Adds two new primitives to the situation graph:

Schema (lib/graph/schema.js):
- SituationKind.option — a choice available within a decision context
- SituationRelationship.contained_in — links option → its parent unknown context

Prompt rules (lib/graph/prompt-builder.js):
- Section added: Decision Option Structure Rules with 5 numbered instructions
  governing when/how to create option nodes, link them via contained_in,
  attach consequences to specific options, and handle do-nothing alternatives.
  Explicitly forbids alternative_to edges and is_baseline/is_default flags.

Tests (446 new lines):
- schema.test.js: +300 — enum completeness updates, option kind validation,
  contained_in edge validation, native two-option graph fixture (~25 new tests)
- prompt-builder.test.js: +133 — focused rules verification for all 5 rule points,
  negative checks (no relocation/savings/example-specific wording, no alternative_to
  requirement, baseline flag prohibition context)

No production code paths affected beyond the two enum additions; existing node and
edge kinds remain unchanged. No Ollama calls, no live API calls.
2026-08-12 19:39:58 +01:00
robbond 6dd9afbf6b experiment: choose minimum decision representation 2026-08-12 18:34:18 +01:00
robbond e6cf973d2a exp 60A.1: read-only vocabulary adequacy diagnosis for alternatives and decisions
Diagnoses the root cause of the persistent pattern from 59B.2-59B.4
where explicit dual-option input collapsed into a single undifferentiated
unknown node. Concludes the graph vocabulary lacks first-class primitives
for options/decisions (not primarily a prompt issue). Identifies three
missing primitives: option node kind, decision node kind, alternative_of
edge type. Recommends ~25-line schema addition for 60A.2 implementation.
2026-08-12 18:19:29 +01:00
robbond ec32713c31 experiment: test explicit two-option decision structure 2026-08-12 17:52:38 +01:00
robbond 2cd346423d experiment: test do-nothing baseline representation 2026-08-12 17:42:25 +01:00
robbond 70688f91c9 experiment: test independent decision relevance 2026-08-12 17:18:18 +01:00
robbond 7f27fccadc experiment: test decision relevance and do-nothing baseline 2026-08-12 17:10:01 +01:00
robbond 8856e66147 experiment: test known-vs-uncertain consequence structure 2026-08-12 16:59:56 +01:00
robbond c3c5351143 experiment: test trade-off decomposition 2026-08-12 16:51:39 +01:00
robbond 8c5c4b5b75 experiment: test shift into trade-off reasoning 2026-08-12 16:37:52 +01:00
robbond 3f1bf7bcb0 experiment: test verified uncertainty resolution 2026-08-12 16:26:43 +01:00