create-agdf 0.11.0 → 0.11.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/.github/skills/agdf-gate-check/SKILL.md +15 -0
- package/generated/.github/skills/agdf-interaction-locales.json +38 -0
- package/generated/.github/skills/contracts/control-scaffold.md +4 -0
- package/generated/.github/skills/contracts/interaction.md +19 -0
- package/generated/.opencode/agdf-interaction-locales.json +38 -0
- package/generated/.opencode/contracts/control-scaffold.md +4 -0
- package/generated/.opencode/contracts/interaction.md +19 -0
- package/generated/.opencode/skills/agdf-gate-check/SKILL.md +15 -0
- package/generated/plugins/agdf/.claude-plugin/plugin.json +1 -1
- package/generated/plugins/agdf/.codex-plugin/plugin.json +1 -1
- package/generated/plugins/agdf/meta/agdf-interaction-locales.json +38 -0
- package/generated/plugins/agdf/meta/agdf-plugin.definition.json +1 -1
- package/generated/plugins/agdf/meta/contracts/control-scaffold.md +4 -0
- package/generated/plugins/agdf/meta/contracts/interaction.md +19 -0
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-interaction-locales.json +38 -0
- 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/interaction-presentation.js +63 -0
- 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/check-runtime-integrity.mjs +52 -0
- package/generated/plugins/agdf/skills/gate-check/SKILL.md +15 -0
- package/lib/interaction-presentation.js +63 -0
- package/package.json +1 -1
|
@@ -69,6 +69,12 @@ for a native-capable adapter.
|
|
|
69
69
|
|
|
70
70
|
The CLI reports are validators and JSON evidence, not the primary user experience, not a required ritual for normal work and not a second rule system. If a report says `blocked`, do not continue with later-gate artefacts until the reported blocker is resolved.
|
|
71
71
|
|
|
72
|
+
## Repository Activation Diagnosis
|
|
73
|
+
|
|
74
|
+
`doctor --json` on the resolved surface-local validator is the sole canonical, code-owned, tool-shell-safe activation probe. Determine whether a repository is AGDF-active through `doctor --json` (or `gate-check --json` for a selected run), not through plugin `AGDF_*` environment variables, not through a relative glob, not through a relative `grep`, and not through a relative `read` of `.agdf/control/config.json`.
|
|
75
|
+
|
|
76
|
+
Plugin `AGDF_*` environment variables set by the OpenCode `shell.env` hook are convenience only and must not be used as the only proof of activation; host shell-env propagation to spawned tool shells is not guaranteed and is OpenCode-owned, not AGDF-owned. A relative glob or `grep` for `.agdf/control/config.json` must not be used as proof of presence or absence of `.agdf/control/config.json`; an absolute `read` or the canonical CLI probe is required.
|
|
77
|
+
|
|
72
78
|
## Native Interaction Path
|
|
73
79
|
|
|
74
80
|
`../contracts/interaction.md` is the complete normative owner for interaction kinds, locale,
|
|
@@ -163,6 +169,15 @@ If a status is not explicit, do not assume it is satisfied.
|
|
|
163
169
|
11. When `.agdf/control/` is missing or incomplete, make the next allowed artefact action explicit. For a fresh request, that means draft the minimal UR in the response, then request `Approval: UR`. Do not write a full control scaffold unless durable control state was explicitly requested or is already the repository's live AGDF working state.
|
|
164
170
|
12. If branch, workspace and durable artefacts disagree, do not choose a scope silently; report the ambiguity and ask for the smallest clarifying gate action.
|
|
165
171
|
|
|
172
|
+
### Scope Classification Output
|
|
173
|
+
When this skill classifies a fresh scope as ungated (Quick Task or Trivial Change Boundary), consume
|
|
174
|
+
`scope_classification.markdown` verbatim from `renderScopeClassificationCard` in
|
|
175
|
+
`../contracts/interaction.md` § Scope Classification Card. The card is a compact, localized,
|
|
176
|
+
non-authorizing projection: mode, boundary, UR-trigger evaluation, one allowed line, one forbidden
|
|
177
|
+
line, escalation triggers and the challenge path. Do not maintain or render a skill-local
|
|
178
|
+
classification card template. If the renderer returns `null`, fail closed to the existing ceremony
|
|
179
|
+
and do not model-reconstruct Markdown.
|
|
180
|
+
|
|
166
181
|
## Output
|
|
167
182
|
Keep the result short and operational. For a status-only response, consume the Runtime Contract's
|
|
168
183
|
code-owned `status_presentation.markdown` verbatim. It is the compact localized operational Run
|
|
@@ -39,6 +39,25 @@
|
|
|
39
39
|
"breadcrumbOpen": "\u25cb",
|
|
40
40
|
"breadcrumbSeparator": " \u00b7 "
|
|
41
41
|
},
|
|
42
|
+
"scopeClassification": {
|
|
43
|
+
"title": "AGDF scope classification",
|
|
44
|
+
"field": "Field",
|
|
45
|
+
"value": "Value",
|
|
46
|
+
"classification": "Classification",
|
|
47
|
+
"mode": {
|
|
48
|
+
"quick_task": "Quick Task",
|
|
49
|
+
"verified_change": "Verified Change"
|
|
50
|
+
},
|
|
51
|
+
"boundary": {
|
|
52
|
+
"inside": "Trivial change boundary satisfied",
|
|
53
|
+
"outside": "Outside trivial change boundary"
|
|
54
|
+
},
|
|
55
|
+
"grounds": "UR trigger evaluation",
|
|
56
|
+
"allowed": "Currently allowed",
|
|
57
|
+
"forbidden": "Remains forbidden",
|
|
58
|
+
"escalation": "Escalation triggers",
|
|
59
|
+
"challenge": "Challenge path"
|
|
60
|
+
},
|
|
42
61
|
"internalStateLabels": {
|
|
43
62
|
"verifiedChange": "Compact change under review",
|
|
44
63
|
"verifiedChangeEscalated": "Escalated to structured delivery",
|
|
@@ -246,6 +265,25 @@
|
|
|
246
265
|
"breadcrumbOpen": "\u25cb",
|
|
247
266
|
"breadcrumbSeparator": " \u00b7 "
|
|
248
267
|
},
|
|
268
|
+
"scopeClassification": {
|
|
269
|
+
"title": "AGDF-Scope-Klassifizierung",
|
|
270
|
+
"field": "Feld",
|
|
271
|
+
"value": "Wert",
|
|
272
|
+
"classification": "Klassifizierung",
|
|
273
|
+
"mode": {
|
|
274
|
+
"quick_task": "Quick Task",
|
|
275
|
+
"verified_change": "Verified Change"
|
|
276
|
+
},
|
|
277
|
+
"boundary": {
|
|
278
|
+
"inside": "Trivial-Change-Boundary erfüllt",
|
|
279
|
+
"outside": "Außerhalb der Trivial-Change-Boundary"
|
|
280
|
+
},
|
|
281
|
+
"grounds": "UR-Trigger-Evaluation",
|
|
282
|
+
"allowed": "Aktuell erlaubt",
|
|
283
|
+
"forbidden": "Bleibt verboten",
|
|
284
|
+
"escalation": "Eskalationsauslöser",
|
|
285
|
+
"challenge": "Widerspruchspfad"
|
|
286
|
+
},
|
|
249
287
|
"internalStateLabels": {
|
|
250
288
|
"verifiedChange": "Kompakte Änderung wird geprüft",
|
|
251
289
|
"verifiedChangeEscalated": "Eskaliert zu structured delivery",
|
|
@@ -89,6 +89,10 @@ Helper commands are deterministic proof and automation interfaces, not the norma
|
|
|
89
89
|
Machine-readable outputs should stay agent-friendly: stable decisions, blocking gate or current gate, missing approval, allowed outputs, forbidden outputs, next step, evidence and findings.
|
|
90
90
|
They make the repository state checkable, but they do not replace the native skill workflow or the durable control artefacts.
|
|
91
91
|
|
|
92
|
+
### Repository Activation Diagnosis Boundary
|
|
93
|
+
|
|
94
|
+
`doctor --json` on the resolved surface-local validator is the sole canonical, code-owned, tool-shell-safe activation probe. Plugin `AGDF_*` environment variables set by the OpenCode `shell.env` hook are an internal plugin status channel consumed by `opencode-status`, not an agent-facing diagnosis proof; host shell-env propagation to spawned tool shells is not guaranteed and is OpenCode-owned. A relative glob or `grep` for `.agdf/control/config.json` must not be used as proof of presence or absence of `.agdf/control/config.json`; an absolute `read` or the canonical CLI probe is required.
|
|
95
|
+
|
|
92
96
|
## Delivery Map
|
|
93
97
|
|
|
94
98
|
`delivery-map --json` is the machine-readable delivery picture for the selected canonical control state.
|
|
@@ -338,6 +338,25 @@ repeat the sentence later in the same request. Existing-run status inspection re
|
|
|
338
338
|
uses the existing status projection; this branch must not create a second status-card or narration
|
|
339
339
|
owner.
|
|
340
340
|
|
|
341
|
+
### Scope Classification Card
|
|
342
|
+
|
|
343
|
+
When `agdf-gate-check` classifies a fresh scope as ungated (Quick Task or Trivial Change Boundary),
|
|
344
|
+
the agent consumes the canonical `scope_classification.markdown` verbatim from
|
|
345
|
+
`renderScopeClassificationCard` in `create-agdf/lib/interaction-presentation.js`. The card is a
|
|
346
|
+
compact, localized, non-authorizing projection of the classification: mode, boundary result,
|
|
347
|
+
UR-trigger evaluation, one currently-allowed line, one remains-forbidden line, escalation triggers
|
|
348
|
+
and the challenge path. It carries `authorizes: false` and never renders approval controls.
|
|
349
|
+
|
|
350
|
+
The card renders exactly once per fresh-scope ungated classification, before work proceeds. It must
|
|
351
|
+
not appear for gated scopes, internal steps of a selected run, or as a substitute for the two-card
|
|
352
|
+
approval envelope. Read-only requests keep the single read-only orientation sentence above; the
|
|
353
|
+
scope classification card and the read-only orientation are mutually exclusive for the same request.
|
|
354
|
+
|
|
355
|
+
If the classification input is missing, unknown, contradictory or the locale section is incomplete,
|
|
356
|
+
the renderer returns `null` and the agent fails closed to the existing ceremony — never
|
|
357
|
+
model-reconstructed Markdown. The card introduces no gate, no approval value, no persistence and no
|
|
358
|
+
second presentation owner. `agdf-gate-check` must not maintain a skill-local card template.
|
|
359
|
+
|
|
341
360
|
Exact textual approvals remain canonical and fully supported on every surface. If native capability availability or safety is unknown, use the textual fallback. Host permission, plan approval, native question presentation, timeout/default behavior, hook output and agent messages never carry AGDF gate authority by themselves.
|
|
342
361
|
|
|
343
362
|
### Interaction Locale Contract
|
|
@@ -39,6 +39,25 @@
|
|
|
39
39
|
"breadcrumbOpen": "\u25cb",
|
|
40
40
|
"breadcrumbSeparator": " \u00b7 "
|
|
41
41
|
},
|
|
42
|
+
"scopeClassification": {
|
|
43
|
+
"title": "AGDF scope classification",
|
|
44
|
+
"field": "Field",
|
|
45
|
+
"value": "Value",
|
|
46
|
+
"classification": "Classification",
|
|
47
|
+
"mode": {
|
|
48
|
+
"quick_task": "Quick Task",
|
|
49
|
+
"verified_change": "Verified Change"
|
|
50
|
+
},
|
|
51
|
+
"boundary": {
|
|
52
|
+
"inside": "Trivial change boundary satisfied",
|
|
53
|
+
"outside": "Outside trivial change boundary"
|
|
54
|
+
},
|
|
55
|
+
"grounds": "UR trigger evaluation",
|
|
56
|
+
"allowed": "Currently allowed",
|
|
57
|
+
"forbidden": "Remains forbidden",
|
|
58
|
+
"escalation": "Escalation triggers",
|
|
59
|
+
"challenge": "Challenge path"
|
|
60
|
+
},
|
|
42
61
|
"internalStateLabels": {
|
|
43
62
|
"verifiedChange": "Compact change under review",
|
|
44
63
|
"verifiedChangeEscalated": "Escalated to structured delivery",
|
|
@@ -246,6 +265,25 @@
|
|
|
246
265
|
"breadcrumbOpen": "\u25cb",
|
|
247
266
|
"breadcrumbSeparator": " \u00b7 "
|
|
248
267
|
},
|
|
268
|
+
"scopeClassification": {
|
|
269
|
+
"title": "AGDF-Scope-Klassifizierung",
|
|
270
|
+
"field": "Feld",
|
|
271
|
+
"value": "Wert",
|
|
272
|
+
"classification": "Klassifizierung",
|
|
273
|
+
"mode": {
|
|
274
|
+
"quick_task": "Quick Task",
|
|
275
|
+
"verified_change": "Verified Change"
|
|
276
|
+
},
|
|
277
|
+
"boundary": {
|
|
278
|
+
"inside": "Trivial-Change-Boundary erfüllt",
|
|
279
|
+
"outside": "Außerhalb der Trivial-Change-Boundary"
|
|
280
|
+
},
|
|
281
|
+
"grounds": "UR-Trigger-Evaluation",
|
|
282
|
+
"allowed": "Aktuell erlaubt",
|
|
283
|
+
"forbidden": "Bleibt verboten",
|
|
284
|
+
"escalation": "Eskalationsauslöser",
|
|
285
|
+
"challenge": "Widerspruchspfad"
|
|
286
|
+
},
|
|
249
287
|
"internalStateLabels": {
|
|
250
288
|
"verifiedChange": "Kompakte Änderung wird geprüft",
|
|
251
289
|
"verifiedChangeEscalated": "Eskaliert zu structured delivery",
|
|
@@ -89,6 +89,10 @@ Helper commands are deterministic proof and automation interfaces, not the norma
|
|
|
89
89
|
Machine-readable outputs should stay agent-friendly: stable decisions, blocking gate or current gate, missing approval, allowed outputs, forbidden outputs, next step, evidence and findings.
|
|
90
90
|
They make the repository state checkable, but they do not replace the native skill workflow or the durable control artefacts.
|
|
91
91
|
|
|
92
|
+
### Repository Activation Diagnosis Boundary
|
|
93
|
+
|
|
94
|
+
`doctor --json` on the resolved surface-local validator is the sole canonical, code-owned, tool-shell-safe activation probe. Plugin `AGDF_*` environment variables set by the OpenCode `shell.env` hook are an internal plugin status channel consumed by `opencode-status`, not an agent-facing diagnosis proof; host shell-env propagation to spawned tool shells is not guaranteed and is OpenCode-owned. A relative glob or `grep` for `.agdf/control/config.json` must not be used as proof of presence or absence of `.agdf/control/config.json`; an absolute `read` or the canonical CLI probe is required.
|
|
95
|
+
|
|
92
96
|
## Delivery Map
|
|
93
97
|
|
|
94
98
|
`delivery-map --json` is the machine-readable delivery picture for the selected canonical control state.
|
|
@@ -338,6 +338,25 @@ repeat the sentence later in the same request. Existing-run status inspection re
|
|
|
338
338
|
uses the existing status projection; this branch must not create a second status-card or narration
|
|
339
339
|
owner.
|
|
340
340
|
|
|
341
|
+
### Scope Classification Card
|
|
342
|
+
|
|
343
|
+
When `agdf-gate-check` classifies a fresh scope as ungated (Quick Task or Trivial Change Boundary),
|
|
344
|
+
the agent consumes the canonical `scope_classification.markdown` verbatim from
|
|
345
|
+
`renderScopeClassificationCard` in `create-agdf/lib/interaction-presentation.js`. The card is a
|
|
346
|
+
compact, localized, non-authorizing projection of the classification: mode, boundary result,
|
|
347
|
+
UR-trigger evaluation, one currently-allowed line, one remains-forbidden line, escalation triggers
|
|
348
|
+
and the challenge path. It carries `authorizes: false` and never renders approval controls.
|
|
349
|
+
|
|
350
|
+
The card renders exactly once per fresh-scope ungated classification, before work proceeds. It must
|
|
351
|
+
not appear for gated scopes, internal steps of a selected run, or as a substitute for the two-card
|
|
352
|
+
approval envelope. Read-only requests keep the single read-only orientation sentence above; the
|
|
353
|
+
scope classification card and the read-only orientation are mutually exclusive for the same request.
|
|
354
|
+
|
|
355
|
+
If the classification input is missing, unknown, contradictory or the locale section is incomplete,
|
|
356
|
+
the renderer returns `null` and the agent fails closed to the existing ceremony — never
|
|
357
|
+
model-reconstructed Markdown. The card introduces no gate, no approval value, no persistence and no
|
|
358
|
+
second presentation owner. `agdf-gate-check` must not maintain a skill-local card template.
|
|
359
|
+
|
|
341
360
|
Exact textual approvals remain canonical and fully supported on every surface. If native capability availability or safety is unknown, use the textual fallback. Host permission, plan approval, native question presentation, timeout/default behavior, hook output and agent messages never carry AGDF gate authority by themselves.
|
|
342
361
|
|
|
343
362
|
### Interaction Locale Contract
|
|
@@ -69,6 +69,12 @@ for a native-capable adapter.
|
|
|
69
69
|
|
|
70
70
|
The CLI reports are validators and JSON evidence, not the primary user experience, not a required ritual for normal work and not a second rule system. If a report says `blocked`, do not continue with later-gate artefacts until the reported blocker is resolved.
|
|
71
71
|
|
|
72
|
+
## Repository Activation Diagnosis
|
|
73
|
+
|
|
74
|
+
`doctor --json` on the resolved surface-local validator is the sole canonical, code-owned, tool-shell-safe activation probe. Determine whether a repository is AGDF-active through `doctor --json` (or `gate-check --json` for a selected run), not through plugin `AGDF_*` environment variables, not through a relative glob, not through a relative `grep`, and not through a relative `read` of `.agdf/control/config.json`.
|
|
75
|
+
|
|
76
|
+
Plugin `AGDF_*` environment variables set by the OpenCode `shell.env` hook are convenience only and must not be used as the only proof of activation; host shell-env propagation to spawned tool shells is not guaranteed and is OpenCode-owned, not AGDF-owned. A relative glob or `grep` for `.agdf/control/config.json` must not be used as proof of presence or absence of `.agdf/control/config.json`; an absolute `read` or the canonical CLI probe is required.
|
|
77
|
+
|
|
72
78
|
## Native Interaction Path
|
|
73
79
|
|
|
74
80
|
`../../contracts/interaction.md` is the complete normative owner for interaction kinds, locale,
|
|
@@ -163,6 +169,15 @@ If a status is not explicit, do not assume it is satisfied.
|
|
|
163
169
|
11. When `.agdf/control/` is missing or incomplete, make the next allowed artefact action explicit. For a fresh request, that means draft the minimal UR in the response, then request `Approval: UR`. Do not write a full control scaffold unless durable control state was explicitly requested or is already the repository's live AGDF working state.
|
|
164
170
|
12. If branch, workspace and durable artefacts disagree, do not choose a scope silently; report the ambiguity and ask for the smallest clarifying gate action.
|
|
165
171
|
|
|
172
|
+
### Scope Classification Output
|
|
173
|
+
When this skill classifies a fresh scope as ungated (Quick Task or Trivial Change Boundary), consume
|
|
174
|
+
`scope_classification.markdown` verbatim from `renderScopeClassificationCard` in
|
|
175
|
+
`../../contracts/interaction.md` § Scope Classification Card. The card is a compact, localized,
|
|
176
|
+
non-authorizing projection: mode, boundary, UR-trigger evaluation, one allowed line, one forbidden
|
|
177
|
+
line, escalation triggers and the challenge path. Do not maintain or render a skill-local
|
|
178
|
+
classification card template. If the renderer returns `null`, fail closed to the existing ceremony
|
|
179
|
+
and do not model-reconstruct Markdown.
|
|
180
|
+
|
|
166
181
|
## Output
|
|
167
182
|
Keep the result short and operational. For a status-only response, consume the Runtime Contract's
|
|
168
183
|
code-owned `status_presentation.markdown` verbatim. It is the compact localized operational Run
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agdf",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.3",
|
|
4
4
|
"description": "AI Governance & Delivery Framework (AGDF) brings an operating system for governed AI-assisted delivery to Claude Code, combining workflow skills, control templates and machine-readable repository checks for gate decisions, Brownfield analysis, task-plan review, QA decisions, durable run state and auditable closeout.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agentic",
|
|
@@ -39,6 +39,25 @@
|
|
|
39
39
|
"breadcrumbOpen": "\u25cb",
|
|
40
40
|
"breadcrumbSeparator": " \u00b7 "
|
|
41
41
|
},
|
|
42
|
+
"scopeClassification": {
|
|
43
|
+
"title": "AGDF scope classification",
|
|
44
|
+
"field": "Field",
|
|
45
|
+
"value": "Value",
|
|
46
|
+
"classification": "Classification",
|
|
47
|
+
"mode": {
|
|
48
|
+
"quick_task": "Quick Task",
|
|
49
|
+
"verified_change": "Verified Change"
|
|
50
|
+
},
|
|
51
|
+
"boundary": {
|
|
52
|
+
"inside": "Trivial change boundary satisfied",
|
|
53
|
+
"outside": "Outside trivial change boundary"
|
|
54
|
+
},
|
|
55
|
+
"grounds": "UR trigger evaluation",
|
|
56
|
+
"allowed": "Currently allowed",
|
|
57
|
+
"forbidden": "Remains forbidden",
|
|
58
|
+
"escalation": "Escalation triggers",
|
|
59
|
+
"challenge": "Challenge path"
|
|
60
|
+
},
|
|
42
61
|
"internalStateLabels": {
|
|
43
62
|
"verifiedChange": "Compact change under review",
|
|
44
63
|
"verifiedChangeEscalated": "Escalated to structured delivery",
|
|
@@ -246,6 +265,25 @@
|
|
|
246
265
|
"breadcrumbOpen": "\u25cb",
|
|
247
266
|
"breadcrumbSeparator": " \u00b7 "
|
|
248
267
|
},
|
|
268
|
+
"scopeClassification": {
|
|
269
|
+
"title": "AGDF-Scope-Klassifizierung",
|
|
270
|
+
"field": "Feld",
|
|
271
|
+
"value": "Wert",
|
|
272
|
+
"classification": "Klassifizierung",
|
|
273
|
+
"mode": {
|
|
274
|
+
"quick_task": "Quick Task",
|
|
275
|
+
"verified_change": "Verified Change"
|
|
276
|
+
},
|
|
277
|
+
"boundary": {
|
|
278
|
+
"inside": "Trivial-Change-Boundary erfüllt",
|
|
279
|
+
"outside": "Außerhalb der Trivial-Change-Boundary"
|
|
280
|
+
},
|
|
281
|
+
"grounds": "UR-Trigger-Evaluation",
|
|
282
|
+
"allowed": "Aktuell erlaubt",
|
|
283
|
+
"forbidden": "Bleibt verboten",
|
|
284
|
+
"escalation": "Eskalationsauslöser",
|
|
285
|
+
"challenge": "Widerspruchspfad"
|
|
286
|
+
},
|
|
249
287
|
"internalStateLabels": {
|
|
250
288
|
"verifiedChange": "Kompakte Änderung wird geprüft",
|
|
251
289
|
"verifiedChangeEscalated": "Eskaliert zu structured delivery",
|
|
@@ -89,6 +89,10 @@ Helper commands are deterministic proof and automation interfaces, not the norma
|
|
|
89
89
|
Machine-readable outputs should stay agent-friendly: stable decisions, blocking gate or current gate, missing approval, allowed outputs, forbidden outputs, next step, evidence and findings.
|
|
90
90
|
They make the repository state checkable, but they do not replace the native skill workflow or the durable control artefacts.
|
|
91
91
|
|
|
92
|
+
### Repository Activation Diagnosis Boundary
|
|
93
|
+
|
|
94
|
+
`doctor --json` on the resolved surface-local validator is the sole canonical, code-owned, tool-shell-safe activation probe. Plugin `AGDF_*` environment variables set by the OpenCode `shell.env` hook are an internal plugin status channel consumed by `opencode-status`, not an agent-facing diagnosis proof; host shell-env propagation to spawned tool shells is not guaranteed and is OpenCode-owned. A relative glob or `grep` for `.agdf/control/config.json` must not be used as proof of presence or absence of `.agdf/control/config.json`; an absolute `read` or the canonical CLI probe is required.
|
|
95
|
+
|
|
92
96
|
## Delivery Map
|
|
93
97
|
|
|
94
98
|
`delivery-map --json` is the machine-readable delivery picture for the selected canonical control state.
|
|
@@ -338,6 +338,25 @@ repeat the sentence later in the same request. Existing-run status inspection re
|
|
|
338
338
|
uses the existing status projection; this branch must not create a second status-card or narration
|
|
339
339
|
owner.
|
|
340
340
|
|
|
341
|
+
### Scope Classification Card
|
|
342
|
+
|
|
343
|
+
When `gate-check` classifies a fresh scope as ungated (Quick Task or Trivial Change Boundary),
|
|
344
|
+
the agent consumes the canonical `scope_classification.markdown` verbatim from
|
|
345
|
+
`renderScopeClassificationCard` in `create-agdf/lib/interaction-presentation.js`. The card is a
|
|
346
|
+
compact, localized, non-authorizing projection of the classification: mode, boundary result,
|
|
347
|
+
UR-trigger evaluation, one currently-allowed line, one remains-forbidden line, escalation triggers
|
|
348
|
+
and the challenge path. It carries `authorizes: false` and never renders approval controls.
|
|
349
|
+
|
|
350
|
+
The card renders exactly once per fresh-scope ungated classification, before work proceeds. It must
|
|
351
|
+
not appear for gated scopes, internal steps of a selected run, or as a substitute for the two-card
|
|
352
|
+
approval envelope. Read-only requests keep the single read-only orientation sentence above; the
|
|
353
|
+
scope classification card and the read-only orientation are mutually exclusive for the same request.
|
|
354
|
+
|
|
355
|
+
If the classification input is missing, unknown, contradictory or the locale section is incomplete,
|
|
356
|
+
the renderer returns `null` and the agent fails closed to the existing ceremony — never
|
|
357
|
+
model-reconstructed Markdown. The card introduces no gate, no approval value, no persistence and no
|
|
358
|
+
second presentation owner. `gate-check` must not maintain a skill-local card template.
|
|
359
|
+
|
|
341
360
|
Exact textual approvals remain canonical and fully supported on every surface. If native capability availability or safety is unknown, use the textual fallback. Host permission, plan approval, native question presentation, timeout/default behavior, hook output and agent messages never carry AGDF gate authority by themselves.
|
|
342
361
|
|
|
343
362
|
### Interaction Locale Contract
|
|
@@ -39,6 +39,25 @@
|
|
|
39
39
|
"breadcrumbOpen": "\u25cb",
|
|
40
40
|
"breadcrumbSeparator": " \u00b7 "
|
|
41
41
|
},
|
|
42
|
+
"scopeClassification": {
|
|
43
|
+
"title": "AGDF scope classification",
|
|
44
|
+
"field": "Field",
|
|
45
|
+
"value": "Value",
|
|
46
|
+
"classification": "Classification",
|
|
47
|
+
"mode": {
|
|
48
|
+
"quick_task": "Quick Task",
|
|
49
|
+
"verified_change": "Verified Change"
|
|
50
|
+
},
|
|
51
|
+
"boundary": {
|
|
52
|
+
"inside": "Trivial change boundary satisfied",
|
|
53
|
+
"outside": "Outside trivial change boundary"
|
|
54
|
+
},
|
|
55
|
+
"grounds": "UR trigger evaluation",
|
|
56
|
+
"allowed": "Currently allowed",
|
|
57
|
+
"forbidden": "Remains forbidden",
|
|
58
|
+
"escalation": "Escalation triggers",
|
|
59
|
+
"challenge": "Challenge path"
|
|
60
|
+
},
|
|
42
61
|
"internalStateLabels": {
|
|
43
62
|
"verifiedChange": "Compact change under review",
|
|
44
63
|
"verifiedChangeEscalated": "Escalated to structured delivery",
|
|
@@ -246,6 +265,25 @@
|
|
|
246
265
|
"breadcrumbOpen": "\u25cb",
|
|
247
266
|
"breadcrumbSeparator": " \u00b7 "
|
|
248
267
|
},
|
|
268
|
+
"scopeClassification": {
|
|
269
|
+
"title": "AGDF-Scope-Klassifizierung",
|
|
270
|
+
"field": "Feld",
|
|
271
|
+
"value": "Wert",
|
|
272
|
+
"classification": "Klassifizierung",
|
|
273
|
+
"mode": {
|
|
274
|
+
"quick_task": "Quick Task",
|
|
275
|
+
"verified_change": "Verified Change"
|
|
276
|
+
},
|
|
277
|
+
"boundary": {
|
|
278
|
+
"inside": "Trivial-Change-Boundary erfüllt",
|
|
279
|
+
"outside": "Außerhalb der Trivial-Change-Boundary"
|
|
280
|
+
},
|
|
281
|
+
"grounds": "UR-Trigger-Evaluation",
|
|
282
|
+
"allowed": "Aktuell erlaubt",
|
|
283
|
+
"forbidden": "Bleibt verboten",
|
|
284
|
+
"escalation": "Eskalationsauslöser",
|
|
285
|
+
"challenge": "Widerspruchspfad"
|
|
286
|
+
},
|
|
249
287
|
"internalStateLabels": {
|
|
250
288
|
"verifiedChange": "Kompakte Änderung wird geprüft",
|
|
251
289
|
"verifiedChangeEscalated": "Eskaliert zu structured delivery",
|
|
@@ -349,6 +349,69 @@ export function renderOperationalStatusCard(statusCard, {
|
|
|
349
349
|
});
|
|
350
350
|
}
|
|
351
351
|
|
|
352
|
+
export function renderScopeClassificationCard(classification, {
|
|
353
|
+
registry,
|
|
354
|
+
requestedLocale,
|
|
355
|
+
} = {}) {
|
|
356
|
+
if (!plainObject(classification)) return null;
|
|
357
|
+
const outcome = String(classification.outcome ?? "").trim();
|
|
358
|
+
const mode = String(classification.mode ?? "").trim();
|
|
359
|
+
const trivialBoundary = String(classification.trivial_boundary ?? "").trim();
|
|
360
|
+
const urTriggerEvaluation = String(classification.ur_trigger_evaluation ?? "").trim();
|
|
361
|
+
const allowedSummary = String(classification.allowed_summary ?? "").trim();
|
|
362
|
+
const forbiddenSummary = String(classification.forbidden_summary ?? "").trim();
|
|
363
|
+
const escalationTriggers = Array.isArray(classification.escalation_triggers)
|
|
364
|
+
? classification.escalation_triggers.map((item) => String(item ?? "").trim()).filter(Boolean)
|
|
365
|
+
: [];
|
|
366
|
+
const challengePath = String(classification.challenge_path ?? "").trim();
|
|
367
|
+
|
|
368
|
+
if (outcome !== "ungated") return null;
|
|
369
|
+
if (!["quick_task", "verified_change"].includes(mode)) return null;
|
|
370
|
+
if (!["inside", "outside"].includes(trivialBoundary)) return null;
|
|
371
|
+
if (!urTriggerEvaluation || !allowedSummary || !forbiddenSummary || !challengePath) return null;
|
|
372
|
+
if (escalationTriggers.length === 0) return null;
|
|
373
|
+
|
|
374
|
+
let locale;
|
|
375
|
+
try {
|
|
376
|
+
locale = resolvePresentationLocale(registry, requestedLocale);
|
|
377
|
+
} catch {
|
|
378
|
+
return null;
|
|
379
|
+
}
|
|
380
|
+
if (!locale) return null;
|
|
381
|
+
|
|
382
|
+
const pack = localePack(registry, locale);
|
|
383
|
+
const labels = pack?.scopeClassification;
|
|
384
|
+
if (!plainObject(labels)) return null;
|
|
385
|
+
|
|
386
|
+
const modeLabel = labels.mode?.[mode] ?? mode;
|
|
387
|
+
const boundaryLabel = labels.boundary?.[trivialBoundary] ?? trivialBoundary;
|
|
388
|
+
|
|
389
|
+
const rows = [
|
|
390
|
+
[labels.classification, `${modeLabel} · ${boundaryLabel}`],
|
|
391
|
+
[labels.grounds, urTriggerEvaluation],
|
|
392
|
+
[labels.allowed, allowedSummary],
|
|
393
|
+
[labels.forbidden, forbiddenSummary],
|
|
394
|
+
[labels.escalation, escalationTriggers.join("; ")],
|
|
395
|
+
[labels.challenge, challengePath],
|
|
396
|
+
];
|
|
397
|
+
|
|
398
|
+
const markdown = [
|
|
399
|
+
`## ${labels.title ?? "AGDF scope classification"}`,
|
|
400
|
+
"",
|
|
401
|
+
`| ${labels.field ?? "Field"} | ${labels.value ?? "Value"} |`,
|
|
402
|
+
"|---|---|",
|
|
403
|
+
...rows.map(([label, value]) => `| ${markdownCell(label)} | ${markdownCell(value)} |`),
|
|
404
|
+
].join("\n");
|
|
405
|
+
|
|
406
|
+
return Object.freeze({
|
|
407
|
+
schema_version: "1",
|
|
408
|
+
semantic_block: "scope_classification_card",
|
|
409
|
+
presentation_language: locale,
|
|
410
|
+
markdown,
|
|
411
|
+
authorizes: false,
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
|
|
352
415
|
export function gateOptions(registry, requestedLocale, gate, { includeCancel = false } = {}) {
|
|
353
416
|
const pack = localePack(registry, requestedLocale);
|
|
354
417
|
const options = [
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schema_version": "1",
|
|
3
3
|
"generated": true,
|
|
4
4
|
"source": "create-agdf/cli",
|
|
5
|
-
"version": "0.11.
|
|
5
|
+
"version": "0.11.3",
|
|
6
6
|
"entrypoint": "create-agdf/bin/agdf-validator.js",
|
|
7
|
-
"digest": "
|
|
7
|
+
"digest": "217946af2b7c5782e9a620c18a0aa3ce351993b4bda8874bbfbf7d8406cc48ff"
|
|
8
8
|
}
|
|
@@ -376,6 +376,58 @@ if (!gateCheckSkill.includes("`status_presentation.markdown` verbatim")) {
|
|
|
376
376
|
if (gateCheckSkill.includes("| Run status | Value |")) {
|
|
377
377
|
failures.push("gate-check must not maintain a second operational status-card template");
|
|
378
378
|
}
|
|
379
|
+
if (!gateCheckSkill.includes("## Repository Activation Diagnosis")) {
|
|
380
|
+
failures.push("gate-check must own the repository activation diagnosis section");
|
|
381
|
+
}
|
|
382
|
+
if (!gateCheckSkill.includes("`doctor --json` on the resolved surface-local validator is the sole canonical, code-owned, tool-shell-safe activation probe")) {
|
|
383
|
+
failures.push("gate-check must name doctor --json as the sole canonical activation probe");
|
|
384
|
+
}
|
|
385
|
+
if (!gateCheckSkill.includes("must not be used as the only proof of activation")) {
|
|
386
|
+
failures.push("gate-check must forbid AGDF_* env vars as sole activation proof");
|
|
387
|
+
}
|
|
388
|
+
if (!gateCheckSkill.includes("must not be used as proof of presence or absence of `.agdf/control/config.json`")) {
|
|
389
|
+
failures.push("gate-check must forbid relative glob/grep as activation proof");
|
|
390
|
+
}
|
|
391
|
+
for (const antiPattern of [
|
|
392
|
+
"AGDF_CONTROL_DIR` to confirm",
|
|
393
|
+
"AGDF_CONTROL_DIR` to verify",
|
|
394
|
+
"AGDF_CONTROL_DIR` to check",
|
|
395
|
+
"relative glob to confirm",
|
|
396
|
+
"relative glob to verify",
|
|
397
|
+
]) {
|
|
398
|
+
if (gateCheckSkill.includes(antiPattern)) failures.push(`gate-check must not instruct agents to use anti-pattern diagnosis: ${antiPattern}`);
|
|
399
|
+
}
|
|
400
|
+
if (!runtimeContract.includes("### Repository Activation Diagnosis Boundary")) {
|
|
401
|
+
failures.push("control-scaffold contract must own the repository activation diagnosis boundary");
|
|
402
|
+
}
|
|
403
|
+
if (!runtimeContract.includes("### Scope Classification Card")) {
|
|
404
|
+
failures.push("interaction contract must own the scope classification card section");
|
|
405
|
+
}
|
|
406
|
+
if (!gateCheckSkill.includes("scope_classification.markdown` verbatim")) {
|
|
407
|
+
failures.push("gate-check must consume the canonical scope classification projection verbatim");
|
|
408
|
+
}
|
|
409
|
+
if (gateCheckSkill.includes("## Scope Classification Card Template") || gateCheckSkill.includes("| Classification | Mode | Boundary |")) {
|
|
410
|
+
failures.push("gate-check must not maintain a skill-local scope classification card template");
|
|
411
|
+
}
|
|
412
|
+
const interactionPresentationPath = join(pluginRoot, "..", "create-agdf", "lib", "interaction-presentation.js");
|
|
413
|
+
if (sourceMode && isFile(interactionPresentationPath)) {
|
|
414
|
+
const interactionPresentation = read(interactionPresentationPath);
|
|
415
|
+
if (!interactionPresentation.includes("export function renderScopeClassificationCard")) {
|
|
416
|
+
failures.push("interaction-presentation.js must export renderScopeClassificationCard");
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
for (const locale of ["en", "de"]) {
|
|
420
|
+
const pack = interactionLocales?.locales?.[locale];
|
|
421
|
+
if (!pack?.scopeClassification?.title || !pack?.scopeClassification?.mode?.quick_task || !pack?.scopeClassification?.challenge) {
|
|
422
|
+
failures.push(`Interaction locale ${locale} missing scopeClassification section keys`);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
if (!runtimeContract.includes("not an agent-facing diagnosis proof")) {
|
|
426
|
+
failures.push("control-scaffold contract must classify AGDF_* env vars as non-agent-facing diagnosis");
|
|
427
|
+
}
|
|
428
|
+
if (!runtimeContract.includes("must not be used as proof of presence or absence of `.agdf/control/config.json`")) {
|
|
429
|
+
failures.push("control-scaffold contract must forbid relative glob/grep as activation proof");
|
|
430
|
+
}
|
|
379
431
|
if (!runtimeContract.includes("### Deterministic Operational Presentation")
|
|
380
432
|
|| !/must\s+not reconstruct a table/.test(runtimeContract)) {
|
|
381
433
|
failures.push("interaction contract must own deterministic operational status presentation");
|
|
@@ -69,6 +69,12 @@ for a native-capable adapter.
|
|
|
69
69
|
|
|
70
70
|
The CLI reports are validators and JSON evidence, not the primary user experience, not a required ritual for normal work and not a second rule system. If a report says `blocked`, do not continue with later-gate artefacts until the reported blocker is resolved.
|
|
71
71
|
|
|
72
|
+
## Repository Activation Diagnosis
|
|
73
|
+
|
|
74
|
+
`doctor --json` on the resolved surface-local validator is the sole canonical, code-owned, tool-shell-safe activation probe. Determine whether a repository is AGDF-active through `doctor --json` (or `gate-check --json` for a selected run), not through plugin `AGDF_*` environment variables, not through a relative glob, not through a relative `grep`, and not through a relative `read` of `.agdf/control/config.json`.
|
|
75
|
+
|
|
76
|
+
Plugin `AGDF_*` environment variables set by the OpenCode `shell.env` hook are convenience only and must not be used as the only proof of activation; host shell-env propagation to spawned tool shells is not guaranteed and is OpenCode-owned, not AGDF-owned. A relative glob or `grep` for `.agdf/control/config.json` must not be used as proof of presence or absence of `.agdf/control/config.json`; an absolute `read` or the canonical CLI probe is required.
|
|
77
|
+
|
|
72
78
|
## Native Interaction Path
|
|
73
79
|
|
|
74
80
|
`../../meta/contracts/interaction.md` is the complete normative owner for interaction kinds, locale,
|
|
@@ -163,6 +169,15 @@ If a status is not explicit, do not assume it is satisfied.
|
|
|
163
169
|
11. When `.agdf/control/` is missing or incomplete, make the next allowed artefact action explicit. For a fresh request, that means draft the minimal UR in the response, then request `Approval: UR`. Do not write a full control scaffold unless durable control state was explicitly requested or is already the repository's live AGDF working state.
|
|
164
170
|
12. If branch, workspace and durable artefacts disagree, do not choose a scope silently; report the ambiguity and ask for the smallest clarifying gate action.
|
|
165
171
|
|
|
172
|
+
### Scope Classification Output
|
|
173
|
+
When this skill classifies a fresh scope as ungated (Quick Task or Trivial Change Boundary), consume
|
|
174
|
+
`scope_classification.markdown` verbatim from `renderScopeClassificationCard` in
|
|
175
|
+
`../../meta/contracts/interaction.md` § Scope Classification Card. The card is a compact, localized,
|
|
176
|
+
non-authorizing projection: mode, boundary, UR-trigger evaluation, one allowed line, one forbidden
|
|
177
|
+
line, escalation triggers and the challenge path. Do not maintain or render a skill-local
|
|
178
|
+
classification card template. If the renderer returns `null`, fail closed to the existing ceremony
|
|
179
|
+
and do not model-reconstruct Markdown.
|
|
180
|
+
|
|
166
181
|
## Output
|
|
167
182
|
Keep the result short and operational. For a status-only response, consume the Runtime Contract's
|
|
168
183
|
code-owned `status_presentation.markdown` verbatim. It is the compact localized operational Run
|
|
@@ -349,6 +349,69 @@ export function renderOperationalStatusCard(statusCard, {
|
|
|
349
349
|
});
|
|
350
350
|
}
|
|
351
351
|
|
|
352
|
+
export function renderScopeClassificationCard(classification, {
|
|
353
|
+
registry,
|
|
354
|
+
requestedLocale,
|
|
355
|
+
} = {}) {
|
|
356
|
+
if (!plainObject(classification)) return null;
|
|
357
|
+
const outcome = String(classification.outcome ?? "").trim();
|
|
358
|
+
const mode = String(classification.mode ?? "").trim();
|
|
359
|
+
const trivialBoundary = String(classification.trivial_boundary ?? "").trim();
|
|
360
|
+
const urTriggerEvaluation = String(classification.ur_trigger_evaluation ?? "").trim();
|
|
361
|
+
const allowedSummary = String(classification.allowed_summary ?? "").trim();
|
|
362
|
+
const forbiddenSummary = String(classification.forbidden_summary ?? "").trim();
|
|
363
|
+
const escalationTriggers = Array.isArray(classification.escalation_triggers)
|
|
364
|
+
? classification.escalation_triggers.map((item) => String(item ?? "").trim()).filter(Boolean)
|
|
365
|
+
: [];
|
|
366
|
+
const challengePath = String(classification.challenge_path ?? "").trim();
|
|
367
|
+
|
|
368
|
+
if (outcome !== "ungated") return null;
|
|
369
|
+
if (!["quick_task", "verified_change"].includes(mode)) return null;
|
|
370
|
+
if (!["inside", "outside"].includes(trivialBoundary)) return null;
|
|
371
|
+
if (!urTriggerEvaluation || !allowedSummary || !forbiddenSummary || !challengePath) return null;
|
|
372
|
+
if (escalationTriggers.length === 0) return null;
|
|
373
|
+
|
|
374
|
+
let locale;
|
|
375
|
+
try {
|
|
376
|
+
locale = resolvePresentationLocale(registry, requestedLocale);
|
|
377
|
+
} catch {
|
|
378
|
+
return null;
|
|
379
|
+
}
|
|
380
|
+
if (!locale) return null;
|
|
381
|
+
|
|
382
|
+
const pack = localePack(registry, locale);
|
|
383
|
+
const labels = pack?.scopeClassification;
|
|
384
|
+
if (!plainObject(labels)) return null;
|
|
385
|
+
|
|
386
|
+
const modeLabel = labels.mode?.[mode] ?? mode;
|
|
387
|
+
const boundaryLabel = labels.boundary?.[trivialBoundary] ?? trivialBoundary;
|
|
388
|
+
|
|
389
|
+
const rows = [
|
|
390
|
+
[labels.classification, `${modeLabel} · ${boundaryLabel}`],
|
|
391
|
+
[labels.grounds, urTriggerEvaluation],
|
|
392
|
+
[labels.allowed, allowedSummary],
|
|
393
|
+
[labels.forbidden, forbiddenSummary],
|
|
394
|
+
[labels.escalation, escalationTriggers.join("; ")],
|
|
395
|
+
[labels.challenge, challengePath],
|
|
396
|
+
];
|
|
397
|
+
|
|
398
|
+
const markdown = [
|
|
399
|
+
`## ${labels.title ?? "AGDF scope classification"}`,
|
|
400
|
+
"",
|
|
401
|
+
`| ${labels.field ?? "Field"} | ${labels.value ?? "Value"} |`,
|
|
402
|
+
"|---|---|",
|
|
403
|
+
...rows.map(([label, value]) => `| ${markdownCell(label)} | ${markdownCell(value)} |`),
|
|
404
|
+
].join("\n");
|
|
405
|
+
|
|
406
|
+
return Object.freeze({
|
|
407
|
+
schema_version: "1",
|
|
408
|
+
semantic_block: "scope_classification_card",
|
|
409
|
+
presentation_language: locale,
|
|
410
|
+
markdown,
|
|
411
|
+
authorizes: false,
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
|
|
352
415
|
export function gateOptions(registry, requestedLocale, gate, { includeCancel = false } = {}) {
|
|
353
416
|
const pack = localePack(registry, requestedLocale);
|
|
354
417
|
const options = [
|
package/package.json
CHANGED