@tacuchi/agent-workflow-cli 22.0.0 → 22.1.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 (49) hide show
  1. package/dist/adapters/git-cli.js +37 -12
  2. package/dist/adapters/git-cli.js.map +1 -1
  3. package/dist/adapters/node-process.js +25 -5
  4. package/dist/adapters/node-process.js.map +1 -1
  5. package/dist/application/decision-note-service.js +154 -0
  6. package/dist/application/decision-note-service.js.map +1 -0
  7. package/dist/application/decision-registration-service.js +124 -0
  8. package/dist/application/decision-registration-service.js.map +1 -0
  9. package/dist/application/docs-canon-service.js +13 -2
  10. package/dist/application/docs-canon-service.js.map +1 -1
  11. package/dist/application/flow/submit.js +83 -10
  12. package/dist/application/flow/submit.js.map +1 -1
  13. package/dist/application/mcp-test-connection-service.js +5 -3
  14. package/dist/application/mcp-test-connection-service.js.map +1 -1
  15. package/dist/application/parsers/spec-relation.js +50 -0
  16. package/dist/application/parsers/spec-relation.js.map +1 -1
  17. package/dist/application/resume-service.js +52 -0
  18. package/dist/application/resume-service.js.map +1 -1
  19. package/dist/application/self/install-plugin-skills-git.js +8 -4
  20. package/dist/application/self/install-plugin-skills-git.js.map +1 -1
  21. package/dist/application/source-boundary-policy.js +23 -2
  22. package/dist/application/source-boundary-policy.js.map +1 -1
  23. package/dist/application/workline-index-service.js +154 -4
  24. package/dist/application/workline-index-service.js.map +1 -1
  25. package/dist/domain/decision-choice.js +71 -0
  26. package/dist/domain/decision-choice.js.map +1 -0
  27. package/dist/domain/decision-note.js +235 -0
  28. package/dist/domain/decision-note.js.map +1 -0
  29. package/dist/domain/decision-preview.js +159 -0
  30. package/dist/domain/decision-preview.js.map +1 -0
  31. package/dist/domain/design/governance.js +2 -4
  32. package/dist/domain/design/governance.js.map +1 -1
  33. package/dist/domain/effective-contract.js +138 -0
  34. package/dist/domain/effective-contract.js.map +1 -0
  35. package/dist/domain/flow/authority.js +113 -7
  36. package/dist/domain/flow/authority.js.map +1 -1
  37. package/dist/domain/flow/run-state.js +66 -15
  38. package/dist/domain/flow/run-state.js.map +1 -1
  39. package/dist/domain/lineage.js +190 -0
  40. package/dist/domain/lineage.js.map +1 -0
  41. package/dist/domain/proposal.js +18 -0
  42. package/dist/domain/proposal.js.map +1 -1
  43. package/dist/domain/reconciliation.js +50 -0
  44. package/dist/domain/reconciliation.js.map +1 -0
  45. package/dist/domain/sealed-record.js +19 -0
  46. package/dist/domain/sealed-record.js.map +1 -0
  47. package/package.json +1 -1
  48. package/skills/w/context/MANIFEST.json +10 -0
  49. package/skills/w/loops/plan-exec-loop/LOOP.md +37 -12
@@ -0,0 +1,235 @@
1
+ import { CRITERION_GLOBAL, isDigest } from "./design/identity.js";
2
+ import { sealedRecordDigest } from "./sealed-record.js";
3
+ export const NOTE_SCHEMA = "workline.decision-note/v1";
4
+ const NOTE_ID_RE = /^DEC-(?:[0-9]{3}|[1-9][0-9]{3,})$/;
5
+ const CALENDAR_DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
6
+ const CRITERION_RE = new RegExp(`^${CRITERION_GLOBAL.source}$`);
7
+ /** The note's own digest, by the SAME code every sealed record uses. */
8
+ export function computeNoteDigest(note) {
9
+ return sealedRecordDigest(note);
10
+ }
11
+ /**
12
+ * Read a note, refusing anything incomplete under its own code.
13
+ *
14
+ * The codes are per-field on purpose. "La nota es inválida" sends whoever wrote
15
+ * it to re-read the whole record; `NOTE_RESUME_POINT_MISSING` sends them to the
16
+ * one line that is missing.
17
+ */
18
+ export function validateDecisionNote(raw) {
19
+ const failures = [];
20
+ const fail = (code, message, action) => {
21
+ failures.push({ code, message, action });
22
+ };
23
+ if (!isRecord(raw)) {
24
+ fail("NOTE_NOT_OBJECT", "la nota de decisión no es un objeto JSON", "una nota es un record sellado con su propio digest");
25
+ return { ok: false, value: null, failures };
26
+ }
27
+ if (raw.schema !== NOTE_SCHEMA) {
28
+ // El gate de versión corre solo y primero: leer campos de un formato que no
29
+ // conocemos reporta sinsentidos derivados y manda a arreglar un campo cuando
30
+ // lo que falta es actualizar.
31
+ fail("NOTE_SCHEMA_UNKNOWN", `versión de formato no soportada: ${JSON.stringify(raw.schema)}`, `este Workline entiende ${NOTE_SCHEMA}`);
32
+ return { ok: false, value: null, failures };
33
+ }
34
+ if (typeof raw.id !== "string" || !NOTE_ID_RE.test(raw.id)) {
35
+ fail("NOTE_ID_INVALID", "'id' debe ser DEC-NNN", "numerá la nota como DEC-001");
36
+ }
37
+ const lineage = readLineage(raw.lineage, fail);
38
+ requireText(raw.decision, "decision", "NOTE_DECISION_MISSING", "qué se decidió, en una frase", fail);
39
+ requireText(raw.reason, "reason", "NOTE_REASON_MISSING", "por qué se decidió eso y no otra cosa", fail);
40
+ const assertions = readAssertions(raw.supersedes_assertions, fail);
41
+ const supersedesNote = readSupersedesNote(raw.supersedes_note, fail);
42
+ const scope = readScope(raw.scope, fail);
43
+ const consumers = requireList(raw.consumers, "consumers", "NOTE_CONSUMERS_MISSING", "enumerá los planes alcanzados; [] si no alcanza a ninguno", fail);
44
+ const preserved = requireList(raw.evidence_preserved, "evidence_preserved", "NOTE_EVIDENCE_PRESERVED_MISSING", "enumerá la evidencia que sigue valiendo; [] si ninguna", fail);
45
+ const invalidated = requireList(raw.evidence_invalidated, "evidence_invalidated", "NOTE_EVIDENCE_INVALIDATED_MISSING", "enumerá la evidencia que dejó de valer; [] si ninguna", fail);
46
+ const obligations = requireList(raw.obligations, "obligations", "NOTE_OBLIGATIONS_MISSING", "enumerá el trabajo compensatorio que nace; [] si ninguno", fail);
47
+ requireText(raw.resume_point, "resume_point", "NOTE_RESUME_POINT_MISSING", "decí desde dónde sigue la ejecución", fail);
48
+ if (typeof raw.date !== "string" || !CALENDAR_DATE_RE.test(raw.date)) {
49
+ fail("NOTE_DATE_INVALID", "'date' debe ser una fecha AAAA-MM-DD", "la cadena se ordena por fecha e id: sin fecha válida el orden es una opinión");
50
+ }
51
+ if (failures.length > 0)
52
+ return { ok: false, value: null, failures };
53
+ const value = {
54
+ schema: NOTE_SCHEMA,
55
+ id: raw.id,
56
+ lineage: lineage,
57
+ decision: raw.decision,
58
+ reason: raw.reason,
59
+ supersedes_assertions: assertions,
60
+ supersedes_note: supersedesNote,
61
+ scope: scope,
62
+ consumers: consumers,
63
+ evidence_preserved: preserved,
64
+ evidence_invalidated: invalidated,
65
+ obligations: obligations,
66
+ resume_point: raw.resume_point,
67
+ date: raw.date,
68
+ digest: "",
69
+ };
70
+ const expected = computeNoteDigest(stripDigest(value));
71
+ if (typeof raw.digest !== "string" || raw.digest.length === 0) {
72
+ fail("NOTE_DIGEST_MISSING", "'digest' es obligatorio", `sellá la nota con ${expected}`);
73
+ return { ok: false, value: null, failures };
74
+ }
75
+ if (raw.digest !== expected) {
76
+ fail("NOTE_DIGEST_MISMATCH", "el 'digest' no corresponde al contenido de la nota", `una nota publicada no se reescribe: el sello de este contenido es ${expected}`);
77
+ return { ok: false, value: null, failures };
78
+ }
79
+ return { ok: true, value: { ...value, digest: raw.digest }, failures };
80
+ }
81
+ function stripDigest(note) {
82
+ const { digest: _drop, ...rest } = note;
83
+ return rest;
84
+ }
85
+ /**
86
+ * The chain of notes for one lineage, in a deterministic order.
87
+ *
88
+ * Date first, id second. Two notes written the same day still have exactly one
89
+ * order, and it is the order they were minted in — which is what makes "apply
90
+ * them in order" a fact rather than whatever the filesystem returned.
91
+ */
92
+ export function orderNotes(notes) {
93
+ return [...notes].sort((a, b) => a.date === b.date ? compareNoteIds(a.id, b.id) : a.date < b.date ? -1 : 1);
94
+ }
95
+ function compareNoteIds(a, b) {
96
+ const na = Number(a.slice(4));
97
+ const nb = Number(b.slice(4));
98
+ return na === nb ? (a < b ? -1 : a > b ? 1 : 0) : na - nb;
99
+ }
100
+ /**
101
+ * Whether appending this note to an existing chain keeps it append-only.
102
+ *
103
+ * Two refusals, and both are the same rule seen from different sides: an id
104
+ * already in the chain would REWRITE a published note, and a `supersedes_note`
105
+ * pointing at nothing would claim to correct a decision that was never taken.
106
+ */
107
+ export function checkAppendOnly(chain, incoming) {
108
+ const failures = [];
109
+ const byId = new Map(chain.map((note) => [note.id, note]));
110
+ if (byId.has(incoming.id)) {
111
+ failures.push({
112
+ code: "NOTE_ALREADY_PUBLISHED",
113
+ message: `${incoming.id} ya está publicada en este linaje`,
114
+ action: "corregir una nota es publicar OTRA que la sustituya por referencia, nunca reescribirla",
115
+ });
116
+ }
117
+ if (incoming.supersedes_note !== null && !byId.has(incoming.supersedes_note)) {
118
+ failures.push({
119
+ code: "NOTE_SUPERSEDES_ABSENT",
120
+ message: `${incoming.id} dice sustituir a ${incoming.supersedes_note}, que no está en el linaje`,
121
+ action: "una sustitución nombra una nota publicada de la misma cadena",
122
+ });
123
+ }
124
+ return failures;
125
+ }
126
+ /**
127
+ * Whether two notes record the SAME decision, ignoring which correlative it got.
128
+ *
129
+ * This is what makes "an identical retry recovers the same result without
130
+ * deciding again" a property of content. The id cannot take part: a retry mints
131
+ * the next number off a chain that already holds the first attempt, so comparing
132
+ * sealed digests would call every retry a new decision and append a duplicate —
133
+ * the chain would grow one indistinguishable note per interrupted run, and the
134
+ * composition would then report an overlap nobody caused.
135
+ *
136
+ * Everything else does take part, including the fields that look like prose. Two
137
+ * notes that supersede the same assertions for different stated reasons are two
138
+ * decisions, and treating the second as a repeat of the first would drop the
139
+ * reason the chain exists to preserve.
140
+ */
141
+ export function sameDecision(a, b) {
142
+ return canonicalDecision(a) === canonicalDecision(b);
143
+ }
144
+ function canonicalDecision(note) {
145
+ const { id: _id, digest: _digest, ...rest } = note;
146
+ return sealedRecordDigest(rest);
147
+ }
148
+ /** The notes still in force: every one nobody later superseded. */
149
+ export function effectiveNotes(chain) {
150
+ const superseded = new Set(chain.map((note) => note.supersedes_note).filter((id) => id !== null));
151
+ return orderNotes(chain).filter((note) => !superseded.has(note.id));
152
+ }
153
+ function isRecord(value) {
154
+ return typeof value === "object" && value !== null && !Array.isArray(value);
155
+ }
156
+ function requireText(value, field, code, action, fail) {
157
+ if (typeof value !== "string" || value.trim().length === 0) {
158
+ fail(code, `'${field}' es obligatorio y no puede estar vacío`, action);
159
+ }
160
+ }
161
+ function requireList(value, field, code, action, fail) {
162
+ if (!Array.isArray(value) || !value.every((v) => typeof v === "string" && v.length > 0)) {
163
+ fail(code, `'${field}' es obligatorio y debe ser una lista de strings`, action);
164
+ return null;
165
+ }
166
+ return value;
167
+ }
168
+ function readScope(value, fail) {
169
+ if (value !== "functional" && value !== "plan-only") {
170
+ fail("NOTE_SCOPE_INVALID", "'scope' debe ser 'functional' o 'plan-only'", "decí si la decisión cambia lo prometido o sólo el camino para llegar");
171
+ return null;
172
+ }
173
+ return value;
174
+ }
175
+ function readSupersedesNote(value, fail) {
176
+ if (value === null)
177
+ return null;
178
+ if (typeof value !== "string" || !NOTE_ID_RE.test(value)) {
179
+ fail("NOTE_SUPERSEDES_INVALID", "'supersedes_note' debe ser un DEC-NNN o null", "usá null si esta nota no corrige ninguna anterior");
180
+ return null;
181
+ }
182
+ return value;
183
+ }
184
+ function readAssertions(value, fail) {
185
+ const list = requireList(value, "supersedes_assertions", "NOTE_ASSERTIONS_MISSING", "enumerá las afirmaciones que sustituye como S033/AC-05; [] si no sustituye ninguna", fail);
186
+ if (list === null)
187
+ return null;
188
+ const wrong = list.filter((id) => !CRITERION_RE.test(id));
189
+ if (wrong.length > 0) {
190
+ fail("NOTE_ASSERTIONS_INVALID", `'supersedes_assertions' no usa la gramática de criterio en: ${wrong.join(", ")}`, "direccioná cada afirmación como S033/AC-05 — es la misma gramática que ya existe, no una segunda");
191
+ return null;
192
+ }
193
+ if (new Set(list).size !== list.length) {
194
+ fail("NOTE_ASSERTIONS_DUPLICATE", "'supersedes_assertions' repite una afirmación", "nombrar dos veces la misma afirmación no la sustituye dos veces");
195
+ return null;
196
+ }
197
+ return list;
198
+ }
199
+ function readAnchor(value, side, fail) {
200
+ if (!isRecord(value)) {
201
+ fail("NOTE_LINEAGE_MISSING", `'lineage.${side}' es obligatorio`, `anclá el ${side} con su ruta, su correlativo y su digest exacto`);
202
+ return null;
203
+ }
204
+ const { path, number, digest } = value;
205
+ if (typeof path !== "string" || path.length === 0 || typeof number !== "string") {
206
+ fail("NOTE_LINEAGE_INVALID", `'lineage.${side}' necesita 'path' y 'number'`, "el linaje nombra documentos reales del workspace");
207
+ return null;
208
+ }
209
+ if (!isDigest(digest)) {
210
+ fail("NOTE_LINEAGE_DIGEST_INVALID", `'lineage.${side}.digest' debe ser el sha256 exacto de ese documento`, "sin el digest la nota decide sobre un nombre, no sobre unos bytes");
211
+ return null;
212
+ }
213
+ return { path, number, digest };
214
+ }
215
+ function readLineage(value, fail) {
216
+ if (!isRecord(value)) {
217
+ fail("NOTE_LINEAGE_MISSING", "'lineage' es obligatorio", "una nota sin linaje no se puede componer sobre ningún baseline");
218
+ return null;
219
+ }
220
+ const spec = readAnchor(value.spec, "spec", fail);
221
+ const plan = readAnchor(value.plan, "plan", fail);
222
+ const execution = value.execution;
223
+ if (!isRecord(execution) ||
224
+ typeof execution.session !== "string" ||
225
+ execution.session.length === 0 ||
226
+ typeof execution.phase !== "string" ||
227
+ execution.phase.length === 0) {
228
+ fail("NOTE_EXECUTION_STATE_MISSING", "'lineage.execution' necesita 'session' y 'phase'", "registrá desde qué sesión y en qué fase apareció la divergencia");
229
+ return null;
230
+ }
231
+ if (spec === null || plan === null)
232
+ return null;
233
+ return { spec, plan, execution: { session: execution.session, phase: execution.phase } };
234
+ }
235
+ //# sourceMappingURL=decision-note.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision-note.js","sourceRoot":"","sources":["../../src/domain/decision-note.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ import { SELF_AUTHORIZABLE_CLASSES } from "./capability/effects.js";
2
+ import { destinationsOf, observedEffects, sealProposal } from "./proposal.js";
3
+ /**
4
+ * WHAT THE PERSON SEES, once, before deciding — and the seal their single
5
+ * "yes" is given over.
6
+ *
7
+ * The eight sections are not a report format. They are the eight things somebody
8
+ * needs in order to be responsible for the answer: what is being decided over,
9
+ * what actually changes, who else is reached, how far it goes, which evidence
10
+ * survives and which stops counting, what work the decision creates, where
11
+ * execution comes back, and exactly which bytes land where. A preview missing
12
+ * any of them asks for consent to something that was not shown.
13
+ *
14
+ * Every one of them is DERIVED from the composed contract and the sealed note.
15
+ * That is the load-bearing part: a preview authored beside the change is a second
16
+ * description of it, and the moment the two disagree the person is approving the
17
+ * pleasant one. Here, changing anything material changes the proposal's digest,
18
+ * so the grant given over the old seal stops covering the new bytes by
19
+ * construction rather than by anybody remembering to re-check.
20
+ *
21
+ * And it is ONE authorization. Choosing an alternative registers the note and
22
+ * authorizes exactly the previewed effects; there is no second confirmation
23
+ * asking the same question in other words, because {@link grantFor} is derived
24
+ * from the very seal that was shown. What that grant can never carry is the two
25
+ * classes below — a decision note is a document, and a path that wanted to
26
+ * destroy something or leave the machine to register one is not this path.
27
+ */
28
+ /**
29
+ * The classes registering a decision may ever exercise.
30
+ *
31
+ * Publishing a note writes a JSON document beside the spec it amends: it creates
32
+ * or it replaces, and nothing else. `destructive` and `network_external` are
33
+ * absent by intent and not by omission — no reachable combination of a note and
34
+ * an index produces them, so their appearance means the artifacts are not the
35
+ * ones this path is for, and the preview refuses instead of asking somebody to
36
+ * authorize them under a decision's name.
37
+ */
38
+ export const DECISION_EFFECT_CLASSES = [
39
+ "local_additive",
40
+ "mutate_overwrite",
41
+ ];
42
+ /**
43
+ * Build the preview, or refuse to show one.
44
+ *
45
+ * It blocks rather than trims. A preview that dropped a section it could not
46
+ * fill would be indistinguishable from one where that section was genuinely
47
+ * empty — "no compensatory work" and "we did not work out the compensatory work"
48
+ * look identical on screen and mean opposite things to whoever says yes.
49
+ */
50
+ export function buildDecisionPreview(input) {
51
+ const failures = [];
52
+ if (input.artifacts.length === 0) {
53
+ failures.push({
54
+ code: "PREVIEW_NO_ARTIFACTS",
55
+ message: "la vista previa no tiene ningún destino que mostrar",
56
+ action: "una decisión sin efectos no se registra: prepará el índice de decisiones antes de previsualizar",
57
+ });
58
+ }
59
+ if (input.note.lineage.spec.digest !== input.contract.spec.digest) {
60
+ failures.push({
61
+ code: "PREVIEW_BASELINE_DRIFTED",
62
+ message: `la nota decide sobre ${input.note.lineage.spec.digest} y el contrato compone sobre ${input.contract.spec.digest}`,
63
+ action: "recomponé el contrato sobre la spec vigente y volvé a sellar la nota: previsualizar sobre dos baselines distintos muestra una decisión que nadie tomó",
64
+ });
65
+ }
66
+ if (!input.contract.applied.includes(input.note.id)) {
67
+ failures.push({
68
+ code: "PREVIEW_NOTE_NOT_COMPOSED",
69
+ message: `${input.note.id} no está entre las notas aplicadas del contrato que se muestra`,
70
+ action: "componé el contrato incluyendo esta nota: la vista previa enseña el efecto real, no el que tendría si compusiera",
71
+ });
72
+ }
73
+ // The seal has to cover the note that was SHOWN, and the note's own digest is
74
+ // what proves it does. Without this, six of the eight sections are read off a
75
+ // record the proposal never carries: a preview could show one resume point and
76
+ // seal bytes holding another, and the approval would be over the pleasant one.
77
+ // A substring is enough because the digest seals every field of the note — the
78
+ // published record can only carry it by being this record.
79
+ if (!input.artifacts.some((artifact) => artifact.content.includes(input.note.digest))) {
80
+ failures.push({
81
+ code: "PREVIEW_NOTE_NOT_SEALED",
82
+ message: `ningún destino de la propuesta contiene ${input.note.id}`,
83
+ action: "publicá la nota dentro de la propuesta que se aprueba: mostrar una decisión y sellar otros bytes es pedir consentimiento sobre algo que no se enseñó",
84
+ });
85
+ }
86
+ const classes = observedEffects(input.artifacts);
87
+ const beyond = classes.filter((effect) => !DECISION_EFFECT_CLASSES.includes(effect));
88
+ if (beyond.length > 0) {
89
+ failures.push({
90
+ code: "PREVIEW_EFFECT_FORBIDDEN",
91
+ message: `registrar una decisión ejercería ${beyond.join(", ")}`,
92
+ action: `una nota sólo escribe su índice: proponé sólo efectos de ${DECISION_EFFECT_CLASSES.join(", ")}`,
93
+ });
94
+ }
95
+ if (failures.length > 0)
96
+ return { status: "blocked", failures };
97
+ const proposal = sealProposal({
98
+ operation: input.operation,
99
+ artifacts: input.artifacts,
100
+ bases: input.bases,
101
+ effects: classes,
102
+ requiresApproval: classes.filter((effect) => !SELF_AUTHORIZABLE_CLASSES.includes(effect)),
103
+ });
104
+ return {
105
+ status: "previewed",
106
+ preview: {
107
+ baseline: input.contract.spec,
108
+ effective_change: changesOf(input.contract, input.note),
109
+ consumers: [...input.note.consumers],
110
+ impact: {
111
+ scope: input.note.scope,
112
+ assertions: input.note.supersedes_assertions.length,
113
+ consumers: input.note.consumers.length,
114
+ },
115
+ evidence: {
116
+ preserved: [...input.note.evidence_preserved],
117
+ invalidated: [...input.note.evidence_invalidated],
118
+ },
119
+ obligations: [...input.note.obligations],
120
+ resume_point: input.note.resume_point,
121
+ effects: { classes, entries: proposal.preview },
122
+ proposal,
123
+ },
124
+ };
125
+ }
126
+ /**
127
+ * The assertions THIS note moves, read off the composed contract.
128
+ *
129
+ * `from` comes from the contract's attribution rather than from the note: an
130
+ * assertion another note already amended is not going from `baseline`, and
131
+ * saying so would overstate what this decision costs.
132
+ */
133
+ function changesOf(contract, note) {
134
+ const mine = new Set(note.supersedes_assertions);
135
+ return contract.assertions
136
+ .filter((assertion) => mine.has(assertion.id))
137
+ .map((assertion) => ({
138
+ assertion: assertion.id,
139
+ from: assertion.by === note.id ? "baseline" : "amended",
140
+ to: "amended",
141
+ by: note.id,
142
+ }));
143
+ }
144
+ /**
145
+ * The grant one explicit choice gives — over this seal, and nothing wider.
146
+ *
147
+ * Derived from the preview instead of assembled beside it, so "authorize exactly
148
+ * what was shown" is arithmetic. A grant naming a different digest covers
149
+ * nothing, which is what makes a material change between the preview and the
150
+ * write fail closed rather than sail through on a yes that was about other bytes.
151
+ */
152
+ export function grantFor(preview) {
153
+ return {
154
+ digest: preview.proposal.digest,
155
+ destinations: destinationsOf(preview.proposal),
156
+ classes: [...preview.proposal.requires_approval],
157
+ };
158
+ }
159
+ //# sourceMappingURL=decision-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision-preview.js","sourceRoot":"","sources":["../../src/domain/decision-preview.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,4 @@
1
- import { createHash } from "node:crypto";
2
- import { canonicalJson } from "../../application/semantic-operation/protocol.js";
1
+ import { sealedRecordDigest } from "../sealed-record.js";
3
2
  import { isCalendarDate } from "./baseline.js";
4
3
  import { CANONICAL_SCHEMAS } from "./capability.js";
5
4
  import { isDigest, parseBaselineRef } from "./identity.js";
@@ -28,8 +27,7 @@ const DECISIONS = new Set(["proposed", "approved", "rejected"]);
28
27
  * unverifiable — you cannot hash a value that contains its own hash.
29
28
  */
30
29
  export function computeRecordDigest(record) {
31
- const { digest: _drop, ...rest } = record;
32
- return `sha256:${createHash("sha256").update(canonicalJson(rest), "utf8").digest("hex")}`;
30
+ return sealedRecordDigest(record);
33
31
  }
34
32
  export function validateDesignReview(raw, artifact) {
35
33
  const r = new Reader(REVIEW_ALLOWED_KEYS);
@@ -1 +1 @@
1
- {"version":3,"file":"governance.js","sourceRoot":"","sources":["../../../src/domain/design/governance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"governance.js","sourceRoot":"","sources":["../../../src/domain/design/governance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ import { effectiveNotes } from "./decision-note.js";
2
+ /**
3
+ * Compose the baseline with the chain, or block naming the correction.
4
+ *
5
+ * Ordering is the chain's (`effectiveNotes` → date, then correlative), so the
6
+ * result does not depend on the order the notes were handed over. Two callers
7
+ * reading the same lineage from different directions get the same contract or
8
+ * the same refusal.
9
+ */
10
+ export function composeEffectiveContract(baseline, chain) {
11
+ const notes = effectiveNotes(chain);
12
+ const failures = [];
13
+ const known = new Set(baseline.criteria);
14
+ const amendedBy = new Map();
15
+ const obligations = [];
16
+ const preservedBy = new Map();
17
+ const invalidatedBy = new Map();
18
+ const applied = [];
19
+ for (const note of notes) {
20
+ failures.push(...checkBaseline(note, baseline));
21
+ failures.push(...checkAssertions(note, known, amendedBy));
22
+ failures.push(...checkContradiction(note));
23
+ for (const id of note.supersedes_assertions)
24
+ amendedBy.set(id, note.id);
25
+ for (const text of note.obligations)
26
+ obligations.push({ text, by: note.id });
27
+ // First note wins the attribution: the chain is applied in order, so the
28
+ // earliest one to say something about a piece of evidence is the one whose
29
+ // claim the conflict check has to name.
30
+ claimFirst(preservedBy, note.evidence_preserved, note.id);
31
+ claimFirst(invalidatedBy, note.evidence_invalidated, note.id);
32
+ applied.push(note.id);
33
+ }
34
+ failures.push(...checkEvidenceConflict(preservedBy, invalidatedBy));
35
+ if (failures.length > 0)
36
+ return { status: "blocked", failures };
37
+ return {
38
+ status: "composed",
39
+ contract: {
40
+ spec: { path: baseline.path, number: baseline.number, digest: baseline.digest },
41
+ assertions: baseline.criteria.map((id) => ({
42
+ id,
43
+ state: amendedBy.has(id) ? "amended" : "baseline",
44
+ by: amendedBy.get(id) ?? null,
45
+ })),
46
+ obligations,
47
+ evidence_preserved: [...preservedBy.keys()],
48
+ evidence_invalidated: [...invalidatedBy.keys()],
49
+ applied,
50
+ },
51
+ };
52
+ }
53
+ function claimFirst(into, items, noteId) {
54
+ for (const item of items) {
55
+ if (!into.has(item))
56
+ into.set(item, noteId);
57
+ }
58
+ }
59
+ /** A note that decided on other bytes is not stale trivia: it decided elsewhere. */
60
+ function checkBaseline(note, baseline) {
61
+ if (note.lineage.spec.digest === baseline.digest)
62
+ return [];
63
+ return [
64
+ {
65
+ code: "CONTRACT_BASELINE_ABSENT",
66
+ message: `${note.id} decide sobre un baseline de ${note.lineage.spec.path} que ya no es el vigente`,
67
+ action: "revisá la nota contra la spec actual y publicá otra que la sustituya, o volvé la spec a su baseline sellado",
68
+ },
69
+ ];
70
+ }
71
+ /**
72
+ * An amendment must name something that exists, and only once.
73
+ *
74
+ * Two notes in force over the same assertion is an OVERLAP unless the later one
75
+ * explicitly supersedes the earlier: without that reference nobody can say which
76
+ * of the two the contract means, and choosing by recency would be inventing the
77
+ * answer.
78
+ */
79
+ function checkAssertions(note, known, amendedBy) {
80
+ const failures = [];
81
+ for (const id of note.supersedes_assertions) {
82
+ if (!known.has(id)) {
83
+ failures.push({
84
+ code: "CONTRACT_ASSERTION_ABSENT",
85
+ message: `${note.id} sustituye ${id}, que la spec no enuncia`,
86
+ action: `direccioná una afirmación que exista en ${note.lineage.spec.path}, o corregí la nota con otra que la sustituya`,
87
+ });
88
+ continue;
89
+ }
90
+ const previous = amendedBy.get(id);
91
+ if (previous !== undefined && note.supersedes_note !== previous) {
92
+ failures.push({
93
+ code: "CONTRACT_OVERLAP",
94
+ message: `${note.id} y ${previous} están vigentes sobre ${id} y ninguna sustituye a la otra`,
95
+ action: `publicá una nota que sustituya explícitamente a ${previous}: la precedencia por fecha sería una respuesta inventada`,
96
+ });
97
+ }
98
+ }
99
+ return failures;
100
+ }
101
+ /** A note that both keeps and drops the same evidence contradicts itself. */
102
+ function checkContradiction(note) {
103
+ const preserved = new Set(note.evidence_preserved);
104
+ const both = note.evidence_invalidated.filter((item) => preserved.has(item));
105
+ if (both.length === 0)
106
+ return [];
107
+ return [
108
+ {
109
+ code: "CONTRACT_CONTRADICTION",
110
+ message: `${note.id} conserva e invalida a la vez: ${both.join(", ")}`,
111
+ action: "una evidencia sigue valiendo o dejó de valer; decidí cuál y volvé a sellar la nota",
112
+ },
113
+ ];
114
+ }
115
+ /**
116
+ * Two DIFFERENT notes in force where one keeps exactly what another drops.
117
+ *
118
+ * Left unresolved this is the same ambiguity as an overlap, one level down: the
119
+ * contract would claim a piece of evidence is both usable and void. Attributing
120
+ * each side to its note is what keeps this distinct from a single note
121
+ * contradicting itself — that one is already reported against the note itself,
122
+ * and reporting it twice would send the reader to fix two things.
123
+ */
124
+ function checkEvidenceConflict(preservedBy, invalidatedBy) {
125
+ const failures = [];
126
+ for (const [item, keeper] of preservedBy) {
127
+ const dropper = invalidatedBy.get(item);
128
+ if (dropper === undefined || dropper === keeper)
129
+ continue;
130
+ failures.push({
131
+ code: "CONTRACT_CONTRADICTION",
132
+ message: `${keeper} conserva '${item}' y ${dropper} la invalida, y las dos están vigentes`,
133
+ action: `publicá una nota que sustituya a ${keeper} o a ${dropper}: el contrato no puede afirmar las dos`,
134
+ });
135
+ }
136
+ return failures;
137
+ }
138
+ //# sourceMappingURL=effective-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effective-contract.js","sourceRoot":"","sources":["../../src/domain/effective-contract.ts"],"names":[],"mappings":"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"}