create-agdf 0.13.1 → 0.13.3
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.
- package/generated/.agdf/control/templates/RUN_STATE.md +22 -0
- package/generated/.agdf/control/templates/artefacts/OR.md +22 -0
- package/generated/.github/skills/agdf-delivery-closeout/SKILL.md +7 -0
- package/generated/.github/skills/agdf-interaction-locales.json +2 -4
- package/generated/.github/skills/agdf-release-or/SKILL.md +14 -4
- package/generated/.github/skills/contracts/closeout.md +49 -0
- package/generated/.github/skills/contracts/control-scaffold.md +2 -0
- package/generated/.github/skills/contracts/interaction.md +23 -12
- package/generated/.opencode/agdf-interaction-locales.json +2 -4
- package/generated/.opencode/contracts/closeout.md +49 -0
- package/generated/.opencode/contracts/control-scaffold.md +2 -0
- package/generated/.opencode/contracts/interaction.md +23 -12
- package/generated/.opencode/skills/agdf-delivery-closeout/SKILL.md +7 -0
- package/generated/.opencode/skills/agdf-release-or/SKILL.md +14 -4
- package/generated/plugins/agdf/.claude-plugin/plugin.json +1 -1
- package/generated/plugins/agdf/.codex-plugin/plugin.json +1 -1
- package/generated/plugins/agdf/control/templates/RUN_STATE.md +22 -0
- package/generated/plugins/agdf/control/templates/artefacts/OR.md +22 -0
- package/generated/plugins/agdf/meta/agdf-interaction-locales.json +2 -4
- package/generated/plugins/agdf/meta/agdf-plugin.definition.json +1 -1
- package/generated/plugins/agdf/meta/agent-skills-conformance.json +86 -0
- package/generated/plugins/agdf/meta/contracts/closeout.md +49 -0
- package/generated/plugins/agdf/meta/contracts/control-scaffold.md +2 -0
- package/generated/plugins/agdf/meta/contracts/interaction.md +23 -12
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-interaction-locales.json +2 -4
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-plugin.definition.json +1 -1
- package/generated/plugins/agdf/runtime/create-agdf/lib/control-evaluation/delivery-map.js +13 -3
- package/generated/plugins/agdf/runtime/create-agdf/lib/control-evaluation/doctor.js +9 -2
- package/generated/plugins/agdf/runtime/create-agdf/lib/control-evaluation/gate-check.js +6 -1
- package/generated/plugins/agdf/runtime/create-agdf/lib/control-evaluation/gate-policy.js +16 -1
- package/generated/plugins/agdf/runtime/create-agdf/lib/control-evaluation/parent-reconciliation.js +284 -0
- package/generated/plugins/agdf/runtime/create-agdf/lib/control-state/run-state-parser.js +39 -1
- package/generated/plugins/agdf/runtime/create-agdf/lib/interaction-presentation.js +31 -14
- package/generated/plugins/agdf/runtime/create-agdf/package.json +1 -1
- package/generated/plugins/agdf/runtime/runtime-manifest.json +2 -2
- package/generated/plugins/agdf/scripts/agent-skills-conformance.mjs +543 -0
- package/generated/plugins/agdf/scripts/check-runtime-integrity.mjs +31 -17
- package/generated/plugins/agdf/skills/delivery-closeout/SKILL.md +7 -0
- package/generated/plugins/agdf/skills/release-or/SKILL.md +14 -4
- package/generated/plugins/agdf/submission/openai/availability.md +1 -1
- package/generated/plugins/agdf/submission/openai/capability-matrix.json +2 -2
- package/generated/plugins/agdf/submission/openai/release-notes.md +1 -1
- package/generated/plugins/agdf/submission/openai/reviewer-cases.json +1 -1
- package/generated/submissions/openai/agdf/.codex-plugin/plugin.json +1 -1
- package/generated/submissions/openai/agdf/meta/agdf-interaction-locales.json +2 -4
- package/generated/submissions/openai/agdf/meta/agdf-plugin.definition.json +1 -1
- package/generated/submissions/openai/agdf/meta/agent-skills-conformance.json +86 -0
- package/generated/submissions/openai/agdf/meta/contracts/closeout.md +49 -0
- package/generated/submissions/openai/agdf/meta/contracts/control-scaffold.md +2 -0
- package/generated/submissions/openai/agdf/meta/contracts/interaction.md +23 -12
- package/generated/submissions/openai/agdf/skills/delivery-closeout/SKILL.md +7 -0
- package/generated/submissions/openai/agdf/skills/release-or/SKILL.md +14 -4
- package/generated/submissions/openai/agdf/submission/openai/availability.md +1 -1
- package/generated/submissions/openai/agdf/submission/openai/capability-matrix.json +2 -2
- package/generated/submissions/openai/agdf/submission/openai/inventory.json +19 -15
- package/generated/submissions/openai/agdf/submission/openai/listing.json +1 -1
- package/generated/submissions/openai/agdf/submission/openai/readiness.json +2 -2
- package/generated/submissions/openai/agdf/submission/openai/readiness.md +2 -2
- package/generated/submissions/openai/agdf/submission/openai/release-notes.md +1 -1
- package/generated/submissions/openai/agdf/submission/openai/reviewer-cases.json +1 -1
- package/lib/control-evaluation/delivery-map.js +13 -3
- package/lib/control-evaluation/doctor.js +9 -2
- package/lib/control-evaluation/gate-check.js +6 -1
- package/lib/control-evaluation/gate-policy.js +16 -1
- package/lib/control-evaluation/parent-reconciliation.js +284 -0
- package/lib/control-state/run-state-parser.js +39 -1
- package/lib/interaction-presentation.js +31 -14
- package/lib/proportionality-benchmark/blind-prompt.js +2 -1
- package/lib/proportionality-benchmark/contracts.js +16 -7
- package/lib/proportionality-benchmark/corpus-loader.js +132 -21
- package/lib/proportionality-benchmark/evaluator.js +25 -15
- package/lib/proportionality-benchmark/index.js +1 -0
- package/lib/proportionality-benchmark/live-recorder.js +32 -10
- package/lib/proportionality-benchmark/profiles.js +102 -0
- package/lib/proportionality-benchmark/report.js +10 -1
- package/lib/proportionality-benchmark/source-fingerprint.js +6 -2
- package/lib/release/version-coherence.js +79 -0
- package/package.json +7 -3
|
@@ -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
|
|
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
|
|
210
|
-
incomplete
|
|
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
|
|
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
|
|
373
|
-
not appear for
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
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
|
|
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",
|
|
@@ -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
|
-
|
|
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",
|