@shardworks/astrolabe-apparatus 0.1.228 → 0.1.230

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # `@shardworks/astrolabe-apparatus`
2
2
 
3
- The Astrolabe transforms patron briefs into structured work specifications and carries them through implementation. A single combined rig (`astrolabe.plan-and-ship`) runs the planning pipeline — inventory, analysis, patron review, specification writing — and then continues into draft → implement → review → revise → seal on the same brief writ. The brief reaches `completed` only after the final seal engine finishes. It sits between the Clerk (writ lifecycle) and the Spider (rig execution), contributing kit pieces to both.
3
+ The Astrolabe transforms patron briefs into structured work specifications and carries them through implementation. A single combined rig (`astrolabe.plan-and-ship`) runs the planning pipeline — inventory, analysis, optional Patron Anima pre-review, patron review, specification writing — and then continues into draft → implement → review → revise → seal on the same brief writ. The brief reaches `completed` only after the final seal engine finishes. It sits between the Clerk (writ lifecycle) and the Spider (rig execution), contributing kit pieces to both.
4
4
 
5
5
  ---
6
6
 
@@ -88,7 +88,8 @@ Add an `astrolabe` section to `guild.json` to configure behaviour:
88
88
  ```json
89
89
  {
90
90
  "astrolabe": {
91
- "generatedWritType": "mandate"
91
+ "generatedWritType": "mandate",
92
+ "patronRole": "my-plugin.patron"
92
93
  }
93
94
  }
94
95
  ```
@@ -96,6 +97,7 @@ Add an `astrolabe` section to `guild.json` to configure behaviour:
96
97
  | Field | Type | Default | Description |
97
98
  |---|---|---|---|
98
99
  | `generatedWritType` | `string` | `"mandate"` | Writ type posted by the spec-writer engine |
100
+ | `patronRole` | `string` | `""` (unset) | Qualified role name of the Patron Anima consulted before decision-review. When unset or empty, the `patron-anima` engine no-ops and decision-review behaves exactly as it did before the engine existed. |
99
101
 
100
102
  ## Support Kit
101
103
 
@@ -128,7 +130,8 @@ The Astrolabe declares one book in Stacks:
128
130
  |---|---|
129
131
  | `astrolabe.plan-init` | Creates a PlanDoc from the brief writ; validates codex presence |
130
132
  | `astrolabe.inventory-check` | Validates that the reader produced a non-empty inventory |
131
- | `astrolabe.decision-review` | Two-pass engine: blocks for patron review, then reconciles answers. Decisions with `selected` already pre-set by the analyst are auto-accepted they are excluded from the InputRequestDoc, and if nothing remains reviewable the engine fast-paths to `writing` without opening the gate. |
133
+ | `astrolabe.patron-anima` | Consults a configured Patron Anima to pre-fill decisions on behalf of the patron. Reads the plan's reviewable decisions (those without `selected` already set), launches the configured `patronRole` via an anima session, parses a single structured emission, and applies each valid verdict to `Decision.selected` (plus records the full verdict — confirm/override/fill-in with selection, confidence, rationale — on `Decision.patron`). No-ops when `astrolabe.patronRole` is unset or empty, or when no reviewable decisions remain. Unparseable output or invalid verdicts are silently skipped — decision-review surfaces the remainder to the patron. |
134
+ | `astrolabe.decision-review` | Two-pass engine: blocks for patron review, then reconciles answers. Decisions with `selected` already pre-set by the analyst or the patron anima are auto-accepted — they are excluded from the InputRequestDoc, and if nothing remains reviewable the engine fast-paths to `writing` without opening the gate. |
132
135
  | `astrolabe.plan-finalize` | Transitions the plan to `completed` and yields the written `spec` downstream. Does not post any writ. Used inside `plan-and-ship` to hand the spec off to the implement engine on the same brief rig. |
133
136
  | `astrolabe.spec-publish` | Publishes the generated specification as a new mandate writ. Used only by the legacy two-phase / three-phase rigs that split planning from implementation across two writs. |
134
137
 
@@ -136,7 +139,7 @@ The Astrolabe declares one book in Stacks:
136
139
 
137
140
  | Template | Mapped Writ Type | Engines |
138
141
  |---|---|---|
139
- | `astrolabe.plan-and-ship` | `brief` (default) | plan-init → draft → reader-analyst → inventory-check → decision-review → spec-writer → plan-finalize → implement → review → revise → seal |
142
+ | `astrolabe.plan-and-ship` | `brief` (default) | plan-init → draft → reader-analyst → inventory-check → patron-anima → decision-review → spec-writer → plan-finalize → implement → review → revise → seal |
140
143
  | `astrolabe.two-phase-planning` | — (opt-in) | plan-init → draft → reader-analyst → inventory-check → decision-review → spec-writer → spec-publish → seal |
141
144
  | `astrolabe.three-phase-planning` | — (opt-in) | plan-init → draft → reader → inventory-check → analyst → decision-review → spec-writer → spec-publish → seal |
142
145
 
@@ -144,7 +147,7 @@ The `resolutionEngine` is `seal` for `plan-and-ship` (brief completes when imple
144
147
 
145
148
  #### Rig Template Selection
146
149
 
147
- The `brief` writ type maps to `astrolabe.plan-and-ship` by default. This single combined rig carries the brief through planning and implementation on one writ — the `plan-finalize` engine hands the written spec directly to the downstream `implement` engine via `${yields.plan-finalize.spec}`, and no separate mandate writ is posted. The brief reaches `completed` only when the final seal engine completes.
150
+ The `brief` writ type maps to `astrolabe.plan-and-ship` by default. This single combined rig carries the brief through planning and implementation on one writ — the `plan-finalize` engine hands the written spec directly to the downstream `implement` engine via `${yields.plan-finalize.spec}`, and no separate mandate writ is posted. The optional `patron-anima` stage between `inventory-check` and `decision-review` can pre-fill decisions on the patron's behalf when `astrolabe.patronRole` is configured, letting decision-review fast-path past any pre-decided items. The brief reaches `completed` only when the final seal engine completes.
148
151
 
149
152
  To use a legacy planning-only template (which posts a separate mandate writ and ends the brief's lifecycle at spec-writer), add a rig template mapping override in `guild.json`:
150
153
 
@@ -1 +1 @@
1
- {"version":3,"file":"astrolabe.d.ts","sourceRoot":"","sources":["../src/astrolabe.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,wBAAwB,CAAC;AAQrE,OAAO,KAAK,EAEV,eAAe,EAGhB,MAAM,YAAY,CAAC;AAgBpB,iBAAS,sBAAsB,IAAI,eAAe,CAEjD;AAID,wBAAgB,eAAe,IAAI,MAAM,CAkRxC;AAGD,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
1
+ {"version":3,"file":"astrolabe.d.ts","sourceRoot":"","sources":["../src/astrolabe.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,wBAAwB,CAAC;AAQrE,OAAO,KAAK,EAEV,eAAe,EAGhB,MAAM,YAAY,CAAC;AAiBpB,iBAAS,sBAAsB,IAAI,eAAe,CAEjD;AAID,wBAAgB,eAAe,IAAI,MAAM,CAoRxC;AAGD,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
package/dist/astrolabe.js CHANGED
@@ -10,7 +10,7 @@
10
10
  import { guild } from '@shardworks/nexus-core';
11
11
  import { tool } from '@shardworks/tools-apparatus';
12
12
  import { z } from 'zod';
13
- import { createPlanInitEngine, createInventoryCheckEngine, createDecisionReviewEngine, createSpecPublishEngine, createPlanFinalizeEngine, } from "./engines/index.js";
13
+ import { createPlanInitEngine, createInventoryCheckEngine, createPatronAnimaEngine, createDecisionReviewEngine, createSpecPublishEngine, createPlanFinalizeEngine, } from "./engines/index.js";
14
14
  import { twoPhaseRigTemplate } from "./two-phase-planning.js";
15
15
  import { threePhaseRigTemplate } from "./three-phase-planning.js";
16
16
  import { planAndShipRigTemplate } from "./plan-and-ship.js";
@@ -24,6 +24,7 @@ export function createAstrolabe() {
24
24
  // ── Engines ────────────────────────────────────────────────────
25
25
  const planInitEngine = createPlanInitEngine(() => plansBook);
26
26
  const inventoryCheckEngine = createInventoryCheckEngine(() => plansBook);
27
+ const patronAnimaEngine = createPatronAnimaEngine(() => plansBook);
27
28
  const decisionReviewEngine = createDecisionReviewEngine(() => plansBook);
28
29
  const specPublishEngine = createSpecPublishEngine(() => plansBook);
29
30
  const planFinalizeEngine = createPlanFinalizeEngine(() => plansBook);
@@ -194,7 +195,7 @@ export function createAstrolabe() {
194
195
  return {
195
196
  apparatus: {
196
197
  requires: ['stacks', 'clerk'],
197
- recommends: ['spider', 'loom', 'fabricator', 'oculus', 'ratchet'],
198
+ recommends: ['spider', 'loom', 'fabricator', 'oculus', 'ratchet', 'animator'],
198
199
  supportKit: {
199
200
  books: {
200
201
  plans: { indexes: ['status', 'codex', 'createdAt'] },
@@ -228,6 +229,7 @@ export function createAstrolabe() {
228
229
  engines: {
229
230
  'astrolabe.plan-init': planInitEngine,
230
231
  'astrolabe.inventory-check': inventoryCheckEngine,
232
+ 'astrolabe.patron-anima': patronAnimaEngine,
231
233
  'astrolabe.decision-review': decisionReviewEngine,
232
234
  'astrolabe.spec-publish': specPublishEngine,
233
235
  'astrolabe.plan-finalize': planFinalizeEngine,
@@ -1 +1 @@
1
- {"version":3,"file":"astrolabe.js","sourceRoot":"","sources":["../src/astrolabe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"astrolabe.js","sourceRoot":"","sources":["../src/astrolabe.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export { createPlanInitEngine } from './plan-init.ts';
2
2
  export { createInventoryCheckEngine } from './inventory-check.ts';
3
+ export { createPatronAnimaEngine } from './patron-anima.ts';
3
4
  export { createDecisionReviewEngine } from './decision-review.ts';
4
5
  export { createSpecPublishEngine } from './spec-publish.ts';
5
6
  export { createPlanFinalizeEngine } from './plan-finalize.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engines/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engines/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  export { createPlanInitEngine } from "./plan-init.js";
2
2
  export { createInventoryCheckEngine } from "./inventory-check.js";
3
+ export { createPatronAnimaEngine } from "./patron-anima.js";
3
4
  export { createDecisionReviewEngine } from "./decision-review.js";
4
5
  export { createSpecPublishEngine } from "./spec-publish.js";
5
6
  export { createPlanFinalizeEngine } from "./plan-finalize.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/engines/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/engines/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * patron-anima clockwork engine.
3
+ *
4
+ * Between `inventory-check` and `decision-review`, consults a configured
5
+ * Patron Anima to pre-fill decisions on behalf of the patron. Any decision
6
+ * the anima can confidently resolve is set on the PlanDoc with its
7
+ * `selected` value — `decision-review` then auto-skips it via the existing
8
+ * "analyst pre-decides → patron-input omitted" semantics.
9
+ *
10
+ * Config:
11
+ * guild.json["astrolabe"]["patronRole"]
12
+ * Qualified role name for the Patron Anima (e.g. 'guild.patron').
13
+ * When unset or empty, this engine no-ops — the pipeline proceeds
14
+ * exactly as it did before the engine existed.
15
+ *
16
+ * Run → Collect protocol:
17
+ * run() → loads the plan; builds a single prompt covering all
18
+ * reviewable decisions; launches an anima session via
19
+ * `animator.summon()`. Returns
20
+ * `{ status: 'launched', sessionId }`.
21
+ * collect() → reads the session's `output` from Stacks, parses the
22
+ * emitted JSON verdict array, applies verdicts to the
23
+ * PlanDoc, and records each verdict as `Decision.patron`.
24
+ *
25
+ * Output contract (the anima is asked for):
26
+ * The session's final message must be a single fenced JSON block
27
+ * containing an array of verdict objects. Each object:
28
+ * - `id` — the decision id
29
+ * - `verdict` — 'confirm' | 'override' | 'fill-in'
30
+ * - `selection` — one of the decision's offered option keys
31
+ * - `confidence` — 'low' | 'med' | 'high'
32
+ * - `rationale` — short free-text note (optional)
33
+ *
34
+ * Exhaustiveness:
35
+ * Single pass. Any decision not carrying a well-formed verdict —
36
+ * because the anima omitted it, emitted malformed JSON, picked an
37
+ * unknown option, or the session failed entirely — is left unfilled
38
+ * on the PlanDoc and flows to `decision-review` in the normal flow.
39
+ * The engine does not retry.
40
+ *
41
+ * Self-uncertainty:
42
+ * A `confirm` at `confidence: 'low'` is the expected encoding for
43
+ * "anima doesn't know patron well enough on this surface." It still
44
+ * applies the analyst's recommendation; the high-confirm / low-
45
+ * confidence signal is the diagnostic substrate for override-rate
46
+ * × confidence, not an escalation trigger.
47
+ */
48
+ import type { EngineDesign } from '@shardworks/fabricator-apparatus';
49
+ import type { Book } from '@shardworks/stacks-apparatus';
50
+ import type { Decision, PatronEmission, PlanDoc } from '../types.ts';
51
+ /**
52
+ * Assemble the patron prompt from the reviewable decisions. Each decision
53
+ * is rendered with its question, optional context, options, and optional
54
+ * analyst recommendation / rationale. The anima is instructed to return a
55
+ * single fenced JSON block with one verdict per decision.
56
+ */
57
+ export declare function buildPatronPrompt(decisions: Decision[]): string;
58
+ /** Extract the last fenced JSON block from an anima's output. Returns null if none. */
59
+ export declare function extractJsonBlock(output: string): string | null;
60
+ export interface RawVerdict {
61
+ id?: unknown;
62
+ verdict?: unknown;
63
+ selection?: unknown;
64
+ confidence?: unknown;
65
+ rationale?: unknown;
66
+ }
67
+ /**
68
+ * Parse the anima's JSON emission into a map keyed by decision id. Invalid
69
+ * entries are dropped silently — the engine treats missing verdicts as
70
+ * "leave the decision unfilled" and relies on `decision-review` to catch
71
+ * them in the normal flow.
72
+ */
73
+ export declare function parseEmission(output: string, decisions: Decision[]): Map<string, PatronEmission>;
74
+ export declare function createPatronAnimaEngine(getPlansBook: () => Book<PlanDoc>): EngineDesign;
75
+ //# sourceMappingURL=patron-anima.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patron-anima.d.ts","sourceRoot":"","sources":["../../src/engines/patron-anima.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAqC,MAAM,kCAAkC,CAAC;AACxG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAKzD,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AASrE;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CA2E/D;AAED,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa9D;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,QAAQ,EAAE,GACpB,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CA8E7B;AAID,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,YAAY,CA2GvF"}
@@ -0,0 +1,292 @@
1
+ /**
2
+ * patron-anima clockwork engine.
3
+ *
4
+ * Between `inventory-check` and `decision-review`, consults a configured
5
+ * Patron Anima to pre-fill decisions on behalf of the patron. Any decision
6
+ * the anima can confidently resolve is set on the PlanDoc with its
7
+ * `selected` value — `decision-review` then auto-skips it via the existing
8
+ * "analyst pre-decides → patron-input omitted" semantics.
9
+ *
10
+ * Config:
11
+ * guild.json["astrolabe"]["patronRole"]
12
+ * Qualified role name for the Patron Anima (e.g. 'guild.patron').
13
+ * When unset or empty, this engine no-ops — the pipeline proceeds
14
+ * exactly as it did before the engine existed.
15
+ *
16
+ * Run → Collect protocol:
17
+ * run() → loads the plan; builds a single prompt covering all
18
+ * reviewable decisions; launches an anima session via
19
+ * `animator.summon()`. Returns
20
+ * `{ status: 'launched', sessionId }`.
21
+ * collect() → reads the session's `output` from Stacks, parses the
22
+ * emitted JSON verdict array, applies verdicts to the
23
+ * PlanDoc, and records each verdict as `Decision.patron`.
24
+ *
25
+ * Output contract (the anima is asked for):
26
+ * The session's final message must be a single fenced JSON block
27
+ * containing an array of verdict objects. Each object:
28
+ * - `id` — the decision id
29
+ * - `verdict` — 'confirm' | 'override' | 'fill-in'
30
+ * - `selection` — one of the decision's offered option keys
31
+ * - `confidence` — 'low' | 'med' | 'high'
32
+ * - `rationale` — short free-text note (optional)
33
+ *
34
+ * Exhaustiveness:
35
+ * Single pass. Any decision not carrying a well-formed verdict —
36
+ * because the anima omitted it, emitted malformed JSON, picked an
37
+ * unknown option, or the session failed entirely — is left unfilled
38
+ * on the PlanDoc and flows to `decision-review` in the normal flow.
39
+ * The engine does not retry.
40
+ *
41
+ * Self-uncertainty:
42
+ * A `confirm` at `confidence: 'low'` is the expected encoding for
43
+ * "anima doesn't know patron well enough on this surface." It still
44
+ * applies the analyst's recommendation; the high-confirm / low-
45
+ * confidence signal is the diagnostic substrate for override-rate
46
+ * × confidence, not an escalation trigger.
47
+ */
48
+ import { guild } from '@shardworks/nexus-core';
49
+ import { resolveAstrolabeConfig } from "../astrolabe.js";
50
+ // ── Helpers ──────────────────────────────────────────────────────────
51
+ /** Reviewable = not yet pre-decided by the analyst. Mirrors decision-review. */
52
+ function reviewableDecisions(plan) {
53
+ return (plan.decisions ?? []).filter(d => d.selected === undefined);
54
+ }
55
+ /**
56
+ * Assemble the patron prompt from the reviewable decisions. Each decision
57
+ * is rendered with its question, optional context, options, and optional
58
+ * analyst recommendation / rationale. The anima is instructed to return a
59
+ * single fenced JSON block with one verdict per decision.
60
+ */
61
+ export function buildPatronPrompt(decisions) {
62
+ const parts = [
63
+ '# Patron Decision Review',
64
+ '',
65
+ 'You are the patron anima. The analyst has surfaced the following',
66
+ 'decisions. For each one, emit a structured verdict in the patron\'s',
67
+ 'voice so the planning pipeline can proceed without a human block.',
68
+ '',
69
+ '## Decisions',
70
+ '',
71
+ ];
72
+ for (const decision of decisions) {
73
+ parts.push(`### ${decision.id}: ${decision.question}`);
74
+ if (decision.context) {
75
+ parts.push('');
76
+ parts.push(`Context: ${decision.context}`);
77
+ }
78
+ parts.push('');
79
+ parts.push('Options:');
80
+ for (const [key, label] of Object.entries(decision.options)) {
81
+ parts.push(`- \`${key}\` — ${label}`);
82
+ }
83
+ if (decision.recommendation) {
84
+ parts.push('');
85
+ const recLabel = decision.options[decision.recommendation] ?? decision.recommendation;
86
+ parts.push(`Analyst recommendation: \`${decision.recommendation}\` (${recLabel})`);
87
+ if (decision.rationale) {
88
+ parts.push(`Analyst rationale: ${decision.rationale}`);
89
+ }
90
+ }
91
+ else {
92
+ parts.push('');
93
+ parts.push('Analyst recommendation: (none — you must fill in)');
94
+ }
95
+ parts.push('');
96
+ }
97
+ parts.push('## Output contract');
98
+ parts.push('');
99
+ parts.push('Respond with a single fenced JSON block containing an array of', 'verdict objects — one per decision, keyed by decision id. Do not', 'emit prose outside the fenced block; anything outside is ignored.', '', 'Each verdict object MUST have these fields:', '', '- `id` — the decision id (copy from above)', '- `verdict` — one of `confirm` | `override` | `fill-in`', ' - `confirm` — you accept the analyst\'s recommendation', ' - `override` — you pick a different option than the recommendation', ' - `fill-in` — no analyst recommendation existed; you supply one', '- `selection` — the option key you are selecting (MUST be one of the', ' offered option keys above — no custom / free-text answers)', '- `confidence` — one of `low` | `med` | `high`, calibrated against the', ' patron role\'s principles list:', ' - `high` — exactly one principle applies cleanly', ' - `med` — multiple principles conflict (note the conflict in rationale)', ' - `low` — no principle applies (default to `confirm` at `low` rather', ' than abstaining or improvising — leaving decisions unfilled is the', ' fallback path when you genuinely cannot answer)', '- `rationale` — short free-text note (≤ 1 sentence) citing which', ' principle (or conflict) produced this verdict', '', 'Example:', '', '```json', '[', ' { "id": "D1", "verdict": "confirm", "selection": "A", "confidence": "high", "rationale": "Matches simplicity principle." }', ']', '```');
100
+ return parts.join('\n');
101
+ }
102
+ /** Extract the last fenced JSON block from an anima's output. Returns null if none. */
103
+ export function extractJsonBlock(output) {
104
+ // Prefer ```json ... ``` fenced blocks; fall back to plain ``` ... ```.
105
+ const jsonFence = /```(?:json)?\s*([\s\S]*?)```/gi;
106
+ let match;
107
+ let last = null;
108
+ while ((match = jsonFence.exec(output)) !== null) {
109
+ last = match[1].trim();
110
+ }
111
+ if (last !== null)
112
+ return last;
113
+ // Last-ditch: try the output verbatim if it starts with `[` or `{`.
114
+ const trimmed = output.trim();
115
+ if (trimmed.startsWith('[') || trimmed.startsWith('{'))
116
+ return trimmed;
117
+ return null;
118
+ }
119
+ /**
120
+ * Parse the anima's JSON emission into a map keyed by decision id. Invalid
121
+ * entries are dropped silently — the engine treats missing verdicts as
122
+ * "leave the decision unfilled" and relies on `decision-review` to catch
123
+ * them in the normal flow.
124
+ */
125
+ export function parseEmission(output, decisions) {
126
+ const result = new Map();
127
+ const block = extractJsonBlock(output);
128
+ if (block === null)
129
+ return result;
130
+ let parsed;
131
+ try {
132
+ parsed = JSON.parse(block);
133
+ }
134
+ catch {
135
+ return result;
136
+ }
137
+ // Accept either a bare array or an object with an `emissions` / `verdicts`
138
+ // array field — be lenient about the outer shape so small model quirks
139
+ // don't cost a whole round.
140
+ let entries;
141
+ if (Array.isArray(parsed)) {
142
+ entries = parsed;
143
+ }
144
+ else if (parsed && typeof parsed === 'object') {
145
+ const obj = parsed;
146
+ const maybe = obj.emissions ?? obj.verdicts ?? obj.decisions;
147
+ entries = Array.isArray(maybe) ? maybe : [];
148
+ }
149
+ else {
150
+ return result;
151
+ }
152
+ const decisionById = new Map(decisions.map(d => [d.id, d]));
153
+ for (const rawEntry of entries) {
154
+ if (!rawEntry || typeof rawEntry !== 'object')
155
+ continue;
156
+ const raw = rawEntry;
157
+ if (typeof raw.id !== 'string')
158
+ continue;
159
+ const decision = decisionById.get(raw.id);
160
+ if (!decision)
161
+ continue;
162
+ const verdict = raw.verdict;
163
+ if (verdict !== 'confirm' && verdict !== 'override' && verdict !== 'fill-in')
164
+ continue;
165
+ if (typeof raw.selection !== 'string')
166
+ continue;
167
+ if (!(raw.selection in decision.options))
168
+ continue;
169
+ const confidence = raw.confidence;
170
+ if (confidence !== 'low' && confidence !== 'med' && confidence !== 'high')
171
+ continue;
172
+ // `confirm` must agree with the analyst's recommendation. If it doesn't,
173
+ // treat the verdict as malformed — don't silently relabel it. Defends
174
+ // against a model that says "confirm" but picks a different option.
175
+ if (verdict === 'confirm') {
176
+ if (!decision.recommendation || decision.recommendation !== raw.selection) {
177
+ continue;
178
+ }
179
+ }
180
+ // `fill-in` requires there was no analyst recommendation.
181
+ if (verdict === 'fill-in' && decision.recommendation) {
182
+ // Accept but only if the selection genuinely differs — otherwise
183
+ // relabelling a confirm as fill-in is a model quirk we tolerate.
184
+ // (Either way the `selected` resolution is the same.)
185
+ }
186
+ // `override` requires a recommendation existed and differs from selection.
187
+ if (verdict === 'override') {
188
+ if (!decision.recommendation)
189
+ continue;
190
+ if (decision.recommendation === raw.selection)
191
+ continue;
192
+ }
193
+ const emission = {
194
+ verdict,
195
+ selection: raw.selection,
196
+ confidence,
197
+ };
198
+ if (typeof raw.rationale === 'string' && raw.rationale.length > 0) {
199
+ emission.rationale = raw.rationale;
200
+ }
201
+ result.set(decision.id, emission);
202
+ }
203
+ return result;
204
+ }
205
+ // ── Engine factory ───────────────────────────────────────────────────
206
+ export function createPatronAnimaEngine(getPlansBook) {
207
+ return {
208
+ id: 'astrolabe.patron-anima',
209
+ async run(givens, context) {
210
+ const planId = givens.planId;
211
+ if (typeof planId !== 'string' || planId.length === 0) {
212
+ throw new Error('patron-anima engine requires a non-empty string "planId" given.');
213
+ }
214
+ const book = getPlansBook();
215
+ const plan = await book.get(planId);
216
+ if (!plan) {
217
+ throw new Error(`Plan "${planId}" not found.`);
218
+ }
219
+ // Skip-when-unset: no configured patron → no-op, decision-review
220
+ // proceeds as it does today.
221
+ const config = resolveAstrolabeConfig();
222
+ const role = typeof config.patronRole === 'string' ? config.patronRole.trim() : '';
223
+ if (role.length === 0) {
224
+ return { status: 'completed', yields: {} };
225
+ }
226
+ // Fast-path: nothing is reviewable → no-op. The analyst has already
227
+ // pre-decided everything; there's nothing for the anima to weigh in on.
228
+ const reviewable = reviewableDecisions(plan);
229
+ if (reviewable.length === 0) {
230
+ return { status: 'completed', yields: {} };
231
+ }
232
+ const animator = guild().apparatus('animator');
233
+ const writ = givens.writ;
234
+ const cwd = typeof givens.cwd === 'string' && givens.cwd.length > 0
235
+ ? givens.cwd
236
+ : process.cwd();
237
+ const prompt = buildPatronPrompt(reviewable);
238
+ const handle = animator.summon({
239
+ role,
240
+ prompt,
241
+ cwd,
242
+ environment: writ ? { GIT_AUTHOR_EMAIL: `${writ.id}@nexus.local` } : {},
243
+ metadata: {
244
+ engineId: context.engineId,
245
+ planId,
246
+ ...(writ ? { writId: writ.id } : {}),
247
+ },
248
+ });
249
+ return { status: 'launched', sessionId: handle.sessionId };
250
+ },
251
+ async collect(sessionId, givens, _context) {
252
+ const planId = givens.planId;
253
+ if (typeof planId !== 'string' || planId.length === 0) {
254
+ throw new Error('patron-anima collect requires a non-empty string "planId" given.');
255
+ }
256
+ const book = getPlansBook();
257
+ const plan = await book.get(planId);
258
+ if (!plan) {
259
+ throw new Error(`Plan "${planId}" not found.`);
260
+ }
261
+ const stacks = guild().apparatus('stacks');
262
+ const sessionsBook = stacks.readBook('animator', 'sessions');
263
+ const session = await sessionsBook.get(sessionId);
264
+ const output = session?.output ?? '';
265
+ const reviewable = reviewableDecisions(plan);
266
+ const emissionsByDecisionId = parseEmission(output, reviewable);
267
+ // Apply verdicts to each touched decision. Untouched decisions are
268
+ // left unfilled — decision-review will surface them to the human.
269
+ const touched = [];
270
+ const decisions = (plan.decisions ?? []).map(d => ({ ...d }));
271
+ for (const decision of decisions) {
272
+ const emission = emissionsByDecisionId.get(decision.id);
273
+ if (!emission)
274
+ continue;
275
+ decision.patron = emission;
276
+ decision.selected = emission.selection;
277
+ delete decision.patronOverride;
278
+ touched.push(decision.id);
279
+ }
280
+ await book.patch(planId, {
281
+ decisions,
282
+ updatedAt: new Date().toISOString(),
283
+ });
284
+ return {
285
+ sessionId,
286
+ touchedDecisionIds: touched,
287
+ totalReviewable: reviewable.length,
288
+ };
289
+ },
290
+ };
291
+ }
292
+ //# sourceMappingURL=patron-anima.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patron-anima.js","sourceRoot":"","sources":["../../src/engines/patron-anima.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAM/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,wEAAwE;AAExE,gFAAgF;AAChF,SAAS,mBAAmB,CAAC,IAAa;IACxC,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;AACtE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAqB;IACrD,MAAM,KAAK,GAAa;QACtB,0BAA0B;QAC1B,EAAE;QACF,kEAAkE;QAClE,qEAAqE;QACrE,mEAAmE;QACnE,EAAE;QACF,cAAc;QACd,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvD,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,YAAY,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,QAAQ,KAAK,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC;YACtF,KAAK,CAAC,IAAI,CACR,6BAA6B,QAAQ,CAAC,cAAc,OAAO,QAAQ,GAAG,CACvE,CAAC;YACF,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,sBAAsB,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAClE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CACR,gEAAgE,EAChE,kEAAkE,EAClE,mEAAmE,EACnE,EAAE,EACF,6CAA6C,EAC7C,EAAE,EACF,oDAAoD,EACpD,4DAA4D,EAC5D,2DAA2D,EAC3D,sEAAsE,EACtE,oEAAoE,EACpE,uEAAuE,EACvE,8DAA8D,EAC9D,wEAAwE,EACxE,mCAAmC,EACnC,oDAAoD,EACpD,4EAA4E,EAC5E,yEAAyE,EACzE,wEAAwE,EACxE,qDAAqD,EACrD,kEAAkE,EAClE,iDAAiD,EACjD,EAAE,EACF,UAAU,EACV,EAAE,EACF,SAAS,EACT,GAAG,EACH,8HAA8H,EAC9H,GAAG,EACH,KAAK,CACN,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,wEAAwE;IACxE,MAAM,SAAS,GAAG,gCAAgC,CAAC;IACnD,IAAI,KAA6B,CAAC;IAClC,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,oEAAoE;IACpE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IACvE,OAAO,IAAI,CAAC;AACd,CAAC;AAUD;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAc,EACd,SAAqB;IAErB,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;IACjD,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAElC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,2EAA2E;IAC3E,uEAAuE;IACvE,4BAA4B;IAC5B,IAAI,OAAkB,CAAC;IACvB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;SAAM,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,MAAiC,CAAC;QAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,SAAS,CAAC;QAC7D,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5D,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;YAAE,SAAS;QACxD,MAAM,GAAG,GAAG,QAAsB,CAAC;QACnC,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ;YAAE,SAAS;QACzC,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC5B,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,SAAS;YAAE,SAAS;QAEvF,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;YAAE,SAAS;QAChD,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,IAAI,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QAEnD,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;QAClC,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,MAAM;YAAE,SAAS;QAEpF,yEAAyE;QACzE,sEAAsE;QACtE,oEAAoE;QACpE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,QAAQ,CAAC,cAAc,IAAI,QAAQ,CAAC,cAAc,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC1E,SAAS;YACX,CAAC;QACH,CAAC;QAED,0DAA0D;QAC1D,IAAI,OAAO,KAAK,SAAS,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;YACrD,iEAAiE;YACjE,iEAAiE;YACjE,sDAAsD;QACxD,CAAC;QAED,2EAA2E;QAC3E,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,cAAc;gBAAE,SAAS;YACvC,IAAI,QAAQ,CAAC,cAAc,KAAK,GAAG,CAAC,SAAS;gBAAE,SAAS;QAC1D,CAAC;QAED,MAAM,QAAQ,GAAmB;YAC/B,OAAO;YACP,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,UAAU;SACX,CAAC;QACF,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClE,QAAQ,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QACrC,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wEAAwE;AAExE,MAAM,UAAU,uBAAuB,CAAC,YAAiC;IACvE,OAAO;QACL,EAAE,EAAE,wBAAwB;QAE5B,KAAK,CAAC,GAAG,CACP,MAA+B,EAC/B,OAAyB;YAEzB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC7B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACrF,CAAC;YAED,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,cAAc,CAAC,CAAC;YACjD,CAAC;YAED,iEAAiE;YACjE,6BAA6B;YAC7B,MAAM,MAAM,GAAG,sBAAsB,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YAC7C,CAAC;YAED,oEAAoE;YACpE,wEAAwE;YACxE,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YAC7C,CAAC;YAED,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAC,SAAS,CAAc,UAAU,CAAC,CAAC;YAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,IAA2B,CAAC;YAChD,MAAM,GAAG,GACP,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC;gBACrD,CAAC,CAAC,MAAM,CAAC,GAAG;gBACZ,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAEpB,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAE7C,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAC7B,IAAI;gBACJ,MAAM;gBACN,GAAG;gBACH,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE;gBACvE,QAAQ,EAAE;oBACR,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,MAAM;oBACN,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACrC;aACF,CAAC,CAAC;YAEH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;QAC7D,CAAC;QAED,KAAK,CAAC,OAAO,CACX,SAAiB,EACjB,MAA+B,EAC/B,QAA0B;YAE1B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC7B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;YACtF,CAAC;YAED,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,cAAc,CAAC,CAAC;YACjD,CAAC;YAED,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC,SAAS,CAAY,QAAQ,CAAC,CAAC;YACtD,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAa,UAAU,EAAE,UAAU,CAAC,CAAC;YACzE,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;YAErC,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,qBAAqB,GAAG,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAEhE,mEAAmE;YACnE,kEAAkE;YAClE,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACxD,IAAI,CAAC,QAAQ;oBAAE,SAAS;gBACxB,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC;gBAC3B,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC;gBACvC,OAAO,QAAQ,CAAC,cAAc,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC5B,CAAC;YAED,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;gBACvB,SAAS;gBACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;YAEH,OAAO;gBACL,SAAS;gBACT,kBAAkB,EAAE,OAAO;gBAC3B,eAAe,EAAE,UAAU,CAAC,MAAM;aACnC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * See: docs/architecture/apparatus/astrolabe.md
9
9
  */
10
- export type { PlanDoc, ScopeItem, Decision, PlanStatus, PlanFilters, AstrolabeConfig, AstrolabeApi, } from './types.ts';
10
+ export type { PlanDoc, ScopeItem, Decision, PatronEmission, PlanStatus, PlanFilters, AstrolabeConfig, AstrolabeApi, } from './types.ts';
11
11
  export { createAstrolabe } from './astrolabe.ts';
12
12
  declare const _default: import("@shardworks/nexus-core").Plugin;
13
13
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,YAAY,EACV,OAAO,EACP,SAAS,EACT,QAAQ,EACR,UAAU,EACV,WAAW,EACX,eAAe,EACf,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;;AAKjD,wBAAiC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,YAAY,EACV,OAAO,EACP,SAAS,EACT,QAAQ,EACR,cAAc,EACd,UAAU,EACV,WAAW,EACX,eAAe,EACf,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;;AAKjD,wBAAiC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,yEAAyE;AAEzE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,eAAe,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,yEAAyE;AAEzE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,eAAe,eAAe,EAAE,CAAC"}
@@ -9,8 +9,15 @@
9
9
  * dependency gating for downstream writs.
10
10
  *
11
11
  * Stages: plan-init → draft → reader-analyst → inventory-check →
12
- * decision-review → spec-writer → plan-finalize → implement →
13
- * review → revise → seal.
12
+ * patron-anima → decision-review → spec-writer → plan-finalize →
13
+ * implement → review → revise → seal.
14
+ *
15
+ * `patron-anima` consults a configured Patron Anima to pre-fill
16
+ * decisions on behalf of the patron. When `astrolabe.patronRole` is
17
+ * unset or empty, the engine no-ops and `decision-review` proceeds as
18
+ * it did before the engine existed. The `cwd` given is the shared draft
19
+ * worktree so the anima can inspect the codebase if its role instructions
20
+ * allow it.
14
21
  *
15
22
  * The `draft` engine is shared across both phases (D6 in the commission
16
23
  * spec): every downstream engine reads the same `upstream['draft']`
@@ -1 +1 @@
1
- {"version":3,"file":"plan-and-ship.d.ts","sourceRoot":"","sources":["../src/plan-and-ship.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE,eAAO,MAAM,sBAAsB,EAAE,WA6FpC,CAAC"}
1
+ {"version":3,"file":"plan-and-ship.d.ts","sourceRoot":"","sources":["../src/plan-and-ship.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE,eAAO,MAAM,sBAAsB,EAAE,WAuGpC,CAAC"}
@@ -9,8 +9,15 @@
9
9
  * dependency gating for downstream writs.
10
10
  *
11
11
  * Stages: plan-init → draft → reader-analyst → inventory-check →
12
- * decision-review → spec-writer → plan-finalize → implement →
13
- * review → revise → seal.
12
+ * patron-anima → decision-review → spec-writer → plan-finalize →
13
+ * implement → review → revise → seal.
14
+ *
15
+ * `patron-anima` consults a configured Patron Anima to pre-fill
16
+ * decisions on behalf of the patron. When `astrolabe.patronRole` is
17
+ * unset or empty, the engine no-ops and `decision-review` proceeds as
18
+ * it did before the engine existed. The `cwd` given is the shared draft
19
+ * worktree so the anima can inspect the codebase if its role instructions
20
+ * allow it.
14
21
  *
15
22
  * The `draft` engine is shared across both phases (D6 in the commission
16
23
  * spec): every downstream engine reads the same `upstream['draft']`
@@ -52,10 +59,20 @@ export const planAndShipRigTemplate = {
52
59
  upstream: ['reader-analyst'],
53
60
  givens: { planId: '${yields.plan-init.planId}' },
54
61
  },
62
+ {
63
+ id: 'patron-anima',
64
+ designId: 'astrolabe.patron-anima',
65
+ upstream: ['inventory-check'],
66
+ givens: {
67
+ planId: '${yields.plan-init.planId}',
68
+ cwd: '${yields.draft.path}',
69
+ writ: '${writ}',
70
+ },
71
+ },
55
72
  {
56
73
  id: 'decision-review',
57
74
  designId: 'astrolabe.decision-review',
58
- upstream: ['inventory-check'],
75
+ upstream: ['patron-anima'],
59
76
  givens: { planId: '${yields.plan-init.planId}' },
60
77
  },
61
78
  {
@@ -1 +1 @@
1
- {"version":3,"file":"plan-and-ship.js","sourceRoot":"","sources":["../src/plan-and-ship.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,MAAM,CAAC,MAAM,sBAAsB,GAAgB;IACjD,OAAO,EAAE;QACP;YACE,EAAE,EAAE,WAAW;YACf,QAAQ,EAAE,qBAAqB;YAC/B,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;SAC5B;QACD;YACE,EAAE,EAAE,OAAO;YACX,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE,CAAC,WAAW,CAAC;YACvB,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;SAC5B;QACD;YACE,EAAE,EAAE,gBAAgB;YACpB,QAAQ,EAAE,eAAe;YACzB,QAAQ,EAAE,CAAC,OAAO,CAAC;YACnB,MAAM,EAAE;gBACN,IAAI,EAAE,gCAAgC;gBACtC,MAAM,EAAE,qCAAqC;gBAC7C,GAAG,EAAE,sBAAsB;gBAC3B,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE;aACzC;SACF;QACD;YACE,EAAE,EAAE,iBAAiB;YACrB,QAAQ,EAAE,2BAA2B;YACrC,QAAQ,EAAE,CAAC,gBAAgB,CAAC;YAC5B,MAAM,EAAE,EAAE,MAAM,EAAE,4BAA4B,EAAE;SACjD;QACD;YACE,EAAE,EAAE,iBAAiB;YACrB,QAAQ,EAAE,2BAA2B;YACrC,QAAQ,EAAE,CAAC,iBAAiB,CAAC;YAC7B,MAAM,EAAE,EAAE,MAAM,EAAE,4BAA4B,EAAE;SACjD;QACD;YACE,EAAE,EAAE,aAAa;YACjB,QAAQ,EAAE,eAAe;YACzB,QAAQ,EAAE,CAAC,iBAAiB,CAAC;YAC7B,MAAM,EAAE;gBACN,IAAI,EAAE,uBAAuB;gBAC7B,MAAM,EACJ,yCAAyC;oBACzC,8DAA8D;gBAChE,GAAG,EAAE,sBAAsB;gBAC3B,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE;aACtC;SACF;QACD;YACE,EAAE,EAAE,eAAe;YACnB,QAAQ,EAAE,yBAAyB;YACnC,QAAQ,EAAE,CAAC,aAAa,CAAC;YACzB,MAAM,EAAE,EAAE,MAAM,EAAE,4BAA4B,EAAE;SACjD;QACD;YACE,EAAE,EAAE,WAAW;YACf,QAAQ,EAAE,WAAW;YACrB,QAAQ,EAAE,CAAC,eAAe,CAAC;YAC3B,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,8BAA8B;aACvC;SACF;QACD;YACE,EAAE,EAAE,QAAQ;YACZ,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,CAAC,WAAW,CAAC;YACvB,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,UAAU;gBAChB,YAAY,EAAE,sBAAsB;gBACpC,WAAW,EAAE,qBAAqB;aACnC;SACF;QACD;YACE,EAAE,EAAE,QAAQ;YACZ,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,CAAC,QAAQ,CAAC;YACpB,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE;SAClD;QACD;YACE,EAAE,EAAE,MAAM;YACV,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,CAAC,QAAQ,CAAC;YACpB,MAAM,EAAE,EAAE;SACX;KACF;IACD,gBAAgB,EAAE,MAAM;CACzB,CAAC"}
1
+ {"version":3,"file":"plan-and-ship.js","sourceRoot":"","sources":["../src/plan-and-ship.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -44,6 +44,40 @@ export interface Decision {
44
44
  rationale?: string;
45
45
  selected?: string;
46
46
  patronOverride?: string;
47
+ /**
48
+ * Patron Anima emission for this decision, if the patron-anima engine
49
+ * touched it. Records the anima's verdict, selection, confidence, and
50
+ * short rationale. Kept distinct from analyst fields so override-rate ×
51
+ * confidence can be measured as a first-class planner-quality signal.
52
+ */
53
+ patron?: PatronEmission;
54
+ }
55
+ /**
56
+ * A Patron Anima's emission for a single decision.
57
+ *
58
+ * - `verdict: 'confirm'` — the anima accepts the analyst's recommendation.
59
+ * - `verdict: 'override'` — the anima picks a different option than the
60
+ * recommendation.
61
+ * - `verdict: 'fill-in'` — no analyst recommendation existed; the anima
62
+ * supplies one.
63
+ *
64
+ * `selection` must be one of the decision's offered option keys — the
65
+ * anima cannot emit custom / free-text selections. (The human patron
66
+ * retains that escape hatch via `decision-review`'s `allowCustom` input.)
67
+ *
68
+ * `confidence` is calibrated structurally against the patron role's
69
+ * principles list: one principle applies cleanly → `'high'`; multiple
70
+ * principles conflict → `'med'`; no principle applies → `'low'`.
71
+ *
72
+ * `rationale` is a short free-text note — which principle (or conflict)
73
+ * produced the verdict. Optional so the engine can accept minimal well-
74
+ * formed emissions.
75
+ */
76
+ export interface PatronEmission {
77
+ verdict: 'confirm' | 'override' | 'fill-in';
78
+ selection: string;
79
+ confidence: 'low' | 'med' | 'high';
80
+ rationale?: string;
47
81
  }
48
82
  export interface PlanFilters {
49
83
  /** Filter by status. */
@@ -58,6 +92,15 @@ export interface PlanFilters {
58
92
  export interface AstrolabeConfig {
59
93
  /** The writ type posted by the spec-writer engine. Default: 'mandate'. */
60
94
  generatedWritType?: string;
95
+ /**
96
+ * Qualified role name of the Patron Anima consulted by the
97
+ * `astrolabe.patron-anima` engine before `decision-review`. When unset
98
+ * or empty, the engine no-ops and `decision-review` proceeds as it
99
+ * does without the anima stage. There is no framework default — every
100
+ * patron's taste is unique, so a shared default would represent no
101
+ * patron's taste.
102
+ */
103
+ patronRole?: string;
61
104
  }
62
105
  declare module '@shardworks/nexus-core' {
63
106
  interface GuildConfig {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAIpG,MAAM,WAAW,OAAO;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,MAAM,EAAE,UAAU,CAAC;IAGnB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,mDAAmD;IACnD,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IAGvB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAID,MAAM,WAAW,WAAW;IAC1B,wBAAwB;IACxB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,OAAO,QAAQ,wBAAwB,CAAC;IACtC,UAAU,WAAW;QACnB,SAAS,CAAC,EAAE,eAAe,CAAC;KAC7B;CACF;AAID,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,yEAAyE;IACzE,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAChD,kFAAkF;IAClF,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/E"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shardworks/astrolabe-apparatus",
3
- "version": "0.1.228",
3
+ "version": "0.1.230",
4
4
  "license": "ISC",
5
5
  "repository": {
6
6
  "type": "git",
@@ -20,16 +20,17 @@
20
20
  },
21
21
  "dependencies": {
22
22
  "zod": "4.3.6",
23
- "@shardworks/tools-apparatus": "0.1.228",
24
- "@shardworks/clerk-apparatus": "0.1.228",
25
- "@shardworks/stacks-apparatus": "0.1.228",
26
- "@shardworks/spider-apparatus": "0.1.228",
27
- "@shardworks/loom-apparatus": "0.1.228",
28
- "@shardworks/fabricator-apparatus": "0.1.228"
23
+ "@shardworks/stacks-apparatus": "0.1.230",
24
+ "@shardworks/clerk-apparatus": "0.1.230",
25
+ "@shardworks/tools-apparatus": "0.1.230",
26
+ "@shardworks/spider-apparatus": "0.1.230",
27
+ "@shardworks/fabricator-apparatus": "0.1.230",
28
+ "@shardworks/loom-apparatus": "0.1.230",
29
+ "@shardworks/animator-apparatus": "0.1.230"
29
30
  },
30
31
  "devDependencies": {
31
32
  "@types/node": "25.5.0",
32
- "@shardworks/nexus-core": "0.1.228"
33
+ "@shardworks/nexus-core": "0.1.230"
33
34
  },
34
35
  "files": [
35
36
  "dist",
@@ -41,7 +42,7 @@
41
42
  ],
42
43
  "scripts": {
43
44
  "build": "tsc",
44
- "test": "node --disable-warning=ExperimentalWarning --experimental-transform-types --test 'src/**/*.test.ts'",
45
+ "test": "node --disable-warning=ExperimentalWarning --experimental-transform-types --test 'src/**/*.test.ts' 'pages/**/*.test.js'",
45
46
  "typecheck": "tsc --noEmit"
46
47
  }
47
48
  }
@@ -307,10 +307,10 @@
307
307
  detailTitle.textContent = 'Plan: ' + plan.id;
308
308
 
309
309
  // Metadata card
310
- var briefLink = '<a href="/pages/clerk/?writ=' + encodeURIComponent(plan.id) + '">' + esc(plan.id) + '</a>';
310
+ var briefLink = '<a href="/pages/writs/?writ=' + encodeURIComponent(plan.id) + '">' + esc(plan.id) + '</a>';
311
311
  var mandateHtml = '';
312
312
  if (plan.generatedWritId) {
313
- mandateHtml = '<dt>Mandate Writ</dt><dd><a href="/pages/clerk/?writ=' +
313
+ mandateHtml = '<dt>Mandate Writ</dt><dd><a href="/pages/writs/?writ=' +
314
314
  encodeURIComponent(plan.generatedWritId) + '">' + esc(plan.generatedWritId) + '</a></dd>';
315
315
  }
316
316
 
@@ -10,6 +10,12 @@
10
10
 
11
11
  import { describe, it } from 'node:test';
12
12
  import assert from 'node:assert/strict';
13
+ import { readFileSync } from 'node:fs';
14
+ import { resolve, dirname } from 'node:path';
15
+ import { fileURLToPath } from 'node:url';
16
+
17
+ const __dirname = dirname(fileURLToPath(import.meta.url));
18
+ const astrolabeJs = readFileSync(resolve(__dirname, 'astrolabe.js'), 'utf-8');
13
19
 
14
20
  // ── Extracted pure functions (identical to astrolabe.js) ─────────────
15
21
 
@@ -422,3 +428,34 @@ describe('renderDecisionsTable()', () => {
422
428
  assert.ok(!html.includes('<script>'));
423
429
  });
424
430
  });
431
+
432
+ describe('astrolabe.js plan-detail writ cross-link URL', () => {
433
+ // Regression guard: the plan-detail brief-writ and mandate-writ anchors
434
+ // historically targeted '/pages/clerk/?writ=…', but no plugin registers
435
+ // a page with id 'clerk' — the Clerk's writs page is registered with id
436
+ // 'writs' and served at '/pages/writs/'. That produced a bare 404 on
437
+ // every click. Pin the canonical URL shape and forbid the broken one.
438
+
439
+ it('writ deep-links target the canonical Clerk writs page path', () => {
440
+ assert.match(
441
+ astrolabeJs,
442
+ /\/pages\/writs\/\?writ=/,
443
+ 'writ deep-links must target /pages/writs/?writ=',
444
+ );
445
+ assert.doesNotMatch(
446
+ astrolabeJs,
447
+ /\/pages\/clerk\/\?writ=/,
448
+ 'writ deep-links must NOT target the broken /pages/clerk/?writ= path',
449
+ );
450
+ });
451
+
452
+ it('both plan-detail writ anchors (brief and mandate) use the canonical path', () => {
453
+ // The plan-detail view emits two writ anchors: the brief-writ link and
454
+ // the (optional) mandate-writ link. Both must use the canonical shape.
455
+ var matches = astrolabeJs.match(/\/pages\/writs\/\?writ=/g) || [];
456
+ assert.ok(
457
+ matches.length >= 2,
458
+ 'expected at least 2 canonical /pages/writs/?writ= links (brief + mandate), found ' + matches.length,
459
+ );
460
+ });
461
+ });