wicked-crew 0.7.46 → 0.7.48

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 (263) hide show
  1. package/dist/api/capture.d.ts +2 -2
  2. package/dist/api/chat-citations.d.ts +10 -1
  3. package/dist/api/chat-citations.d.ts.map +1 -1
  4. package/dist/api/chat-citations.js +28 -0
  5. package/dist/api/chat-citations.js.map +1 -1
  6. package/dist/api/chat-scope.d.ts +4 -2
  7. package/dist/api/chat-scope.d.ts.map +1 -1
  8. package/dist/api/chat-scope.js +35 -3
  9. package/dist/api/chat-scope.js.map +1 -1
  10. package/dist/api/chat-transcripts.d.ts +23 -1
  11. package/dist/api/chat-transcripts.d.ts.map +1 -1
  12. package/dist/api/chat-transcripts.js +61 -6
  13. package/dist/api/chat-transcripts.js.map +1 -1
  14. package/dist/api/delivery-index.d.ts +21 -0
  15. package/dist/api/delivery-index.d.ts.map +1 -1
  16. package/dist/api/delivery-index.js +36 -0
  17. package/dist/api/delivery-index.js.map +1 -1
  18. package/dist/api/elicitation-cache.d.ts +12 -0
  19. package/dist/api/elicitation-cache.d.ts.map +1 -1
  20. package/dist/api/elicitation-cache.js +17 -1
  21. package/dist/api/elicitation-cache.js.map +1 -1
  22. package/dist/api/eval-sample.d.ts +12 -12
  23. package/dist/api/governance-steering.d.ts.map +1 -1
  24. package/dist/api/governance-steering.js +1 -0
  25. package/dist/api/governance-steering.js.map +1 -1
  26. package/dist/api/mcp.d.ts +4 -4
  27. package/dist/api/policy-landing.d.ts +55 -0
  28. package/dist/api/policy-landing.d.ts.map +1 -0
  29. package/dist/api/policy-landing.js +174 -0
  30. package/dist/api/policy-landing.js.map +1 -0
  31. package/dist/api/recording.d.ts +228 -0
  32. package/dist/api/recording.d.ts.map +1 -0
  33. package/dist/api/recording.js +1140 -0
  34. package/dist/api/recording.js.map +1 -0
  35. package/dist/api/routes.d.ts +42 -39
  36. package/dist/api/routes.d.ts.map +1 -1
  37. package/dist/api/routes.js +362 -107
  38. package/dist/api/routes.js.map +1 -1
  39. package/dist/api/run-timing-index.d.ts +17 -0
  40. package/dist/api/run-timing-index.d.ts.map +1 -1
  41. package/dist/api/run-timing-index.js +43 -1
  42. package/dist/api/run-timing-index.js.map +1 -1
  43. package/dist/api/server.d.ts +27 -0
  44. package/dist/api/server.d.ts.map +1 -1
  45. package/dist/api/server.js +168 -4
  46. package/dist/api/server.js.map +1 -1
  47. package/dist/api/testing.d.ts +4 -4
  48. package/dist/api/testing.d.ts.map +1 -1
  49. package/dist/api/testing.js +3 -0
  50. package/dist/api/testing.js.map +1 -1
  51. package/dist/api/watch-routes.d.ts +30 -0
  52. package/dist/api/watch-routes.d.ts.map +1 -0
  53. package/dist/api/watch-routes.js +104 -0
  54. package/dist/api/watch-routes.js.map +1 -0
  55. package/dist/campaigns/routes.d.ts +2 -2
  56. package/dist/cli/index.d.ts.map +1 -1
  57. package/dist/cli/index.js +20 -2
  58. package/dist/cli/index.js.map +1 -1
  59. package/dist/core/adapter.d.ts +52 -1
  60. package/dist/core/adapter.d.ts.map +1 -1
  61. package/dist/core/adapter.js +193 -5
  62. package/dist/core/adapter.js.map +1 -1
  63. package/dist/core/run-identity.js +1 -1
  64. package/dist/core/run-identity.js.map +1 -1
  65. package/dist/core/walkthrough-root.d.ts +21 -0
  66. package/dist/core/walkthrough-root.d.ts.map +1 -0
  67. package/dist/core/walkthrough-root.js +66 -0
  68. package/dist/core/walkthrough-root.js.map +1 -0
  69. package/dist/decisions/chat-recorder.d.ts +129 -0
  70. package/dist/decisions/chat-recorder.d.ts.map +1 -0
  71. package/dist/decisions/chat-recorder.js +367 -0
  72. package/dist/decisions/chat-recorder.js.map +1 -0
  73. package/dist/decisions/consider.d.ts +102 -0
  74. package/dist/decisions/consider.d.ts.map +1 -0
  75. package/dist/decisions/consider.js +207 -0
  76. package/dist/decisions/consider.js.map +1 -0
  77. package/dist/decisions/derive.d.ts +79 -0
  78. package/dist/decisions/derive.d.ts.map +1 -0
  79. package/dist/decisions/derive.js +282 -0
  80. package/dist/decisions/derive.js.map +1 -0
  81. package/dist/decisions/events.d.ts +25 -0
  82. package/dist/decisions/events.d.ts.map +1 -0
  83. package/dist/decisions/events.js +24 -0
  84. package/dist/decisions/events.js.map +1 -0
  85. package/dist/decisions/ingest.d.ts +51 -0
  86. package/dist/decisions/ingest.d.ts.map +1 -0
  87. package/dist/decisions/ingest.js +100 -0
  88. package/dist/decisions/ingest.js.map +1 -0
  89. package/dist/decisions/land.d.ts +100 -0
  90. package/dist/decisions/land.d.ts.map +1 -0
  91. package/dist/decisions/land.js +466 -0
  92. package/dist/decisions/land.js.map +1 -0
  93. package/dist/decisions/ledger.d.ts +60 -0
  94. package/dist/decisions/ledger.d.ts.map +1 -0
  95. package/dist/decisions/ledger.js +246 -0
  96. package/dist/decisions/ledger.js.map +1 -0
  97. package/dist/decisions/routes.d.ts +10 -0
  98. package/dist/decisions/routes.d.ts.map +1 -0
  99. package/dist/decisions/routes.js +141 -0
  100. package/dist/decisions/routes.js.map +1 -0
  101. package/dist/decisions/rules-text.d.ts +21 -0
  102. package/dist/decisions/rules-text.d.ts.map +1 -0
  103. package/dist/decisions/rules-text.js +50 -0
  104. package/dist/decisions/rules-text.js.map +1 -0
  105. package/dist/decisions/types.d.ts +120 -0
  106. package/dist/decisions/types.d.ts.map +1 -0
  107. package/dist/decisions/types.js +19 -0
  108. package/dist/decisions/types.js.map +1 -0
  109. package/dist/editors/csp.d.ts +31 -0
  110. package/dist/editors/csp.d.ts.map +1 -0
  111. package/dist/editors/csp.js +46 -0
  112. package/dist/editors/csp.js.map +1 -0
  113. package/dist/editors/pack-install.d.ts +28 -0
  114. package/dist/editors/pack-install.d.ts.map +1 -0
  115. package/dist/editors/pack-install.js +153 -0
  116. package/dist/editors/pack-install.js.map +1 -0
  117. package/dist/editors/registry.d.ts +142 -0
  118. package/dist/editors/registry.d.ts.map +1 -0
  119. package/dist/editors/registry.js +255 -0
  120. package/dist/editors/registry.js.map +1 -0
  121. package/dist/editors/routes.d.ts +46 -0
  122. package/dist/editors/routes.d.ts.map +1 -0
  123. package/dist/editors/routes.js +166 -0
  124. package/dist/editors/routes.js.map +1 -0
  125. package/dist/interactive/bridge-pool.d.ts +7 -2
  126. package/dist/interactive/bridge-pool.d.ts.map +1 -1
  127. package/dist/interactive/bridge-pool.js +6 -1
  128. package/dist/interactive/bridge-pool.js.map +1 -1
  129. package/dist/interactive/draft-events.d.ts.map +1 -1
  130. package/dist/interactive/draft-events.js +1 -0
  131. package/dist/interactive/draft-events.js.map +1 -1
  132. package/dist/interactive/theme-events.d.ts +119 -0
  133. package/dist/interactive/theme-events.d.ts.map +1 -0
  134. package/dist/interactive/theme-events.js +606 -0
  135. package/dist/interactive/theme-events.js.map +1 -0
  136. package/dist/projects/events.d.ts.map +1 -1
  137. package/dist/projects/events.js +2 -1
  138. package/dist/projects/events.js.map +1 -1
  139. package/dist/projects/routes.d.ts +2 -2
  140. package/dist/projects/state-home-preflight.d.ts.map +1 -1
  141. package/dist/projects/state-home-preflight.js +3 -0
  142. package/dist/projects/state-home-preflight.js.map +1 -1
  143. package/dist/projects/state-home-registry.d.ts.map +1 -1
  144. package/dist/projects/state-home-registry.js +2 -0
  145. package/dist/projects/state-home-registry.js.map +1 -1
  146. package/dist/projects/state-home.d.ts +6 -0
  147. package/dist/projects/state-home.d.ts.map +1 -1
  148. package/dist/projects/state-home.js +28 -1
  149. package/dist/projects/state-home.js.map +1 -1
  150. package/dist/qe/acceptance.d.ts +45 -4
  151. package/dist/qe/acceptance.d.ts.map +1 -1
  152. package/dist/qe/acceptance.js +93 -4
  153. package/dist/qe/acceptance.js.map +1 -1
  154. package/dist/qe/ledger.d.ts +20 -0
  155. package/dist/qe/ledger.d.ts.map +1 -1
  156. package/dist/qe/ledger.js +34 -0
  157. package/dist/qe/ledger.js.map +1 -1
  158. package/dist/qe/walkthrough-acceptance.d.ts +82 -0
  159. package/dist/qe/walkthrough-acceptance.d.ts.map +1 -0
  160. package/dist/qe/walkthrough-acceptance.js +248 -0
  161. package/dist/qe/walkthrough-acceptance.js.map +1 -0
  162. package/dist/skills/base-skill.d.ts.map +1 -1
  163. package/dist/skills/base-skill.js +3 -2
  164. package/dist/skills/base-skill.js.map +1 -1
  165. package/dist/skills/plugin-source.d.ts +19 -1
  166. package/dist/skills/plugin-source.d.ts.map +1 -1
  167. package/dist/skills/plugin-source.js +31 -2
  168. package/dist/skills/plugin-source.js.map +1 -1
  169. package/dist/skills/runtime.d.ts +11 -2
  170. package/dist/skills/runtime.d.ts.map +1 -1
  171. package/dist/skills/runtime.js +29 -1
  172. package/dist/skills/runtime.js.map +1 -1
  173. package/dist/skills/store.d.ts +14 -1
  174. package/dist/skills/store.d.ts.map +1 -1
  175. package/dist/skills/store.js +19 -5
  176. package/dist/skills/store.js.map +1 -1
  177. package/dist/standing-orders/routes.d.ts +22 -22
  178. package/dist/standing-orders/store.d.ts +10 -10
  179. package/dist/watch/checks/check-failed.d.ts +24 -0
  180. package/dist/watch/checks/check-failed.d.ts.map +1 -0
  181. package/dist/watch/checks/check-failed.js +56 -0
  182. package/dist/watch/checks/check-failed.js.map +1 -0
  183. package/dist/watch/checks/claim-vs-evidence.d.ts +30 -0
  184. package/dist/watch/checks/claim-vs-evidence.d.ts.map +1 -0
  185. package/dist/watch/checks/claim-vs-evidence.js +152 -0
  186. package/dist/watch/checks/claim-vs-evidence.js.map +1 -0
  187. package/dist/watch/checks/deliver-audit.d.ts +19 -0
  188. package/dist/watch/checks/deliver-audit.d.ts.map +1 -0
  189. package/dist/watch/checks/deliver-audit.js +129 -0
  190. package/dist/watch/checks/deliver-audit.js.map +1 -0
  191. package/dist/watch/checks/index.d.ts +8 -0
  192. package/dist/watch/checks/index.d.ts.map +1 -0
  193. package/dist/watch/checks/index.js +24 -0
  194. package/dist/watch/checks/index.js.map +1 -0
  195. package/dist/watch/checks/lag.d.ts +24 -0
  196. package/dist/watch/checks/lag.d.ts.map +1 -0
  197. package/dist/watch/checks/lag.js +55 -0
  198. package/dist/watch/checks/lag.js.map +1 -0
  199. package/dist/watch/checks/quiet-after-claim.d.ts +17 -0
  200. package/dist/watch/checks/quiet-after-claim.d.ts.map +1 -0
  201. package/dist/watch/checks/quiet-after-claim.js +89 -0
  202. package/dist/watch/checks/quiet-after-claim.js.map +1 -0
  203. package/dist/watch/checks/ungated.d.ts +12 -0
  204. package/dist/watch/checks/ungated.d.ts.map +1 -0
  205. package/dist/watch/checks/ungated.js +64 -0
  206. package/dist/watch/checks/ungated.js.map +1 -0
  207. package/dist/watch/checks/warned-rule.d.ts +26 -0
  208. package/dist/watch/checks/warned-rule.d.ts.map +1 -0
  209. package/dist/watch/checks/warned-rule.js +126 -0
  210. package/dist/watch/checks/warned-rule.js.map +1 -0
  211. package/dist/watch/emit.d.ts +122 -0
  212. package/dist/watch/emit.d.ts.map +1 -0
  213. package/dist/watch/emit.js +443 -0
  214. package/dist/watch/emit.js.map +1 -0
  215. package/dist/watch/events.d.ts +21 -0
  216. package/dist/watch/events.d.ts.map +1 -0
  217. package/dist/watch/events.js +21 -0
  218. package/dist/watch/events.js.map +1 -0
  219. package/dist/watch/keys.d.ts +15 -0
  220. package/dist/watch/keys.d.ts.map +1 -0
  221. package/dist/watch/keys.js +23 -0
  222. package/dist/watch/keys.js.map +1 -0
  223. package/dist/watch/lanes.d.ts +41 -0
  224. package/dist/watch/lanes.d.ts.map +1 -0
  225. package/dist/watch/lanes.js +73 -0
  226. package/dist/watch/lanes.js.map +1 -0
  227. package/dist/watch/loader.d.ts +47 -0
  228. package/dist/watch/loader.d.ts.map +1 -0
  229. package/dist/watch/loader.js +178 -0
  230. package/dist/watch/loader.js.map +1 -0
  231. package/dist/watch/registry.d.ts +166 -0
  232. package/dist/watch/registry.d.ts.map +1 -0
  233. package/dist/watch/registry.js +589 -0
  234. package/dist/watch/registry.js.map +1 -0
  235. package/dist/watch/ring.d.ts +32 -0
  236. package/dist/watch/ring.d.ts.map +1 -0
  237. package/dist/watch/ring.js +90 -0
  238. package/dist/watch/ring.js.map +1 -0
  239. package/dist/watch/router.d.ts +25 -0
  240. package/dist/watch/router.d.ts.map +1 -0
  241. package/dist/watch/router.js +87 -0
  242. package/dist/watch/router.js.map +1 -0
  243. package/dist/watch/sources.d.ts +42 -0
  244. package/dist/watch/sources.d.ts.map +1 -0
  245. package/dist/watch/sources.js +104 -0
  246. package/dist/watch/sources.js.map +1 -0
  247. package/dist/watch/types.d.ts +129 -0
  248. package/dist/watch/types.d.ts.map +1 -0
  249. package/dist/watch/types.js +6 -0
  250. package/dist/watch/types.js.map +1 -0
  251. package/endpoint-manifest.json +272 -1
  252. package/package.json +3 -2
  253. package/watch/entries/claim-vs-evidence.json +13 -0
  254. package/watch/entries/deliver-audit.json +17 -0
  255. package/watch/entries/quiet-after-claim.json +16 -0
  256. package/watch/entries/registry-check-failed.json +12 -0
  257. package/watch/entries/registry-lagging.json +12 -0
  258. package/watch/entries/risky-call.json +12 -0
  259. package/watch/entries/ungated.json +13 -0
  260. package/dist/api/demo.d.ts +0 -90
  261. package/dist/api/demo.d.ts.map +0 -1
  262. package/dist/api/demo.js +0 -492
  263. package/dist/api/demo.js.map +0 -1
@@ -0,0 +1,246 @@
1
+ /**
2
+ * The decision ledger AT REST (DES-decision-capture §4.2.1, DC-S4a).
3
+ *
4
+ * One append-only JSONL file per project at `<state home>/decisions/<projectId|_unscoped>.jsonl`:
5
+ * the directory 0700, each file 0600 — the posture of the chat transcripts (`chat-transcripts.ts`).
6
+ * The words live HERE and nowhere else crew writes (never the bus, logs or `/diagnostics`).
7
+ * Registered in `tests/fixtures/state-home-subtrees.json` as `decisions` (crew half) — the core half,
8
+ * the worker Read fence, shipped with wicked-core-ts 0.7.35 — so a worker cannot read the operator's
9
+ * words through the file system.
10
+ *
11
+ * Reads fold `record` + `outcome` lines into a {@link DecisionView}; the in-memory index is built
12
+ * once at first use and kept current by `append`.
13
+ */
14
+ import { appendFileSync, chmodSync, existsSync, mkdirSync, readFileSync, readdirSync } from 'node:fs';
15
+ import { join } from 'node:path';
16
+ import { crewStateHome } from '../projects/state-home.js';
17
+ /** The state-home entry (`<state home>/decisions/`) — the name the fixture registers. */
18
+ export const DECISIONS_DIRNAME = 'decisions';
19
+ const UNSCOPED = '_unscoped';
20
+ /** A project id admitted as a file name — anything else is filed under a hashed-safe spelling. */
21
+ const SAFE_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
22
+ export function defaultDecisionsDir() {
23
+ return join(crewStateHome(), 'decisions');
24
+ }
25
+ export class DecisionLedger {
26
+ dir;
27
+ loaded = false;
28
+ byId = new Map();
29
+ /** decision key → ids, in record order (recurrence + widen). */
30
+ byKey = new Map();
31
+ /** estate proposal id → decision id (B12: answering either one resolves both). */
32
+ byProposal = new Map();
33
+ constructor(dir = defaultDecisionsDir()) {
34
+ this.dir = dir;
35
+ }
36
+ fileFor(projectId) {
37
+ const name = projectId === null ? UNSCOPED : SAFE_NAME.test(projectId) ? projectId : `p_${Buffer.from(projectId).toString('hex').slice(0, 120)}`;
38
+ return join(this.dir, `${name}.jsonl`);
39
+ }
40
+ load() {
41
+ if (this.loaded)
42
+ return;
43
+ this.loaded = true;
44
+ if (!existsSync(this.dir))
45
+ return;
46
+ for (const entry of readdirSync(this.dir).sort()) {
47
+ if (!entry.endsWith('.jsonl'))
48
+ continue;
49
+ const file = join(this.dir, entry);
50
+ const text = readFileSync(file, 'utf8');
51
+ // A torn last line (a crash mid-append) is terminated, so the next append starts a fresh
52
+ // line instead of being glued onto it and lost on the next load (codex on DC-S4a).
53
+ if (text !== '' && !text.endsWith('\n'))
54
+ appendFileSync(file, '\n', { mode: 0o600 });
55
+ for (const line of text.split('\n')) {
56
+ if (line.trim() === '')
57
+ continue;
58
+ try {
59
+ this.index(JSON.parse(line));
60
+ }
61
+ catch {
62
+ // A torn last line (crash mid-append) is skipped; every complete line still folds.
63
+ }
64
+ }
65
+ }
66
+ }
67
+ index(line) {
68
+ if (line.op === 'record') {
69
+ if (this.byId.has(line.id))
70
+ return;
71
+ this.byId.set(line.id, { record: line, outcomes: [] });
72
+ if (line.derived.key !== null) {
73
+ const ids = this.byKey.get(line.derived.key) ?? [];
74
+ ids.push(line.id);
75
+ this.byKey.set(line.derived.key, ids);
76
+ }
77
+ return;
78
+ }
79
+ const folded = this.byId.get(line.id);
80
+ if (folded === undefined)
81
+ return;
82
+ folded.outcomes.push(line);
83
+ if (line.proposal_id !== undefined)
84
+ this.byProposal.set(line.proposal_id, line.id);
85
+ }
86
+ write(projectId, line) {
87
+ mkdirSync(this.dir, { recursive: true, mode: 0o700 });
88
+ chmodSync(this.dir, 0o700);
89
+ const file = this.fileFor(projectId);
90
+ appendFileSync(file, `${JSON.stringify(line)}\n`, { mode: 0o600 });
91
+ chmodSync(file, 0o600);
92
+ }
93
+ appendRecord(record) {
94
+ this.load();
95
+ this.write(record.project_id, record);
96
+ this.index(record);
97
+ }
98
+ appendOutcome(outcome) {
99
+ this.load();
100
+ const folded = this.byId.get(outcome.id);
101
+ if (folded === undefined)
102
+ throw new Error(`decision ${outcome.id} is not in the ledger`);
103
+ this.write(folded.record.project_id, outcome);
104
+ this.index(outcome);
105
+ }
106
+ record(id) {
107
+ this.load();
108
+ return this.byId.get(id)?.record ?? null;
109
+ }
110
+ outcomes(id) {
111
+ this.load();
112
+ return [...(this.byId.get(id)?.outcomes ?? [])];
113
+ }
114
+ /** The decision a review-queue proposal was filed for, or `null` (an ordinary proposal). */
115
+ decisionForProposal(proposalId) {
116
+ this.load();
117
+ return this.byProposal.get(proposalId) ?? null;
118
+ }
119
+ /** Prior records with this key: how often, since when, and in which projects. */
120
+ recurrence(key) {
121
+ this.load();
122
+ const ids = this.byKey.get(key);
123
+ if (ids === undefined || ids.length === 0)
124
+ return null;
125
+ const records = ids.map((i) => this.byId.get(i)?.record).filter((r) => r !== undefined);
126
+ const projects = [...new Set(records.map((r) => r.project_id).filter((p) => p !== null))].sort();
127
+ return { count: records.length, first_at: Math.min(...records.map((r) => r.at)), projects };
128
+ }
129
+ /** Remembered, not undone decisions with this key, newest outcome last. */
130
+ rememberedWithKey(key) {
131
+ this.load();
132
+ const out = [];
133
+ for (const id of this.byKey.get(key) ?? []) {
134
+ const view = this.view(id);
135
+ const folded = this.byId.get(id);
136
+ if (view === null || folded === undefined)
137
+ continue;
138
+ if (view.state === 'remembered' && view.rule_id !== undefined)
139
+ out.push({ record: folded.record, rule_id: view.rule_id });
140
+ }
141
+ return out;
142
+ }
143
+ /** Records whose route asks for an action but carry no outcome yet (the restart re-drive). */
144
+ pending() {
145
+ this.load();
146
+ return [...this.byId.values()]
147
+ .filter((f) => f.outcomes.length === 0 && f.record.route !== 'ledger')
148
+ .map((f) => f.record);
149
+ }
150
+ view(id) {
151
+ this.load();
152
+ const folded = this.byId.get(id);
153
+ if (folded === undefined)
154
+ return null;
155
+ return foldView(folded, this);
156
+ }
157
+ list(filter = {}) {
158
+ this.load();
159
+ const out = [];
160
+ for (const folded of this.byId.values()) {
161
+ const r = folded.record;
162
+ if (filter.project !== undefined && r.project_id !== filter.project)
163
+ continue;
164
+ if (filter.chat !== undefined && r.origin.chat_id !== filter.chat)
165
+ continue;
166
+ if (filter.run !== undefined && r.origin.run_id !== filter.run)
167
+ continue;
168
+ if (filter.since !== undefined && r.at < filter.since)
169
+ continue;
170
+ const view = foldView(folded, this);
171
+ if (filter.state !== undefined && view.state !== filter.state)
172
+ continue;
173
+ out.push(view);
174
+ }
175
+ return out.sort((a, b) => b.at - a.at || (a.id < b.id ? 1 : -1));
176
+ }
177
+ }
178
+ function foldView(folded, ledger) {
179
+ const r = folded.record;
180
+ const view = {
181
+ id: r.id,
182
+ at: r.at,
183
+ project_id: r.project_id,
184
+ host: r.host,
185
+ origin: {
186
+ actor: r.origin.actor,
187
+ auth_mode: r.origin.auth_mode,
188
+ ...(r.origin.run_id !== undefined ? { run_id: r.origin.run_id } : {}),
189
+ ...(r.origin.ord !== undefined ? { ord: r.origin.ord } : {}),
190
+ ...(r.origin.gate_id !== undefined ? { gate_id: r.origin.gate_id } : {}),
191
+ ...(r.origin.elicitation_id !== undefined ? { elicitation_id: r.origin.elicitation_id } : {}),
192
+ ...(r.origin.chat_id !== undefined ? { chat_id: r.origin.chat_id } : {}),
193
+ ...(r.origin.turn_id !== undefined ? { turn_id: r.origin.turn_id } : {}),
194
+ words: r.origin.words,
195
+ ...(r.origin.choice !== undefined ? { choice: r.origin.choice } : {}),
196
+ words_source: r.origin.words_source,
197
+ redacted: r.origin.redacted,
198
+ },
199
+ derived: {
200
+ statement: r.derived.statement,
201
+ polarity: r.derived.polarity,
202
+ key: r.derived.key,
203
+ scope: r.derived.scope,
204
+ steering_type: r.derived.steering_type,
205
+ template: r.labels.deterministic.template,
206
+ exclusions: r.labels.deterministic.exclusions,
207
+ },
208
+ route: r.route,
209
+ state: 'recorded',
210
+ ...(r.route === 'conflict' && r.rule_ref !== undefined ? { conflicts_rule_id: r.rule_ref } : {}),
211
+ ...((r.route === 'restated' || r.route === 'maybe-restated') && r.rule_ref !== undefined ? { restates_rule_id: r.rule_ref } : {}),
212
+ };
213
+ for (const o of folded.outcomes) {
214
+ view.state = o.state;
215
+ if (o.how !== undefined)
216
+ view.how = o.how;
217
+ if (o.proposal_id !== undefined)
218
+ view.proposal_id = o.proposal_id;
219
+ if (o.rule_id !== undefined)
220
+ view.rule_id = o.rule_id;
221
+ if (o.restates_rule_id !== undefined)
222
+ view.restates_rule_id = o.restates_rule_id;
223
+ if (o.edits !== undefined) {
224
+ const edits = { ...(view.edits ?? {}) };
225
+ if (o.edits.statement !== undefined)
226
+ edits.statement = o.edits.statement;
227
+ if (o.edits.scope !== undefined)
228
+ edits.scope = o.edits.scope;
229
+ if (o.edits.steering_type !== undefined)
230
+ edits.steering_type = o.edits.steering_type;
231
+ view.edits = edits;
232
+ }
233
+ if (o.state === 'landing_failed' && o.error !== undefined)
234
+ view.error = o.error;
235
+ else
236
+ delete view.error;
237
+ }
238
+ // B8: the same key decided in ≥ 2 projects → offer "Make it apply everywhere".
239
+ if (r.derived.key !== null && r.project_id !== null && view.state !== 'widened') {
240
+ const projects = ledger.recurrence(r.derived.key)?.projects ?? [];
241
+ if (projects.length >= 2)
242
+ view.widen = { projects };
243
+ }
244
+ return view;
245
+ }
246
+ //# sourceMappingURL=ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/decisions/ledger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `/decisions` (DES-decision-capture §4.6, DC-S4a; api-types 0.80.0). Every route is operator+,
3
+ * including the GET (the words are the operator's, review N11), and every write additionally passes
4
+ * the human check inside `remember()` & co. No endpoint takes words for a new decision: words
5
+ * enter only through the operator routes (gate, elicitation, inject; chat in DC-S4b).
6
+ */
7
+ import type { FastifyInstance } from 'fastify';
8
+ import { type DecisionService } from './land.js';
9
+ export declare function registerDecisionRoutes(app: FastifyInstance, service: DecisionService): void;
10
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/decisions/routes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAM7E,OAAO,EAAiB,KAAK,eAAe,EAAsB,MAAM,WAAW,CAAC;AAkBpF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CA8H3F"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * `/decisions` (DES-decision-capture §4.6, DC-S4a; api-types 0.80.0). Every route is operator+,
3
+ * including the GET (the words are the operator's, review N11), and every write additionally passes
4
+ * the human check inside `remember()` & co. No endpoint takes words for a new decision: words
5
+ * enter only through the operator routes (gate, elicitation, inject; chat in DC-S4b).
6
+ */
7
+ import { z } from 'zod';
8
+ import { LOCAL_ACTOR, trustAtLeast } from '../api/auth.js';
9
+ import { API_PREFIX } from '../api/api-prefix.js';
10
+ import { DecisionError } from './land.js';
11
+ const V = API_PREFIX;
12
+ const STEERING = z.enum(['architecture', 'development', 'security', 'testing', 'operations', 'compliance', 'design-ux']);
13
+ const RememberSchema = z
14
+ .object({
15
+ scope: z.enum(['project', 'everywhere']).optional(),
16
+ steering_type: STEERING.optional(),
17
+ statement: z.string().trim().min(1).max(500).optional(),
18
+ })
19
+ .strict();
20
+ const DismissSchema = z
21
+ .object({ reason: z.enum(['not-a-rule', 'one-off', 'wrong-type', 'wrong-scope', 'not-the-same', 'undone']) })
22
+ .strict();
23
+ const SameSchema = z.object({ same: z.boolean() }).strict();
24
+ const STATES = new Set(['recorded', 'offered', 'remembered', 'undone', 'dismissed', 'restated', 'widened', 'landing_failed']);
25
+ export function registerDecisionRoutes(app, service) {
26
+ const actorOf = (req) => req.actor ?? LOCAL_ACTOR;
27
+ const refuse = (reply, err) => {
28
+ if (err instanceof DecisionError)
29
+ return reply.code(err.status).send({ error: err.message });
30
+ return reply.code(500).send({ error: err instanceof Error ? err.message : String(err) });
31
+ };
32
+ const operatorOnly = (req, reply) => {
33
+ const actor = actorOf(req);
34
+ if (trustAtLeast(actor, 'operator'))
35
+ return true;
36
+ void reply.code(403).send({ error: `Insufficient trust: decisions require 'operator' (you are '${actor.trust}')` });
37
+ return false;
38
+ };
39
+ const idOf = (req) => req.params.id.trim();
40
+ app.get(`${V}/decisions`, { config: { manifest: { responseType: 'ListDecisionsResponse', statusCodes: [200, 400, 403] } } }, async (req, reply) => {
41
+ if (!operatorOnly(req, reply))
42
+ return reply;
43
+ const q = req.query;
44
+ const one = (k) => {
45
+ const v = q[k];
46
+ const s = Array.isArray(v) ? v[0] : v;
47
+ return typeof s === 'string' && s.trim() !== '' ? s.trim() : undefined;
48
+ };
49
+ const state = one('state');
50
+ if (state !== undefined && !STATES.has(state)) {
51
+ return reply.code(400).send({ error: `\`state\` must be one of ${[...STATES].join('|')}` });
52
+ }
53
+ const sinceRaw = one('since');
54
+ const since = sinceRaw !== undefined ? Number(sinceRaw) : undefined;
55
+ if (since !== undefined && !Number.isFinite(since)) {
56
+ return reply.code(400).send({ error: '`since` must be epoch milliseconds' });
57
+ }
58
+ const filter = {};
59
+ const project = one('project');
60
+ const chat = one('chat');
61
+ const run = one('run');
62
+ if (project !== undefined)
63
+ filter.project = project;
64
+ if (chat !== undefined)
65
+ filter.chat = chat;
66
+ if (run !== undefined)
67
+ filter.run = run;
68
+ if (state !== undefined)
69
+ filter.state = state;
70
+ if (since !== undefined)
71
+ filter.since = since;
72
+ const body = {
73
+ decisions: service.deps.ledger.list(filter),
74
+ mode: service.mode,
75
+ };
76
+ return body;
77
+ });
78
+ app.post(`${V}/decisions/:id/remember`, {
79
+ config: {
80
+ manifest: { requestType: 'RememberDecisionBody', responseType: 'RememberDecisionResponse', statusCodes: [200, 400, 403, 404, 409, 502] },
81
+ },
82
+ }, async (req, reply) => {
83
+ const parsed = RememberSchema.safeParse(req.body ?? {});
84
+ if (!parsed.success)
85
+ return reply.code(400).send({ error: parsed.error.issues.map((i) => i.message).join('; ') });
86
+ try {
87
+ const edits = {};
88
+ if (parsed.data.statement !== undefined)
89
+ edits.statement = parsed.data.statement;
90
+ if (parsed.data.scope !== undefined)
91
+ edits.scope = parsed.data.scope;
92
+ if (parsed.data.steering_type !== undefined)
93
+ edits.steering_type = parsed.data.steering_type;
94
+ return await service.remember(idOf(req), actorOf(req), { how: 'chip', edits });
95
+ }
96
+ catch (err) {
97
+ return refuse(reply, err);
98
+ }
99
+ });
100
+ app.post(`${V}/decisions/:id/undo`, { config: { manifest: { responseType: '{ ok: true }', statusCodes: [200, 403, 404, 409, 502] } } }, async (req, reply) => {
101
+ try {
102
+ await service.undo(idOf(req), actorOf(req));
103
+ return { ok: true };
104
+ }
105
+ catch (err) {
106
+ return refuse(reply, err);
107
+ }
108
+ });
109
+ app.post(`${V}/decisions/:id/dismiss`, { config: { manifest: { requestType: 'DismissDecisionBody', responseType: '{ ok: true }', statusCodes: [200, 400, 403, 404, 409, 502] } } }, async (req, reply) => {
110
+ const parsed = DismissSchema.safeParse(req.body ?? {});
111
+ if (!parsed.success)
112
+ return reply.code(400).send({ error: parsed.error.issues.map((i) => i.message).join('; ') });
113
+ try {
114
+ await service.dismiss(idOf(req), actorOf(req), parsed.data.reason);
115
+ return { ok: true };
116
+ }
117
+ catch (err) {
118
+ return refuse(reply, err);
119
+ }
120
+ });
121
+ app.post(`${V}/decisions/:id/widen`, { config: { manifest: { responseType: '{ rule_id: string }', statusCodes: [200, 403, 404, 409, 502] } } }, async (req, reply) => {
122
+ try {
123
+ return await service.widen(idOf(req), actorOf(req));
124
+ }
125
+ catch (err) {
126
+ return refuse(reply, err);
127
+ }
128
+ });
129
+ app.post(`${V}/decisions/:id/same`, { config: { manifest: { requestType: 'SameDecisionBody', responseType: '{ rule_id?: string }', statusCodes: [200, 400, 403, 404, 409, 502] } } }, async (req, reply) => {
130
+ const parsed = SameSchema.safeParse(req.body ?? {});
131
+ if (!parsed.success)
132
+ return reply.code(400).send({ error: parsed.error.issues.map((i) => i.message).join('; ') });
133
+ try {
134
+ return await service.same(idOf(req), actorOf(req), parsed.data.same);
135
+ }
136
+ catch (err) {
137
+ return refuse(reply, err);
138
+ }
139
+ });
140
+ }
141
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/decisions/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * How seats learn the rules (DES-decision-capture §4.7, DC-S7) — the text halves, pure.
3
+ *
4
+ * - The chat scope statement lists the chat project's in-force rules as `[rule:<id>] statement`
5
+ * lines, severity-ordered and capped at {@link RULES_STATEMENT_CAP}.
6
+ * - A rule remembered mid-chat reaches the seats as a crew-authored `wicked-context` preface on
7
+ * the next send, disclosed to the operator as a `system` transcript record.
8
+ *
9
+ * Both tell the seat to cite a rule it follows as `[rule:<id>]`, and both say what crew does with
10
+ * that: shows it as cited — unchecked. Nothing here (and nothing anywhere in crew) turns a citation into
11
+ * a compliance verdict; that belongs to DES-rule-check (B4).
12
+ */
13
+ import type { ConformanceRule } from '../core/types.js';
14
+ export declare const RULES_STATEMENT_CAP = 20;
15
+ /** Severity first (critical → info), then id — a stable order a seat and an operator both read. */
16
+ export declare function orderBySeverity<T extends Pick<ConformanceRule, 'id' | 'severity'>>(rules: ReadonlyArray<T>): T[];
17
+ /** The `## Rules in force` section of the scope statement (no trailing blank line). */
18
+ export declare function rulesStatementLines(rules: ReadonlyArray<ConformanceRule>): string[];
19
+ /** The preface a send carries when rules landed since the seats last heard from crew. */
20
+ export declare function rulesPreface(rules: ReadonlyArray<ConformanceRule>): string;
21
+ //# sourceMappingURL=rules-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-text.d.ts","sourceRoot":"","sources":["../../src/decisions/rules-text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAItC,mGAAmG;AACnG,wBAAgB,eAAe,CAAC,CAAC,SAAS,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,UAAU,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAEhH;AAMD,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG,MAAM,EAAE,CAgBnF;AAED,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG,MAAM,CAQ1E"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * How seats learn the rules (DES-decision-capture §4.7, DC-S7) — the text halves, pure.
3
+ *
4
+ * - The chat scope statement lists the chat project's in-force rules as `[rule:<id>] statement`
5
+ * lines, severity-ordered and capped at {@link RULES_STATEMENT_CAP}.
6
+ * - A rule remembered mid-chat reaches the seats as a crew-authored `wicked-context` preface on
7
+ * the next send, disclosed to the operator as a `system` transcript record.
8
+ *
9
+ * Both tell the seat to cite a rule it follows as `[rule:<id>]`, and both say what crew does with
10
+ * that: shows it as cited — unchecked. Nothing here (and nothing anywhere in crew) turns a citation into
11
+ * a compliance verdict; that belongs to DES-rule-check (B4).
12
+ */
13
+ export const RULES_STATEMENT_CAP = 20;
14
+ const SEVERITY_RANK = { critical: 0, error: 1, warn: 2, info: 3 };
15
+ /** Severity first (critical → info), then id — a stable order a seat and an operator both read. */
16
+ export function orderBySeverity(rules) {
17
+ return [...rules].sort((a, b) => (SEVERITY_RANK[a.severity] ?? 9) - (SEVERITY_RANK[b.severity] ?? 9) || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
18
+ }
19
+ function oneLine(statement) {
20
+ return statement.replace(/\s+/gu, ' ').trim();
21
+ }
22
+ /** The `## Rules in force` section of the scope statement (no trailing blank line). */
23
+ export function rulesStatementLines(rules) {
24
+ const ordered = orderBySeverity(rules);
25
+ const shown = ordered.slice(0, RULES_STATEMENT_CAP);
26
+ const lines = [
27
+ '## Rules in force',
28
+ '',
29
+ "These steering rules apply here. Where you follow one, cite it as `[rule:<id>]`; crew shows it",
30
+ 'as cited — unchecked (a citation, never a verdict).',
31
+ '',
32
+ ...shown.map((r) => `- [rule:${r.id}] ${oneLine(r.statement)}`),
33
+ ];
34
+ if (ordered.length > shown.length) {
35
+ const more = ordered.length - shown.length;
36
+ lines.push(`- … and ${more} more rule${more === 1 ? '' : 's'} (ask for them if a step turns on one).`);
37
+ }
38
+ return lines;
39
+ }
40
+ /** The preface a send carries when rules landed since the seats last heard from crew. */
41
+ export function rulesPreface(rules) {
42
+ const ordered = orderBySeverity(rules);
43
+ return [
44
+ '<wicked-context>',
45
+ `Rule${ordered.length === 1 ? '' : 's'} remembered since your last message (cite as [rule:<id>] where you follow one):`,
46
+ ...ordered.map((r) => `- [rule:${r.id}] ${oneLine(r.statement)}`),
47
+ '</wicked-context>',
48
+ ].join('\n');
49
+ }
50
+ //# sourceMappingURL=rules-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-text.js","sourceRoot":"","sources":["../../src/decisions/rules-text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAEtC,MAAM,aAAa,GAAgD,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAE/G,mGAAmG;AACnG,MAAM,UAAU,eAAe,CAAqD,KAAuB;IACzG,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpJ,CAAC;AAED,SAAS,OAAO,CAAC,SAAiB;IAChC,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAChD,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,mBAAmB,CAAC,KAAqC;IACvE,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG;QACZ,mBAAmB;QACnB,EAAE;QACF,gGAAgG;QAChG,qDAAqD;QACrD,EAAE;QACF,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;KAChE,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,aAAa,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,yCAAyC,CAAC,CAAC;IACzG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,YAAY,CAAC,KAAqC;IAChE,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACvC,OAAO;QACL,kBAAkB;QAClB,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,iFAAiF;QACvH,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;QACjE,mBAAmB;KACpB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Decision capture — the ledger's shapes (DES-decision-capture §4.2.1, DC-S4a).
3
+ *
4
+ * The ledger is the ONLY source of ORIGIN: the operator's verbatim words, who typed them (a human
5
+ * actor — an agent's words are never recorded), and the auth mode that decides auto eligibility.
6
+ * One append-only JSONL file per project; a line is a `record` or an `outcome`, and a read folds
7
+ * them into a {@link DecisionView} (api-types 0.80.0).
8
+ */
9
+ import type { DecisionDismissReason, DecisionHost, DecisionRoute, DecisionState, DecisionTemplateId, DecisionType, SteeringType, TrustLevel } from 'wicked-crew-api-types';
10
+ export type { DecisionView } from 'wicked-crew-api-types';
11
+ export type { DecisionDismissReason, DecisionHost, DecisionRoute, DecisionState, DecisionTemplateId, DecisionType, };
12
+ /** The model's labels for one quoted span (the studio chat recorder, DC-S4b). Optional here. */
13
+ export interface DecisionModelLabels {
14
+ is_decision: boolean;
15
+ type: DecisionType;
16
+ codify: boolean;
17
+ ambiguous: boolean;
18
+ steering_type: SteeringType;
19
+ same_as?: string | null;
20
+ approves_proposal?: boolean;
21
+ recorder: string;
22
+ model_id?: string;
23
+ }
24
+ export interface DecisionRecord {
25
+ op: 'record';
26
+ v: 1;
27
+ id: string;
28
+ at: number;
29
+ project_id: string | null;
30
+ host: DecisionHost;
31
+ origin: {
32
+ actor: {
33
+ id: string;
34
+ kind: 'human';
35
+ trust: TrustLevel;
36
+ };
37
+ auth_mode: 'off' | 'required';
38
+ chat_id?: string;
39
+ turn_id?: string;
40
+ run_id?: string;
41
+ ord?: number;
42
+ attempt?: number;
43
+ gate_id?: string;
44
+ elicitation_id?: string;
45
+ words: string;
46
+ choice?: string;
47
+ message_sha256: string;
48
+ proposal?: {
49
+ turn_id: string;
50
+ cli_key: string;
51
+ excerpt: string;
52
+ } | null;
53
+ words_source: 'typed' | 'operator-files' | 'cli-transcript';
54
+ redacted: boolean;
55
+ };
56
+ labels: {
57
+ model?: DecisionModelLabels;
58
+ votes?: Array<{
59
+ cli_key: string;
60
+ type: DecisionType;
61
+ codify: boolean;
62
+ }>;
63
+ deterministic: {
64
+ template: DecisionTemplateId | null;
65
+ exclusions: string[];
66
+ dgc: {
67
+ durable: boolean;
68
+ general: boolean;
69
+ checkable: boolean;
70
+ };
71
+ recurrence: {
72
+ count: number;
73
+ first_at: number;
74
+ projects: string[];
75
+ };
76
+ };
77
+ };
78
+ derived: {
79
+ statement: string | null;
80
+ polarity: 'do' | 'dont' | null;
81
+ key: string | null;
82
+ scope: 'project' | 'everywhere';
83
+ steering_type: SteeringType;
84
+ };
85
+ route: DecisionRoute;
86
+ /** The in-force rule a `restated` / `maybe-restated` decision restates, or a `conflict` contradicts. */
87
+ rule_ref?: string;
88
+ }
89
+ export interface DecisionOutcome {
90
+ op: 'outcome';
91
+ id: string;
92
+ at: number;
93
+ state: Exclude<DecisionState, 'recorded'>;
94
+ how?: 'auto' | 'chip' | 'needs-you';
95
+ by: {
96
+ id: string;
97
+ kind: 'human' | 'system';
98
+ };
99
+ proposal_id?: string;
100
+ rule_id?: string;
101
+ restates_rule_id?: string;
102
+ edits?: {
103
+ statement?: string;
104
+ scope?: 'project' | 'everywhere';
105
+ type?: DecisionType;
106
+ steering_type?: SteeringType;
107
+ };
108
+ reason?: DecisionDismissReason;
109
+ /** `landing_failed` only: the loud reason (never words). */
110
+ error?: string;
111
+ }
112
+ export type DecisionLine = DecisionRecord | DecisionOutcome;
113
+ /** `WICKED_DECISIONS` (§5.6): one switch, not a fallback. */
114
+ export type DecisionsMode = 'off' | 'ledger' | 'on';
115
+ /**
116
+ * Resolve the switch. Default `ledger`: record and label, no chips and no auto — the live-precision
117
+ * mode §8 runs before `on` (the corpus gate). An unknown value is `ledger`, never `on`.
118
+ */
119
+ export declare function resolveDecisionsMode(env?: NodeJS.ProcessEnv): DecisionsMode;
120
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/decisions/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,UAAU,EACX,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,YAAY,EACV,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,YAAY,GACb,CAAC;AAEF,gGAAgG;AAChG,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,YAAY,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,QAAQ,CAAC;IACb,CAAC,EAAE,CAAC,CAAC;IACL,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE;QACN,KAAK,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,UAAU,CAAA;SAAE,CAAC;QACxD,SAAS,EAAE,KAAK,GAAG,UAAU,CAAC;QAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QACxE,YAAY,EAAE,OAAO,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;QAC5D,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,MAAM,EAAE;QACN,KAAK,CAAC,EAAE,mBAAmB,CAAC;QAC5B,KAAK,CAAC,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,YAAY,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;QACxE,aAAa,EAAE;YACb,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAAC;YACpC,UAAU,EAAE,MAAM,EAAE,CAAC;YACrB,GAAG,EAAE;gBAAE,OAAO,EAAE,OAAO,CAAC;gBAAC,OAAO,EAAE,OAAO,CAAC;gBAAC,SAAS,EAAE,OAAO,CAAA;aAAE,CAAC;YAChE,UAAU,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,QAAQ,EAAE,MAAM,CAAC;gBAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;aAAE,CAAC;SACrE,CAAC;KACH,CAAC;IACF,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;QAC/B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QACnB,KAAK,EAAE,SAAS,GAAG,YAAY,CAAC;QAChC,aAAa,EAAE,YAAY,CAAC;KAC7B,CAAC;IACF,KAAK,EAAE,aAAa,CAAC;IACrB,wGAAwG;IACxG,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,SAAS,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAC1C,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;IACpC,EAAE,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAA;KAAE,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;QAAC,IAAI,CAAC,EAAE,YAAY,CAAC;QAAC,aAAa,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC;IACpH,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,eAAe,CAAC;AAE5D,6DAA6D;AAC7D,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC;AAEpD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,aAAa,CAIxF"}