@eir-labs/coltrane 0.4.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 (279) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +85 -0
  3. package/agents/anticipation-mapper.json +34 -0
  4. package/agents/claim-amender.json +34 -0
  5. package/agents/claim-architect.json +34 -0
  6. package/agents/claim-rewriter.json +32 -0
  7. package/agents/delivery-finalizer.json +40 -0
  8. package/agents/diamond-cutter.json +33 -0
  9. package/agents/disclosure-analyst.json +26 -0
  10. package/agents/domain-explorer.json +37 -0
  11. package/agents/e2e-runner.json +34 -0
  12. package/agents/e2e-suite-judge.json +26 -0
  13. package/agents/event-clusterer.json +29 -0
  14. package/agents/novelty-searcher.json +40 -0
  15. package/agents/patent-browser-scout.json +49 -0
  16. package/agents/patent-examiner.json +36 -0
  17. package/agents/phase_agents/claim-rewriter.md +44 -0
  18. package/agents/phase_agents/delivery-finalizer.md +30 -0
  19. package/agents/phase_agents/diamond-cutter.md +47 -0
  20. package/agents/phase_agents/domain-explorer.md +27 -0
  21. package/agents/phase_agents/novelty-searcher.md +50 -0
  22. package/agents/phase_agents/problem-definer.md +32 -0
  23. package/agents/phase_agents/solution-developer.md +26 -0
  24. package/agents/phase_agents/verdict-judger.md +70 -0
  25. package/agents/players/audience-modeler.md +40 -0
  26. package/agents/players/chain-audit-keeper.md +41 -0
  27. package/agents/players/illumination-reviewer.md +42 -0
  28. package/agents/players/methodology-cadence-keeper.md +42 -0
  29. package/agents/players/substrate-edge-keeper.md +45 -0
  30. package/agents/prior-art-scout.json +45 -0
  31. package/agents/problem-definer.json +35 -0
  32. package/agents/seeds/steve_seed_a.json +12 -0
  33. package/agents/seeds/steve_seed_b.json +12 -0
  34. package/agents/seeds/steve_seed_c.json +12 -0
  35. package/agents/seeds/steve_seed_d.json +12 -0
  36. package/agents/sensor.json +22 -0
  37. package/agents/solution-developer.json +35 -0
  38. package/agents/source-walker.json +38 -0
  39. package/agents/spec-drafter.json +31 -0
  40. package/agents/sub_thread_soft_judge.json +26 -0
  41. package/agents/sub_thread_trace_sensor.json +22 -0
  42. package/agents/summarizer.json +25 -0
  43. package/agents/synthesis-writer.json +29 -0
  44. package/agents/triage-judge.json +39 -0
  45. package/agents/user_flow_judge.json +26 -0
  46. package/agents/user_flow_sensor.json +22 -0
  47. package/agents/verdict-judger.json +39 -0
  48. package/core_types/artifact.json +17 -0
  49. package/core_types/interpretation.json +16 -0
  50. package/core_types/judgment.json +16 -0
  51. package/core_types/plan.json +16 -0
  52. package/core_types/signal.json +16 -0
  53. package/core_types/verdict.json +27 -0
  54. package/dist/src/access_grant.d.ts +46 -0
  55. package/dist/src/access_grant.js +76 -0
  56. package/dist/src/access_grant.js.map +1 -0
  57. package/dist/src/acoustics.d.ts +9 -0
  58. package/dist/src/acoustics.js +65 -0
  59. package/dist/src/acoustics.js.map +1 -0
  60. package/dist/src/agent_profile.d.ts +36 -0
  61. package/dist/src/agent_profile.js +57 -0
  62. package/dist/src/agent_profile.js.map +1 -0
  63. package/dist/src/bifrost_invoker.d.ts +33 -0
  64. package/dist/src/bifrost_invoker.js +85 -0
  65. package/dist/src/bifrost_invoker.js.map +1 -0
  66. package/dist/src/canonical_core_types.d.ts +2 -0
  67. package/dist/src/canonical_core_types.js +111 -0
  68. package/dist/src/canonical_core_types.js.map +1 -0
  69. package/dist/src/canonical_form.d.ts +55 -0
  70. package/dist/src/canonical_form.js +93 -0
  71. package/dist/src/canonical_form.js.map +1 -0
  72. package/dist/src/charter.d.ts +37 -0
  73. package/dist/src/charter.js +86 -0
  74. package/dist/src/charter.js.map +1 -0
  75. package/dist/src/circle_of_fifths.d.ts +27 -0
  76. package/dist/src/circle_of_fifths.js +78 -0
  77. package/dist/src/circle_of_fifths.js.map +1 -0
  78. package/dist/src/claude_invoker.d.ts +102 -0
  79. package/dist/src/claude_invoker.js +760 -0
  80. package/dist/src/claude_invoker.js.map +1 -0
  81. package/dist/src/coltrane_profile.d.ts +87 -0
  82. package/dist/src/coltrane_profile.js +132 -0
  83. package/dist/src/coltrane_profile.js.map +1 -0
  84. package/dist/src/composition.d.ts +57 -0
  85. package/dist/src/composition.js +447 -0
  86. package/dist/src/composition.js.map +1 -0
  87. package/dist/src/core_types.d.ts +6 -0
  88. package/dist/src/core_types.js +25 -0
  89. package/dist/src/core_types.js.map +1 -0
  90. package/dist/src/document_factory.d.ts +89 -0
  91. package/dist/src/document_factory.js +176 -0
  92. package/dist/src/document_factory.js.map +1 -0
  93. package/dist/src/genome_schema.d.ts +512 -0
  94. package/dist/src/genome_schema.js +168 -0
  95. package/dist/src/genome_schema.js.map +1 -0
  96. package/dist/src/genome_writer.d.ts +67 -0
  97. package/dist/src/genome_writer.js +179 -0
  98. package/dist/src/genome_writer.js.map +1 -0
  99. package/dist/src/gig_song.d.ts +29 -0
  100. package/dist/src/gig_song.js +56 -0
  101. package/dist/src/gig_song.js.map +1 -0
  102. package/dist/src/gig_tracker.d.ts +54 -0
  103. package/dist/src/gig_tracker.js +109 -0
  104. package/dist/src/gig_tracker.js.map +1 -0
  105. package/dist/src/harmonic_validation.d.ts +11 -0
  106. package/dist/src/harmonic_validation.js +35 -0
  107. package/dist/src/harmonic_validation.js.map +1 -0
  108. package/dist/src/hooks.d.ts +27 -0
  109. package/dist/src/hooks.js +2 -0
  110. package/dist/src/hooks.js.map +1 -0
  111. package/dist/src/index.d.ts +36 -0
  112. package/dist/src/index.js +37 -0
  113. package/dist/src/index.js.map +1 -0
  114. package/dist/src/jsong.d.ts +47 -0
  115. package/dist/src/jsong.js +130 -0
  116. package/dist/src/jsong.js.map +1 -0
  117. package/dist/src/judges/user_flow_judge.d.ts +89 -0
  118. package/dist/src/judges/user_flow_judge.js +200 -0
  119. package/dist/src/judges/user_flow_judge.js.map +1 -0
  120. package/dist/src/learner.d.ts +37 -0
  121. package/dist/src/learner.js +30 -0
  122. package/dist/src/learner.js.map +1 -0
  123. package/dist/src/ledger.d.ts +225 -0
  124. package/dist/src/ledger.js +306 -0
  125. package/dist/src/ledger.js.map +1 -0
  126. package/dist/src/loader.d.ts +87 -0
  127. package/dist/src/loader.js +504 -0
  128. package/dist/src/loader.js.map +1 -0
  129. package/dist/src/mcp.d.ts +23 -0
  130. package/dist/src/mcp.js +125 -0
  131. package/dist/src/mcp.js.map +1 -0
  132. package/dist/src/modulation_path.d.ts +42 -0
  133. package/dist/src/modulation_path.js +60 -0
  134. package/dist/src/modulation_path.js.map +1 -0
  135. package/dist/src/output_validation.d.ts +19 -0
  136. package/dist/src/output_validation.js +51 -0
  137. package/dist/src/output_validation.js.map +1 -0
  138. package/dist/src/outputs.d.ts +125 -0
  139. package/dist/src/outputs.js +452 -0
  140. package/dist/src/outputs.js.map +1 -0
  141. package/dist/src/overtones.d.ts +42 -0
  142. package/dist/src/overtones.js +98 -0
  143. package/dist/src/overtones.js.map +1 -0
  144. package/dist/src/player_to_claude_code.d.ts +17 -0
  145. package/dist/src/player_to_claude_code.js +141 -0
  146. package/dist/src/player_to_claude_code.js.map +1 -0
  147. package/dist/src/playwright_cage.d.ts +28 -0
  148. package/dist/src/playwright_cage.js +47 -0
  149. package/dist/src/playwright_cage.js.map +1 -0
  150. package/dist/src/polyphony.d.ts +46 -0
  151. package/dist/src/polyphony.js +91 -0
  152. package/dist/src/polyphony.js.map +1 -0
  153. package/dist/src/portfolio.d.ts +52 -0
  154. package/dist/src/portfolio.js +186 -0
  155. package/dist/src/portfolio.js.map +1 -0
  156. package/dist/src/pricing.d.ts +23 -0
  157. package/dist/src/pricing.js +16 -0
  158. package/dist/src/pricing.js.map +1 -0
  159. package/dist/src/registry.d.ts +46 -0
  160. package/dist/src/registry.js +199 -0
  161. package/dist/src/registry.js.map +1 -0
  162. package/dist/src/runtime.d.ts +304 -0
  163. package/dist/src/runtime.js +1099 -0
  164. package/dist/src/runtime.js.map +1 -0
  165. package/dist/src/server.d.ts +88 -0
  166. package/dist/src/server.js +1692 -0
  167. package/dist/src/server.js.map +1 -0
  168. package/dist/src/server_entry.d.ts +2 -0
  169. package/dist/src/server_entry.js +40 -0
  170. package/dist/src/server_entry.js.map +1 -0
  171. package/dist/src/server_relay.d.ts +82 -0
  172. package/dist/src/server_relay.js +341 -0
  173. package/dist/src/server_relay.js.map +1 -0
  174. package/dist/src/simulate.d.ts +60 -0
  175. package/dist/src/simulate.js +72 -0
  176. package/dist/src/simulate.js.map +1 -0
  177. package/dist/src/skill_runner.mjs +34 -0
  178. package/dist/src/skill_subprocess.d.ts +65 -0
  179. package/dist/src/skill_subprocess.js +132 -0
  180. package/dist/src/skill_subprocess.js.map +1 -0
  181. package/dist/src/skills.d.ts +85 -0
  182. package/dist/src/skills.js +258 -0
  183. package/dist/src/skills.js.map +1 -0
  184. package/dist/src/subthread_recorder.d.ts +68 -0
  185. package/dist/src/subthread_recorder.js +166 -0
  186. package/dist/src/subthread_recorder.js.map +1 -0
  187. package/dist/src/tensor_read.d.ts +38 -0
  188. package/dist/src/tensor_read.js +60 -0
  189. package/dist/src/tensor_read.js.map +1 -0
  190. package/dist/src/test_honest_broker.d.ts +34 -0
  191. package/dist/src/test_honest_broker.js +155 -0
  192. package/dist/src/test_honest_broker.js.map +1 -0
  193. package/dist/src/test_topology.d.ts +22 -0
  194. package/dist/src/test_topology.js +137 -0
  195. package/dist/src/test_topology.js.map +1 -0
  196. package/dist/src/tones.d.ts +20 -0
  197. package/dist/src/tones.js +81 -0
  198. package/dist/src/tones.js.map +1 -0
  199. package/dist/src/tool_providers.d.ts +45 -0
  200. package/dist/src/tool_providers.js +104 -0
  201. package/dist/src/tool_providers.js.map +1 -0
  202. package/dist/src/type_versioning.d.ts +23 -0
  203. package/dist/src/type_versioning.js +31 -0
  204. package/dist/src/type_versioning.js.map +1 -0
  205. package/dist/src/version.d.ts +28 -0
  206. package/dist/src/version.js +86 -0
  207. package/dist/src/version.js.map +1 -0
  208. package/domain_types/claim-draft.json +34 -0
  209. package/domain_types/coverage-report.json +31 -0
  210. package/domain_types/draft-agent-profile.json +31 -0
  211. package/domain_types/draft-domain-type.json +28 -0
  212. package/domain_types/draft-standard.json +46 -0
  213. package/domain_types/e2e-observation.json +32 -0
  214. package/domain_types/e2e-report.json +30 -0
  215. package/domain_types/e2e-target.json +26 -0
  216. package/domain_types/e2e-verdict.json +26 -0
  217. package/domain_types/examine-round-record.json +40 -0
  218. package/domain_types/examiner-rejection.json +28 -0
  219. package/domain_types/failure-modes.json +31 -0
  220. package/domain_types/invention-analysis.json +34 -0
  221. package/domain_types/invention-spec.json +34 -0
  222. package/domain_types/novelty-analysis.json +28 -0
  223. package/domain_types/novelty-verdict.json +35 -0
  224. package/domain_types/parsed-conversation-trace.json +38 -0
  225. package/domain_types/pattern-extraction.json +62 -0
  226. package/domain_types/prior-art-hit.json +50 -0
  227. package/domain_types/project-charter.json +71 -0
  228. package/domain_types/provisional-draft.json +34 -0
  229. package/domain_types/raw-note.json +19 -0
  230. package/domain_types/repo-survey.json +28 -0
  231. package/domain_types/seeding-verdict.json +70 -0
  232. package/domain_types/soft-verdict.json +55 -0
  233. package/domain_types/summary.json +19 -0
  234. package/domain_types/triage-verdict.json +59 -0
  235. package/domain_types/user-flow-transcript.json +43 -0
  236. package/domain_types/user-flow-verdict.json +60 -0
  237. package/domain_types/verdict-record.json +39 -0
  238. package/package.json +82 -0
  239. package/skills/citation-verify/fixtures/basic.json +14 -0
  240. package/skills/citation-verify/meta.json +10 -0
  241. package/skills/citation-verify/skill.mjs +26 -0
  242. package/skills/claim-element-decompose/fixtures/basic.json +11 -0
  243. package/skills/claim-element-decompose/meta.json +10 -0
  244. package/skills/claim-element-decompose/skill.mjs +14 -0
  245. package/skills/diamond-cutting-discipline/fixtures/basic.json +13 -0
  246. package/skills/diamond-cutting-discipline/meta.json +19 -0
  247. package/skills/diamond-cutting-discipline/skill.md +46 -0
  248. package/skills/element-mapping-matrix/fixtures/basic.json +13 -0
  249. package/skills/element-mapping-matrix/meta.json +10 -0
  250. package/skills/element-mapping-matrix/skill.mjs +20 -0
  251. package/skills/number-adder/fixtures/basic.json +9 -0
  252. package/skills/number-adder/meta.json +10 -0
  253. package/skills/number-adder/skill.mjs +12 -0
  254. package/skills/patent-fetch/fixtures/parse.json +18 -0
  255. package/skills/patent-fetch/meta.json +11 -0
  256. package/skills/patent-fetch/skill.mjs +34 -0
  257. package/skills/query-expand/fixtures/basic.json +14 -0
  258. package/skills/query-expand/meta.json +10 -0
  259. package/skills/query-expand/skill.mjs +29 -0
  260. package/skills/run-vitest-band/fixtures/basic.json +9 -0
  261. package/skills/run-vitest-band/meta.json +18 -0
  262. package/skills/run-vitest-band/skill.mjs +22 -0
  263. package/skills/statutory-checklist/fixtures/basic.json +16 -0
  264. package/skills/statutory-checklist/meta.json +10 -0
  265. package/skills/statutory-checklist/skill.mjs +25 -0
  266. package/skills/summarize-tight/fixtures/basic.json +13 -0
  267. package/skills/summarize-tight/meta.json +20 -0
  268. package/skills/summarize-tight/skill.md +1 -0
  269. package/skills/verdict-gate/fixtures/basic.json +9 -0
  270. package/skills/verdict-gate/meta.json +10 -0
  271. package/skills/verdict-gate/skill.mjs +82 -0
  272. package/standards/e2e-suite-v0.json +44 -0
  273. package/standards/patent-triage-v0.json +98 -0
  274. package/standards/patent-triage-v1.json +84 -0
  275. package/standards/seed-from-local-repos-v0.json +115 -0
  276. package/standards/sub_thread_invocation.json +50 -0
  277. package/standards/summarize.json +40 -0
  278. package/standards/synthesis-walk-v0.json +108 -0
  279. package/standards/user_flow_correctness.json +57 -0
@@ -0,0 +1,125 @@
1
+ import { zodToMcpProps, AgentSchema, StandardSchema, SkillSchema, DomainTypeSchema } from "./genome_schema.js";
2
+ // A property value is either a bare JSON-schema type name (the common case) or a full schema
3
+ // fragment — needed for fields that are honestly nullable, e.g. a measurement the engine has no
4
+ // data to compute (#238). Declaring those as plain "number" is the same lie as returning 1.0.
5
+ const obj = (props) => ({
6
+ type: "object",
7
+ properties: Object.fromEntries(Object.entries(props).map(([k, v]) => [k, typeof v === "string" ? { type: v } : v])),
8
+ });
9
+ const nullable = (type) => ({ type: [type, "null"] });
10
+ // Select named fields from a generated prop map (preserving their derived JSON types).
11
+ const pickProps = (src, keys) => Object.fromEntries(keys.filter((k) => src[k] !== undefined).map((k) => [k, src[k]]));
12
+ // type_register's surface is the AUTHORED projection of DomainTypeSchema (the single source) — field
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.)
16
+ const DT_AUTHORED = pickProps(zodToMcpProps(DomainTypeSchema), ["slug", "extends", "domain", "schema", "required_fields"]);
17
+ 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: "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
+ { 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" }) },
24
+ // #217 — advertised contract == handler. The five filters src/server.ts actually reads, and
25
+ // the two keys it actually returns. The old {company_id, domain} in / {gigs,
26
+ // performance_summary} out overlapped the handler in neither direction, so a client
27
+ // following the surface got an UNFILTERED DUMP of the audit trail and then looked for a key
28
+ // that was never returned.
29
+ { 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" }) },
31
+ { 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" }) },
33
+ { 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" }) },
35
+ { slug: "standard_compose", category: "build", input_schema: obj(zodToMcpProps(StandardSchema)), output_schema: obj({ standard_id: "string", validation_result: "object" }) },
36
+ // #239 — `basis`/`sample_size` say WHERE the estimate came from (a measured mean of real runs,
37
+ // the standard's real structure, or a per-slug guess). estimated_duration_ms is the key the
38
+ // handler actually returns; the old `estimated_duration` was never present on a response.
39
+ { 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
+ // #237 — `depth` is read now (and rejected when unrecognized); the response echoes the depth
41
+ // 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" }) },
44
+ { 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
+ // #251 — `status` is the field both existing tests actually assert and it was not advertised.
46
+ // `aborted` now means "this call delivered a cancellation to a live run", not "we looked at
47
+ // the stores and guessed"; `cancellable` says whether this server could reach the run at all.
48
+ { 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" }) },
51
+ // #238 — success_rate and trend are NULLABLE, because the engine genuinely cannot compute
52
+ // them (a failed gig writes no ledger row, so the denominator does not exist) and a hardcoded
53
+ // 1.0 is a fabricated measurement presented as a measurement. The `*_basis` strings say why.
54
+ // `cost_usd` is real settled spend off the gig rows (#195), not an output count.
55
+ { slug: "health_check", category: "improve", input_schema: obj({ entity_type: "string", kind: "string", slug: "string", window: "string" }), output_schema: obj({ entity: "string", kind: "string", output_count: "number", execution_count: "number", usage: "number", success_rate: nullable("number"), success_rate_basis: "string", cost: "number", cost_usd: "number", cost_basis: "string", trend: nullable("string"), trend_basis: "string", recommendations: "array" }) },
56
+ // #255 — the integrity fields are ADVERTISED, not just returned. This tool's whole purpose
57
+ // is that an operator can ask whether the system is healthy; a damage report they cannot
58
+ // discover from the schema is only marginally better than one that is never computed.
59
+ { slug: "system_health", category: "improve", input_schema: obj({ window: "string" }), output_schema: obj({ gigs_run: "number", cost: "number", type_stats: "object", agent_stats: "object", tool_stats: "object", bottlenecks: "array", budget: "object", load_errors: "array", ledger_integrity: "object", outputs_integrity: "object", counts_complete: "boolean", counts_complete_basis: "string" }) },
60
+ // genome_reload — Rob #130. Re-reads agents/standards/types/skills/evals from
61
+ // disk and updates the live deps in place (no MCP server restart needed).
62
+ // Returns the diff vs the prior state, plus any load_errors from the new genome.
63
+ { slug: "genome_reload", category: "improve", input_schema: obj({}), output_schema: obj({ reloaded: "boolean", changes: "object", load_errors: "array" }) },
64
+ // server_restart — Rob #N / PR #141. Picks up new server bytes after
65
+ // npm run build without ending the Claude Code conversation. This entry
66
+ // exists so coltrane's own introspection (tool_inspect, system_audit)
67
+ // sees the tool — but the server itself never executes it. The relay
68
+ // parent-process catches `tools/call server_restart` before it reaches
69
+ // the child server, kills + respawns the child, and replies. If the
70
+ // server-side handler below is ever reached, the relay is misconfigured
71
+ // (typically: COLTRANE_SERVER_DIRECT=1 was set, bypassing the relay).
72
+ { slug: "server_restart", category: "improve", input_schema: obj({}), output_schema: obj({ restarted: "boolean", note: "string" }) },
73
+ { 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" }) },
75
+ { slug: "tool_propose", category: "improve", input_schema: obj({ slug: "string", type: "string", spec: "object", reason: "string" }), output_schema: obj({ proposal_id: "string" }) },
76
+ // tool_register — close the propose→register loop. Adds a slug to the live
77
+ // tool registry so subsequent agent_define calls can grant scope to it.
78
+ // Without this, propose-only governance is half-built: there is no path to
79
+ // legitimately admit a tool, and the rejection gate becomes a permanent block.
80
+ { slug: "tool_register", category: "improve", input_schema: obj({ slug: "string", type: "string", spec: "object", category: "string" }), output_schema: obj({ registered: "boolean", slug: "string" }) },
81
+ { 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" }) },
84
+ { 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" }) },
87
+ { 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" }) },
90
+ ];
91
+ // Lifecycle promotion order — forward-only. agent/standard share the same chain;
92
+ // skill includes the explicit `testing` step before active.
93
+ export const AGENT_STATUS_ORDER = ["draft", "review", "approved", "active", "retired"];
94
+ export const STANDARD_STATUS_ORDER = ["draft", "active", "retired"];
95
+ export const SKILL_STATUS_ORDER = ["draft", "testing", "active", "retired"];
96
+ export class PromotionError extends Error {
97
+ }
98
+ /** Validate a forward-only transition through the given status chain. Throws on
99
+ * unknown current/target or any backward/sideways move. Idempotent (current = target). */
100
+ export function checkPromotion(current, target, order) {
101
+ const ci = order.indexOf(current);
102
+ const ti = order.indexOf(target);
103
+ if (ci < 0)
104
+ throw new PromotionError(`unknown current status "${current}"`);
105
+ if (ti < 0)
106
+ throw new PromotionError(`unknown target status "${target}"`);
107
+ if (ti < ci)
108
+ throw new PromotionError(`cannot promote backwards: ${current} → ${target}`);
109
+ }
110
+ const ALWAYS_APPROVAL = new Set([
111
+ "tool_propose",
112
+ "tool_deprecate_propose",
113
+ "charter_suggest_update",
114
+ ]);
115
+ const APPROVAL_IF_BREAKING = new Set(["type_register", "type_extend"]);
116
+ export function requiresApproval(q) {
117
+ if (ALWAYS_APPROVAL.has(q.slug))
118
+ return true;
119
+ if (APPROVAL_IF_BREAKING.has(q.slug))
120
+ return q.change_class === "breaking";
121
+ if (q.slug === "proposal_create")
122
+ return q.target_kind === "permissions";
123
+ return false;
124
+ }
125
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { type Key, type ModulationKind } from "./circle_of_fifths.js";
2
+ export interface PhaseStep {
3
+ phase: string;
4
+ key: Key;
5
+ }
6
+ export interface PathTransition {
7
+ from_phase: string;
8
+ to_phase: string;
9
+ from_key: Key;
10
+ to_key: Key;
11
+ distance: number;
12
+ kind: ModulationKind;
13
+ }
14
+ export interface ModulationPath {
15
+ steps: readonly PhaseStep[];
16
+ transitions: readonly PathTransition[];
17
+ starts_in: Key;
18
+ ends_in: Key;
19
+ }
20
+ export declare class ModulationPathError extends Error {
21
+ }
22
+ export declare function buildPath(steps: readonly PhaseStep[]): ModulationPath;
23
+ /**
24
+ * Lawful-only: every transition is either stay or lawful (no jarring jumps).
25
+ * Used by the validation tensor as ONE channel-read — not a global verdict.
26
+ */
27
+ export declare function isLawful(path: ModulationPath): boolean;
28
+ /**
29
+ * Count jarring transitions. Returned as a number, not a boolean, so a
30
+ * validator can weight it inside a tensor instead of collapsing to pass/fail.
31
+ */
32
+ export declare function jarringCount(path: ModulationPath): number;
33
+ /**
34
+ * Total distance traveled along the trajectory. Sum of per-step circle-of-fifths
35
+ * distances. NOT a verdict — a feature for the validation tensor.
36
+ */
37
+ export declare function totalTravel(path: ModulationPath): number;
38
+ /**
39
+ * Did the path return to its starting key (closed loop)? Cadence-shaped:
40
+ * a song that resolves to where it began. Feature, not verdict.
41
+ */
42
+ export declare function returnsHome(path: ModulationPath): boolean;
@@ -0,0 +1,60 @@
1
+ // The per-gig journey through 12-key space. A modulation path is the song's
2
+ // trajectory: which key it's in at each phase, what kind of move it made to get
3
+ // there. NOT collapsed to a scalar — preserved as a per-phase sequence so a
4
+ // validator can read it as one channel in a multi-channel tensor.
5
+ import { circleOfFifthsDistance, classifyModulation, } from "./circle_of_fifths.js";
6
+ export class ModulationPathError extends Error {
7
+ }
8
+ export function buildPath(steps) {
9
+ if (steps.length === 0) {
10
+ throw new ModulationPathError("modulation path requires at least one step");
11
+ }
12
+ const transitions = [];
13
+ for (let i = 1; i < steps.length; i++) {
14
+ const a = steps[i - 1];
15
+ const b = steps[i];
16
+ transitions.push({
17
+ from_phase: a.phase,
18
+ to_phase: b.phase,
19
+ from_key: a.key,
20
+ to_key: b.key,
21
+ distance: circleOfFifthsDistance(a.key, b.key),
22
+ kind: classifyModulation(a.key, b.key),
23
+ });
24
+ }
25
+ return {
26
+ steps,
27
+ transitions,
28
+ starts_in: steps[0].key,
29
+ ends_in: steps[steps.length - 1].key,
30
+ };
31
+ }
32
+ /**
33
+ * Lawful-only: every transition is either stay or lawful (no jarring jumps).
34
+ * Used by the validation tensor as ONE channel-read — not a global verdict.
35
+ */
36
+ export function isLawful(path) {
37
+ return path.transitions.every((t) => t.kind !== "jarring");
38
+ }
39
+ /**
40
+ * Count jarring transitions. Returned as a number, not a boolean, so a
41
+ * validator can weight it inside a tensor instead of collapsing to pass/fail.
42
+ */
43
+ export function jarringCount(path) {
44
+ return path.transitions.filter((t) => t.kind === "jarring").length;
45
+ }
46
+ /**
47
+ * Total distance traveled along the trajectory. Sum of per-step circle-of-fifths
48
+ * distances. NOT a verdict — a feature for the validation tensor.
49
+ */
50
+ export function totalTravel(path) {
51
+ return path.transitions.reduce((acc, t) => acc + t.distance, 0);
52
+ }
53
+ /**
54
+ * Did the path return to its starting key (closed loop)? Cadence-shaped:
55
+ * a song that resolves to where it began. Feature, not verdict.
56
+ */
57
+ export function returnsHome(path) {
58
+ return path.starts_in === path.ends_in;
59
+ }
60
+ //# sourceMappingURL=modulation_path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modulation_path.js","sourceRoot":"","sources":["../../src/modulation_path.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,gFAAgF;AAChF,4EAA4E;AAC5E,kEAAkE;AAElE,OAAO,EAEL,sBAAsB,EACtB,kBAAkB,GAEnB,MAAM,uBAAuB,CAAC;AA0B/B,MAAM,OAAO,mBAAoB,SAAQ,KAAK;CAAG;AAEjD,MAAM,UAAU,SAAS,CAAC,KAA2B;IACnD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,mBAAmB,CAAC,4CAA4C,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,WAAW,GAAqB,EAAE,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACpB,WAAW,CAAC,IAAI,CAAC;YACf,UAAU,EAAE,CAAC,CAAC,KAAK;YACnB,QAAQ,EAAE,CAAC,CAAC,KAAK;YACjB,QAAQ,EAAE,CAAC,CAAC,GAAG;YACf,MAAM,EAAE,CAAC,CAAC,GAAG;YACb,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;YAC9C,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IACD,OAAO;QACL,KAAK;QACL,WAAW;QACX,SAAS,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG;QACxB,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,GAAG;KACtC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAoB;IAC3C,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAoB;IAC/C,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAoB;IAC9C,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAoB;IAC9C,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC;AACzC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type CoreType } from "./core_types.js";
2
+ export interface OutputCandidate {
3
+ core_type: CoreType;
4
+ domain_type: string;
5
+ data: Record<string, unknown>;
6
+ }
7
+ export interface ValidationResult {
8
+ valid: boolean;
9
+ reason?: string;
10
+ }
11
+ export interface SubstanceRule {
12
+ field: string;
13
+ /** the declared JSON type of the floor field — decides what "empty" means */
14
+ shape: "array" | "string";
15
+ /** for array floors: a property every item must carry as a non-empty string */
16
+ item_requires?: string;
17
+ }
18
+ export declare const CORE_SUBSTANCE: Readonly<Record<CoreType, SubstanceRule>>;
19
+ export declare function validateOutput(out: OutputCandidate): ValidationResult;
@@ -0,0 +1,51 @@
1
+ import { CORE_TYPES } from "./core_types.js";
2
+ export const CORE_SUBSTANCE = {
3
+ Signal: { field: "source", shape: "string" },
4
+ Interpretation: { field: "claims", shape: "array" },
5
+ Plan: { field: "steps", shape: "array" },
6
+ Judgment: { field: "criteria", shape: "array" },
7
+ Artifact: { field: "validation_criteria", shape: "array" },
8
+ Verdict: { field: "checks", shape: "array", item_requires: "method" },
9
+ };
10
+ // Compile-time + load-time guard: every core has a floor. A seventh core (or a rename)
11
+ // cannot land without deciding what makes it substantive.
12
+ for (const core of CORE_TYPES) {
13
+ if (!CORE_SUBSTANCE[core])
14
+ throw new Error(`core type "${core}" has no substance invariant`);
15
+ }
16
+ export function validateOutput(out) {
17
+ const rule = CORE_SUBSTANCE[out.core_type];
18
+ // An unrecognised core_type is not this function's contract to police (the loader and
19
+ // the registry own that); it simply has no floor to apply.
20
+ if (!rule)
21
+ return { valid: true };
22
+ const value = out.data[rule.field];
23
+ if (rule.shape === "array") {
24
+ if (!Array.isArray(value) || value.length === 0) {
25
+ return {
26
+ valid: false,
27
+ reason: `${out.core_type} requires non-empty ${rule.field}[]`,
28
+ };
29
+ }
30
+ if (rule.item_requires) {
31
+ for (const item of value) {
32
+ const got = item?.[rule.item_requires];
33
+ if (typeof got !== "string" || got.length === 0) {
34
+ return {
35
+ valid: false,
36
+ reason: `${out.core_type}.${rule.field}[*].${rule.item_requires} is required (string)`,
37
+ };
38
+ }
39
+ }
40
+ }
41
+ return { valid: true };
42
+ }
43
+ if (typeof value !== "string" || value.length === 0) {
44
+ return {
45
+ valid: false,
46
+ reason: `${out.core_type} requires a non-empty ${rule.field}`,
47
+ };
48
+ }
49
+ return { valid: true };
50
+ }
51
+ //# sourceMappingURL=output_validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output_validation.js","sourceRoot":"","sources":["../../src/output_validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,iBAAiB,CAAC;AA2E5D,MAAM,CAAC,MAAM,cAAc,GAA8C;IACvE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC5C,cAAc,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;IACnD,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IACxC,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE;IAC/C,QAAQ,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE;IAC1D,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE;CACtE,CAAC;AAEF,uFAAuF;AACvF,0DAA0D;AAC1D,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;IAC9B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,8BAA8B,CAAC,CAAC;AAC/F,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAoB;IACjD,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC3C,sFAAsF;IACtF,2DAA2D;IAC3D,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAElC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,uBAAuB,IAAI,CAAC,KAAK,IAAI;aAC9D,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,KAAK,MAAM,IAAI,IAAI,KAAqB,EAAE,CAAC;gBACzC,MAAM,GAAG,GAAI,IAAmD,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACvF,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAChD,OAAO;wBACL,KAAK,EAAE,KAAK;wBACZ,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,aAAa,uBAAuB;qBACvF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,yBAAyB,IAAI,CAAC,KAAK,EAAE;SAC9D,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,125 @@
1
+ import type { Registry } from "./registry.js";
2
+ export declare const REF_RELATIONS: readonly ["derived_from", "validates", "challenges", "refines", "triggers", "contains"];
3
+ export type RefRelation = (typeof REF_RELATIONS)[number];
4
+ export interface OutputRecord {
5
+ id: string;
6
+ core_type: string;
7
+ domain_type: string;
8
+ domain_type_version: number;
9
+ domain: string;
10
+ gig_id: string;
11
+ agent_slug: string;
12
+ from_role?: string | undefined;
13
+ phase?: string | undefined;
14
+ primitive: string;
15
+ data: Record<string, unknown>;
16
+ content_sha: string;
17
+ input_refs: string[];
18
+ input_shas: string[];
19
+ created_at: string;
20
+ cost_usd?: number | undefined;
21
+ tokens_used?: number | undefined;
22
+ duration_ms?: number | undefined;
23
+ skill_provenance?: {
24
+ slug: string;
25
+ version: number;
26
+ code_hash: string;
27
+ tier: number;
28
+ } | undefined;
29
+ }
30
+ export interface OutputWrite {
31
+ core_type: string;
32
+ domain_type: string;
33
+ domain_type_version?: number | undefined;
34
+ domain: string;
35
+ gig_id: string;
36
+ agent_slug: string;
37
+ from_role?: string | undefined;
38
+ phase?: string | undefined;
39
+ primitive: string;
40
+ data: Record<string, unknown>;
41
+ input_refs?: string[] | undefined;
42
+ /** content_sha of each input_ref (same order) — the real predecessor hashes (#196). When omitted,
43
+ * write() resolves them from the store by input_refs id. */
44
+ input_shas?: string[] | undefined;
45
+ cost_usd?: number | undefined;
46
+ tokens_used?: number | undefined;
47
+ duration_ms?: number | undefined;
48
+ skill_provenance?: {
49
+ slug: string;
50
+ version: number;
51
+ code_hash: string;
52
+ tier: number;
53
+ } | undefined;
54
+ }
55
+ export interface OutputRef {
56
+ id: string;
57
+ from_output_id: string;
58
+ to_output_id: string;
59
+ relation: RefRelation;
60
+ primitive: string;
61
+ created_at: string;
62
+ }
63
+ export interface Finding {
64
+ id: string;
65
+ gig_id: string;
66
+ pattern_key?: string | undefined;
67
+ severity?: string | undefined;
68
+ title?: string | undefined;
69
+ evidence?: string | undefined;
70
+ location?: string | undefined;
71
+ recommendation?: string | undefined;
72
+ is_novel?: boolean | undefined;
73
+ kpi_impacts?: unknown;
74
+ status?: string | undefined;
75
+ agent_role: string;
76
+ dimension?: string | undefined;
77
+ created_at: string;
78
+ }
79
+ export declare class OutputStoreError extends Error {
80
+ }
81
+ /**
82
+ * One unreadable line in a persisted jsonl file. Same vocabulary as the ledger's
83
+ * `LedgerCorruption` (#211) — two stores in one engine should describe damage the same way.
84
+ */
85
+ export interface OutputStoreCorruption {
86
+ path: string;
87
+ line_no: number;
88
+ reason: string;
89
+ preview: string;
90
+ }
91
+ /**
92
+ * #248 — skip-and-REPORT, the shape PR #256 established for the ledger.
93
+ *
94
+ * A silent skip let a torn append (crash mid-write, disk full) delete an output from `all()`,
95
+ * `trace()` and `output_query` with no signal at all, so the engine reported a SHORTER CHAIN
96
+ * as if it were the whole chain. That is the exact INVERSE of the ledger's old problem, where
97
+ * the same situation threw and took the entire audit surface offline. Two stores, opposite
98
+ * failure modes, neither correct: one hid corruption, the other was destroyed by it. Reads
99
+ * stay forgiving — the intact rows keep serving — and this is how an operator learns the
100
+ * store is damaged.
101
+ */
102
+ export interface OutputStoreIntegrityReport {
103
+ ok: boolean;
104
+ /** jsonl files actually read this session. 0 for a purely in-memory store. */
105
+ scanned: number;
106
+ corrupt: OutputStoreCorruption[];
107
+ }
108
+ export interface OutputStore {
109
+ write(o: OutputWrite): OutputRecord;
110
+ get(id: string): OutputRecord | undefined;
111
+ all(): readonly OutputRecord[];
112
+ addRef(from_output_id: string, to_output_id: string, relation: RefRelation, primitive: string): OutputRef;
113
+ refs(): readonly OutputRef[];
114
+ trace(id: string, opts?: {
115
+ max_depth?: number;
116
+ }): OutputRecord[];
117
+ findings(): Finding[];
118
+ coreTypeOf(typeSlug: string): string | null;
119
+ integrity(): OutputStoreIntegrityReport;
120
+ }
121
+ export interface OutputStoreOptions {
122
+ persistDir?: string | undefined;
123
+ }
124
+ export declare function defaultOutputsPersistDir(): string;
125
+ export declare function createOutputStore(registry: Registry, options?: OutputStoreOptions): OutputStore;