Commit Graph
198 Commits
Author SHA1 Message Date
robbond 9fb9735c6e test(experiment): checkpoint semantic relationship inference result 2026-08-19 19:14:46 +01:00
robbond e1a18e27e7 test(experiment): checkpoint relationship negative-control result 2026-08-19 17:27:52 +01:00
robbond c97f07ba65 test(experiment): checkpoint fragment relationship discovery result 2026-08-19 16:59:22 +01:00
robbond 8c52939c02 test(experiment): checkpoint derived focused current-view result 2026-08-19 15:34:41 +01:00
robbond 0b0d5594fe test(experiment): checkpoint granular answer fragment result 2026-08-19 14:41:57 +01:00
robbond 6ed3415220 test(experiment): checkpoint three-turn separated reasoning result 2026-08-19 09:51:31 +01:00
robbond 9c715161b0 test(experiment): checkpoint separated reasoning layers result 2026-08-19 09:15:25 +01:00
robbond 56de4a7ef3 test(experiment): checkpoint separated reasoning layers apparatus 2026-08-19 08:53:33 +01:00
robbond b20707c447 test(experiment): checkpoint focused context boundary result 2026-08-19 08:33:41 +01:00
robbond 153bbee85e test(experiment): checkpoint two-turn focused refinement result 2026-08-19 07:53:26 +01:00
robbond ebcf1d9306 test(experiment): checkpoint two-turn focused refinement apparatus 2026-08-19 07:35:32 +01:00
robbond 7add85d8d2 feat(experiment): checkpoint focused investigation boundaries 2026-08-19 05:41:32 +01:00
robbond c0b963973f test(experiment): checkpoint focused vs global result 2026-08-19 05:15:25 +01:00
robbond 913dfec507 test(experiment): checkpoint comparison observability 2026-08-18 19:28:30 +01:00
robbond 952cb442b5 test(experiment): checkpoint focused vs global comparison apparatus 2026-08-18 18:34:08 +01:00
robbond 2f6c90b027 test(experiment): checkpoint focused answer deconstruction 2026-08-18 18:25:35 +01:00
robbond 648e1c7a29 test(experiment): checkpoint explicit-node formulation 2026-08-18 17:29:07 +01:00
robbond 4a34dcc361 test(experiment): ground RTO apparatus in real fixture 2026-08-18 12:39:19 +01:00
robbond 25a88c5fc3 feat: multi-thread experimental apparatus (RTO.A1)
Add fixture-only apparatus for representing multiple concurrent open
investigation items within a fixed case context.

New scenario 'multi-thread' exposes:
- A fixed central situation statement and case summary (product-launch
  timing decision, drawn from existing pre-anchored-product-launch
  data)
- Three open investigation items — none compulsory: enterprise customer
  signing probability, competitor timing, financial viability comparison
- One engine recommendation (mt-ent-customer-signing, ordered first)
- User selection of any item; chosen item becomes visually primary while
  others remain visible as context
- Experimental state isolated in _experimental / _experimentalState —
  never aliases production graph fields
2026-08-18 10:39:16 +01:00
robbond 55b7551739 test(harness): preserve null-question start captures 2026-08-18 07:11:27 +01:00
robbond 600b07d820 test(harness): support gated live investigation continuation 2026-08-18 06:48:40 +01:00
robbond 7685a4f2af test(evidence): preserve live product-launch journey captures 2026-08-17 18:08:47 +01:00
robbond 772ae495c6 fix(reasoning): preserve investigation ownership across selection and question rejection 2026-08-17 17:58:45 +01:00
robbond d908f3746d test(e2e): preserve manually recorded investigation journey 2026-08-17 13:48:56 +01:00
robbond 6ca8381b99 fix(reasoning): correct insufficient-observation comparability state 2026-08-17 09:32:21 +01:00
robbond ade445e453 fix(reasoning): reconcile evidence and preserve deterministic continuation 2026-08-17 08:06:08 +01:00
robbond 2561b5d720 test(e2e): repair investigation textarea selectors 2026-08-15 13:55:59 +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 912680b967 fix(reasoning): recognise decision in sufficiency question 2026-08-14 19:04:17 +01:00
robbond 8311a176a5 fix(reasoning): ask for missing sufficiency confirmation 2026-08-14 18:01:27 +01:00
robbond 36b4f47097 refactor(reasoning): extract decision sufficiency 2026-08-14 15:37:24 +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 5ef2b5a3c7 feat(reasoning): detect remaining decision factors 2026-08-14 13:31:28 +01:00
robbond 54e2e2186b fix(reasoning): reconcile closure selection state 2026-08-14 11:02:00 +01:00
robbond 831e395511 tooling: expose closure metadata in live harness 2026-08-14 09:30:55 +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 bcbcb65020 test(reasoning): add customer signing followup fixture 2026-08-14 08:02:45 +01:00
robbond 437aadc587 fix(reasoning): honor explicit whether propositions 2026-08-14 07:01:23 +01:00
robbond d26bbfebdf fix(reasoning): support uncertainty-over propositions 2026-08-14 06:31:33 +01:00
robbond 1f361e2d93 fix(reasoning): preserve explicit uncertainty propositions 2026-08-14 06:16:14 +01:00
robbond f955b875af fix(reasoning): clean proposition question formulation 2026-08-13 17:45:28 +01:00
robbond 8cca70774c fix(reasoning): narrow decision audience question routing 2026-08-13 16:58:32 +01:00
robbond 229fbfbfd9 experiment: test decision chain across product launch 2026-08-13 13:04:09 +01:00
robbond d871a8c5c4 fix(reasoning): scope structural context admission 2026-08-13 12:49:42 +01:00
robbond 54bc48342b fix(reasoning): preserve ready material question target 2026-08-13 09:36:10 +01:00
robbond 5ce5e7349b feat(reasoning): add decision materiality rule 2026-08-13 07:24:16 +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 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 fa42a2643a fix(graph): preserve grammar for question-like unknown labels 2026-08-12 15:02:56 +01:00