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.
This commit is contained in:
2026-08-12 19:39:58 +01:00
parent 6dd9afbf6b
commit 57c9f2205e
4 changed files with 446 additions and 2 deletions
+2
View File
@@ -18,6 +18,7 @@ export const SituationKind = /** @type {const} */ ({
assumption: "assumption",
unknown: "unknown",
conclusion: "conclusion",
option: "option",
});
export const SituationStatus = /** @type {const} */ ({
@@ -83,6 +84,7 @@ export const SituationRelationship = /** @type {const} */ ({
measures: "measures",
compares_with: "compares_with",
updates: "updates",
contained_in: "contained_in",
other: "other",
});