perttool 0.8.1 → 0.9.1

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 (139) hide show
  1. package/CHANGELOG.md +37 -1
  2. package/README.md +100 -38
  3. package/dist/application/cli-facade.d.ts +12 -7
  4. package/dist/application/cli-facade.d.ts.map +1 -1
  5. package/dist/application/cli-facade.js +16 -7
  6. package/dist/application/cli-facade.js.map +1 -1
  7. package/dist/application/contract8-milestone-acceptance.d.ts +74 -0
  8. package/dist/application/contract8-milestone-acceptance.d.ts.map +1 -0
  9. package/dist/application/contract8-milestone-acceptance.js +185 -0
  10. package/dist/application/contract8-milestone-acceptance.js.map +1 -0
  11. package/dist/application/editor-milestone-acceptance.d.ts +75 -0
  12. package/dist/application/editor-milestone-acceptance.d.ts.map +1 -0
  13. package/dist/application/editor-milestone-acceptance.js +161 -0
  14. package/dist/application/editor-milestone-acceptance.js.map +1 -0
  15. package/dist/application/target-governance-init.d.ts +1 -1
  16. package/dist/application/target-governance-init.d.ts.map +1 -1
  17. package/dist/application/target-governance-init.js +3 -5
  18. package/dist/application/target-governance-init.js.map +1 -1
  19. package/dist/application/target-governance-project.d.ts +2 -2
  20. package/dist/application/target-governance-project.d.ts.map +1 -1
  21. package/dist/application/target-historical-graph.d.ts +3 -1
  22. package/dist/application/target-historical-graph.d.ts.map +1 -1
  23. package/dist/application/target-historical-graph.js +85 -2
  24. package/dist/application/target-historical-graph.js.map +1 -1
  25. package/dist/application/target-project-history.d.ts +10 -0
  26. package/dist/application/target-project-history.d.ts.map +1 -1
  27. package/dist/application/target-project-history.js +54 -0
  28. package/dist/application/target-project-history.js.map +1 -1
  29. package/dist/application/target-velocity-observation.d.ts +6 -1
  30. package/dist/application/target-velocity-observation.d.ts.map +1 -1
  31. package/dist/application/target-velocity-observation.js +72 -4
  32. package/dist/application/target-velocity-observation.js.map +1 -1
  33. package/dist/cli.js +377 -37
  34. package/dist/cli.js.map +1 -1
  35. package/dist/command/assurance-discovery.d.ts +4 -3
  36. package/dist/command/assurance-discovery.d.ts.map +1 -1
  37. package/dist/command/assurance-discovery.js +96 -9
  38. package/dist/command/assurance-discovery.js.map +1 -1
  39. package/dist/command/assurance-usage.js +2 -2
  40. package/dist/command/assurance-usage.js.map +1 -1
  41. package/dist/command/discovery.js +4 -4
  42. package/dist/command/discovery.js.map +1 -1
  43. package/dist/command/registry.d.ts +1 -1
  44. package/dist/command/registry.d.ts.map +1 -1
  45. package/dist/command/registry.js +2 -2
  46. package/dist/command/registry.js.map +1 -1
  47. package/dist/command/usage.d.ts.map +1 -1
  48. package/dist/command/usage.js +12 -4
  49. package/dist/command/usage.js.map +1 -1
  50. package/dist/core/index.d.ts +1 -1
  51. package/dist/core/index.d.ts.map +1 -1
  52. package/dist/help/assurance-guide.d.ts +1 -1
  53. package/dist/help/assurance-guide.d.ts.map +1 -1
  54. package/dist/help/assurance-guide.js +46 -19
  55. package/dist/help/assurance-guide.js.map +1 -1
  56. package/dist/help/guide.d.ts +1 -1
  57. package/dist/help/guide.d.ts.map +1 -1
  58. package/dist/help/registry.js +5 -5
  59. package/dist/help/registry.js.map +1 -1
  60. package/dist/history/historical-graph.d.ts +2 -0
  61. package/dist/history/historical-graph.d.ts.map +1 -1
  62. package/dist/history/historical-graph.js +98 -24
  63. package/dist/history/historical-graph.js.map +1 -1
  64. package/dist/history/milestone-acceptance-history.d.ts +59 -0
  65. package/dist/history/milestone-acceptance-history.d.ts.map +1 -0
  66. package/dist/history/milestone-acceptance-history.js +332 -0
  67. package/dist/history/milestone-acceptance-history.js.map +1 -0
  68. package/dist/index.d.ts +10 -9
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +7 -6
  71. package/dist/index.js.map +1 -1
  72. package/dist/migration/grammar-boundary.d.ts +1 -1
  73. package/dist/migration/grammar-boundary.d.ts.map +1 -1
  74. package/dist/migration/grammar-boundary.js +7 -3
  75. package/dist/migration/grammar-boundary.js.map +1 -1
  76. package/dist/milestone-acceptance/advance.d.ts +39 -0
  77. package/dist/milestone-acceptance/advance.d.ts.map +1 -0
  78. package/dist/milestone-acceptance/advance.js +112 -0
  79. package/dist/milestone-acceptance/advance.js.map +1 -0
  80. package/dist/milestone-acceptance/evaluate.d.ts +51 -0
  81. package/dist/milestone-acceptance/evaluate.d.ts.map +1 -0
  82. package/dist/milestone-acceptance/evaluate.js +114 -0
  83. package/dist/milestone-acceptance/evaluate.js.map +1 -0
  84. package/dist/milestone-acceptance/migration.d.ts +25 -0
  85. package/dist/milestone-acceptance/migration.d.ts.map +1 -0
  86. package/dist/milestone-acceptance/migration.js +76 -0
  87. package/dist/milestone-acceptance/migration.js.map +1 -0
  88. package/dist/milestone-acceptance/mutation.d.ts +49 -0
  89. package/dist/milestone-acceptance/mutation.d.ts.map +1 -0
  90. package/dist/milestone-acceptance/mutation.js +136 -0
  91. package/dist/milestone-acceptance/mutation.js.map +1 -0
  92. package/dist/milestone-acceptance/source.d.ts +83 -0
  93. package/dist/milestone-acceptance/source.d.ts.map +1 -0
  94. package/dist/milestone-acceptance/source.js +301 -0
  95. package/dist/milestone-acceptance/source.js.map +1 -0
  96. package/dist/mutation/advance-deletion.d.ts.map +1 -1
  97. package/dist/mutation/advance-deletion.js +6 -1
  98. package/dist/mutation/advance-deletion.js.map +1 -1
  99. package/dist/perttool-vscode-private-0.0.0-d1578b9.vsix +0 -0
  100. package/dist/recommendation/override-types.d.ts +2 -2
  101. package/dist/recommendation/override.d.ts +1 -1
  102. package/dist/recommendation/override.js +2 -2
  103. package/dist/schema/registry.d.ts +1 -1
  104. package/dist/schema/registry.d.ts.map +1 -1
  105. package/dist/schema/registry.js +8 -6
  106. package/dist/schema/registry.js.map +1 -1
  107. package/dist/semantic/validator.d.ts.map +1 -1
  108. package/dist/semantic/validator.js +14 -3
  109. package/dist/semantic/validator.js.map +1 -1
  110. package/dist/session/document-session.d.ts +5 -0
  111. package/dist/session/document-session.d.ts.map +1 -1
  112. package/dist/session/document-session.js +25 -2
  113. package/dist/session/document-session.js.map +1 -1
  114. package/dist/version.d.ts +1 -1
  115. package/dist/version.js +1 -1
  116. package/package.json +1 -1
  117. package/schemas/{Perttool.AdvanceResult.v2.schema.json → Perttool.AdvanceResult.v3.schema.json} +36 -5
  118. package/schemas/Perttool.AgentGuidanceResult.v1.schema.json +1 -1
  119. package/schemas/{Perttool.AnalysisResult.v5.schema.json → Perttool.AnalysisResult.v6.schema.json} +12 -5
  120. package/schemas/{Perttool.CheckResult.v4.schema.json → Perttool.CheckResult.v5.schema.json} +12 -5
  121. package/schemas/Perttool.CliError.v1.schema.json +1 -1
  122. package/schemas/Perttool.CommandHelpResult.v1.schema.json +3 -3
  123. package/schemas/Perttool.ExportResult.v1.schema.json +1 -1
  124. package/schemas/Perttool.FormatResult.v1.schema.json +1 -1
  125. package/schemas/Perttool.GuideResult.v1.schema.json +1 -1
  126. package/schemas/Perttool.HistoricalGraphResult.v1.schema.json +100 -2
  127. package/schemas/Perttool.ImportResult.v1.schema.json +1 -1
  128. package/schemas/Perttool.InitResult.v1.schema.json +1 -1
  129. package/schemas/Perttool.MilestoneAcceptanceMigrationResult.v1.schema.json +24 -0
  130. package/schemas/Perttool.MilestoneAcceptanceResult.v1.schema.json +79 -0
  131. package/schemas/{Perttool.MutationResult.v4.schema.json → Perttool.MutationResult.v5.schema.json} +4 -4
  132. package/schemas/{Perttool.NextResult.v6.schema.json → Perttool.NextResult.v7.schema.json} +12 -5
  133. package/schemas/Perttool.OverrideDecision.v1.schema.json +1 -1
  134. package/schemas/Perttool.PlanAssuranceResult.v1.schema.json +1 -1
  135. package/schemas/Perttool.ProjectHistoryResult.v1.schema.json +1 -1
  136. package/schemas/Perttool.ProjectResult.v4.schema.json +2 -2
  137. package/schemas/Perttool.SchemaResult.v1.schema.json +1 -1
  138. package/schemas/Perttool.UnitMigrationResult.v3.schema.json +5 -3
  139. package/schemas/Perttool.VelocityObservationResult.v1.schema.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advance.d.ts","sourceRoot":"","sources":["../../src/milestone-acceptance/advance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAG1D,OAAO,EAAwD,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAElH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,EAA+B,KAAK,+BAA+B,EAAE,MAAM,eAAe,CAAC;AASlG,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;IACjD,QAAQ,CAAC,yBAAyB,EAAE,SAAS,MAAM,EAAE,CAAC;IACtD,QAAQ,CAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;IACjD,QAAQ,CAAC,iBAAiB,EAAE,SAAS;QACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,UAAU,EAAE,+BAA+B,CAAC,YAAY,CAAC,CAAC;QACnE,QAAQ,CAAC,4BAA4B,EAAE,SAAS,MAAM,EAAE,CAAC;KAC1D,EAAE,CAAC;CACL;AAED,MAAM,WAAW,uCAAuC;IACtD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,uCAAuC,GAAG,IAAI,CAAC;IACrE,QAAQ,CAAC,eAAe,EAAE,iCAAiC,GAAG,IAAI,CAAC;IACnE,QAAQ,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,mCAAoC,SAAQ,eAAe;IAC1E,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,aAAa,CAAC;IAClE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,CAAC;CAC7D;AAyDD,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,mCAAwC,GAAG,kCAAkC,CA8DlJ"}
@@ -0,0 +1,112 @@
1
+ import { sha256DigestUtf8 } from "../model/sha256.js";
2
+ import { createUnifiedDiff } from "../editing/unified-diff.js";
3
+ import { planValidatedAdvance } from "../mutation/advance.js";
4
+ import { applyTextEdits, normalizeTextEdits } from "../mutation/text-edits.js";
5
+ import { TARGET_GRAMMAR_6_CAPABILITY } from "../parser/document-parser.js";
6
+ import { validateTargetGrammar6Document } from "../semantic/target-validator.js";
7
+ import { evaluateMilestoneAcceptance } from "./evaluate.js";
8
+ import { MILESTONE_ACCEPTANCE_SOURCE_CAPABILITY, milestoneAcceptanceBaseText, parseMilestoneAcceptanceSource, } from "./source.js";
9
+ function diagnostic(message, blocked) {
10
+ return Object.freeze({
11
+ code: "PTMAC-108",
12
+ severity: "error",
13
+ message,
14
+ helpTopic: "editing",
15
+ data: Object.freeze({ blocked_milestones: blocked }),
16
+ });
17
+ }
18
+ function validator(text, maxDiagnostics) {
19
+ const acceptance = parseMilestoneAcceptanceSource(text, MILESTONE_ACCEPTANCE_SOURCE_CAPABILITY);
20
+ const base = validateTargetGrammar6Document(milestoneAcceptanceBaseText(text), TARGET_GRAMMAR_6_CAPABILITY, { maxDiagnostics });
21
+ return {
22
+ ok: acceptance.ok && base.ok,
23
+ document: { ...base.document, text },
24
+ documentId: base.documentId,
25
+ diagnostics: base.diagnostics,
26
+ diagnosticsTruncated: base.diagnosticsTruncated,
27
+ };
28
+ }
29
+ function acceptanceRemovalExtension(text) {
30
+ const source = parseMilestoneAcceptanceSource(text, MILESTONE_ACCEPTANCE_SOURCE_CAPABILITY);
31
+ return (_unusedText, _document, context) => {
32
+ const removedMilestones = new Set(context.removedMilestones.map(({ id }) => id));
33
+ const sets = source.records.filter((record) => record.kind === "milestone_criterion_set" && removedMilestones.has(record.milestoneId));
34
+ const setIds = new Set(sets.map(({ id }) => id));
35
+ const receipts = source.records.filter((record) => record.kind === "milestone_acceptance_receipt" && setIds.has(record.setId));
36
+ return {
37
+ edits: Object.freeze([...sets, ...receipts].map(({ span }) => ({ startOffset: span.start.offset, endOffset: span.end.offset, replacement: "" }))),
38
+ };
39
+ };
40
+ }
41
+ function acceptanceRemovalEdits(text, removedMilestoneIds) {
42
+ const source = parseMilestoneAcceptanceSource(text, MILESTONE_ACCEPTANCE_SOURCE_CAPABILITY);
43
+ const removedMilestones = new Set(removedMilestoneIds);
44
+ const sets = source.records.filter((record) => record.kind === "milestone_criterion_set" && removedMilestones.has(record.milestoneId));
45
+ const setIds = new Set(sets.map(({ id }) => id));
46
+ const receipts = source.records.filter((record) => record.kind === "milestone_acceptance_receipt" && setIds.has(record.setId));
47
+ return [...sets, ...receipts].map(({ span }) => ({
48
+ startOffset: span.start.offset,
49
+ endOffset: span.end.offset,
50
+ replacement: "",
51
+ }));
52
+ }
53
+ export function planMilestoneAcceptanceAdvance(text, options = {}) {
54
+ const source = parseMilestoneAcceptanceSource(text, MILESTONE_ACCEPTANCE_SOURCE_CAPABILITY);
55
+ if (!source.ok || source.grammarVersion !== 7) {
56
+ const migrationRequired = Object.freeze({ code: "PTMAC-101", severity: "error", message: "Grammar 7 migration is required for milestone acceptance advance", helpTopic: "editing", data: Object.freeze({}) });
57
+ return Object.freeze({ modelVersion: 1, ok: false, persistable: false, originalDigest: sha256DigestUtf8(text), provisional: null, acceptanceGuard: null, canonical: null, diagnostics: Object.freeze([migrationRequired]) });
58
+ }
59
+ const plannedBase = options.provisionalPlanner === undefined
60
+ ? planValidatedAdvance(text, validator, options, { extendPlan: acceptanceRemovalExtension(text) })
61
+ : options.provisionalPlanner(milestoneAcceptanceBaseText(text));
62
+ let provisionalBase = plannedBase;
63
+ if (options.provisionalPlanner !== undefined &&
64
+ plannedBase.ok &&
65
+ plannedBase.updatedText !== null &&
66
+ plannedBase.advance !== null) {
67
+ const edits = normalizeTextEdits(text, [...plannedBase.edits, ...acceptanceRemovalEdits(text, plannedBase.advance.removedMilestoneIds)], "milestone acceptance provisional advance");
68
+ const updatedText = applyTextEdits(text, edits);
69
+ const checked = validator(updatedText, options.maxDiagnostics ?? 100);
70
+ if (!checked.ok)
71
+ throw new Error("milestone acceptance provisional planner lost Grammar 7 validation");
72
+ provisionalBase = Object.freeze({
73
+ ...plannedBase,
74
+ originalDigest: sha256DigestUtf8(text),
75
+ updatedText,
76
+ updatedDigest: sha256DigestUtf8(updatedText),
77
+ diff: createUnifiedDiff(text, updatedText, {
78
+ originalLabel: options.originalLabel ?? "original",
79
+ updatedLabel: options.updatedLabel ?? "updated",
80
+ }),
81
+ edits,
82
+ });
83
+ }
84
+ if (!provisionalBase.ok || provisionalBase.updatedText === null || provisionalBase.updatedDigest === null || provisionalBase.diff === null || provisionalBase.advance === null) {
85
+ return Object.freeze({ modelVersion: 1, ok: false, persistable: false, originalDigest: provisionalBase.originalDigest, provisional: null, acceptanceGuard: null, canonical: null, diagnostics: provisionalBase.diagnostics });
86
+ }
87
+ const provisional = Object.freeze({ updatedDigest: provisionalBase.updatedDigest, updatedText: provisionalBase.updatedText, diff: provisionalBase.diff, edits: provisionalBase.edits, advance: provisionalBase.advance });
88
+ const milestoneIds = [...text.matchAll(/^milestone ([A-Za-z][A-Za-z0-9_-]*):$/gmu)].map((match) => match[1]);
89
+ const closureReachedMilestoneIds = new Set([...provisional.advance.removedMilestoneIds, ...provisional.advance.stateChangedMilestoneIds]);
90
+ const evaluation = evaluateMilestoneAcceptance({ source, milestoneIds, closureReachedMilestoneIds });
91
+ if (!evaluation.ok) {
92
+ return Object.freeze({ modelVersion: 1, ok: false, persistable: false, originalDigest: provisionalBase.originalDigest, provisional, acceptanceGuard: null, canonical: null, diagnostics: Object.freeze(evaluation.diagnostics.map(({ message }) => diagnostic(message, []))) });
93
+ }
94
+ const affected = evaluation.milestones.filter(({ milestoneId }) => closureReachedMilestoneIds.has(milestoneId));
95
+ const blockedMilestones = Object.freeze(affected.filter(({ grandfathered, acceptance }) => !grandfathered && acceptance !== "accepted").map(({ milestoneId, acceptance, blockingRequiredCriterionIds }) => Object.freeze({ milestoneId, acceptance, blockingRequiredCriterionIds })));
96
+ const guard = Object.freeze({
97
+ modelVersion: 1,
98
+ status: blockedMilestones.length === 0 ? "passed" : "blocked",
99
+ affectedMilestoneIds: Object.freeze(affected.map(({ milestoneId }) => milestoneId)),
100
+ grandfatheredMilestoneIds: Object.freeze(affected.filter(({ grandfathered }) => grandfathered).map(({ milestoneId }) => milestoneId)),
101
+ acceptedMilestoneIds: Object.freeze(affected.filter(({ acceptance }) => acceptance === "accepted").map(({ milestoneId }) => milestoneId)),
102
+ blockedMilestones,
103
+ });
104
+ if (blockedMilestones.length > 0) {
105
+ return Object.freeze({ modelVersion: 1, ok: false, persistable: false, originalDigest: provisionalBase.originalDigest, provisional, acceptanceGuard: guard, canonical: null, diagnostics: Object.freeze([diagnostic("Canonical advance is blocked by milestone acceptance", blockedMilestones)]) });
106
+ }
107
+ const canonical = options.canonicalPlanner?.(text) ?? provisionalBase;
108
+ if (!canonical.ok || canonical.updatedText !== provisional.updatedText || canonical.updatedDigest !== provisional.updatedDigest)
109
+ throw new Error("canonical advance did not preserve the accepted provisional candidate");
110
+ return Object.freeze({ modelVersion: 1, ok: true, persistable: true, originalDigest: provisionalBase.originalDigest, provisional, acceptanceGuard: guard, canonical, diagnostics: canonical.diagnostics });
111
+ }
112
+ //# sourceMappingURL=advance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advance.js","sourceRoot":"","sources":["../../src/milestone-acceptance/advance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { MilestoneAcceptanceSourceResultV1, MilestoneCriterionSourceV1 } from "./source.js";
2
+ export declare const MILESTONE_ACCEPTANCE_MODEL_VERSION: 1;
3
+ export type CriterionAcceptanceState = "pending" | "satisfied" | "failed" | "unavailable" | "waived";
4
+ export type MilestoneAcceptanceState = "not_declared" | "pending" | "accepted" | "failed" | "unavailable";
5
+ export type MilestoneClosureState = "unreached" | "reached";
6
+ export interface CriterionAcceptanceResultV1 {
7
+ readonly criterionId: string;
8
+ readonly required: boolean;
9
+ readonly evidenceKind: MilestoneCriterionSourceV1["evidenceKind"];
10
+ readonly commitment: `sha256:${string}`;
11
+ readonly state: CriterionAcceptanceState;
12
+ readonly effectiveReceiptId: string | null;
13
+ readonly evidenceReference: string | null;
14
+ readonly evidenceRevision: string | null;
15
+ readonly verifier: string | null;
16
+ readonly assertedAt: string | null;
17
+ readonly waiverReason: string | null;
18
+ readonly revokedReceiptIds: readonly string[];
19
+ }
20
+ export interface MilestoneAcceptanceEvaluationV1 {
21
+ readonly milestoneId: string;
22
+ readonly closure: MilestoneClosureState;
23
+ readonly acceptance: MilestoneAcceptanceState;
24
+ readonly grandfathered: boolean;
25
+ readonly criterionSetId: string | null;
26
+ readonly criterionRevisionId: string | null;
27
+ readonly criterionSetCommitment: `sha256:${string}` | null;
28
+ readonly criteria: readonly CriterionAcceptanceResultV1[];
29
+ readonly blockingRequiredCriterionIds: readonly string[];
30
+ }
31
+ export interface MilestoneAcceptanceEvaluationDiagnosticV1 {
32
+ readonly code: "PTMAC-103" | "PTMAC-104" | "PTMAC-105";
33
+ readonly message: string;
34
+ readonly milestoneId: string | null;
35
+ readonly criterionId: string | null;
36
+ readonly receiptIds: readonly string[];
37
+ }
38
+ export interface MilestoneAcceptanceModelResultV1 {
39
+ readonly ok: boolean;
40
+ readonly modelVersion: 1;
41
+ readonly grammarVersion: number;
42
+ readonly milestones: readonly MilestoneAcceptanceEvaluationV1[];
43
+ readonly diagnostics: readonly MilestoneAcceptanceEvaluationDiagnosticV1[];
44
+ }
45
+ export interface MilestoneAcceptanceEvaluationInputV1 {
46
+ readonly source: MilestoneAcceptanceSourceResultV1;
47
+ readonly milestoneIds: readonly string[];
48
+ readonly closureReachedMilestoneIds: ReadonlySet<string>;
49
+ }
50
+ export declare function evaluateMilestoneAcceptance(input: MilestoneAcceptanceEvaluationInputV1): MilestoneAcceptanceModelResultV1;
51
+ //# sourceMappingURL=evaluate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/milestone-acceptance/evaluate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ export const MILESTONE_ACCEPTANCE_MODEL_VERSION = 1;
2
+ function diagnostic(code, message, milestoneId, criterionId, receiptIds = []) {
3
+ return { code, message, milestoneId, criterionId, receiptIds };
4
+ }
5
+ function terminalState(receipt) {
6
+ switch (receipt.action) {
7
+ case "verify": return "satisfied";
8
+ case "fail": return "failed";
9
+ case "unavailable": return "unavailable";
10
+ case "waive": return "waived";
11
+ case "revoke": return null;
12
+ }
13
+ }
14
+ function evaluateCriterion(milestoneId, set, criterion, receipts, diagnostics) {
15
+ const owned = receipts.filter((receipt) => receipt.setId === set.id && receipt.criterionId === criterion.criterionId);
16
+ const byId = new Map(owned.map((receipt) => [receipt.id, receipt]));
17
+ const revoked = new Set();
18
+ for (const receipt of owned) {
19
+ if (receipt.action !== "revoke")
20
+ continue;
21
+ const target = receipt.revokes === null ? undefined : byId.get(receipt.revokes);
22
+ if (target === undefined ||
23
+ target.action === "revoke" ||
24
+ target.span.start.offset >= receipt.span.start.offset ||
25
+ revoked.has(target.id)) {
26
+ diagnostics.push(diagnostic("PTMAC-105", "A revocation must name one earlier unrevoked terminal receipt for the same criterion", milestoneId, criterion.criterionId, target === undefined ? [receipt.id] : [target.id, receipt.id]));
27
+ continue;
28
+ }
29
+ revoked.add(target.id);
30
+ }
31
+ const active = owned.filter((receipt) => terminalState(receipt) !== null && !revoked.has(receipt.id));
32
+ if (active.length > 1) {
33
+ diagnostics.push(diagnostic("PTMAC-104", "A criterion has more than one unrevoked terminal receipt", milestoneId, criterion.criterionId, active.map(({ id }) => id)));
34
+ }
35
+ const effective = active.length === 1 ? active[0] : null;
36
+ if (effective?.action === "waive" && !criterion.required) {
37
+ diagnostics.push(diagnostic("PTMAC-103", "Only a required criterion may be waived", milestoneId, criterion.criterionId, [effective.id]));
38
+ }
39
+ return Object.freeze({
40
+ criterionId: criterion.criterionId,
41
+ required: criterion.required,
42
+ evidenceKind: criterion.evidenceKind,
43
+ commitment: criterion.commitment,
44
+ state: effective === null ? "pending" : terminalState(effective),
45
+ effectiveReceiptId: effective?.id ?? null,
46
+ evidenceReference: effective?.evidenceReference ?? null,
47
+ evidenceRevision: effective?.evidenceRevision ?? null,
48
+ verifier: effective?.verifier ?? null,
49
+ assertedAt: effective?.occurredAt ?? null,
50
+ waiverReason: effective?.action === "waive" ? effective.reason : null,
51
+ revokedReceiptIds: Object.freeze(owned.filter(({ id }) => revoked.has(id)).map(({ id }) => id)),
52
+ });
53
+ }
54
+ function aggregate(criteria) {
55
+ const required = criteria.filter((criterion) => criterion.required);
56
+ if (required.some(({ state }) => state === "failed"))
57
+ return "failed";
58
+ if (required.some(({ state }) => state === "unavailable"))
59
+ return "unavailable";
60
+ if (required.every(({ state }) => state === "satisfied" || state === "waived"))
61
+ return "accepted";
62
+ return "pending";
63
+ }
64
+ export function evaluateMilestoneAcceptance(input) {
65
+ if (!input.source.ok || input.source.grammarVersion === null) {
66
+ throw new TypeError("milestone acceptance evaluation requires a valid source result");
67
+ }
68
+ if (new Set(input.milestoneIds).size !== input.milestoneIds.length) {
69
+ throw new TypeError("milestoneIds must be unique in document declaration order");
70
+ }
71
+ const diagnostics = [];
72
+ const milestoneSet = new Set(input.milestoneIds);
73
+ for (const reached of input.closureReachedMilestoneIds) {
74
+ if (!milestoneSet.has(reached))
75
+ throw new TypeError(`unknown closure milestone ${reached}`);
76
+ }
77
+ const sets = input.source.records.filter((record) => record.kind === "milestone_criterion_set");
78
+ const receipts = input.source.records.filter((record) => record.kind === "milestone_acceptance_receipt");
79
+ const grandfathered = new Set(input.source.records
80
+ .filter((record) => record.kind === "milestone_acceptance_migration")
81
+ .flatMap((record) => record.grandfatheredMilestoneIds));
82
+ const results = [];
83
+ for (const milestoneId of input.milestoneIds) {
84
+ const ownedSets = sets.filter((set) => set.milestoneId === milestoneId);
85
+ if (ownedSets.length > 1)
86
+ diagnostics.push(diagnostic("PTMAC-104", "A milestone has more than one current criterion-set revision", milestoneId, null));
87
+ const set = ownedSets.length === 1 ? ownedSets[0] : null;
88
+ const criteria = set === null
89
+ ? []
90
+ : set.criteria.map((criterion) => evaluateCriterion(milestoneId, set, criterion, receipts, diagnostics));
91
+ const acceptance = set === null ? "not_declared" : aggregate(criteria);
92
+ results.push(Object.freeze({
93
+ milestoneId,
94
+ closure: input.closureReachedMilestoneIds.has(milestoneId) ? "reached" : "unreached",
95
+ acceptance,
96
+ grandfathered: grandfathered.has(milestoneId),
97
+ criterionSetId: set?.id ?? null,
98
+ criterionRevisionId: set?.revisionId ?? null,
99
+ criterionSetCommitment: set?.commitment ?? null,
100
+ criteria: Object.freeze(criteria),
101
+ blockingRequiredCriterionIds: Object.freeze(criteria
102
+ .filter(({ required, state }) => required && state !== "satisfied" && state !== "waived")
103
+ .map(({ criterionId }) => criterionId)),
104
+ }));
105
+ }
106
+ return Object.freeze({
107
+ ok: diagnostics.length === 0,
108
+ modelVersion: 1,
109
+ grammarVersion: input.source.grammarVersion,
110
+ milestones: Object.freeze(results),
111
+ diagnostics: Object.freeze(diagnostics),
112
+ });
113
+ }
114
+ //# sourceMappingURL=evaluate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/milestone-acceptance/evaluate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export declare const MILESTONE_ACCEPTANCE_MIGRATION_MODEL_VERSION: 1;
2
+ export interface CommittedMigrationProofV1 {
3
+ readonly repositoryId: string;
4
+ readonly repositoryRelativePath: string;
5
+ readonly objectFormat: "sha1" | "sha256";
6
+ readonly headCommit: string;
7
+ readonly headBlob: string;
8
+ readonly stage0Blob: string;
9
+ readonly sourceDigest: `sha256:${string}`;
10
+ }
11
+ export interface MilestoneAcceptanceMigrationPlanV1 {
12
+ readonly ok: boolean;
13
+ readonly modelVersion: 1;
14
+ readonly changed: boolean;
15
+ readonly sourceGrammarVersion: number | null;
16
+ readonly targetGrammarVersion: 7 | null;
17
+ readonly sourceDigest: `sha256:${string}`;
18
+ readonly candidateDigest: `sha256:${string}` | null;
19
+ readonly grandfatheredMilestoneIds: readonly string[];
20
+ readonly candidateText: string | null;
21
+ readonly diagnostics: readonly string[];
22
+ }
23
+ export declare function planMilestoneAcceptanceMigration(text: string, proof: CommittedMigrationProofV1): MilestoneAcceptanceMigrationPlanV1;
24
+ export declare function recheckCommittedMigrationProof(baseline: CommittedMigrationProofV1, current: CommittedMigrationProofV1): boolean;
25
+ //# sourceMappingURL=migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../src/milestone-acceptance/migration.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,4CAA4C,EAAG,CAAU,CAAC;AAEvE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,UAAU,MAAM,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,oBAAoB,EAAE,CAAC,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,UAAU,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,eAAe,EAAE,UAAU,MAAM,EAAE,GAAG,IAAI,CAAC;IACpD,QAAQ,CAAC,yBAAyB,EAAE,SAAS,MAAM,EAAE,CAAC;IACtD,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AA6BD,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,yBAAyB,GAC/B,kCAAkC,CA+BpC;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,yBAAyB,EACnC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAQT"}
@@ -0,0 +1,76 @@
1
+ import { sha256DigestUtf8 } from "../model/sha256.js";
2
+ import { fieldNamed } from "../model/syntax.js";
3
+ import { TARGET_GRAMMAR_6_CAPABILITY } from "../parser/document-parser.js";
4
+ import { validateTargetGrammar6Document } from "../semantic/target-validator.js";
5
+ import { MILESTONE_ACCEPTANCE_SOURCE_CAPABILITY, parseMilestoneAcceptanceSource, } from "./source.js";
6
+ export const MILESTONE_ACCEPTANCE_MIGRATION_MODEL_VERSION = 1;
7
+ function candidateCommitment(proof, ids) {
8
+ return sha256DigestUtf8(JSON.stringify([
9
+ "Perttool.MilestoneAcceptanceMigrationCandidate.v1",
10
+ proof.repositoryId,
11
+ proof.repositoryRelativePath,
12
+ proof.objectFormat,
13
+ proof.headCommit,
14
+ proof.headBlob,
15
+ proof.sourceDigest,
16
+ ids,
17
+ ]));
18
+ }
19
+ function replaceVersion(text) {
20
+ const pattern = /(^ version )(\d+)(\r?$)/mu;
21
+ if (!pattern.test(text))
22
+ return null;
23
+ return text.replace(pattern, "$17$3");
24
+ }
25
+ function insertionOffset(text) {
26
+ const project = /^project [A-Za-z][A-Za-z0-9_-]*:\r?\n(?:^(?: |\s*$).*\r?\n?)*/mu.exec(text);
27
+ return project === null ? null : project.index + project[0].length;
28
+ }
29
+ export function planMilestoneAcceptanceMigration(text, proof) {
30
+ const sourceDigest = sha256DigestUtf8(text);
31
+ const diagnostics = [];
32
+ if (proof.sourceDigest !== sourceDigest)
33
+ diagnostics.push("source_digest_mismatch");
34
+ if (proof.headBlob !== proof.stage0Blob)
35
+ diagnostics.push("stage0_not_equal_to_head");
36
+ const objectLength = proof.objectFormat === "sha1" ? 40 : 64;
37
+ if (!new RegExp(`^[0-9a-f]{${objectLength}}$`, "u").test(proof.headCommit))
38
+ diagnostics.push("invalid_head");
39
+ if (!new RegExp(`^[0-9a-f]{${objectLength}}$`, "u").test(proof.headBlob))
40
+ diagnostics.push("invalid_blob");
41
+ if (proof.repositoryId.length === 0 || proof.repositoryRelativePath.length === 0 || proof.repositoryRelativePath.startsWith("/") || proof.repositoryRelativePath.split("/").includes(".."))
42
+ diagnostics.push("invalid_repository_binding");
43
+ const checked = validateTargetGrammar6Document(text, TARGET_GRAMMAR_6_CAPABILITY);
44
+ const grammar = checked.validatedDocument?.grammarVersion ?? null;
45
+ if (!checked.ok || grammar === null)
46
+ diagnostics.push("invalid_source");
47
+ const grandfathered = checked.document.declarations
48
+ .filter((declaration) => declaration.kind === "milestone" && fieldNamed(declaration, "state")?.value === "reached")
49
+ .map((declaration) => declaration.id)
50
+ .sort();
51
+ if (diagnostics.length > 0)
52
+ return Object.freeze({ ok: false, modelVersion: 1, changed: false, sourceGrammarVersion: grammar, targetGrammarVersion: null, sourceDigest, candidateDigest: null, grandfatheredMilestoneIds: Object.freeze(grandfathered), candidateText: null, diagnostics: Object.freeze(diagnostics) });
53
+ const upgraded = replaceVersion(text);
54
+ const offset = insertionOffset(upgraded ?? "");
55
+ if (upgraded === null || offset === null)
56
+ return Object.freeze({ ok: false, modelVersion: 1, changed: false, sourceGrammarVersion: grammar, targetGrammarVersion: null, sourceDigest, candidateDigest: null, grandfatheredMilestoneIds: Object.freeze(grandfathered), candidateText: null, diagnostics: Object.freeze(["version_or_project_span_unavailable"]) });
57
+ const commitment = candidateCommitment(proof, grandfathered);
58
+ let record = `\nmilestone_acceptance_migration GRAMMAR_7_BASELINE:\n model 1\n repository ${proof.repositoryId}\n path ${JSON.stringify(proof.repositoryRelativePath)}\n object_format ${proof.objectFormat}\n head ${proof.headCommit}\n blob ${proof.headBlob}\n source_digest ${proof.sourceDigest}\n candidate_digest ${commitment}\n`;
59
+ for (const id of grandfathered)
60
+ record += ` grandfathered ${id}\n`;
61
+ const candidateText = upgraded.slice(0, offset) + record + upgraded.slice(offset);
62
+ const candidate = parseMilestoneAcceptanceSource(candidateText, MILESTONE_ACCEPTANCE_SOURCE_CAPABILITY);
63
+ if (!candidate.ok)
64
+ throw new Error(`migration candidate invariant failed: ${candidate.diagnostics.map(({ code }) => code).join(",")}`);
65
+ return Object.freeze({ ok: true, modelVersion: 1, changed: true, sourceGrammarVersion: grammar, targetGrammarVersion: 7, sourceDigest, candidateDigest: commitment, grandfatheredMilestoneIds: Object.freeze(grandfathered), candidateText, diagnostics: Object.freeze([]) });
66
+ }
67
+ export function recheckCommittedMigrationProof(baseline, current) {
68
+ return baseline.repositoryId === current.repositoryId &&
69
+ baseline.repositoryRelativePath === current.repositoryRelativePath &&
70
+ baseline.objectFormat === current.objectFormat &&
71
+ baseline.headCommit === current.headCommit &&
72
+ baseline.headBlob === current.headBlob &&
73
+ baseline.stage0Blob === current.stage0Blob &&
74
+ baseline.sourceDigest === current.sourceDigest;
75
+ }
76
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/milestone-acceptance/migration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AACjF,OAAO,EACL,sCAAsC,EACtC,8BAA8B,GAC/B,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,4CAA4C,GAAG,CAAU,CAAC;AAyBvE,SAAS,mBAAmB,CAC1B,KAAgC,EAChC,GAAsB;IAEtB,OAAO,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC;QACrC,mDAAmD;QACnD,KAAK,CAAC,YAAY;QAClB,KAAK,CAAC,sBAAsB;QAC5B,KAAK,CAAC,YAAY;QAClB,KAAK,CAAC,UAAU;QAChB,KAAK,CAAC,QAAQ;QACd,KAAK,CAAC,YAAY;QAClB,GAAG;KACJ,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,OAAO,GAAG,4BAA4B,CAAC;IAC7C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,OAAO,GAAG,kEAAkE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9F,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,IAAY,EACZ,KAAgC;IAEhC,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,KAAK,CAAC,YAAY,KAAK,YAAY;QAAE,WAAW,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACpF,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,UAAU;QAAE,WAAW,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACtF,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,IAAI,CAAC,IAAI,MAAM,CAAC,aAAa,YAAY,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;QAAE,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC7G,IAAI,CAAC,IAAI,MAAM,CAAC,aAAa,YAAY,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3G,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,WAAW,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAE3O,MAAM,OAAO,GAAG,8BAA8B,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,EAAE,cAAc,IAAI,IAAI,CAAC;IAClE,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,OAAO,KAAK,IAAI;QAAE,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY;SAChD,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CACtB,WAAW,CAAC,IAAI,KAAK,WAAW,IAAI,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,KAAK,KAAK,SAAS,CAC1F;SACA,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;SACpC,IAAI,EAAE,CAAC;IACV,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAExT,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAC/C,IAAI,QAAQ,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,qCAAqC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClW,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAC7D,IAAI,MAAM,GAAG,iFAAiF,KAAK,CAAC,YAAY,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,sBAAsB,CAAC,qBAAqB,KAAK,CAAC,YAAY,YAAY,KAAK,CAAC,UAAU,YAAY,KAAK,CAAC,QAAQ,qBAAqB,KAAK,CAAC,YAAY,wBAAwB,UAAU,IAAI,CAAC;IACnV,KAAK,MAAM,EAAE,IAAI,aAAa;QAAE,MAAM,IAAI,mBAAmB,EAAE,IAAI,CAAC;IACpE,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClF,MAAM,SAAS,GAAG,8BAA8B,CAAC,aAAa,EAAE,sCAAsC,CAAC,CAAC;IACxG,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvI,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,yBAAyB,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAChR,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,QAAmC,EACnC,OAAkC;IAElC,OAAO,QAAQ,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY;QACnD,QAAQ,CAAC,sBAAsB,KAAK,OAAO,CAAC,sBAAsB;QAClE,QAAQ,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY;QAC9C,QAAQ,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU;QAC1C,QAAQ,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;QACtC,QAAQ,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU;QAC1C,QAAQ,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY,CAAC;AACnD,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { GovernanceDecisionV1, GovernanceRequestInput } from "../governance/types.js";
2
+ import { type DocumentWriteResult } from "../io/safe-write.js";
3
+ import { type MilestoneAcceptanceModelResultV1 } from "./evaluate.js";
4
+ import { type AcceptanceReceiptAction, type CriterionEvidenceKind } from "./source.js";
5
+ export interface CriterionReplacementInputV1 {
6
+ readonly setId: string;
7
+ readonly milestoneId: string;
8
+ readonly revisionId: string;
9
+ readonly criteria: readonly {
10
+ readonly criterionId: string;
11
+ readonly required: boolean;
12
+ readonly evidenceKind: CriterionEvidenceKind;
13
+ readonly description: string;
14
+ }[];
15
+ }
16
+ export interface ReceiptMutationInputV1 {
17
+ readonly receiptId: string;
18
+ readonly setId: string;
19
+ readonly criterionId: string;
20
+ readonly action: AcceptanceReceiptAction;
21
+ readonly evidenceKind?: CriterionEvidenceKind;
22
+ readonly evidenceReference?: string;
23
+ readonly evidenceRevision?: string;
24
+ readonly verifier?: string;
25
+ readonly occurredAt?: string;
26
+ readonly reason?: string;
27
+ readonly revokes?: string;
28
+ }
29
+ export interface MilestoneAcceptanceMutationOptionsV1 {
30
+ readonly governance?: GovernanceRequestInput;
31
+ }
32
+ export interface MilestoneAcceptanceMutationResultV1 {
33
+ readonly modelVersion: 1;
34
+ readonly operation: "replace" | AcceptanceReceiptAction;
35
+ readonly ok: boolean;
36
+ readonly changed: boolean;
37
+ readonly replayed: boolean;
38
+ readonly originalDigest: `sha256:${string}`;
39
+ readonly updatedDigest: `sha256:${string}` | null;
40
+ readonly updatedText: string | null;
41
+ readonly governance: GovernanceDecisionV1 | null;
42
+ readonly evaluation: MilestoneAcceptanceModelResultV1 | null;
43
+ readonly diagnostics: readonly string[];
44
+ }
45
+ export declare function planCriterionSetReplacement(text: string, input: CriterionReplacementInputV1, options?: MilestoneAcceptanceMutationOptionsV1): MilestoneAcceptanceMutationResultV1;
46
+ export declare function planAcceptanceReceiptMutation(text: string, input: ReceiptMutationInputV1, options?: MilestoneAcceptanceMutationOptionsV1): MilestoneAcceptanceMutationResultV1;
47
+ export declare function showMilestoneAcceptance(text: string, closureReachedMilestoneIds: readonly string[]): MilestoneAcceptanceModelResultV1;
48
+ export declare function persistMilestoneAcceptanceMutation(path: string, result: MilestoneAcceptanceMutationResultV1, expectedDigest?: string): Promise<DocumentWriteResult>;
49
+ //# sourceMappingURL=mutation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation.d.ts","sourceRoot":"","sources":["../../src/milestone-acceptance/mutation.ts"],"names":[],"mappings":"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"}