@eir-labs/coltrane 0.4.0 → 0.5.0

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.
Files changed (58) hide show
  1. package/dist/src/access_grant.d.ts +21 -0
  2. package/dist/src/access_grant.js +33 -4
  3. package/dist/src/access_grant.js.map +1 -1
  4. package/dist/src/claude_invoker.d.ts +28 -0
  5. package/dist/src/claude_invoker.js +68 -7
  6. package/dist/src/claude_invoker.js.map +1 -1
  7. package/dist/src/cli.d.ts +44 -0
  8. package/dist/src/cli.js +358 -0
  9. package/dist/src/cli.js.map +1 -0
  10. package/dist/src/cli_entry.d.ts +2 -0
  11. package/dist/src/cli_entry.js +23 -0
  12. package/dist/src/cli_entry.js.map +1 -0
  13. package/dist/src/composition.d.ts +2 -0
  14. package/dist/src/composition.js.map +1 -1
  15. package/dist/src/fs_atomic.d.ts +1 -0
  16. package/dist/src/fs_atomic.js +34 -0
  17. package/dist/src/fs_atomic.js.map +1 -0
  18. package/dist/src/genome_schema.d.ts +5 -1
  19. package/dist/src/genome_schema.js +12 -1
  20. package/dist/src/genome_schema.js.map +1 -1
  21. package/dist/src/genome_writer.d.ts +2 -2
  22. package/dist/src/genome_writer.js +17 -4
  23. package/dist/src/genome_writer.js.map +1 -1
  24. package/dist/src/gig_tracker.d.ts +29 -1
  25. package/dist/src/gig_tracker.js +27 -0
  26. package/dist/src/gig_tracker.js.map +1 -1
  27. package/dist/src/index.d.ts +1 -0
  28. package/dist/src/index.js +1 -0
  29. package/dist/src/index.js.map +1 -1
  30. package/dist/src/ledger.d.ts +3 -0
  31. package/dist/src/ledger.js.map +1 -1
  32. package/dist/src/loader.d.ts +2 -0
  33. package/dist/src/loader.js +10 -0
  34. package/dist/src/loader.js.map +1 -1
  35. package/dist/src/mcp.js +82 -20
  36. package/dist/src/mcp.js.map +1 -1
  37. package/dist/src/outputs.d.ts +74 -0
  38. package/dist/src/outputs.js +106 -71
  39. package/dist/src/outputs.js.map +1 -1
  40. package/dist/src/registry.d.ts +13 -0
  41. package/dist/src/registry.js +112 -0
  42. package/dist/src/registry.js.map +1 -1
  43. package/dist/src/reuse.d.ts +276 -0
  44. package/dist/src/reuse.js +215 -0
  45. package/dist/src/reuse.js.map +1 -0
  46. package/dist/src/runtime.d.ts +157 -4
  47. package/dist/src/runtime.js +519 -30
  48. package/dist/src/runtime.js.map +1 -1
  49. package/dist/src/server.d.ts +20 -0
  50. package/dist/src/server.js +733 -28
  51. package/dist/src/server.js.map +1 -1
  52. package/dist/src/skill_runner.mjs +8 -2
  53. package/dist/src/skill_subprocess.d.ts +55 -5
  54. package/dist/src/skill_subprocess.js +215 -11
  55. package/dist/src/skill_subprocess.js.map +1 -1
  56. package/dist/src/version.d.ts +1 -1
  57. package/dist/src/version.js +1 -1
  58. package/package.json +6 -4
package/dist/src/mcp.js CHANGED
@@ -11,27 +11,34 @@ const nullable = (type) => ({ type: [type, "null"] });
11
11
  const pickProps = (src, keys) => Object.fromEntries(keys.filter((k) => src[k] !== undefined).map((k) => [k, src[k]]));
12
12
  // type_register's surface is the AUTHORED projection of DomainTypeSchema (the single source) — field
13
13
  // types are generated, so they can't drift from the schema; version/status are server-assigned (not
14
- // authored), and `reason` is approval metadata. (type_extend is an extension DELTA — fields_to_add is
15
- // not a restatement of the type record — so there's nothing to derive there.)
14
+ // authored). (type_extend is an extension DELTA — fields_to_add is not a restatement of the type
15
+ // record — so there's nothing to derive there.)
16
+ //
17
+ // `reason` used to be appended here as "approval metadata" and was read by nothing: the only
18
+ // handlers that read args["reason"] are proposal_create and gig_abort (#234).
16
19
  const DT_AUTHORED = pickProps(zodToMcpProps(DomainTypeSchema), ["slug", "extends", "domain", "schema", "required_fields"]);
17
20
  export const MCP_TOOLS = [
18
- { slug: "type_resolve", category: "understand", input_schema: obj({ core_type: "string", domain: "string", semantic_description: "string", required_fields: "array" }), output_schema: obj({ action: "string", candidates: "array", recommendation: "object" }) },
19
- { slug: "type_browse", category: "understand", input_schema: obj({ domain: "string", extends: "string", min_usage: "number", status: "string" }), output_schema: obj({ types: "array", stats: "object" }) },
20
- { slug: "tool_registry_browse", category: "understand", input_schema: obj({ category: "string", usage_min: "number", unused_since: "string" }), output_schema: obj({ tools: "array", usage_stats: "array", dependency_map: "object" }) },
21
+ { slug: "type_resolve", category: "understand", input_schema: obj({ core_type: "string", extends: "string", domain: "string", required_fields: "array" }), output_schema: obj({ action: "string", candidates: "array", recommendation: "object" }) },
22
+ { slug: "type_browse", category: "understand", input_schema: obj({ domain: "string", extends: "string", status: "string", min_usage: "number" }), output_schema: obj({ types: "array", stats: "object" }) },
23
+ { slug: "tool_registry_browse", category: "understand", input_schema: obj({ category: "string" }), output_schema: obj({ tools: "array", usage_stats: "array", dependency_map: "object" }) },
21
24
  { slug: "output_query", category: "understand", input_schema: obj({ domain_type: "string", gig_id: "string", agent_slug: "string", data_filter: "object" }), output_schema: obj({ outputs: "array", total_count: "number" }) },
22
25
  { slug: "output_trace", category: "understand", input_schema: obj({ output_id: "string", direction: "string", max_depth: "number" }), output_schema: obj({ graph: "object", root_signals: "array", terminal_outputs: "array" }) },
23
- { slug: "charter_read", category: "understand", input_schema: obj({ company_id: "string" }), output_schema: obj({ products: "array", goals: "array", pain_points: "array", tech_stack: "array", access_grants: "array" }) },
26
+ { slug: "charter_read", category: "understand", input_schema: obj({ path: "string" }), output_schema: obj({ products: "array", goals: "array", pain_points: "array", tech_stack: "array", access_grants: "array" }) },
24
27
  // #217 — advertised contract == handler. The five filters src/server.ts actually reads, and
25
28
  // the two keys it actually returns. The old {company_id, domain} in / {gigs,
26
29
  // performance_summary} out overlapped the handler in neither direction, so a client
27
30
  // following the surface got an UNFILTERED DUMP of the audit trail and then looked for a key
28
31
  // that was never returned.
29
32
  { slug: "execution_history_read", category: "understand", input_schema: obj({ gig_id: "string", standard_slug: "string", genome_hash: "string", after: "string", before: "string" }), output_schema: obj({ executions: "array", count: "number" }) },
30
- { slug: "access_grant_check", category: "understand", input_schema: obj({ company_id: "string", resource_uri: "string", required_permissions: "array" }), output_schema: obj({ granted: "boolean", missing_permissions: "array", expires_in: "number" }) },
33
+ // #234/#279 the advertised surface here shared NOT ONE argument with the handler, which
34
+ // reads `grant`, `plan` and `now_ms`. A caller obeying the schema passed three arguments that
35
+ // were all ignored and got an answer computed from an absent grant. Advertising the real
36
+ // shape is the minimum; the wiring question (nothing in production calls this) is #279.
37
+ { slug: "access_grant_check", category: "understand", input_schema: obj({ grant: "object", plan: "object", required_permissions: "array", now_ms: "number" }), output_schema: obj({ granted: "boolean", missing_permissions: "array", expires_in: "number" }) },
31
38
  { slug: "type_register", category: "build", input_schema: obj({ ...DT_AUTHORED, reason: "string" }), output_schema: obj({ registered: "boolean", domain_type_id: "string", version: "number" }) },
32
- { slug: "type_extend", category: "build", input_schema: obj({ slug: "string", domain: "string", fields_to_add: "object", reason: "string" }), output_schema: obj({ new_version: "number", changelog_entry: "string" }) },
39
+ { slug: "type_extend", category: "build", input_schema: obj({ slug: "string", fields_to_add: "object", extension: "object", reason: "string" }), output_schema: obj({ new_version: "number", changelog_entry: "string" }) },
33
40
  { slug: "agent_define", category: "build", input_schema: obj(zodToMcpProps(AgentSchema)), output_schema: obj({ agent_profile_id: "string", validation_result: "object" }) },
34
- { slug: "agent_evolve", category: "build", input_schema: obj({ slug: "string", changes: "object", reason: "string", evidence: "object" }), output_schema: obj({ new_version: "number", cascade_check: "object" }) },
41
+ { slug: "agent_evolve", category: "build", input_schema: obj({ slug: "string", changes: "object", base: "object", next: "object", new_version: "number", reason: "string", evidence: "object" }), output_schema: obj({ new_version: "number", cascade_check: "object" }) },
35
42
  { slug: "standard_compose", category: "build", input_schema: obj(zodToMcpProps(StandardSchema)), output_schema: obj({ standard_id: "string", validation_result: "object" }) },
36
43
  // #239 — `basis`/`sample_size` say WHERE the estimate came from (a measured mean of real runs,
37
44
  // the standard's real structure, or a per-slug guess). estimated_duration_ms is the key the
@@ -39,15 +46,50 @@ export const MCP_TOOLS = [
39
46
  { slug: "standard_simulate", category: "build", input_schema: obj({ standard_slug: "string", mock_input: "object", depth: "string" }), output_schema: obj({ phases: "array", estimated_cost: "number", estimated_duration_ms: "number", basis: "string", sample_size: "number" }) },
40
47
  // #237 — `depth` is read now (and rejected when unrecognized); the response echoes the depth
41
48
  // the run actually took, so "I ran a cheap iteration" is verifiable rather than assumed.
42
- { slug: "gig_dispatch", category: "run", input_schema: obj({ standard_slug: "string", input: "object", depth: "string", company_id: "string", wait: "boolean" }), output_schema: obj({ gig_id: "string", status: "string", depth: "string", manifest: "object" }) },
43
- { slug: "gig_monitor", category: "run", input_schema: obj({ gig_id: "string" }), output_schema: obj({ status: "string", phases_complete: "number", current_phase: "string", chairs: "array", outputs_so_far: "array" }) },
49
+ // #234 every argument this tool reads is advertised, and every argument advertised is read.
50
+ //
51
+ // `budget` enforced a real spend ceiling and appeared in no schema: a caller reading the
52
+ // tool surface had no way to learn a ceiling could be set, so the guardrail may as well not
53
+ // have existed. That is the whole of #234 in one line.
54
+ //
55
+ // `resume_gig_id` + `reuse` are the two ways to reuse a sealed output instead of paying to
56
+ // derive it again, and both are ADVERTISED for the same reason — an undiscoverable feature
57
+ // is #234 repeated.
58
+ // resume_gig_id — continue a gig that died mid-pipeline, skipping the phases that already
59
+ // sealed. Refused (never silently run cold) if the genome, its PRODUCERS, payload, model,
60
+ // depth or a domain type moved since; the reply then carries `resume_refused` + `drift`.
61
+ // reuse — allow chair-level cache reads AND writes. A chair whose producer, resolved
62
+ // inputs and payload hash to a prior sealed output is served from it instead of invoked.
63
+ // `skipped` / `resumed_from` / `reuse` on the response say exactly what did not run and why.
64
+ //
65
+ // `company_id` is GONE, found by the guard added with the same change. It was advertised and
66
+ // never read — the #237 shape (advertised, silently discarded). It is worse than a merely
67
+ // dead argument because it is TENANCY-shaped: a caller passing it to scope a run to a company
68
+ // would reasonably believe the run was scoped, and nothing in the engine reads it. The engine
69
+ // deliberately does not do tenancy — `principal` on the ledger is documented as provenance
70
+ // and explicitly NOT an access control — so the honest move is to stop advertising a
71
+ // guarantee it does not make.
72
+ //
73
+ // Sweeping the guard across all 37 tools then found `company_id` advertised and unread on
74
+ // charter_read and charter_suggest_update too, so it is gone from the MCP surface entirely.
75
+ // It survives only as a FIELD on the AccessGrant object (src/access_grant.ts), where it
76
+ // describes the grant a caller passes in rather than promising the engine will scope by it.
77
+ { slug: "gig_dispatch", category: "run", input_schema: obj({ standard_slug: "string", input: "object", depth: "string", wait: "boolean", budget: "object", resume_gig_id: "string", reuse: "boolean" }), output_schema: obj({ gig_id: "string", status: "string", depth: "string", manifest: "object", resumed_from: "string", reuse: "boolean", resume_refused: "boolean", drift: "array" }) },
78
+ // `skipped_chairs` / `resumed_from` / `reuse_rejected` are the ASYNC path's only report of a
79
+ // saving — the manifest never reaches a caller who dispatched without `wait`.
80
+ { slug: "gig_monitor", category: "run", input_schema: obj({ gig_id: "string" }), output_schema: obj({ status: "string", phases_complete: "number", current_phase: "string", chairs: "array", outputs_so_far: "array", skipped_chairs: "array", resumed_from: "object", reuse_rejected: "array" }) },
44
81
  { slug: "gig_logs", category: "understand", input_schema: obj({ gig_id: "string", role: "string", type: "string", tail: "number" }), output_schema: obj({ gig_id: "string", roles: "array", count: "number", events: "array" }) },
45
82
  // #251 — `status` is the field both existing tests actually assert and it was not advertised.
46
83
  // `aborted` now means "this call delivered a cancellation to a live run", not "we looked at
47
84
  // the stores and guessed"; `cancellable` says whether this server could reach the run at all.
48
85
  { slug: "gig_abort", category: "run", input_schema: obj({ gig_id: "string", reason: "string" }), output_schema: obj({ status: "string", aborted: "boolean", cancellable: "boolean", cleanup_result: "object" }) },
49
- { slug: "output_write", category: "run", input_schema: obj({ core_type: "string", domain_type: "string", data: "object", input_refs: "array", refs: "array" }), output_schema: obj({ output_id: "string", validation_result: "object" }) },
50
- { slug: "agent_validate_pipeline", category: "improve", input_schema: obj({ agents: "array", standard_slug: "string" }), output_schema: obj({ valid: "boolean", graph: "object", unsatisfied_inputs: "array", illegal_progressions: "array" }) },
86
+ // #234 `gig_id`, `agent_slug` and `phase` were read by the handler and advertised nowhere.
87
+ // This one had teeth: a skill prompt written against this schema omits `gig_id`, the handler
88
+ // defaults it to "", and the sealed output lands in the store attached to NO gig. A live run
89
+ // of the consuming product produced 509 such orphans. The provenance chain is the engine's
90
+ // core promise, and the field that anchors an output to its run was undiscoverable.
91
+ { slug: "output_write", category: "run", input_schema: obj({ core_type: "string", primitive: "string", domain_type: "string", domain_type_version: "number", domain: "string", data: "object", input_refs: "array", refs: "array", gig_id: "string", agent_slug: "string", phase: "string", cost_usd: "number", tokens_used: "number", duration_ms: "number", model: "string", model_tier: "string" }), output_schema: obj({ output_id: "string", validation_result: "object" }) },
92
+ { slug: "agent_validate_pipeline", category: "improve", input_schema: obj({ agents: "array", standard_slug: "string", slug: "string", domain: "string", primitives: "array", phases: "array" }), output_schema: obj({ valid: "boolean", graph: "object", unsatisfied_inputs: "array", illegal_progressions: "array" }) },
51
93
  // #238 — success_rate and trend are NULLABLE, because the engine genuinely cannot compute
52
94
  // them (a failed gig writes no ledger row, so the denominator does not exist) and a hardcoded
53
95
  // 1.0 is a fabricated measurement presented as a measurement. The `*_basis` strings say why.
@@ -71,7 +113,7 @@ export const MCP_TOOLS = [
71
113
  // (typically: COLTRANE_SERVER_DIRECT=1 was set, bypassing the relay).
72
114
  { slug: "server_restart", category: "improve", input_schema: obj({}), output_schema: obj({ restarted: "boolean", note: "string" }) },
73
115
  { slug: "system_audit", category: "improve", input_schema: obj({ scope: "string", check: "string" }), output_schema: obj({ findings: "array" }) },
74
- { slug: "proposal_create", category: "improve", input_schema: obj({ change_type: "string", target: "string", changes: "object", reason: "string", evidence: "object" }), output_schema: obj({ proposal_id: "string", cascade_impact: "object" }) },
116
+ { slug: "proposal_create", category: "improve", input_schema: obj({ change_type: "string", target: "string", target_kind: "string", reason: "string" }), output_schema: obj({ proposal_id: "string", cascade_impact: "object" }) },
75
117
  { slug: "tool_propose", category: "improve", input_schema: obj({ slug: "string", type: "string", spec: "object", reason: "string" }), output_schema: obj({ proposal_id: "string" }) },
76
118
  // tool_register — close the propose→register loop. Adds a slug to the live
77
119
  // tool registry so subsequent agent_define calls can grant scope to it.
@@ -79,14 +121,34 @@ export const MCP_TOOLS = [
79
121
  // legitimately admit a tool, and the rejection gate becomes a permanent block.
80
122
  { slug: "tool_register", category: "improve", input_schema: obj({ slug: "string", type: "string", spec: "object", category: "string" }), output_schema: obj({ registered: "boolean", slug: "string" }) },
81
123
  { slug: "tool_deprecate_propose", category: "improve", input_schema: obj({ slug: "string", reason: "string", usage_stats: "object" }), output_schema: obj({ proposal_id: "string", affected_agents: "array" }) },
82
- { slug: "capability_research", category: "improve", input_schema: obj({ need: "string", context: "object" }), output_schema: obj({ approaches: "array", mcp_options: "array", recommendation: "object" }) },
83
- { slug: "session_review_write", category: "improve", input_schema: obj({ gig_id: "string", output_id: "string", agent_slug: "string", agent_version: "number", quality_score: "number", quality_scores: "object", domain: "string", notes: "string" }), output_schema: obj({ review_id: "string", recorded: "boolean" }) },
124
+ // `need` is the documented argument; `query`/`capability` are accepted aliases kept for
125
+ // callers written against the handler rather than the schema, and advertised so they are
126
+ // discoverable rather than folklore (#234).
127
+ { slug: "capability_research", category: "improve", input_schema: obj({ need: "string", query: "string", capability: "string" }), output_schema: obj({ existing_matches: "array", gap: "boolean", approaches: "array", mcp_options: "array", recommendation: "object" }) },
128
+ { slug: "session_review_write", category: "improve", input_schema: obj({ gig_id: "string", output_id: "string", agent_slug: "string", agent_version: "number", quality_scores: "object", domain: "string", notes: "string" }), output_schema: obj({ review_id: "string", recorded: "boolean" }) },
129
+ // The differentiator, made answerable: did this producer get BETTER, and what did it cost?
130
+ // `learning_synthesize` counts reviews; this MEASURES the change across producer versions.
131
+ // Every input was already sealed — outputs carry agent_slug/cost_usd, reviews carry
132
+ // quality_scores against a specific output_id and agent_version — and nothing joined them.
133
+ { slug: "improvement_report", category: "improve", input_schema: obj({ agent_slug: "string", window: "string" }), output_schema: obj({ agent_slug: "string", total_outputs: "number", versions: "array", deltas: "array", tiers: "array", comparable: "boolean", basis: "string" }) },
84
134
  { slug: "learning_synthesize", category: "improve", input_schema: obj({ agent_slug: "string", min_reviews: "number", since: "string", auto_propose: "boolean" }), output_schema: obj({ agent_slug: "string", review_count: "number", evidence_sufficient: "boolean", summary: "object", proposal_id: "string" }) },
85
- { slug: "agent_promote", category: "build", input_schema: obj({ slug: "string", status: "string" }), output_schema: obj({ slug: "string", status: "string", promoted: "boolean" }) },
86
- { slug: "standard_promote", category: "build", input_schema: obj({ slug: "string", status: "string" }), output_schema: obj({ slug: "string", status: "string", promoted: "boolean" }) },
135
+ { slug: "agent_promote", category: "build", input_schema: obj({ slug: "string", status: "string", current: "string" }), output_schema: obj({ slug: "string", status: "string", promoted: "boolean" }) },
136
+ { slug: "standard_promote", category: "build", input_schema: obj({ slug: "string", status: "string", current: "string" }), output_schema: obj({ slug: "string", status: "string", promoted: "boolean" }) },
87
137
  { slug: "skill_define", category: "build", input_schema: obj(zodToMcpProps(SkillSchema)), output_schema: obj({ skill_id: "string", content_hash: "string" }) },
88
- { slug: "skill_promote", category: "build", input_schema: obj({ slug: "string", status: "string" }), output_schema: obj({ slug: "string", status: "string", promoted: "boolean" }) },
89
- { slug: "charter_suggest_update", category: "manage_context", input_schema: obj({ company_id: "string", field: "string", current_value: "string", suggested_value: "string", evidence: "object" }), output_schema: obj({ proposal_id: "string" }) },
138
+ // The skill ITERATION loop. Until 0.5.0 the surface was define + promote: a skill could be
139
+ // created and given production status, and never run, tested, listed or revised through the
140
+ // engine. The fixture gate on promotion made the gap sharper — a skill could be refused for
141
+ // failing fixtures with no way to run them and see which.
142
+ { slug: "skill_browse", category: "understand", input_schema: obj({ domain: "string", status: "string", skill_type: "string", has_code: "boolean" }), output_schema: obj({ skills: "array", count: "number" }) },
143
+ { slug: "skill_inspect", category: "understand", input_schema: obj({ slug: "string" }), output_schema: obj({ slug: "string", version: "number", has_code: "boolean", code_hash: nullable("string"), fixture_count: "number", fixtures: "array", promotable: "boolean" }) },
144
+ // `mode:"test"` runs the skill's own fixtures instead of a caller's input, and reports the
145
+ // threshold it would be held to at promotion — so "why was I refused" is one call.
146
+ { slug: "skill_execute", category: "run", input_schema: obj({ slug: "string", input: "object", mode: "string", timeout_ms: "number" }), output_schema: obj({ slug: "string", ok: "boolean", output: "object", error: "string", duration_ms: "number" }) },
147
+ // A candidate is run against the CURRENT fixtures in a throwaway copy and lands only if it
148
+ // passes. A skill cannot regress through this door.
149
+ { slug: "skill_evolve", category: "build", input_schema: obj({ slug: "string", code: "string", reason: "string" }), output_schema: obj({ slug: "string", accepted: "boolean", new_version: "number", failing_fixtures: "array" }) },
150
+ { slug: "skill_promote", category: "build", input_schema: obj({ slug: "string", status: "string", current: "string" }), output_schema: obj({ slug: "string", status: "string", promoted: "boolean", fixture_report: "object" }) },
151
+ { slug: "charter_suggest_update", category: "manage_context", input_schema: obj({ field: "string", current_value: "string", suggested_value: "string", evidence: "object" }), output_schema: obj({ proposal_id: "string" }) },
90
152
  ];
91
153
  // Lifecycle promotion order — forward-only. agent/standard share the same chain;
92
154
  // skill includes the explicit `testing` step before active.
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -20,12 +20,47 @@ export interface OutputRecord {
20
20
  cost_usd?: number | undefined;
21
21
  tokens_used?: number | undefined;
22
22
  duration_ms?: number | undefined;
23
+ /**
24
+ * WHICH model produced this output, and the tier that selected it.
25
+ *
26
+ * `cost_usd` was recorded per chair and the model was not, so a run whose chairs deliberately
27
+ * sit on different tiers — the entire point of per-chair routing — could not attribute its
28
+ * spend to a tier. The gig ledger row's `by_model` is gig-level and cannot separate two
29
+ * chairs in the same run. Without this, "does the cheap tier still clear the bar for THIS
30
+ * chair" is not an answerable question.
31
+ *
32
+ * Absent for skill-backed chairs (no model ran) and for records sealed before this existed —
33
+ * absent means unknown, never "the default".
34
+ */
35
+ model?: string | undefined;
36
+ model_tier?: string | undefined;
23
37
  skill_provenance?: {
24
38
  slug: string;
25
39
  version: number;
26
40
  code_hash: string;
27
41
  tier: number;
28
42
  } | undefined;
43
+ /**
44
+ * Set when this record was RECALLED rather than DERIVED — the reuse cache served a prior
45
+ * gig's sealed output instead of invoking the producer, and this record is that output
46
+ * re-sealed into the current gig.
47
+ *
48
+ * It is an annotation, not a shortcut: the record went through the same `write` gate as a
49
+ * fresh one, its `input_refs`/`input_shas` name the inputs THIS gig actually fed the chair,
50
+ * and its `content_sha` was recomputed (and matches the source's, which is the property
51
+ * that makes the substitution legitimate). What this field adds is the one fact the record
52
+ * would otherwise not carry — that no model was invoked to produce it. An auditor reading
53
+ * a run has to be able to tell recall from derivation.
54
+ *
55
+ * Deliberately NOT folded into `content_sha`: two byte-identical outputs must hash
56
+ * identically whether one was recalled and the other derived, or the whole reuse story
57
+ * ("a reused output is indistinguishable in substance from a fresh one") would be false.
58
+ */
59
+ reused_from?: {
60
+ output_id: string;
61
+ gig_id: string;
62
+ cache_key: string;
63
+ } | undefined;
29
64
  }
30
65
  export interface OutputWrite {
31
66
  core_type: string;
@@ -45,12 +80,21 @@ export interface OutputWrite {
45
80
  cost_usd?: number | undefined;
46
81
  tokens_used?: number | undefined;
47
82
  duration_ms?: number | undefined;
83
+ /** See OutputRecord.model — which model produced this, and the tier that selected it. */
84
+ model?: string | undefined;
85
+ model_tier?: string | undefined;
48
86
  skill_provenance?: {
49
87
  slug: string;
50
88
  version: number;
51
89
  code_hash: string;
52
90
  tier: number;
53
91
  } | undefined;
92
+ /** See OutputRecord.reused_from — recall, not derivation. */
93
+ reused_from?: {
94
+ output_id: string;
95
+ gig_id: string;
96
+ cache_key: string;
97
+ } | undefined;
54
98
  }
55
99
  export interface OutputRef {
56
100
  id: string;
@@ -116,6 +160,36 @@ export interface OutputStore {
116
160
  }): OutputRecord[];
117
161
  findings(): Finding[];
118
162
  coreTypeOf(typeSlug: string): string | null;
163
+ /**
164
+ * A hash of the type's CURRENT shape — its core, its required list, its whole schema.
165
+ *
166
+ * Lives here for the same reason `coreTypeOf` does: this store is the single owner of
167
+ * "what does the registry say about this type" at the seal boundary, and #263 was
168
+ * precisely two layers disagreeing about that question. A second owner reading the
169
+ * registry directly would be that bug again.
170
+ *
171
+ * Returns "" for a type the registry cannot describe (unregistered, or absent). A caller
172
+ * deciding whether a stored object still satisfies its type must treat "" as "cannot
173
+ * check" — and a cache that cannot check its entries must not serve them.
174
+ */
175
+ typeFingerprint(typeSlug: string): string;
176
+ /**
177
+ * Would `write` accept this? Runs EXACTLY the gates `write` runs — core agreement (#263),
178
+ * the registry schema, and the core substance floor (#227/#228) — and persists nothing.
179
+ *
180
+ * The reuse path needs this because a chair is all-or-nothing (#243): a multi-output entry
181
+ * whose second record fails validation must not leave the first one durable. `write` itself
182
+ * cannot offer that guarantee mid-loop, so the check has to be separable from the effect.
183
+ * One implementation backs both, so the two answers cannot drift.
184
+ */
185
+ validateWrite(o: {
186
+ core_type: string;
187
+ domain_type: string;
188
+ data: Record<string, unknown>;
189
+ }): {
190
+ valid: boolean;
191
+ reason?: string;
192
+ };
119
193
  integrity(): OutputStoreIntegrityReport;
120
194
  }
121
195
  export interface OutputStoreOptions {
@@ -15,6 +15,7 @@ import * as path from "node:path";
15
15
  import { CORE_TYPES } from "./core_types.js";
16
16
  import { validateOutput } from "./output_validation.js";
17
17
  import { outputContentHash } from "./canonical_form.js";
18
+ import { typeShapeFingerprint } from "./reuse.js";
18
19
  // §6 output_refs.relation CHECK constraint, as a closed set.
19
20
  export const REF_RELATIONS = [
20
21
  "derived_from",
@@ -139,6 +140,96 @@ export function createOutputStore(registry, options) {
139
140
  const dt = registry.listTypes().find((t) => t.slug === typeSlug);
140
141
  return dt ? dt.extends : null;
141
142
  }
143
+ function resolveTypeFingerprint(typeSlug) {
144
+ if (!typeSlug)
145
+ return "";
146
+ // A bare core type is immutable by construction (the six cores are canonical and frozen),
147
+ // so its fingerprint is a constant naming which core it is. Nothing to read.
148
+ if (CORE_TYPES.includes(typeSlug)) {
149
+ return typeShapeFingerprint({ extends: typeSlug, required_fields: [], schema: null });
150
+ }
151
+ const dt = registry.listTypes().find((t) => t.slug === typeSlug);
152
+ if (!dt)
153
+ return ""; // unregistered — unfingerprintable, therefore uncheckable
154
+ return typeShapeFingerprint({ extends: dt.extends, required_fields: dt.required_fields, schema: dt.schema });
155
+ }
156
+ /**
157
+ * The one owner of "would a seal accept this". `write` calls it for effect;
158
+ * `validateWrite` exposes it as a question. Returns the full rejection message so the two
159
+ * paths cannot diverge in what they tell an operator, only in whether they throw.
160
+ */
161
+ function checkWritable(o) {
162
+ // #263 — the asserted core must agree with the registry's answer.
163
+ //
164
+ // #227/#228 made `core_type` load-bearing: it selects which substance floor is
165
+ // enforced. So a caller asserting the wrong core does not merely mislabel the record —
166
+ // it gets the WRONG core's floor applied, and can satisfy `Verdict.checks[]` while
167
+ // sealing something the registry says is an Interpretation that owed `claims[]`.
168
+ //
169
+ // ORDER: this runs FIRST, ahead of the schema validation below, and that placement is
170
+ // load-bearing in a way the first draft of this fix got wrong. The agreement check is
171
+ // pure METADATA — it compares two declarations and never looks at the payload — so it
172
+ // does not need the schema to have passed. Running it second meant that for a CLOSED
173
+ // schema (the default, and what every shipped domain type uses) a payload carrying the
174
+ // wrong core's substance field died on Ajv first, telling the operator to delete
175
+ // `checks` when the actual repair is to fix the declared core. The diagnosis for a
176
+ // contradicted core has to come from the check that understands cores.
177
+ //
178
+ // Unresolvable slugs still fall through untouched: an unregistered domain_type is the
179
+ // registry's `unknown domain_type` rejection below, and this must not become a second,
180
+ // competing owner of that error.
181
+ if (o.domain_type) {
182
+ const registered = resolveCoreType(o.domain_type);
183
+ if (registered !== null && registered !== o.core_type) {
184
+ return {
185
+ valid: false,
186
+ reason: `output rejected: ${o.domain_type} was sealed as core_type "${o.core_type}" but the ` +
187
+ `registry defines it as "${registered}" — one of the two is wrong, and the core ` +
188
+ `decides which substance invariant applies`,
189
+ };
190
+ }
191
+ }
192
+ // #263 follow-on — a `core_type` that is not a core type at all.
193
+ //
194
+ // The check above only fires when a domain_type RESOLVES. With no domain_type (the
195
+ // freeform path, Rob #133) any string sailed through: `core_type: "Nonsense"` sealed,
196
+ // and so did `core_type: ""`. `validateOutput` returns valid for an unrecognised core,
197
+ // so those records carried NO substance floor whatsoever — the purest form of the very
198
+ // defect #263 describes, reachable without a registry entry at all.
199
+ if (!CORE_TYPES.includes(o.core_type)) {
200
+ return {
201
+ valid: false,
202
+ reason: `output rejected: "${o.core_type}" is not a core type — expected one of ` +
203
+ `[${CORE_TYPES.join(", ")}]. The core selects which substance invariant applies, ` +
204
+ `so an unrecognised one silently means "no floor at all".`,
205
+ };
206
+ }
207
+ // T2/T3: reject bad-schema output AT WRITE by wiring the registry validator.
208
+ const result = registry.validate({ core_type: o.core_type, domain_type: o.domain_type, data: o.data });
209
+ if (!result.valid) {
210
+ return { valid: false, reason: `output rejected: ${o.domain_type} failed schema validation — ${result.errors.join("; ")}` };
211
+ }
212
+ // #227/#228 — the CORE-type invariant, checked on every write regardless of whether
213
+ // a domain schema applied. registry.validate above returns {valid:true} without
214
+ // looking at the data for a bare core type and for an absent domain_type, and a
215
+ // subtype can overload away an inherited floor (#230) — so the substance floor an
216
+ // Artifact/Verdict carries by definition has to be enforced here, at the one seal
217
+ // boundary, not delegated to the domain schema that may not exist.
218
+ //
219
+ // validateOutput was already written and already tested; it was simply never called
220
+ // (#228). Path (b) per the #228 ruling: an ABSENT substance key is rejected, not just
221
+ // an empty one — an Artifact nobody can check is not an artifact, and a Verdict with
222
+ // no evidence is not a verification.
223
+ //
224
+ // Per the #227 ruling ("there's no subtype thing — it's all the way top to bottom")
225
+ // ALL SIX cores now carry a floor, not just Artifact and Verdict, and it applies to
226
+ // bare cores and domain subtypes alike. src/output_validation.ts holds the table.
227
+ const core = validateOutput({ core_type: o.core_type, domain_type: o.domain_type, data: o.data });
228
+ if (!core.valid) {
229
+ return { valid: false, reason: `output rejected: ${o.domain_type || o.core_type} failed core-type invariant — ${core.reason}` };
230
+ }
231
+ return { valid: true };
232
+ }
142
233
  function hydrateGig(gig_id) {
143
234
  if (!outputsDir || hydratedGigs.has(gig_id))
144
235
  return;
@@ -176,77 +267,12 @@ export function createOutputStore(registry, options) {
176
267
  }
177
268
  return {
178
269
  write(o) {
179
- // #263the asserted core must agree with the registry's answer.
180
- //
181
- // #227/#228 made `core_type` load-bearing: it selects which substance floor is
182
- // enforced. So a caller asserting the wrong core does not merely mislabel the record —
183
- // it gets the WRONG core's floor applied, and can satisfy `Verdict.checks[]` while
184
- // sealing something the registry says is an Interpretation that owed `claims[]`.
185
- //
186
- // ORDER: this runs FIRST, ahead of the schema validation below, and that placement is
187
- // load-bearing in a way the first draft of this fix got wrong. The agreement check is
188
- // pure METADATA — it compares two declarations and never looks at the payload — so it
189
- // does not need the schema to have passed. Running it second meant that for a CLOSED
190
- // schema (the default, and what every shipped domain type uses) a payload carrying the
191
- // wrong core's substance field died on Ajv first, telling the operator to delete
192
- // `checks` when the actual repair is to fix the declared core. The diagnosis for a
193
- // contradicted core has to come from the check that understands cores.
194
- //
195
- // Unresolvable slugs still fall through untouched: an unregistered domain_type is the
196
- // registry's `unknown domain_type` rejection below, and this must not become a second,
197
- // competing owner of that error.
198
- if (o.domain_type) {
199
- const registered = resolveCoreType(o.domain_type);
200
- if (registered !== null && registered !== o.core_type) {
201
- throw new OutputStoreError(`output rejected: ${o.domain_type} was sealed as core_type "${o.core_type}" but the ` +
202
- `registry defines it as "${registered}" — one of the two is wrong, and the core ` +
203
- `decides which substance invariant applies`);
204
- }
205
- }
206
- // #263 follow-on — a `core_type` that is not a core type at all.
207
- //
208
- // The check above only fires when a domain_type RESOLVES. With no domain_type (the
209
- // freeform path, Rob #133) any string sailed through: `core_type: "Nonsense"` sealed,
210
- // and so did `core_type: ""`. `validateOutput` returns valid for an unrecognised core,
211
- // so those records carried NO substance floor whatsoever — the purest form of the very
212
- // defect #263 describes, reachable without a registry entry at all.
213
- if (!CORE_TYPES.includes(o.core_type)) {
214
- throw new OutputStoreError(`output rejected: "${o.core_type}" is not a core type — expected one of ` +
215
- `[${CORE_TYPES.join(", ")}]. The core selects which substance invariant applies, ` +
216
- `so an unrecognised one silently means "no floor at all".`);
217
- }
218
- // T2/T3: reject bad-schema output AT WRITE by wiring the registry validator.
219
- const result = registry.validate({
220
- core_type: o.core_type,
221
- domain_type: o.domain_type,
222
- data: o.data,
223
- });
224
- if (!result.valid) {
225
- throw new OutputStoreError(`output rejected: ${o.domain_type} failed schema validation — ${result.errors.join("; ")}`);
226
- }
227
- // #227/#228 — the CORE-type invariant, checked on every write regardless of whether
228
- // a domain schema applied. registry.validate above returns {valid:true} without
229
- // looking at the data for a bare core type and for an absent domain_type, and a
230
- // subtype can overload away an inherited floor (#230) — so the substance floor an
231
- // Artifact/Verdict carries by definition has to be enforced here, at the one seal
232
- // boundary, not delegated to the domain schema that may not exist.
233
- //
234
- // validateOutput was already written and already tested; it was simply never called
235
- // (#228). Path (b) per the #228 ruling: an ABSENT substance key is rejected, not just
236
- // an empty one — an Artifact nobody can check is not an artifact, and a Verdict with
237
- // no evidence is not a verification.
238
- //
239
- // Per the #227 ruling ("there's no subtype thing — it's all the way top to bottom")
240
- // ALL SIX cores now carry a floor, not just Artifact and Verdict, and it applies to
241
- // bare cores and domain subtypes alike. src/output_validation.ts holds the table.
242
- const core = validateOutput({
243
- core_type: o.core_type,
244
- domain_type: o.domain_type,
245
- data: o.data,
246
- });
247
- if (!core.valid) {
248
- throw new OutputStoreError(`output rejected: ${o.domain_type || o.core_type} failed core-type invariant — ${core.reason}`);
249
- }
270
+ // Every gate lives in checkWritable one owner, so `validateWrite` (which the reuse
271
+ // path uses to decide before it injects anything) cannot answer a different question
272
+ // than the one this boundary actually asks.
273
+ const gate = checkWritable({ core_type: o.core_type, domain_type: o.domain_type, data: o.data });
274
+ if (!gate.valid)
275
+ throw new OutputStoreError(gate.reason ?? "output rejected");
250
276
  const domain_type_version = o.domain_type_version ?? 1;
251
277
  const rec = {
252
278
  id: randomUUID(),
@@ -278,7 +304,10 @@ export function createOutputStore(registry, options) {
278
304
  cost_usd: o.cost_usd,
279
305
  tokens_used: o.tokens_used,
280
306
  duration_ms: o.duration_ms,
307
+ model: o.model,
308
+ model_tier: o.model_tier,
281
309
  skill_provenance: o.skill_provenance,
310
+ reused_from: o.reused_from,
282
311
  };
283
312
  outputs.set(rec.id, rec);
284
313
  if (outputsDir) {
@@ -401,6 +430,12 @@ export function createOutputStore(registry, options) {
401
430
  coreTypeOf(typeSlug) {
402
431
  return resolveCoreType(typeSlug);
403
432
  },
433
+ typeFingerprint(typeSlug) {
434
+ return resolveTypeFingerprint(typeSlug);
435
+ },
436
+ validateWrite(o) {
437
+ return checkWritable(o);
438
+ },
404
439
  integrity() {
405
440
  // Force the full hydrate first, so reads stay consistent with what we are about to
406
441
  // report — an integrity report over a partially-hydrated store would itself be the