create-agdf 0.8.7 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/create-agdf.js +67 -8
- package/generated/.github/skills/agdf-brownfield-analysis/SKILL.md +6 -2
- package/generated/.github/skills/agdf-clean-implementation-review/SKILL.md +9 -1
- package/generated/.github/skills/agdf-code-review/SKILL.md +9 -1
- package/generated/.github/skills/agdf-delivery-closeout/SKILL.md +5 -1
- package/generated/.github/skills/agdf-delivery-path-search/SKILL.md +5 -1
- package/generated/.github/skills/agdf-gate-check/SKILL.md +12 -5
- package/generated/.github/skills/agdf-qa-gate/SKILL.md +12 -2
- package/generated/.github/skills/agdf-release-or/SKILL.md +7 -2
- package/generated/.github/skills/agdf-runtime-contract.md +11 -812
- package/generated/.github/skills/agdf-task-plan-review/SKILL.md +10 -1
- package/generated/.github/skills/contracts/closeout.md +29 -0
- package/generated/.github/skills/contracts/context-graph.md +48 -0
- package/generated/.github/skills/contracts/control-scaffold.md +109 -0
- package/generated/.github/skills/contracts/gate-transition.md +134 -0
- package/generated/.github/skills/contracts/interaction.md +370 -0
- package/generated/.github/skills/contracts/modes.md +91 -0
- package/generated/.github/skills/contracts/quality.md +100 -0
- package/generated/.opencode/AGDF.md +9 -1
- package/generated/.opencode/agdf-runtime-contract.md +11 -812
- package/generated/.opencode/contracts/closeout.md +29 -0
- package/generated/.opencode/contracts/context-graph.md +48 -0
- package/generated/.opencode/contracts/control-scaffold.md +109 -0
- package/generated/.opencode/contracts/gate-transition.md +134 -0
- package/generated/.opencode/contracts/interaction.md +370 -0
- package/generated/.opencode/contracts/modes.md +91 -0
- package/generated/.opencode/contracts/quality.md +100 -0
- package/generated/.opencode/skills/agdf-brownfield-analysis/SKILL.md +6 -2
- package/generated/.opencode/skills/agdf-clean-implementation-review/SKILL.md +9 -1
- package/generated/.opencode/skills/agdf-code-review/SKILL.md +9 -1
- package/generated/.opencode/skills/agdf-delivery-closeout/SKILL.md +5 -1
- package/generated/.opencode/skills/agdf-delivery-path-search/SKILL.md +5 -1
- package/generated/.opencode/skills/agdf-gate-check/SKILL.md +12 -5
- package/generated/.opencode/skills/agdf-qa-gate/SKILL.md +12 -2
- package/generated/.opencode/skills/agdf-release-or/SKILL.md +7 -2
- package/generated/.opencode/skills/agdf-task-plan-review/SKILL.md +10 -1
- package/generated/AGENTS.md +9 -1
- package/generated/plugins/agdf/.codex-plugin/plugin.json +4 -4
- package/generated/plugins/agdf/meta/agdf-agent-router.md +9 -1
- package/generated/plugins/agdf/meta/agdf-plugin.definition.json +14 -8
- package/generated/plugins/agdf/meta/agdf-runtime-contract.md +11 -812
- package/generated/plugins/agdf/meta/contracts/closeout.md +29 -0
- package/generated/plugins/agdf/meta/contracts/context-graph.md +48 -0
- package/generated/plugins/agdf/meta/contracts/control-scaffold.md +109 -0
- package/generated/plugins/agdf/meta/contracts/gate-transition.md +134 -0
- package/generated/plugins/agdf/meta/contracts/interaction.md +370 -0
- package/generated/plugins/agdf/meta/contracts/modes.md +91 -0
- package/generated/plugins/agdf/meta/contracts/quality.md +100 -0
- package/generated/plugins/agdf/skills/brownfield-analysis/SKILL.md +6 -2
- package/generated/plugins/agdf/skills/clean-implementation-review/SKILL.md +9 -1
- package/generated/plugins/agdf/skills/code-review/SKILL.md +9 -1
- package/generated/plugins/agdf/skills/delivery-closeout/SKILL.md +5 -1
- package/generated/plugins/agdf/skills/delivery-path-search/SKILL.md +5 -1
- package/generated/plugins/agdf/skills/gate-check/SKILL.md +12 -5
- package/generated/plugins/agdf/skills/qa-gate/SKILL.md +12 -2
- package/generated/plugins/agdf/skills/release-or/SKILL.md +7 -2
- package/generated/plugins/agdf/skills/task-plan-review/SKILL.md +10 -1
- package/package.json +1 -1
package/bin/create-agdf.js
CHANGED
|
@@ -91,6 +91,15 @@ const codexSkillNames = pluginDefinition.skillSet.map((skill) => `${pluginDefini
|
|
|
91
91
|
const copilotSkillNames = pluginDefinition.skillSet.map((skill) => `${pluginDefinition.copilot.skillPrefix}${skill.slug}`);
|
|
92
92
|
const openCodeSkillNames = pluginDefinition.skillSet.map((skill) => `${pluginDefinition.opencode.skillPrefix}${skill.slug}`);
|
|
93
93
|
const globalOpenCodeSkillNames = pluginDefinition.skillSet.map((skill) => `${pluginDefinition.opencode.globalSkillPrefix}${skill.slug}`);
|
|
94
|
+
const contractModules = [
|
|
95
|
+
"gate-transition.md",
|
|
96
|
+
"interaction.md",
|
|
97
|
+
"modes.md",
|
|
98
|
+
"quality.md",
|
|
99
|
+
"context-graph.md",
|
|
100
|
+
"control-scaffold.md",
|
|
101
|
+
"closeout.md",
|
|
102
|
+
];
|
|
94
103
|
const globalOpenCodeSkillOwnershipMarker = "<!-- AGDF-GLOBAL-SKILL: ";
|
|
95
104
|
const globalOpenCodeInstructionsOwnershipMarker = "<!-- AGDF-GLOBAL-INSTRUCTIONS -->";
|
|
96
105
|
const globalOpenCodeRuntimeContractOwnershipMarker = "<!-- AGDF-GLOBAL-RUNTIME-CONTRACT -->";
|
|
@@ -119,6 +128,7 @@ const codexPluginFiles = [
|
|
|
119
128
|
join("plugins", "agdf", "meta", "agdf-plugin.definition.json"),
|
|
120
129
|
join("plugins", "agdf", "meta", "agdf-runtime-contract.md"),
|
|
121
130
|
join("plugins", "agdf", "meta", "agdf-tenets.md"),
|
|
131
|
+
...contractModules.map((moduleName) => join("plugins", "agdf", "meta", "contracts", moduleName)),
|
|
122
132
|
...codexSkillNames.map((skillName) => join("plugins", "agdf", "skills", skillName, "SKILL.md")),
|
|
123
133
|
];
|
|
124
134
|
const controlFiles = [
|
|
@@ -184,12 +194,14 @@ const copilotInstructionFiles = [
|
|
|
184
194
|
const copilotSkillFiles = [
|
|
185
195
|
join(".github", "skills", "README.md"),
|
|
186
196
|
join(".github", "skills", pluginDefinition.copilot.runtimeContractFileName),
|
|
197
|
+
...contractModules.map((moduleName) => join(".github", "skills", "contracts", moduleName)),
|
|
187
198
|
...copilotSkillNames.map((skillName) => join(".github", "skills", skillName, "SKILL.md")),
|
|
188
199
|
];
|
|
189
200
|
const openCodeFiles = [
|
|
190
201
|
join(".opencode", pluginDefinition.opencode.instructionsFileName),
|
|
191
202
|
join(".opencode", "README.md"),
|
|
192
203
|
join(".opencode", pluginDefinition.opencode.runtimeContractFileName),
|
|
204
|
+
...contractModules.map((moduleName) => join(".opencode", "contracts", moduleName)),
|
|
193
205
|
...openCodeSkillNames.map((skillName) => join(".opencode", "skills", skillName, "SKILL.md")),
|
|
194
206
|
];
|
|
195
207
|
|
|
@@ -582,6 +594,7 @@ function globalOpenCodeConfigPaths(configDir) {
|
|
|
582
594
|
return {
|
|
583
595
|
instructions: join(configDir, pluginDefinition.opencode.instructionsFileName),
|
|
584
596
|
runtimeContract: join(configDir, pluginDefinition.opencode.runtimeContractFileName),
|
|
597
|
+
contracts: join(configDir, "contracts"),
|
|
585
598
|
skills: join(configDir, "skills"),
|
|
586
599
|
};
|
|
587
600
|
}
|
|
@@ -605,6 +618,13 @@ function assertGlobalOpenCodeSurfaceWritable(configDir) {
|
|
|
605
618
|
const paths = globalOpenCodeConfigPaths(configDir);
|
|
606
619
|
assertGlobalOpenCodeFileWritable(paths.instructions, globalOpenCodeInstructionsOwnershipMarker, "first-line");
|
|
607
620
|
assertGlobalOpenCodeFileWritable(paths.runtimeContract, globalOpenCodeRuntimeContractOwnershipMarker, "first-line");
|
|
621
|
+
for (const moduleName of contractModules) {
|
|
622
|
+
assertGlobalOpenCodeFileWritable(
|
|
623
|
+
join(paths.contracts, moduleName),
|
|
624
|
+
globalOpenCodeRuntimeContractOwnershipMarker,
|
|
625
|
+
"first-line",
|
|
626
|
+
);
|
|
627
|
+
}
|
|
608
628
|
for (const skillName of globalOpenCodeSkillNames) {
|
|
609
629
|
assertGlobalOpenCodeFileWritable(
|
|
610
630
|
join(paths.skills, skillName, "SKILL.md"),
|
|
@@ -664,6 +684,15 @@ function installOpenCodeGlobalSurface(configDir) {
|
|
|
664
684
|
|
|
665
685
|
writeOwnedGlobalOpenCodeFile(paths.instructions, globalInstructions, globalOpenCodeInstructionsOwnershipMarker, "first-line");
|
|
666
686
|
writeOwnedGlobalOpenCodeFile(paths.runtimeContract, globalRuntimeContract, globalOpenCodeRuntimeContractOwnershipMarker, "first-line");
|
|
687
|
+
for (const moduleName of contractModules) {
|
|
688
|
+
const generatedModule = readFileSync(join(generatedOpenCodeRoot, "contracts", moduleName), "utf8");
|
|
689
|
+
writeOwnedGlobalOpenCodeFile(
|
|
690
|
+
join(paths.contracts, moduleName),
|
|
691
|
+
`${globalOpenCodeRuntimeContractOwnershipMarker}\n${generatedModule}`,
|
|
692
|
+
globalOpenCodeRuntimeContractOwnershipMarker,
|
|
693
|
+
"first-line",
|
|
694
|
+
);
|
|
695
|
+
}
|
|
667
696
|
|
|
668
697
|
for (let index = 0; index < openCodeSkillNames.length; index += 1) {
|
|
669
698
|
const sourceName = openCodeSkillNames[index];
|
|
@@ -678,6 +707,7 @@ function installOpenCodeGlobalSurface(configDir) {
|
|
|
678
707
|
return {
|
|
679
708
|
instructions: paths.instructions,
|
|
680
709
|
runtimeContract: paths.runtimeContract,
|
|
710
|
+
contracts: paths.contracts,
|
|
681
711
|
skills: paths.skills,
|
|
682
712
|
};
|
|
683
713
|
}
|
|
@@ -760,14 +790,21 @@ function openCodePackageTransition(previousPackage, installedPackage) {
|
|
|
760
790
|
function evaluateGlobalOpenCodeSurface(configDir) {
|
|
761
791
|
const paths = globalOpenCodeConfigPaths(configDir);
|
|
762
792
|
const skillCount = globalOpenCodeSkillNames.filter((skillName) => existsSync(join(paths.skills, skillName, "SKILL.md"))).length;
|
|
793
|
+
const contractCount = contractModules.filter((moduleName) => existsSync(join(paths.contracts, moduleName))).length;
|
|
763
794
|
return {
|
|
764
795
|
path: paths.skills,
|
|
765
796
|
instructions: paths.instructions,
|
|
766
797
|
runtime_contract: paths.runtimeContract,
|
|
798
|
+
contracts: paths.contracts,
|
|
767
799
|
expected_skill_count: globalOpenCodeSkillNames.length,
|
|
768
800
|
skill_count: skillCount,
|
|
801
|
+
expected_contract_count: contractModules.length,
|
|
802
|
+
contract_count: contractCount,
|
|
769
803
|
present: existsSync(paths.skills),
|
|
770
|
-
complete: existsSync(paths.instructions)
|
|
804
|
+
complete: existsSync(paths.instructions)
|
|
805
|
+
&& existsSync(paths.runtimeContract)
|
|
806
|
+
&& contractCount === contractModules.length
|
|
807
|
+
&& skillCount === openCodeSkillNames.length,
|
|
771
808
|
};
|
|
772
809
|
}
|
|
773
810
|
|
|
@@ -795,7 +832,11 @@ function evaluateOpenCodeStatus(targetDir, configDir = defaultOpenCodeConfigDir(
|
|
|
795
832
|
if (!packageState.loadable) findings.push(`${pluginDefinition.opencode.npmPackage} is not loadable from the OpenCode config directory.`);
|
|
796
833
|
if (packageVersionStatus === "outdated") findings.push(`${pluginDefinition.opencode.npmPackage} version ${packageState.installed_version} is outdated; expected ${pluginDefinition.version}.`);
|
|
797
834
|
if (packageVersionStatus === "unknown" && packageState.loadable) findings.push(`${pluginDefinition.opencode.npmPackage} is loadable but its installed version is unknown.`);
|
|
798
|
-
if (!globalNativeSurface.complete)
|
|
835
|
+
if (!globalNativeSurface.complete) {
|
|
836
|
+
findings.push(
|
|
837
|
+
`Global OpenCode native surface is incomplete (${globalNativeSurface.skill_count}/${globalNativeSurface.expected_skill_count} skills; ${globalNativeSurface.contract_count}/${globalNativeSurface.expected_contract_count} contract modules).`,
|
|
838
|
+
);
|
|
839
|
+
}
|
|
799
840
|
if (!sessionSignals.active) findings.push("No active AGDF OpenCode session signal is visible in this process.");
|
|
800
841
|
if (!repositorySurface) findings.push("Current repository does not contain the AGDF OpenCode surface.");
|
|
801
842
|
|
|
@@ -1531,6 +1572,13 @@ function filled(value) {
|
|
|
1531
1572
|
return Boolean(value && !isPlaceholderValue(value) && value.trim() !== "");
|
|
1532
1573
|
}
|
|
1533
1574
|
|
|
1575
|
+
function runSelectionRecovery(target) {
|
|
1576
|
+
const directSelection = "Pass --run <run_id> or set AGDF_RUN_ID to select the intended run";
|
|
1577
|
+
return ["doctor", "delivery-map"].includes(target)
|
|
1578
|
+
? `${directSelection}, or use --all-active to evaluate every active run independently.`
|
|
1579
|
+
: `${directSelection}.`;
|
|
1580
|
+
}
|
|
1581
|
+
|
|
1534
1582
|
function parseQualityContracts(content) {
|
|
1535
1583
|
const parsed = JSON.parse(content);
|
|
1536
1584
|
if (!Array.isArray(parsed.contracts) || parsed.contracts.length === 0) {
|
|
@@ -1627,7 +1675,7 @@ function evaluateDoctor(targetDir, selection = {}) {
|
|
|
1627
1675
|
selectedRunState.resolution_error.split(":")[0] || "AGDF_ACTIVE_RUN_UNRESOLVED",
|
|
1628
1676
|
`Run selection failed: ${selectedRunState.resolution_error}`,
|
|
1629
1677
|
runPath,
|
|
1630
|
-
|
|
1678
|
+
runSelectionRecovery(selection.target),
|
|
1631
1679
|
);
|
|
1632
1680
|
} else {
|
|
1633
1681
|
const currentGateLine = run.match(/^- current_gate:[^\S\r\n]*(.*)$/m)?.[1]?.trim() ?? "";
|
|
@@ -2344,6 +2392,12 @@ const BREADCRUMB_PATH_TEMPLATES = {
|
|
|
2344
2392
|
|
|
2345
2393
|
const BREADCRUMB_STANDARD_GATES = ["UR", "PRD", "SD", "TP", "QA", "UAT"];
|
|
2346
2394
|
|
|
2395
|
+
function isReadyUserGateApproval({ status, currentGate, missingApproval }) {
|
|
2396
|
+
return status === "open"
|
|
2397
|
+
&& BREADCRUMB_STANDARD_GATES.includes(currentGate)
|
|
2398
|
+
&& missingApproval === `Approval: ${currentGate}`;
|
|
2399
|
+
}
|
|
2400
|
+
|
|
2347
2401
|
function buildBreadcrumbPath(modeSliceDecision, currentGate, runState) {
|
|
2348
2402
|
const gates = BREADCRUMB_PATH_TEMPLATES[modeSliceDecision] ?? ["UR"];
|
|
2349
2403
|
return gates.map((gate) => {
|
|
@@ -2381,7 +2435,7 @@ function buildStatusCard({
|
|
|
2381
2435
|
}) {
|
|
2382
2436
|
const qualityOutlook = deriveQualityOutlook(runState, findings);
|
|
2383
2437
|
const postApproval = postApprovalTransition(missingApproval);
|
|
2384
|
-
const isUserGateApproval = missingApproval
|
|
2438
|
+
const isUserGateApproval = isReadyUserGateApproval({ status, currentGate, missingApproval });
|
|
2385
2439
|
const lifecycle = extractField(runState.content ?? "", "lifecycle") || "unknown";
|
|
2386
2440
|
const nativeAttemptRequired = false;
|
|
2387
2441
|
const interactionKind = status === "open" && isUserGateApproval ? "gate_approval" : status === "blocked" ? "blocked" : "status";
|
|
@@ -2529,9 +2583,9 @@ function transitionDecisionForRunState(runState, verifiedChange = null) {
|
|
|
2529
2583
|
|
|
2530
2584
|
if (!isGateSatisfied(runState, "UR")) {
|
|
2531
2585
|
return {
|
|
2532
|
-
status: "
|
|
2586
|
+
status: "open",
|
|
2533
2587
|
current_gate: "UR",
|
|
2534
|
-
blocking_reason: "
|
|
2588
|
+
blocking_reason: "none",
|
|
2535
2589
|
missing_approval: "Approval: UR",
|
|
2536
2590
|
allowed: ["clarify user need", "formulate and persist UR", "record evidence", "request exact UR approval"],
|
|
2537
2591
|
forbidden: ["create PRD", "create SD", "create TP", "run Brownfield Analysis", "implement code", "claim QA or release readiness"],
|
|
@@ -2847,7 +2901,7 @@ function evaluateGateCheck(targetDir, selection = {}) {
|
|
|
2847
2901
|
enumerable: false,
|
|
2848
2902
|
});
|
|
2849
2903
|
attachApprovalOrientationSnapshot(statusCard, {
|
|
2850
|
-
ready: status
|
|
2904
|
+
ready: isReadyUserGateApproval({ status, currentGate, missingApproval }),
|
|
2851
2905
|
humanPresentation,
|
|
2852
2906
|
revisionId: extractField(runState.content ?? "", "revision_id"),
|
|
2853
2907
|
registry: interactionLocales,
|
|
@@ -3280,4 +3334,9 @@ async function main() {
|
|
|
3280
3334
|
printNextSteps(options.target, options.dir, files, wroteAgentsFragment, wroteOpenCodeConfigFragment, removedOpenCodeAgents);
|
|
3281
3335
|
}
|
|
3282
3336
|
|
|
3283
|
-
|
|
3337
|
+
try {
|
|
3338
|
+
await main();
|
|
3339
|
+
} catch (error) {
|
|
3340
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
3341
|
+
process.exitCode = 1;
|
|
3342
|
+
}
|
|
@@ -19,7 +19,11 @@ The skill answers:
|
|
|
19
19
|
- whether Context Graph impact exists without automatically creating a node
|
|
20
20
|
|
|
21
21
|
## Runtime Contract
|
|
22
|
-
Use
|
|
22
|
+
Use these focused runtime-contract modules:
|
|
23
|
+
|
|
24
|
+
- `../contracts/gate-transition.md`
|
|
25
|
+
- `../contracts/context-graph.md`
|
|
26
|
+
- `../contracts/quality.md`
|
|
23
27
|
|
|
24
28
|
Brownfield-specific output must make evidence, missing existing-system view, parallel-structure risk, reuse strategy, and the minimal next step visible.
|
|
25
29
|
When `.agdf/control/` is present, persist or link `post_ur_review` output under `.agdf/control/artefacts/<key>/BROWNFIELD_REVIEW.md`.
|
|
@@ -96,7 +100,7 @@ When used as Brownfield Review after `Approval: UR`, do not recommend PRD, SD, T
|
|
|
96
100
|
7. Check SoT/runtime/product-semantics drift.
|
|
97
101
|
8. Check primary visible ownership for UI/status/recovery paths.
|
|
98
102
|
9. Check UI monolith risk for large surfaces or central hooks.
|
|
99
|
-
10. Check Context Graph impact according to `../
|
|
103
|
+
10. Check Context Graph impact according to `../contracts/context-graph.md`.
|
|
100
104
|
11. Recommend the minimal clean implementation path.
|
|
101
105
|
|
|
102
106
|
## Output
|
|
@@ -18,7 +18,10 @@ This skill answers:
|
|
|
18
18
|
- is it maintainable or workaround-heavy
|
|
19
19
|
|
|
20
20
|
## Runtime Contract
|
|
21
|
-
Use
|
|
21
|
+
Use these focused runtime-contract modules:
|
|
22
|
+
|
|
23
|
+
- `../contracts/quality.md`
|
|
24
|
+
- `../contracts/context-graph.md`
|
|
22
25
|
|
|
23
26
|
Clean-review-specific output must make the primary solution, fallbacks, workarounds, parallel structures, exit criteria, and next cleanup/review step visible.
|
|
24
27
|
|
|
@@ -91,6 +94,11 @@ Use this compact structure:
|
|
|
91
94
|
- `revise`: solution works but contains avoidable fallback, unclear ownership, or missing evidence.
|
|
92
95
|
- `block`: solution creates a second SoT, a second owner, unbounded fallback, or masks unresolved product semantics.
|
|
93
96
|
|
|
97
|
+
### Compact Chat Output
|
|
98
|
+
|
|
99
|
+
At `pass`: one line — `Clean Review: pass — <one-line summary>`.
|
|
100
|
+
At `revise`/`block`: show the specific fallback/workaround/parallel-structure risk with file references.
|
|
101
|
+
|
|
94
102
|
## Forbidden
|
|
95
103
|
This skill must not:
|
|
96
104
|
|
|
@@ -17,7 +17,10 @@ It answers:
|
|
|
17
17
|
- whether Brownfield, TP, or clean-review follow-up remains open
|
|
18
18
|
|
|
19
19
|
## Runtime Contract
|
|
20
|
-
Use
|
|
20
|
+
Use these focused runtime-contract modules:
|
|
21
|
+
|
|
22
|
+
- `../contracts/quality.md`
|
|
23
|
+
- `../contracts/context-graph.md`
|
|
21
24
|
|
|
22
25
|
Code-review-specific output must make actual findings, missing review scope, evidence strength, and the next required step visible.
|
|
23
26
|
|
|
@@ -84,6 +87,11 @@ Use this compact structure:
|
|
|
84
87
|
- `block`: a hard defect, security risk, data-integrity risk, or unresolved critical uncertainty remains.
|
|
85
88
|
- `not_applicable`: no code changes were present for review.
|
|
86
89
|
|
|
90
|
+
### Compact Chat Output
|
|
91
|
+
|
|
92
|
+
At `pass`: one line — `Code Review: pass — <one-line summary>`.
|
|
93
|
+
At `revise`/`block`: show blocking findings with file references. Full report remains in durable file or inline evidence as specified.
|
|
94
|
+
|
|
87
95
|
## Forbidden
|
|
88
96
|
This skill must not:
|
|
89
97
|
|
|
@@ -20,7 +20,11 @@ It answers:
|
|
|
20
20
|
This skill does not replace `agdf-qa-gate`, `agdf-release-or`, user approvals, or gate decisions.
|
|
21
21
|
|
|
22
22
|
## Runtime Contract
|
|
23
|
-
Use
|
|
23
|
+
Use these focused runtime-contract modules:
|
|
24
|
+
|
|
25
|
+
- `../contracts/closeout.md`
|
|
26
|
+
- `../contracts/context-graph.md`
|
|
27
|
+
- `../contracts/gate-transition.md`
|
|
24
28
|
|
|
25
29
|
## Rules
|
|
26
30
|
1. Delivery follows gate clarity.
|
|
@@ -13,7 +13,11 @@ The search is advisory and read-only. Canonical AGDF `agdf-gate-check` remains t
|
|
|
13
13
|
|
|
14
14
|
## Runtime Contract
|
|
15
15
|
|
|
16
|
-
Use
|
|
16
|
+
Use these focused runtime-contract modules:
|
|
17
|
+
|
|
18
|
+
- `../contracts/control-scaffold.md`
|
|
19
|
+
- `../contracts/gate-transition.md`
|
|
20
|
+
- `../contracts/quality.md`
|
|
17
21
|
|
|
18
22
|
## Trigger
|
|
19
23
|
|
|
@@ -18,8 +18,14 @@ Determine the earliest blocking user approval gate and derive:
|
|
|
18
18
|
This skill must not create later artefacts such as PRD, SD, TP, CD, CR, QA, or UAT when the gate does not allow them.
|
|
19
19
|
|
|
20
20
|
## Runtime Contract
|
|
21
|
-
Use
|
|
22
|
-
|
|
21
|
+
Use these focused runtime-contract modules:
|
|
22
|
+
|
|
23
|
+
- `../contracts/gate-transition.md`
|
|
24
|
+
- `../contracts/interaction.md`
|
|
25
|
+
- `../contracts/control-scaffold.md`
|
|
26
|
+
- `../contracts/modes.md`
|
|
27
|
+
- `../contracts/quality.md`
|
|
28
|
+
The canonical gate order and transition model live only in `../contracts/gate-transition.md`. This skill evaluates the current state against that model; it must not maintain a second complete gate table.
|
|
23
29
|
|
|
24
30
|
## Agent-Native Control Path
|
|
25
31
|
|
|
@@ -69,7 +75,7 @@ For a ready `gate_approval`:
|
|
|
69
75
|
7. Distinguish internal process steps from user decisions in natural language. For example, after `Approval: TP`, say that pre-implementation Brownfield Analysis runs next and that no further user action is required now; do not expose `next_user_gate: none` or `user_action_required: no`, and do not ask for a second approval for Brownfield Analysis.
|
|
70
76
|
8. Ask exactly one question that names the selected `run_id` and `current_gate`.
|
|
71
77
|
9. Offer options in stable order: exact `Approval: <GateName>`, localized revise and localized decline. Add explicit cancel only where supported after decline; otherwise host dismissal maps to cancel. Never preselect, skip, auto-submit or reorder an option.
|
|
72
|
-
10. Use the surface adapter declared in the canonical plugin definition only when it can wait for deliberate input without auto-resolution
|
|
78
|
+
10. Use the surface adapter declared in the canonical plugin definition only when it can wait for deliberate input without auto-resolution and can transport `exact_option_value` or `separate_label_and_value`; never invoke a `decorated_label_only` adapter. Otherwise request the same exact approval in concise text.
|
|
73
79
|
11. Render both cards once in that single complete assistant message. Never merge, reverse, omit or duplicate them; the action heading does not replace either card. If the native attempt is unavailable or not applied, continue to exact text without repeating either card.
|
|
74
80
|
12. Re-run gate evaluation for the same run and expected gate after the response and immediately before persistence.
|
|
75
81
|
13. Reject a missing artefact, ambiguous or wrong run, wrong gate, stale expected gate, timeout/default, hook-supplied answer, agent message, technical permission outcome or plan approval.
|
|
@@ -88,7 +94,7 @@ For the transition card, use the complete resolved locale pack. The initial Germ
|
|
|
88
94
|
|
|
89
95
|
The primary option is derived exactly as `Approval: <GateName>` from the evaluated current gate; only explanatory copy and non-authoritative outcome labels are localized. Concrete localized copy belongs to the user-facing interaction layer or the approved delivery artefact, not to English runtime rules.
|
|
90
96
|
|
|
91
|
-
Make exactly one native-attempt for the ready gate. If the host does not render,
|
|
97
|
+
Make exactly one native-attempt for the eligible ready gate. If the host does not render,
|
|
92
98
|
apply or safely return the native question on that attempt, switch immediately
|
|
93
99
|
to the exact textual approval. Do not ask the user to request the buttons again
|
|
94
100
|
and do not create a retry loop or simulated control.
|
|
@@ -102,7 +108,7 @@ only after fresh run/gate/artefact revalidation; never retry automatically.
|
|
|
102
108
|
|
|
103
109
|
Surface behavior:
|
|
104
110
|
|
|
105
|
-
- Codex: invoke the native short-question/request-user-input control
|
|
111
|
+
- Codex: invoke the native short-question/request-user-input control only when preflight proves `exact_option_value` or `separate_label_and_value`, and omit auto-resolution. The canonical `decorated_label_only` capability must use exact text without invoking the adapter. `Approval: <GateName> (Recommended)` is never a valid option or approval.
|
|
106
112
|
- Claude Code: invoke `AskUserQuestion` on the first eligible attempt only when no timeout can auto-continue and no hook supplies `answers` or `updatedInput`; if it is not rendered or applied, use exact text immediately. Claude permissions and `ExitPlanMode` remain separate.
|
|
107
113
|
- OpenCode: use built-in `question` when permitted. Preserve explicit `permission.question` denial and use exact text in that case. `once`, `always`, `reject` and auto mode never become gate input.
|
|
108
114
|
- Other, unavailable or non-interactive surfaces: use exact textual approval and wait for a new explicit user response.
|
|
@@ -232,6 +238,7 @@ from the same snapshot and are shown exactly once.
|
|
|
232
238
|
|
|
233
239
|
If this skill creates or updates control artefacts, do not paste full file bodies into the chat.
|
|
234
240
|
List paths, summarize the decision, name the blocker or approval needed, and keep the durable content in the files.
|
|
241
|
+
See the Runtime Contract §Chat and Tool-Call Discipline for tool-call batching and skill output compaction rules.
|
|
235
242
|
|
|
236
243
|
## Forbidden
|
|
237
244
|
This skill must not:
|
|
@@ -22,7 +22,11 @@ It answers:
|
|
|
22
22
|
- whether blockers, critical risks, or missing evidence remain
|
|
23
23
|
|
|
24
24
|
## Runtime Contract
|
|
25
|
-
Use
|
|
25
|
+
Use these focused runtime-contract modules:
|
|
26
|
+
|
|
27
|
+
- `../contracts/quality.md`
|
|
28
|
+
- `../contracts/context-graph.md`
|
|
29
|
+
- `../contracts/gate-transition.md`
|
|
26
30
|
|
|
27
31
|
QA-specific `decision` is exactly `pass | revise | block`.
|
|
28
32
|
`pass` is allowed only when TP coverage, Brownfield fit, solution integrity, and relevant documentation/Context Graph impact are sufficiently evidenced.
|
|
@@ -100,7 +104,13 @@ Use this shape:
|
|
|
100
104
|
- impact_codes:
|
|
101
105
|
```
|
|
102
106
|
|
|
103
|
-
If Context Graph impact is relevant, include the fields from `../
|
|
107
|
+
If Context Graph impact is relevant, include the fields from `../contracts/context-graph.md`.
|
|
108
|
+
|
|
109
|
+
### Compact Chat Output
|
|
110
|
+
|
|
111
|
+
At `pass`: one line — `QA: pass — <one-line summary>`. Reference the durable QA report
|
|
112
|
+
path. Do not show the Quality Readiness projection or evidence inventory in chat.
|
|
113
|
+
At `revise`/`block`: show the decisive dimension, reason and next action.
|
|
104
114
|
|
|
105
115
|
## Decision Guidance
|
|
106
116
|
- `pass`: required TP tasks are done, evidence is strong, no blocking Brownfield or solution-integrity risk remains.
|
|
@@ -25,7 +25,12 @@ It reports:
|
|
|
25
25
|
- whether further quality follow-up or a separate delivery closeout is useful
|
|
26
26
|
|
|
27
27
|
## Runtime Contract
|
|
28
|
-
Use
|
|
28
|
+
Use these focused runtime-contract modules:
|
|
29
|
+
|
|
30
|
+
- `../contracts/closeout.md`
|
|
31
|
+
- `../contracts/quality.md`
|
|
32
|
+
- `../contracts/context-graph.md`
|
|
33
|
+
- `../contracts/control-scaffold.md`
|
|
29
34
|
|
|
30
35
|
OR-specific output must make gate status, delivered and intentionally not delivered content, missing approvals, missing evidence, risks, retained fallbacks, and the next permissible step visible.
|
|
31
36
|
When `.agdf/control/` is present, persist or link the OR under `.agdf/control/artefacts/<key>/OR.md` and reference it from the selected canonical `RUN_STATE.md` or `MASTER_BACKLOG.md` when it is steering-relevant.
|
|
@@ -118,7 +123,7 @@ Use a compact structure:
|
|
|
118
123
|
- quality_outlook:
|
|
119
124
|
```
|
|
120
125
|
|
|
121
|
-
When Context Graph impact is relevant, include the fields from `../
|
|
126
|
+
When Context Graph impact is relevant, include the fields from `../contracts/context-graph.md`.
|
|
122
127
|
Include `context_graph_reconciliation` whenever Context Graph impact is present. If the value is `open_gap`, required next step must resolve or explicitly retain that gap before commit-ready or release-ready handoff.
|
|
123
128
|
|
|
124
129
|
## Forbidden
|