create-agdf 0.13.2 → 0.13.4

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 (77) hide show
  1. package/generated/.agdf/control/templates/RUN_STATE.md +22 -0
  2. package/generated/.agdf/control/templates/artefacts/OR.md +22 -0
  3. package/generated/.github/skills/agdf-delivery-closeout/SKILL.md +7 -0
  4. package/generated/.github/skills/agdf-interaction-locales.json +2 -4
  5. package/generated/.github/skills/agdf-release-or/SKILL.md +14 -4
  6. package/generated/.github/skills/contracts/closeout.md +49 -0
  7. package/generated/.github/skills/contracts/control-scaffold.md +2 -0
  8. package/generated/.github/skills/contracts/interaction.md +23 -12
  9. package/generated/.opencode/agdf-interaction-locales.json +2 -4
  10. package/generated/.opencode/contracts/closeout.md +49 -0
  11. package/generated/.opencode/contracts/control-scaffold.md +2 -0
  12. package/generated/.opencode/contracts/interaction.md +23 -12
  13. package/generated/.opencode/skills/agdf-delivery-closeout/SKILL.md +7 -0
  14. package/generated/.opencode/skills/agdf-release-or/SKILL.md +14 -4
  15. package/generated/plugins/agdf/.claude-plugin/plugin.json +1 -1
  16. package/generated/plugins/agdf/.codex-plugin/plugin.json +1 -1
  17. package/generated/plugins/agdf/control/templates/RUN_STATE.md +22 -0
  18. package/generated/plugins/agdf/control/templates/artefacts/OR.md +22 -0
  19. package/generated/plugins/agdf/meta/agdf-interaction-locales.json +2 -4
  20. package/generated/plugins/agdf/meta/agdf-plugin.definition.json +1 -1
  21. package/generated/plugins/agdf/meta/agent-skills-conformance.json +86 -0
  22. package/generated/plugins/agdf/meta/contracts/closeout.md +49 -0
  23. package/generated/plugins/agdf/meta/contracts/control-scaffold.md +2 -0
  24. package/generated/plugins/agdf/meta/contracts/interaction.md +23 -12
  25. package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-interaction-locales.json +2 -4
  26. package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-plugin.definition.json +1 -1
  27. package/generated/plugins/agdf/runtime/create-agdf/lib/control-evaluation/delivery-map.js +13 -3
  28. package/generated/plugins/agdf/runtime/create-agdf/lib/control-evaluation/doctor.js +9 -2
  29. package/generated/plugins/agdf/runtime/create-agdf/lib/control-evaluation/gate-check.js +6 -1
  30. package/generated/plugins/agdf/runtime/create-agdf/lib/control-evaluation/gate-policy.js +16 -1
  31. package/generated/plugins/agdf/runtime/create-agdf/lib/control-evaluation/parent-reconciliation.js +284 -0
  32. package/generated/plugins/agdf/runtime/create-agdf/lib/control-state/run-state-parser.js +39 -1
  33. package/generated/plugins/agdf/runtime/create-agdf/lib/interaction-presentation.js +42 -18
  34. package/generated/plugins/agdf/runtime/create-agdf/package.json +1 -1
  35. package/generated/plugins/agdf/runtime/runtime-manifest.json +2 -2
  36. package/generated/plugins/agdf/scripts/agent-skills-conformance.mjs +543 -0
  37. package/generated/plugins/agdf/scripts/check-runtime-integrity.mjs +31 -17
  38. package/generated/plugins/agdf/skills/delivery-closeout/SKILL.md +7 -0
  39. package/generated/plugins/agdf/skills/release-or/SKILL.md +14 -4
  40. package/generated/plugins/agdf/submission/openai/availability.md +1 -1
  41. package/generated/plugins/agdf/submission/openai/capability-matrix.json +2 -2
  42. package/generated/plugins/agdf/submission/openai/release-notes.md +1 -1
  43. package/generated/plugins/agdf/submission/openai/reviewer-cases.json +1 -1
  44. package/generated/submissions/openai/agdf/.codex-plugin/plugin.json +1 -1
  45. package/generated/submissions/openai/agdf/meta/agdf-interaction-locales.json +2 -4
  46. package/generated/submissions/openai/agdf/meta/agdf-plugin.definition.json +1 -1
  47. package/generated/submissions/openai/agdf/meta/agent-skills-conformance.json +86 -0
  48. package/generated/submissions/openai/agdf/meta/contracts/closeout.md +49 -0
  49. package/generated/submissions/openai/agdf/meta/contracts/control-scaffold.md +2 -0
  50. package/generated/submissions/openai/agdf/meta/contracts/interaction.md +23 -12
  51. package/generated/submissions/openai/agdf/skills/delivery-closeout/SKILL.md +7 -0
  52. package/generated/submissions/openai/agdf/skills/release-or/SKILL.md +14 -4
  53. package/generated/submissions/openai/agdf/submission/openai/availability.md +1 -1
  54. package/generated/submissions/openai/agdf/submission/openai/capability-matrix.json +2 -2
  55. package/generated/submissions/openai/agdf/submission/openai/inventory.json +19 -15
  56. package/generated/submissions/openai/agdf/submission/openai/listing.json +1 -1
  57. package/generated/submissions/openai/agdf/submission/openai/readiness.json +2 -2
  58. package/generated/submissions/openai/agdf/submission/openai/readiness.md +2 -2
  59. package/generated/submissions/openai/agdf/submission/openai/release-notes.md +1 -1
  60. package/generated/submissions/openai/agdf/submission/openai/reviewer-cases.json +1 -1
  61. package/lib/control-evaluation/delivery-map.js +13 -3
  62. package/lib/control-evaluation/doctor.js +9 -2
  63. package/lib/control-evaluation/gate-check.js +6 -1
  64. package/lib/control-evaluation/gate-policy.js +16 -1
  65. package/lib/control-evaluation/parent-reconciliation.js +284 -0
  66. package/lib/control-state/run-state-parser.js +39 -1
  67. package/lib/interaction-presentation.js +42 -18
  68. package/lib/proportionality-benchmark/blind-prompt.js +2 -1
  69. package/lib/proportionality-benchmark/contracts.js +16 -7
  70. package/lib/proportionality-benchmark/corpus-loader.js +132 -21
  71. package/lib/proportionality-benchmark/evaluator.js +25 -15
  72. package/lib/proportionality-benchmark/index.js +1 -0
  73. package/lib/proportionality-benchmark/live-recorder.js +32 -10
  74. package/lib/proportionality-benchmark/profiles.js +102 -0
  75. package/lib/proportionality-benchmark/report.js +10 -1
  76. package/lib/proportionality-benchmark/source-fingerprint.js +6 -2
  77. package/package.json +4 -2
@@ -0,0 +1,86 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "policyVersion": "2026-08-19",
4
+ "baseline": {
5
+ "id": "agent-skills-core-format",
6
+ "specificationUrl": "https://agentskills.io/specification",
7
+ "reviewedAt": "2026-08-19"
8
+ },
9
+ "classifications": [
10
+ "standard_strict",
11
+ "upstream_advisory",
12
+ "agdf_policy"
13
+ ],
14
+ "frontmatterProfile": {
15
+ "requiredFields": [
16
+ "name",
17
+ "description"
18
+ ],
19
+ "allowedFields": [
20
+ "name",
21
+ "description"
22
+ ],
23
+ "scalarStyles": [
24
+ "plain",
25
+ "single_quoted",
26
+ "double_quoted"
27
+ ]
28
+ },
29
+ "strictRules": {
30
+ "nameMaxCodePoints": 64,
31
+ "descriptionMaxCodePoints": 1024,
32
+ "namePattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
33
+ "nameMustMatchParent": true
34
+ },
35
+ "advisoryRules": {
36
+ "skillMdMaxLines": 500
37
+ },
38
+ "agdfRules": {
39
+ "descriptionStartsWith": "Use this skill",
40
+ "requiresRuntimeContractResource": true
41
+ },
42
+ "surfaces": {
43
+ "source": {
44
+ "skillsRoot": "skills",
45
+ "sharedResourceRoots": [
46
+ "meta/contracts"
47
+ ],
48
+ "skillPrefixOwner": "codex",
49
+ "ignoredSkillEntries": []
50
+ },
51
+ "plugin": {
52
+ "skillsRoot": "skills",
53
+ "sharedResourceRoots": [
54
+ "meta/contracts"
55
+ ],
56
+ "skillPrefixOwner": "codex",
57
+ "ignoredSkillEntries": []
58
+ },
59
+ "copilot": {
60
+ "skillsRoot": ".",
61
+ "sharedResourceRoots": [
62
+ "contracts"
63
+ ],
64
+ "skillPrefixOwner": "copilot",
65
+ "ignoredSkillEntries": [
66
+ "contracts"
67
+ ]
68
+ },
69
+ "opencode": {
70
+ "skillsRoot": "skills",
71
+ "sharedResourceRoots": [
72
+ "contracts"
73
+ ],
74
+ "skillPrefixOwner": "opencode",
75
+ "ignoredSkillEntries": []
76
+ },
77
+ "public_candidate": {
78
+ "skillsRoot": "skills",
79
+ "sharedResourceRoots": [
80
+ "meta/contracts"
81
+ ],
82
+ "skillPrefixOwner": "codex",
83
+ "ignoredSkillEntries": []
84
+ }
85
+ }
86
+ }
@@ -21,6 +21,55 @@ selected-run ceremony even when it is otherwise a relevant run. If a selected ca
21
21
  section or any other existing line.
22
22
 
23
23
 
24
+ ## Parent Reconciliation Handoff
25
+
26
+ Parent reconciliation is an optional closeout coordination projection. It never grants, revokes or
27
+ blocks Child gates, QA, UAT, OR completion or an otherwise valid delivery handoff.
28
+
29
+ It activates only when the Child `Artefact Chain` contains exactly one evidenced row with:
30
+
31
+ - `From`: `OR`
32
+ - `Relationship`: `reconciles_with`
33
+ - `To`: `parent_run:<run_id>` using the canonical run-id grammar
34
+
35
+ Names, directories, branches, backlog proximity, chat history and evidence prose do not establish
36
+ Parentage. Delivery Map is the single deterministic evaluator. It compares the Child row with one
37
+ evidenced reciprocal Parent row `Aggregate | includes | child_run:<run_id>` and returns exactly one
38
+ outcome:
39
+
40
+ - `resolved`: the named Parent has exactly one evidenced reciprocal Child relationship;
41
+ - `not_applicable`: the Child declares no qualifying Parent relationship; or
42
+ - `open`: the explicit relationship is invalid, ambiguous, unavailable, stale or lacks reciprocal
43
+ evidence.
44
+
45
+ An open outcome contains concrete evidence or missing evidence and exactly one next action. Optional
46
+ Child handling input is limited to `action_required | accepted_open`. `accepted_open` keeps the
47
+ outcome open and visible while allowing independently valid Child delivery to continue; it never
48
+ asserts Parent reconciliation. Evaluation is read-only and must never mutate a Parent.
49
+
50
+ `release-or` reports the evaluated result in the Child OR. `delivery-closeout` consumes that OR
51
+ projection only; it must not search sibling runs, infer a relationship, reevaluate evidence or repair
52
+ a Parent. Unresolved explicit reconciliation is warning-level coordination evidence, not a Child
53
+ gate failure. Legacy runs without the optional relationship remain unchanged and add no routine
54
+ visible ceremony.
55
+
56
+
57
+ ## Programme Aggregation Readiness
58
+
59
+ An explicit Parent/programme run may project two independent evidence values:
60
+
61
+ - `startable: true` requires at least one evidenced `Aggregate | includes | child_run:<run_id>` row
62
+ whose Child has a completed OR;
63
+ - `final_ready: true` additionally requires one valid declared acceptance artefact beneath
64
+ `.agdf/control/artefacts/`, concrete aggregation evidence and
65
+ `programme_aggregation_missing_evidence: none`.
66
+
67
+ `final_ready: true` always implies `startable: true`. Failed prerequisites stay false with explicit
68
+ missing evidence and one next action; they are never silently promoted. These values are evidence
69
+ projections only. They do not approve QA/UAT, create a gate or define the programme-specific
70
+ acceptance criteria, which remain owned by the referenced programme artefact.
71
+
72
+
24
73
  ## Do Not Duplicate
25
74
 
26
75
  The explanatory framework lives in `docs/`.
@@ -108,6 +108,8 @@ It must expose:
108
108
  - multi-scope ambiguity and branch/workspace evidence limits when present
109
109
  - memory persistence target, reason and references when present
110
110
  - Context Graph impact and gate effect
111
+ - optional evaluated Parent reconciliation and programme aggregation readiness from the Closeout
112
+ Contract, without changing Child gate authority
111
113
  - the Run Status Card as a compact projection of current gate, next step and quality outlook
112
114
  - findings that explain why the delivery picture is `pass | warn | revise | block`
113
115
 
@@ -7,7 +7,7 @@ It must not introduce a second gate model or override `gate-check`, `delivery-ma
7
7
 
8
8
  - `mode`: `quick_task | verified_change | structured_delivery | unknown`
9
9
  - `run_id`: the exactly selected canonical run
10
- - `presentation_language`: the resolved complete locale-pack tag; absent, unsupported or incomplete packs resolve to the registry's deterministic `en` fallback
10
+ - `presentation_language`: the resolved complete locale-pack tag; absent or unsupported requested locale tags resolve to the registry's deterministic `en` fallback, while an incomplete or invalid registry fails closed
11
11
  - `status`: `open | blocked | pass | warn | revise | block | in_progress`
12
12
  - `current_gate`: current user gate or internal step
13
13
  - `mode_slice_decision`: `undecided | quick_task | verified_change | structured_slice | structured_delivery | block`
@@ -206,8 +206,8 @@ Use this compact composition:
206
206
 
207
207
  Resolve all AGDF-owned explanatory text through the canonical Interaction
208
208
  Locale Registry. `en` and `de` are initial reviewed packs, not a closed locale
209
- list. English is the deterministic fallback for absent, unsupported or
210
- incomplete packs. Gate identifiers, `run_id`, canonical paths and exact
209
+ list. English is the deterministic fallback for absent or unsupported requested locale tags; an
210
+ incomplete or invalid registry fails closed. Gate identifiers, `run_id`, canonical paths and exact
211
211
  approval values are never translated. The visible gate title is localized;
212
212
  for example, the German title may be `Lösungsdesign` while the authorization
213
213
  value remains `Approval: SD`. Meaning, ordering and authority boundaries are
@@ -362,20 +362,30 @@ skill-local target-orientation template.
362
362
 
363
363
  ### Scope Classification Card
364
364
 
365
- When `gate-check` classifies a fresh scope as ungated (Quick Task or Trivial Change Boundary),
365
+ When `gate-check` classifies a fresh scope as an ungated `quick_task` with a resolved Trivial
366
+ Change Boundary result,
366
367
  the agent consumes the canonical `scope_classification.markdown` verbatim from
367
368
  `renderScopeClassificationCard` in `create-agdf/lib/interaction-presentation.js`. The card is a
368
369
  compact, localized, non-authorizing projection of the classification: mode, boundary result,
369
370
  UR-trigger evaluation, one currently-allowed line, one remains-forbidden line, escalation triggers
370
371
  and the challenge path. It carries `authorizes: false` and never renders approval controls.
371
372
 
372
- The card renders exactly once per fresh-scope ungated classification, before work proceeds. It must
373
- not appear for gated scopes, internal steps of a selected run, or as a substitute for the two-card
374
- approval envelope. Read-only requests keep the single read-only orientation sentence above; the
375
- scope classification card and the read-only orientation are mutually exclusive for the same request.
376
-
377
- If the classification input is missing, unknown, contradictory or the locale section is incomplete,
378
- the renderer returns `null` and the agent fails closed to the existing ceremony — never
373
+ The card renders exactly once per valid fresh-scope Quick Task classification, before work proceeds.
374
+ It must not appear for Verified Change, Structured Delivery, gated, ambiguous, unknown or selected-
375
+ run states, internal steps of a selected run, or as a substitute for the two-card approval envelope.
376
+ Read-only requests keep the single read-only orientation sentence above; the scope classification
377
+ card and the read-only orientation are mutually exclusive for the same request.
378
+
379
+ Every dynamic scalar and escalation-trigger item is a non-empty, single-line plain-text string of at
380
+ most 240 Unicode code points. Markdown control tokens and line-leading heading, blockquote, list or
381
+ ordered-list syntax are invalid. The escalation list contains 1–3 valid, distinct normalized items.
382
+ The renderer rejects the complete input on any violation; it never coerces, truncates, sanitizes or
383
+ partially retains invalid values.
384
+
385
+ An unsupported requested locale resolves through the complete deterministic English fallback pack.
386
+ A present incomplete or otherwise invalid registry is an invalid presentation source, not an
387
+ unsupported locale: the renderer returns `null`. Missing, unknown or contradictory classification
388
+ input likewise returns `null`, and the agent fails closed to the existing ceremony — never
379
389
  model-reconstructed Markdown. The card introduces no gate, no approval value, no persistence and no
380
390
  second presentation owner. `gate-check` must not maintain a skill-local card template.
381
391
 
@@ -390,7 +400,8 @@ fallback and human CLI output use the configured project chat language from
390
400
 
391
401
  - resolve an exact complete pack, then its language subtag, then deterministic English fallback;
392
402
  - `en` and `de` are the initial complete packs; additional reviewed complete packs are supported without changing runtime logic;
393
- - an incomplete pack is unsupported and must fail to English as a unit;
403
+ - an unsupported requested locale must fail to English as a complete unit; an incomplete or invalid
404
+ registry is not an unsupported locale and must fail closed without presentation;
394
405
  - one interaction must not mix presentation languages, including labels and descriptions;
395
406
  - durable artefacts, runtime rules, task identifiers and machine-facing approval values remain English;
396
407
  - the exact approval value remains `Approval: <GateName>` in every locale;
@@ -45,8 +45,7 @@
45
45
  "value": "Value",
46
46
  "classification": "Classification",
47
47
  "mode": {
48
- "quick_task": "Quick Task",
49
- "verified_change": "Verified Change"
48
+ "quick_task": "Quick Task"
50
49
  },
51
50
  "boundary": {
52
51
  "inside": "Trivial change boundary satisfied",
@@ -296,8 +295,7 @@
296
295
  "value": "Wert",
297
296
  "classification": "Klassifizierung",
298
297
  "mode": {
299
- "quick_task": "Quick Task",
300
- "verified_change": "Verified Change"
298
+ "quick_task": "Quick Task"
301
299
  },
302
300
  "boundary": {
303
301
  "inside": "Trivial-Change-Boundary erfüllt",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "id": "agdf",
4
- "version": "0.13.2",
4
+ "version": "0.13.4",
5
5
  "displayName": "AI Governance & Delivery Framework",
6
6
  "developerName": "Arndt Gold",
7
7
  "description": "Control layer for governed AI-assisted delivery.",
@@ -3,8 +3,9 @@ import { join } from 'node:path';
3
3
  import { aggregate, resolveRuns } from '../control-state/index.js';
4
4
  import { resolveConfiguredChatLanguage } from '../cli/runtime-context.js';
5
5
  import { isGateSatisfied, transitionDecisionForRunState } from './gate-policy.js';
6
- import { gateApprovalStatus, readRunState } from './run-state.js';
6
+ import { gateApprovalStatus, readRunState, resolvedArtefactFile } from './run-state.js';
7
7
  import { allowNoActiveRuns, filled, isPlaceholderValue, markdownSection, parseBacklogSection, readTargetFile } from './shared.js';
8
+ import { evaluateReconciliationState } from './parent-reconciliation.js';
8
9
 
9
10
  const deliveryRelationships = [
10
11
  { from: "UR", relationship: "approved_by", to: "Approval: UR", requiredBy: "UR" },
@@ -38,8 +39,10 @@ function severityFromImpact(value) {
38
39
  return null;
39
40
  }
40
41
 
41
- export function analyzeDeliveryMap(runState) {
42
+ export function analyzeDeliveryMap(runState, dependencies = {}) {
42
43
  const findings = [];
44
+ const reconciliation = evaluateReconciliationState(runState, dependencies);
45
+ findings.push(...reconciliation.findings);
43
46
  const relationships = deliveryRelationships.map((expected) => {
44
47
  const row = findRelationship(runState, expected);
45
48
  const required = relationshipRequired(runState, expected.requiredBy);
@@ -142,6 +145,8 @@ export function analyzeDeliveryMap(runState) {
142
145
  context_graph: runState.context_graph,
143
146
  source_scope: runState.source_scope,
144
147
  memory: runState.memory,
148
+ parent_reconciliation: reconciliation.parent_reconciliation,
149
+ programme_aggregation: reconciliation.programme_aggregation,
145
150
  findings,
146
151
  };
147
152
  }
@@ -215,7 +220,10 @@ export function evaluateDeliveryMap(targetDir, selection = {}, dependencies = {}
215
220
  }
216
221
  const doctorReport = evaluateDoctor(targetDir, selection);
217
222
  const runState = readRunState(targetDir, selection);
218
- const map = analyzeDeliveryMap(runState);
223
+ const map = analyzeDeliveryMap(runState, {
224
+ loadRun: (runId) => readRunState(targetDir, { runId }),
225
+ resolveFile: (path) => resolvedArtefactFile(targetDir, path),
226
+ });
219
227
  const gateDecision = transitionDecisionForRunState(runState);
220
228
  const currentGate = gateDecision.current_gate;
221
229
 
@@ -262,6 +270,8 @@ export function evaluateDeliveryMap(targetDir, selection = {}, dependencies = {}
262
270
  context_graph: map.context_graph,
263
271
  source_scope: map.source_scope,
264
272
  memory: map.memory,
273
+ parent_reconciliation: map.parent_reconciliation,
274
+ programme_aggregation: map.programme_aggregation,
265
275
  findings: map.findings,
266
276
  doctor_status: doctorReport.status,
267
277
  doctor_summary: doctorReport.summary,
@@ -4,7 +4,7 @@ import { aggregate, resolveRuns, verifyLegacyProjection } from '../control-state
4
4
  import { doctorRequiredFiles } from './required-files.js';
5
5
  import { analyzeDeliveryMap } from './delivery-map.js';
6
6
  import { evaluateVerifiedChange } from './verified-change.js';
7
- import { analyzeArtefactRoleConsistency, analyzeDurableGateArtefactConsistency, modeSliceDecision, readRunState } from './run-state.js';
7
+ import { analyzeArtefactRoleConsistency, analyzeDurableGateArtefactConsistency, modeSliceDecision, readRunState, resolvedArtefactFile } from './run-state.js';
8
8
  import { addFinding, allowNoActiveRuns, filled, hasFilledEvidenceRow, hasFilledTableRow, isPlaceholderValue, markdownSection, nonEmptyTableRows, parseBacklogSection, parseQualityContracts, readTargetFile, runSelectionRecovery, tableRows } from './shared.js';
9
9
 
10
10
  export function evaluateDoctor(targetDir, selection = {}) {
@@ -45,6 +45,7 @@ export function evaluateDoctor(targetDir, selection = {}) {
45
45
  };
46
46
  }
47
47
  const findings = [];
48
+ let reconciliation;
48
49
  const hasCanonicalRuns = existsSync(join(targetDir, ".agdf", "control", "runs"));
49
50
  if (hasCanonicalRuns) {
50
51
  const projection = verifyLegacyProjection(targetDir);
@@ -221,7 +222,11 @@ export function evaluateDoctor(targetDir, selection = {}) {
221
222
  for (const finding of analyzeArtefactRoleConsistency(targetDir, runState)) {
222
223
  addFinding(findings, finding.severity, finding.code, finding.message, finding.path, finding.next_step);
223
224
  }
224
- for (const finding of analyzeDeliveryMap(runState).findings) {
225
+ reconciliation = analyzeDeliveryMap(runState, {
226
+ loadRun: (runId) => readRunState(targetDir, { runId }),
227
+ resolveFile: (path) => resolvedArtefactFile(targetDir, path),
228
+ });
229
+ for (const finding of reconciliation.findings) {
225
230
  addFinding(findings, finding.severity, finding.code, finding.message, finding.path, finding.next_step);
226
231
  }
227
232
  }
@@ -241,6 +246,8 @@ export function evaluateDoctor(targetDir, selection = {}) {
241
246
  revise: findings.filter((finding) => finding.severity === "revise").length,
242
247
  warn: findings.filter((finding) => finding.severity === "warn").length,
243
248
  },
249
+ parent_reconciliation: reconciliation?.parent_reconciliation,
250
+ programme_aggregation: reconciliation?.programme_aggregation,
244
251
  findings,
245
252
  };
246
253
  }
@@ -225,7 +225,10 @@ export function evaluateGateCheck(targetDir, selection = {}) {
225
225
  ? evaluateVerifiedChange(targetDir, runState)
226
226
  : null;
227
227
  const transitionDecision = transitionDecisionForRunState(runState, verifiedChange);
228
- const deliveryMap = analyzeDeliveryMap(runState);
228
+ const deliveryMap = analyzeDeliveryMap(runState, {
229
+ loadRun: (runId) => readRunState(targetDir, { runId }),
230
+ resolveFile: (path) => resolvedArtefactFile(targetDir, path),
231
+ });
229
232
  const doctorBlocker = doctorReport.findings.find((finding) => finding.severity === "block");
230
233
  const doctorRevise = doctorReport.findings.find((finding) => finding.severity === "revise");
231
234
  const routesInvalidVerifiedChange = modeSliceDecision(runState) === "verified_change"
@@ -344,6 +347,8 @@ export function evaluateGateCheck(targetDir, selection = {}) {
344
347
  context_graph: deliveryMap.context_graph,
345
348
  source_scope: deliveryMap.source_scope,
346
349
  memory: deliveryMap.memory,
350
+ parent_reconciliation: deliveryMap.parent_reconciliation,
351
+ programme_aggregation: deliveryMap.programme_aggregation,
347
352
  findings: deliveryMap.findings,
348
353
  },
349
354
  verified_change: verifiedChange,
@@ -1,4 +1,4 @@
1
- import { verifiedChangeEscalationTargets } from './verified-change.js';
1
+ import { extractField, verifiedChangeEscalationTargets } from './verified-change.js';
2
2
  import { gateApprovalStatus, gateArtefactStatus, isDurableGateArtefactSatisfied, isInternalStepSatisfied, modeSliceDecision } from './run-state.js';
3
3
 
4
4
  function durableArtefactBlock(gate, nextGate) {
@@ -98,6 +98,21 @@ export function transitionDecisionForRunState(runState, verifiedChange = null) {
98
98
  }
99
99
 
100
100
  if (modeDecision === "quick_task") {
101
+ if (
102
+ extractField(runState.content ?? "", "lifecycle") === "completed"
103
+ && runState.current_gate === "OR"
104
+ && runState.artefacts.get("OR")?.status === "done"
105
+ ) {
106
+ return {
107
+ status: "pass",
108
+ current_gate: "OR",
109
+ blocking_reason: "none",
110
+ missing_approval: "none",
111
+ allowed: ["use delivery closeout when explicitly requested"],
112
+ forbidden: ["repeat Quick Task execution", "commit, push, open PR or release automatically"],
113
+ next_allowed_action: "Use delivery closeout only when an operative VCS handoff is explicitly requested.",
114
+ };
115
+ }
101
116
  return {
102
117
  status: "open",
103
118
  current_gate: "Quick Task Execution",