@deftai/directive-runtime 0.126.0-beta.1 → 0.126.0-beta.2
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/contracts/human-origin-authz.md +14 -8
- package/dist/coverage-hotspots.d.ts +3 -0
- package/dist/coverage-hotspots.js +42 -2
- package/dist/occupancy-release.d.ts +5 -0
- package/dist/occupancy-release.js +11 -3
- package/dist/policy.d.ts +2 -0
- package/dist/policy.js +6 -0
- package/dist/triage-actions.js +10 -2
- package/docs/framework-gap-filing.md +85 -0
- package/docs/product-signal.md +1 -1
- package/package.json +1 -1
- package/packs/skills/skills-pack-0.1.json +6 -3
- package/scm/github.md +1 -1
- package/skills/deft-directive-feedback/SKILL.md +19 -14
- package/skills/deft-directive-product-signal/SKILL.md +1 -1
- package/vendor/directive-content/contracts/human-origin-authz.md +14 -8
- package/vendor/directive-content/docs/framework-gap-filing.md +85 -0
- package/vendor/directive-content/docs/product-signal.md +1 -1
- package/vendor/directive-content/packs/skills/skills-pack-0.1.json +6 -3
- package/vendor/directive-content/scm/github.md +1 -1
- package/vendor/directive-content/skills/deft-directive-feedback/SKILL.md +19 -14
- package/vendor/directive-content/skills/deft-directive-product-signal/SKILL.md +1 -1
- package/vendor/directive-core/dist/.tsbuildinfo +1 -1
- package/vendor/directive-core/dist/coverage-applicability/evaluate.d.ts.map +1 -1
- package/vendor/directive-core/dist/coverage-applicability/evaluate.js +39 -0
- package/vendor/directive-core/dist/coverage-applicability/evaluate.js.map +1 -1
- package/vendor/directive-core/dist/coverage-hotspots/evaluate.d.ts +24 -5
- package/vendor/directive-core/dist/coverage-hotspots/evaluate.d.ts.map +1 -1
- package/vendor/directive-core/dist/coverage-hotspots/evaluate.js +89 -8
- package/vendor/directive-core/dist/coverage-hotspots/evaluate.js.map +1 -1
- package/vendor/directive-core/dist/hooks/dispatcher.d.ts.map +1 -1
- package/vendor/directive-core/dist/hooks/dispatcher.js +10 -2
- package/vendor/directive-core/dist/hooks/dispatcher.js.map +1 -1
- package/vendor/directive-core/dist/init-deposit/skill-discovery-deposit.d.ts.map +1 -1
- package/vendor/directive-core/dist/init-deposit/skill-discovery-deposit.js +15 -0
- package/vendor/directive-core/dist/init-deposit/skill-discovery-deposit.js.map +1 -1
- package/vendor/directive-core/dist/intake/issue-ingest.d.ts +13 -0
- package/vendor/directive-core/dist/intake/issue-ingest.d.ts.map +1 -1
- package/vendor/directive-core/dist/intake/issue-ingest.js +164 -21
- package/vendor/directive-core/dist/intake/issue-ingest.js.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/controller.d.ts.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/controller.js +118 -12
- package/vendor/directive-core/dist/pre-pr-controller/controller.js.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/index.d.ts +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/index.d.ts.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/index.js +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/index.js.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/phases.d.ts +5 -0
- package/vendor/directive-core/dist/pre-pr-controller/phases.d.ts.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/phases.js +10 -0
- package/vendor/directive-core/dist/pre-pr-controller/phases.js.map +1 -1
- package/vendor/directive-core/dist/scope/promote-from-issue.d.ts +2 -1
- package/vendor/directive-core/dist/scope/promote-from-issue.d.ts.map +1 -1
- package/vendor/directive-core/dist/scope/promote-from-issue.js +17 -61
- package/vendor/directive-core/dist/scope/promote-from-issue.js.map +1 -1
- package/vendor/directive-core/dist/session/occupancy-recovery.d.ts +10 -0
- package/vendor/directive-core/dist/session/occupancy-recovery.d.ts.map +1 -1
- package/vendor/directive-core/dist/session/occupancy-recovery.js +43 -7
- package/vendor/directive-core/dist/session/occupancy-recovery.js.map +1 -1
- package/vendor/directive-core/dist/session/occupancy.d.ts +47 -1
- package/vendor/directive-core/dist/session/occupancy.d.ts.map +1 -1
- package/vendor/directive-core/dist/session/occupancy.js +240 -33
- package/vendor/directive-core/dist/session/occupancy.js.map +1 -1
- package/vendor/directive-core/dist/session/session-start.d.ts.map +1 -1
- package/vendor/directive-core/dist/session/session-start.js +6 -1
- package/vendor/directive-core/dist/session/session-start.js.map +1 -1
- package/vendor/directive-core/dist/triage/actions/index.d.ts +8 -5
- package/vendor/directive-core/dist/triage/actions/index.d.ts.map +1 -1
- package/vendor/directive-core/dist/triage/actions/index.js +248 -22
- package/vendor/directive-core/dist/triage/actions/index.js.map +1 -1
- package/vendor/directive-core/dist/triage/actions/types.d.ts +16 -2
- package/vendor/directive-core/dist/triage/actions/types.d.ts.map +1 -1
- package/vendor/directive-core/dist/triage/bulk/index.d.ts +8 -1
- package/vendor/directive-core/dist/triage/bulk/index.d.ts.map +1 -1
- package/vendor/directive-core/dist/triage/bulk/index.js +30 -11
- package/vendor/directive-core/dist/triage/bulk/index.js.map +1 -1
- package/vendor/directive-core/dist/value/feedback-file.d.ts +5 -0
- package/vendor/directive-core/dist/value/feedback-file.d.ts.map +1 -1
- package/vendor/directive-core/dist/value/feedback-file.js +26 -4
- package/vendor/directive-core/dist/value/feedback-file.js.map +1 -1
|
@@ -89,17 +89,21 @@ deft authz:uat-suspend
|
|
|
89
89
|
deft authz:revoke -- grant-…
|
|
90
90
|
```
|
|
91
91
|
|
|
92
|
-
## Gate-override hatch (#5542)
|
|
92
|
+
## Gate-override hatch (#5542 / #5674)
|
|
93
93
|
|
|
94
94
|
Mint + admission APIs for an audited interactive override bound to a coverage-
|
|
95
|
-
applicability refuse.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
95
|
+
applicability refuse (#5542). Consumer wiring on pre-PR `coverage_headroom` /
|
|
96
|
+
`deft coverage:hotspots` lands as **exit 4** + distinct waived skip token with
|
|
97
|
+
admission-receipt re-verify (#5674). Measured Istanbul floor/headroom failure
|
|
98
|
+
still dominates when a coverage report exists. Exit 4 never maps to pass /
|
|
99
|
+
exit 0. Residual deposit keep-unknowns (run / hooks / codeql / approved-scope)
|
|
100
|
+
stay open on #5677. Classifier exact-path relief for ordinary managed
|
|
101
|
+
stamps/ledgers is #5665 — not this hatch.
|
|
99
102
|
|
|
100
103
|
```bash
|
|
101
104
|
deft authz:grant -- --template gate-override --target <refuseCode> \
|
|
102
105
|
--plan-ref <attemptId> --base-sha <sha> --head-sha <sha> --tree-hash <hash> [--confirm]
|
|
106
|
+
deft coverage:hotspots --attempt-id <attemptId>
|
|
103
107
|
```
|
|
104
108
|
|
|
105
109
|
| Rule | Detail |
|
|
@@ -107,11 +111,11 @@ deft authz:grant -- --template gate-override --target <refuseCode> \
|
|
|
107
111
|
| Mint provenance | `origin.kind=operator-cli` only via live `authz:grant` human-presence; `operator-session` non-admitting; refuse chat/parent/fixture consent |
|
|
108
112
|
| Binding | gate id + refuse code + `baseSha+headSha+treeHash` + attempt id (+ optional worktree/evaluator) |
|
|
109
113
|
| Admission | Atomic one-use via claim lock; inspection does **not** consume; same attempt reuses receipt; renew after revoke/expiry replaces under an attempt-id lock |
|
|
110
|
-
| Result arms (
|
|
114
|
+
| Result arms (#5674) | Live `waived` on coverage-hotspots + pre-PR evidence via exit 4 + waived skip token — **never** map to pass / exit 0; measured floor dominates when a report exists |
|
|
111
115
|
| Eligible refuse codes | Closed set (`unknown-path`, `dirty-tree`, …); non-overridable authenticity codes (`tree-mismatch`, `invalid-*`) dominate |
|
|
112
116
|
| Deferred peers | Empty list in v1 |
|
|
113
117
|
| Push/merge | Grant is `settings` only — no independent push/merge permission |
|
|
114
|
-
| Keep-outs | Does not fix #5541 classifier correctness; no fabricate green; no UAT silent suspend; no blanket env override |
|
|
118
|
+
| Keep-outs | Does not fix #5541 / #5665 classifier correctness; no fabricate green; no UAT silent suspend; no blanket env override |
|
|
115
119
|
|
|
116
120
|
Complementary hatches stay separate: `--allow-coverage-debt`, `policy:allow-*`,
|
|
117
121
|
`DEFT_ALLOW_*`, delivery-attempt `recordOperatorOverride`, `spec-drift-override`.
|
|
@@ -125,8 +129,10 @@ Complementary hatches stay separate: `--allow-coverage-debt`, `policy:allow-*`,
|
|
|
125
129
|
| Path write fence schema | #516 / #2443 |
|
|
126
130
|
| AFK session-auth / release verbs | #1095 — see `content/contracts/closed-verb-authz.md` (Wave 4; consumes these grants) |
|
|
127
131
|
| HMAC / hardware-keyed grants | non-goal for MVP |
|
|
128
|
-
| Classifier false-refuse correctness | #5541 (not absorbed by gate-override) |
|
|
132
|
+
| Classifier false-refuse correctness | #5541 / #5665 (not absorbed by gate-override) |
|
|
129
133
|
| Interactive gate waiver audit | #5542 (this hatch) |
|
|
134
|
+
| Pre-PR/hotspots waived-exit consumer + VERSION/lifecycle gitkeep inert | #5674 (leftover #5665/#5542) |
|
|
135
|
+
| Residual deposit keep-unknowns (run / hooks / codeql / approved-scope) | #5677 |
|
|
130
136
|
|
|
131
137
|
## Wave 4 consumers
|
|
132
138
|
|
|
@@ -18,6 +18,9 @@ export function parseArgs(argv) {
|
|
|
18
18
|
baseRef: null,
|
|
19
19
|
pathFilter: [],
|
|
20
20
|
useDiffPaths: true,
|
|
21
|
+
attemptId: null,
|
|
22
|
+
worktree: null,
|
|
23
|
+
evaluatorId: null,
|
|
21
24
|
json: false,
|
|
22
25
|
quiet: false,
|
|
23
26
|
};
|
|
@@ -32,6 +35,39 @@ export function parseArgs(argv) {
|
|
|
32
35
|
else if (arg === "--no-diff-filter") {
|
|
33
36
|
parsed.useDiffPaths = false;
|
|
34
37
|
}
|
|
38
|
+
else if (arg === "--attempt-id") {
|
|
39
|
+
const value = argv[i + 1];
|
|
40
|
+
if (value === undefined) {
|
|
41
|
+
return { ...parsed, error: "argument --attempt-id: expected one argument" };
|
|
42
|
+
}
|
|
43
|
+
parsed.attemptId = value;
|
|
44
|
+
i += 1;
|
|
45
|
+
}
|
|
46
|
+
else if (arg?.startsWith("--attempt-id=")) {
|
|
47
|
+
parsed.attemptId = arg.slice("--attempt-id=".length);
|
|
48
|
+
}
|
|
49
|
+
else if (arg === "--worktree") {
|
|
50
|
+
const value = argv[i + 1];
|
|
51
|
+
if (value === undefined) {
|
|
52
|
+
return { ...parsed, error: "argument --worktree: expected one argument" };
|
|
53
|
+
}
|
|
54
|
+
parsed.worktree = value;
|
|
55
|
+
i += 1;
|
|
56
|
+
}
|
|
57
|
+
else if (arg?.startsWith("--worktree=")) {
|
|
58
|
+
parsed.worktree = arg.slice("--worktree=".length);
|
|
59
|
+
}
|
|
60
|
+
else if (arg === "--evaluator-id") {
|
|
61
|
+
const value = argv[i + 1];
|
|
62
|
+
if (value === undefined) {
|
|
63
|
+
return { ...parsed, error: "argument --evaluator-id: expected one argument" };
|
|
64
|
+
}
|
|
65
|
+
parsed.evaluatorId = value;
|
|
66
|
+
i += 1;
|
|
67
|
+
}
|
|
68
|
+
else if (arg?.startsWith("--evaluator-id=")) {
|
|
69
|
+
parsed.evaluatorId = arg.slice("--evaluator-id=".length);
|
|
70
|
+
}
|
|
35
71
|
else if (arg === "--project-root") {
|
|
36
72
|
const value = argv[i + 1];
|
|
37
73
|
if (value === undefined) {
|
|
@@ -126,9 +162,13 @@ export function run(argv) {
|
|
|
126
162
|
baseRef: args.baseRef,
|
|
127
163
|
pathFilter: args.pathFilter.length > 0 ? args.pathFilter : null,
|
|
128
164
|
useDiffPaths: args.useDiffPaths,
|
|
165
|
+
attemptId: args.attemptId,
|
|
166
|
+
worktree: args.worktree,
|
|
167
|
+
evaluatorId: args.evaluatorId,
|
|
129
168
|
});
|
|
130
|
-
// Exit 3 = authorized coverage N/A (#5421);
|
|
131
|
-
|
|
169
|
+
// Exit 3 = authorized coverage N/A (#5421); exit 4 = gate-override waived (#5674).
|
|
170
|
+
// Keep machine-readable artifact on stdout for --json. Never map waived to exit 0.
|
|
171
|
+
if (result.exitCode === 3 || result.exitCode === 4) {
|
|
132
172
|
if (args.json && result.applicability) {
|
|
133
173
|
process.stdout.write(`${JSON.stringify(result.applicability, null, 2)}\n`);
|
|
134
174
|
}
|
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
* claim-over and deny-embedded copy-paste remain. host:none / address:none
|
|
6
6
|
* are unset metadata, not the lock cause. Does not reopen anonymous live
|
|
7
7
|
* auto-release (#3954).
|
|
8
|
+
*
|
|
9
|
+
* #5544 Prefer-A: pass the supplied --project-root through to releaseOccupancy
|
|
10
|
+
* so the consumer AGENTS.md header check stays at the project directory.
|
|
11
|
+
* Lease file / lock resolution stays inside releaseOccupancy (shared with the
|
|
12
|
+
* Write-hook lease view); denials / already-free print occupancyFile=.
|
|
8
13
|
*/
|
|
9
14
|
export declare const ABANDONED_OCCUPANCY_LEASE_RECOVERY: string;
|
|
10
15
|
export declare function formatOccupancyReleaseHelp(): string;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { resolve } from "node:path";
|
|
3
2
|
import { releaseOccupancy } from "../vendor/directive-core/dist/session/index.js";
|
|
4
3
|
import { occupancyUnrecognizedArgument } from "./occupancy-unrecognized.js";
|
|
5
4
|
/**
|
|
@@ -8,17 +7,24 @@ import { occupancyUnrecognizedArgument } from "./occupancy-unrecognized.js";
|
|
|
8
7
|
* claim-over and deny-embedded copy-paste remain. host:none / address:none
|
|
9
8
|
* are unset metadata, not the lock cause. Does not reopen anonymous live
|
|
10
9
|
* auto-release (#3954).
|
|
10
|
+
*
|
|
11
|
+
* #5544 Prefer-A: pass the supplied --project-root through to releaseOccupancy
|
|
12
|
+
* so the consumer AGENTS.md header check stays at the project directory.
|
|
13
|
+
* Lease file / lock resolution stays inside releaseOccupancy (shared with the
|
|
14
|
+
* Write-hook lease view); denials / already-free print occupancyFile=.
|
|
11
15
|
*/
|
|
12
16
|
export const ABANDONED_OCCUPANCY_LEASE_RECOVERY = "Abandoned live occupancy lease: bare session:end / occupancy:release without a presented " +
|
|
13
17
|
"session identity refuses while the lease is live. Immediate recovery: " +
|
|
14
18
|
"occupancy:release --session-id=<id from .deft/occupancy.json> " +
|
|
15
19
|
"(read session_id from that file). Or wait for TTL claim-over. " +
|
|
16
|
-
"host:none / address:none are ordinary unset metadata, not the lock cause."
|
|
20
|
+
"host:none / address:none are ordinary unset metadata, not the lock cause. " +
|
|
21
|
+
"Denials and already-free print occupancyFile= for the lease root this CLI resolved.";
|
|
17
22
|
export function formatOccupancyReleaseHelp() {
|
|
18
23
|
return [
|
|
19
24
|
"Usage: deft occupancy:release [--project-root <path>] [--session-id <id>]",
|
|
20
25
|
"",
|
|
21
26
|
"Release this worktree occupancy lease (owner live, or expired residue).",
|
|
27
|
+
"Pass the consumer project directory as --project-root (header check uses it; lease file resolves to the Git toplevel when available).",
|
|
22
28
|
"",
|
|
23
29
|
ABANDONED_OCCUPANCY_LEASE_RECOVERY,
|
|
24
30
|
"",
|
|
@@ -83,7 +89,9 @@ export function run(argv) {
|
|
|
83
89
|
process.stdout.write(formatOccupancyReleaseHelp());
|
|
84
90
|
return 0;
|
|
85
91
|
}
|
|
86
|
-
|
|
92
|
+
// Keep the supplied project directory for the consumer header check; lease
|
|
93
|
+
// root resolution happens inside releaseOccupancy (#5544 Greptile P1).
|
|
94
|
+
const result = releaseOccupancy(args.projectRoot, {
|
|
87
95
|
sessionId: args.sessionId,
|
|
88
96
|
env: process.env,
|
|
89
97
|
});
|
package/dist/policy.d.ts
CHANGED
|
@@ -23,6 +23,8 @@ interface SetArgs {
|
|
|
23
23
|
ceremonyEnabled?: boolean;
|
|
24
24
|
/** #5350 driftGuard.enforcement target for set-spec-guard-enforcement. */
|
|
25
25
|
specGuardEnforcement?: SpecGuardEnforcement;
|
|
26
|
+
/** #4375 audited setter for valueFeedback.upstreamPrompt. */
|
|
27
|
+
upstreamPrompt?: boolean;
|
|
26
28
|
error?: string;
|
|
27
29
|
}
|
|
28
30
|
/** Parse policy:show flags (mirrors _policy_show_cli.py). */
|
package/dist/policy.js
CHANGED
|
@@ -261,11 +261,15 @@ export function parseArgs(argv) {
|
|
|
261
261
|
let host;
|
|
262
262
|
let ceremonyOverride;
|
|
263
263
|
let ceremonyEnabled;
|
|
264
|
+
let upstreamPrompt;
|
|
264
265
|
for (let i = 1; i < argv.length; i += 1) {
|
|
265
266
|
const arg = argv[i];
|
|
266
267
|
if (arg === "--confirm") {
|
|
267
268
|
confirm = true;
|
|
268
269
|
}
|
|
270
|
+
else if (cmd === "enable-value-feedback" && arg === "--upstream-prompt") {
|
|
271
|
+
upstreamPrompt = true;
|
|
272
|
+
}
|
|
269
273
|
else if (arg === "--actor") {
|
|
270
274
|
const v = argv[i + 1];
|
|
271
275
|
if (v === undefined)
|
|
@@ -377,6 +381,7 @@ export function parseArgs(argv) {
|
|
|
377
381
|
host,
|
|
378
382
|
ceremonyOverride,
|
|
379
383
|
ceremonyEnabled,
|
|
384
|
+
upstreamPrompt,
|
|
380
385
|
};
|
|
381
386
|
}
|
|
382
387
|
return makeSetError(`unknown subcommand: ${cmd}`);
|
|
@@ -457,6 +462,7 @@ function runEnableValueFeedback(args) {
|
|
|
457
462
|
confirm: args.confirm,
|
|
458
463
|
actor: args.actor,
|
|
459
464
|
note: args.note,
|
|
465
|
+
subFlags: args.upstreamPrompt === true ? { upstreamPrompt: true } : undefined,
|
|
460
466
|
});
|
|
461
467
|
process.stdout.write(result.stdout);
|
|
462
468
|
return result.exitCode;
|
package/dist/triage-actions.js
CHANGED
|
@@ -152,13 +152,21 @@ export function run(argv) {
|
|
|
152
152
|
const repo = args.repo;
|
|
153
153
|
try {
|
|
154
154
|
if (args.cmd === "accept") {
|
|
155
|
-
const
|
|
155
|
+
const outcome = accept(n, repo, deps, {
|
|
156
156
|
actor: args.actor,
|
|
157
157
|
projectRoot,
|
|
158
158
|
autoPromote: args.autoPromote === true,
|
|
159
159
|
force: args.force === true,
|
|
160
160
|
});
|
|
161
|
-
process.stdout.write(`${formatAcceptOutput(n, repo, decisionId, {
|
|
161
|
+
process.stdout.write(`${formatAcceptOutput(n, repo, outcome.decisionId, {
|
|
162
|
+
autoPromote: args.autoPromote === true,
|
|
163
|
+
disposition: outcome.disposition,
|
|
164
|
+
relativePath: outcome.relativePath,
|
|
165
|
+
ingestMessage: outcome.ingestMessage,
|
|
166
|
+
})}\n`);
|
|
167
|
+
if (outcome.disposition === "refused") {
|
|
168
|
+
return 1;
|
|
169
|
+
}
|
|
162
170
|
}
|
|
163
171
|
else if (args.cmd === "reject") {
|
|
164
172
|
const decisionId = reject(n, repo, args.reason ?? "", deps, {
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Framework-gap filing (consumer → deftai/directive)
|
|
2
|
+
|
|
3
|
+
Durable house style for consumer framework-gap issues filed against
|
|
4
|
+
`deftai/directive`. Mirrors the shipped builders `buildFrameworkGapTitle` and
|
|
5
|
+
`buildFrameworkGapBody` in the value-feedback engine. This document is
|
|
6
|
+
**gate-free**: agents may read it while `plan.policy.valueFeedback.upstreamPrompt`
|
|
7
|
+
is OFF.
|
|
8
|
+
|
|
9
|
+
Primary command: `deft feedback:file` (optional Taskfile wrapper when
|
|
10
|
+
go-task is installed). Skill: `deft-directive-feedback`.
|
|
11
|
+
|
|
12
|
+
Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
13
|
+
|
|
14
|
+
## Title
|
|
15
|
+
|
|
16
|
+
- ! Prefix with `[framework-gap]` (the builder adds it when missing).
|
|
17
|
+
- ! Consumer hard-stop classification uses the sole title token `BLOCKER`
|
|
18
|
+
(`--blocker`). Example: `[framework-gap] BLOCKER Missing decompose hint`.
|
|
19
|
+
- ⊗ Invent other title classifications. Label-only classes stay labels.
|
|
20
|
+
- ⊗ Treat absence of `BLOCKER` as "not a blocker" — absence means not classified.
|
|
21
|
+
|
|
22
|
+
## Body sections
|
|
23
|
+
|
|
24
|
+
The builder emits this shape (placeholders when a field is omitted):
|
|
25
|
+
|
|
26
|
+
1. `## Summary` — one-line sanitized summary
|
|
27
|
+
2. `## Context`
|
|
28
|
+
3. `## Expected behavior`
|
|
29
|
+
4. `## Actual behavior / gap`
|
|
30
|
+
5. `## Session notes`
|
|
31
|
+
6. When `--blocker`: `## Adoption impact` with affected flow/version,
|
|
32
|
+
documented alternatives, observed recovery cost, and a triage owner/date
|
|
33
|
+
placeholder for a privileged actor
|
|
34
|
+
7. Footer separator + `_Filed via \`deft feedback:file\` … (Refs #1709 …)_`
|
|
35
|
+
|
|
36
|
+
Free-text fields fence line-leading `#` and `---` (indent) so operator paste
|
|
37
|
+
cannot break the markdown skeleton.
|
|
38
|
+
|
|
39
|
+
## Labels at create
|
|
40
|
+
|
|
41
|
+
- ! Pass an **empty** label list at issue create. Consumers generally lack
|
|
42
|
+
push access to set labels.
|
|
43
|
+
- ! Maintainer triage applies labels afterward from the maintainer catalog
|
|
44
|
+
(`.github/ISSUE_LABELS.md`) and `content/scm/github.md`.
|
|
45
|
+
- ~ `docs/consumer-issue-label-kit.md` is contrast only for consumer-kit
|
|
46
|
+
repos — not the privileged upstream `adoption-blocker` SoT.
|
|
47
|
+
- ⊗ Cite the consumer label kit as authority for upstream
|
|
48
|
+
`adoption-blocker`.
|
|
49
|
+
|
|
50
|
+
## Privileged `adoption-blocker`
|
|
51
|
+
|
|
52
|
+
- ! `adoption-blocker` is a **privileged write** after the body-evidence test
|
|
53
|
+
in `content/scm/github.md` § Consumer hard-blocker.
|
|
54
|
+
- ! The `BLOCKER` title token is an inbound flare only; it never writes the
|
|
55
|
+
ranking label.
|
|
56
|
+
- ⊗ Auto-apply or request `adoption-blocker` from a consumer-authored title alone.
|
|
57
|
+
|
|
58
|
+
## Dedup
|
|
59
|
+
|
|
60
|
+
- ! Normalize titles by stripping `[framework-gap]` and optional `BLOCKER`
|
|
61
|
+
before comparison so marked/unmarked drafts collide.
|
|
62
|
+
- ! When an open upstream issue matches, STOP and link it — do not file again.
|
|
63
|
+
|
|
64
|
+
## Tracking footer
|
|
65
|
+
|
|
66
|
+
- ! Use `Refs #1709` (value-feedback gap escalation) only.
|
|
67
|
+
- ⊗ Use `Closes` / `Fixes` / `Resolves` in the upstream body.
|
|
68
|
+
|
|
69
|
+
## Draft → confirm
|
|
70
|
+
|
|
71
|
+
1. Draft / readout: `deft feedback:file --summary "…" …` (optional
|
|
72
|
+
`--dry-run` / `--json`). Gate-OFF still returns title+body for template
|
|
73
|
+
readout; filing stays blocked until consent.
|
|
74
|
+
2. Enable upstream path when needed:
|
|
75
|
+
`deft policy:enable-value-feedback --confirm --upstream-prompt`
|
|
76
|
+
(audited setter; bare `--confirm` does not silently enable
|
|
77
|
+
`upstreamPrompt`). ⊗ Hand-edit PROJECT-DEFINITION as the primary setter.
|
|
78
|
+
3. Confirm: re-run the **same report fields and target repo** with `--confirm`
|
|
79
|
+
added and without `--dry-run` or `--json`.
|
|
80
|
+
|
|
81
|
+
## Related
|
|
82
|
+
|
|
83
|
+
- Skill: `skills/deft-directive-feedback/SKILL.md`
|
|
84
|
+
- SCM hard-stop rules: `scm/github.md` § Consumer hard-blocker
|
|
85
|
+
- Maintainer label catalog: `.github/ISSUE_LABELS.md` (repo-only; not deposited)
|
package/docs/product-signal.md
CHANGED
|
@@ -54,6 +54,6 @@ Agents: `deft-directive-product-signal` — triggers `product check-in`, `produc
|
|
|
54
54
|
|
|
55
55
|
## Related
|
|
56
56
|
|
|
57
|
-
- Public gap escalation: `deft-directive-feedback` / `
|
|
57
|
+
- Public gap escalation: `deft-directive-feedback` / `deft feedback:file` (hard confirm)
|
|
58
58
|
- Skill telemetry emit: #829 (optional `skillsSummary` hook only; not required for pulse)
|
|
59
59
|
- HTTP transport: #2697 (Phase 2)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deftai/directive-runtime",
|
|
3
|
-
"version": "0.126.0-beta.
|
|
3
|
+
"version": "0.126.0-beta.2",
|
|
4
4
|
"description": "Directive runtime — pinned product commands, hooks, content, and engine.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://deftai.github.io/directive/",
|
|
@@ -94,17 +94,20 @@
|
|
|
94
94
|
},
|
|
95
95
|
{
|
|
96
96
|
"id": "deft-directive-feedback",
|
|
97
|
-
"description": "
|
|
97
|
+
"description": "Mid-session and session-end framework-gap escalation for directive consumers. Collects friction/gap reports, drafts deduped framework-gap issues against deftai/directive, and files upstream only after explicit operator confirmation. Use when the operator says \"file a directive issue\", \"file this upstream\", or \"report a framework gap\".",
|
|
98
98
|
"triggers": [
|
|
99
99
|
"feedback",
|
|
100
100
|
"framework gap",
|
|
101
101
|
"file upstream",
|
|
102
|
+
"file this upstream",
|
|
103
|
+
"file a directive issue",
|
|
104
|
+
"report a framework gap",
|
|
102
105
|
"gap escalation",
|
|
103
106
|
"directive feedback"
|
|
104
107
|
],
|
|
105
108
|
"path": "skills/deft-directive-feedback/SKILL.md",
|
|
106
109
|
"version": "0.1",
|
|
107
|
-
"body": "# Deft Directive Feedback -- gap escalation to upstream\n\nConversational batched flow for filing framework gaps discovered during consumer sessions. Mirrors the confirmation gate from `deft-directive-article-review` -- the agent drafts and dedups; the operator approves before any upstream issue is created.\n\nLegend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.\n\n## When to Use\n\n-
|
|
110
|
+
"body": "# Deft Directive Feedback -- gap escalation to upstream\n\nConversational batched flow for filing framework gaps discovered during consumer sessions. Mirrors the confirmation gate from `deft-directive-article-review` -- the agent drafts and dedups; the operator approves before any upstream issue is created. House style for title/body/labels/dedup lives in [`docs/framework-gap-filing.md`](../../docs/framework-gap-filing.md).\n\nLegend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.\n\n## When to Use\n\n- Mid-session when the operator says \"file a directive issue\", \"file this upstream\", \"report a framework gap\", or \"directive feedback\" -- even while `plan.policy.valueFeedback.upstreamPrompt` is OFF\n- Session end when `friction:*` ledger signals or the operator reports a directive shortfall\n- After the operator opts into upstream filing via the audited setter below\n\n## Preconditions\n\n- ! Run only from a **consumer project** -- the filing path no-ops inside the directive maintainer repo\n- ! Filing requires `plan.policy.valueFeedback.upstreamPrompt` ON. If OFF, draft with `deft feedback:file --dry-run` / `--json` (title+body still print), then ask the operator to enable via `deft policy:enable-value-feedback --confirm --upstream-prompt`. If declined, STOP safely -- do not hand-edit PROJECT-DEFINITION.\n- ! Inspect current state with `deft policy:show --field=valueFeedback`\n- ⊗ File upstream issues without explicit operator confirmation\n- ⊗ Treat handwritten typed-block / PROJECT-DEFINITION edits as the primary audited setter\n\n## Phase 1 -- Collect (batched)\n\n- ! Gather concrete gap reports from the session: what was expected, what happened, and minimal reproduction context\n- ! Batch multiple friction items into one upstream issue when they share a root cause; otherwise prepare separate drafts\n- ~ Prefer attributed phrasing (\"encoding gate blocked a valid file\") over vague quality claims\n- ! Follow [`docs/framework-gap-filing.md`](../../docs/framework-gap-filing.md) for title/BLOCKER, section shape, empty create labels, privileged `adoption-blocker`, dedup, and Refs\n\n## Phase 1.5 -- Adoption-blocker judgment\n\n- ! Ask whether the gap blocks adoption. A gap blocks adoption when the consumer cannot complete an intended Directive flow and has no reasonable workaround.\n- ! When the answer is yes, collect the body evidence a privileged actor needs before applying `adoption-blocker`: affected consumer flow and version; documented alternatives attempted, or why they are not a reasonable workaround; observed recovery cost. Pass `--blocker` (and `--flow`, `--alternatives`, `--recovery-cost` when known) so the title carries `BLOCKER` and the body carries those sections.\n- ! When the answer is no or unknown, omit `--blocker`. Absence of the token does not mean \"not a blocker\" -- it means not classified.\n- ⊗ Apply or request the `adoption-blocker` ranking label from a consumer-authored title. The label is a privileged write after the body-evidence test.\n\n## Phase 2 -- Draft + dedup\n\n- ! For each candidate report, run a dry draft (reuse the same report fields and target repo in Phase 3; confirmation adds `--confirm` and drops `--dry-run`/`--json`):\n\n```bash\ndeft feedback:file --summary \"<one-line summary>\" --context \"<session context>\" --expected \"<expected>\" --actual \"<actual>\" --notes \"<optional>\" [--blocker --flow \"<flow and version>\" --alternatives \"<alts>\" --recovery-cost \"<cost>\"] [--dry-run|--json]\n```\n\n- ! Read the printed draft title/body with the operator before proceeding\n- ! If the command reports a duplicate open issue, STOP and link the existing issue instead of filing again\n- ⊗ Proceed past a duplicate-detection block without operator override\n- ~ When go-task is installed, the Taskfile may wrap the same verb; prefer `deft feedback:file` as primary\n\n## Phase 3 -- Confirm + file\n\n- ! Present the final draft and ask for explicit yes/no confirmation\n- ! Only after approval, re-run the **same report fields and target repo** with `--confirm` added and without `--dry-run` or `--json`:\n\n```bash\ndeft feedback:file --summary \"<one-line summary>\" --context \"<session context>\" --expected \"<expected>\" --actual \"<actual>\" --confirm [--blocker]\n```\n\n- ! Print the filed issue URL to the operator\n- ⊗ Use `Closes`/`Fixes`/`Resolves` in the upstream body -- use `Refs #1709` only\n\n## Phase 4 -- Handoff\n\n- ~ Record the upstream issue URL in the session handoff or continue checkpoint if the operator tracks follow-ups locally\n- ~ Return to the prior workflow; gap escalation does not block story completion\n\n## Anti-Patterns\n\n- ⊗ Filing from the maintainer framework repo (consumer-only guard)\n- ⊗ Skipping dedup review when the command reports an existing open issue\n- ⊗ Treating `--confirm` as implicit from broad session approval -- require an explicit filing confirmation step\n- ⊗ Infer \"not a blocker\" from an unmarked report -- absence of `BLOCKER` means not classified\n- ⊗ Auto-apply `adoption-blocker` from a consumer-authored title\n- ⊗ Hand-editing PROJECT-DEFINITION to flip `upstreamPrompt` instead of the audited setter\n",
|
|
108
111
|
"frontmatter_extra": null
|
|
109
112
|
},
|
|
110
113
|
{
|
|
@@ -233,7 +236,7 @@
|
|
|
233
236
|
],
|
|
234
237
|
"path": "skills/deft-directive-product-signal/SKILL.md",
|
|
235
238
|
"version": "0.1",
|
|
236
|
-
"body": "# Deft Directive Product Signal — consented check-in (#2693)\n\nAgent-driven qualitative product-improvement signal for partner/trial installs. Lightweight interview, minimized local summaries (value/health/helped), optional skillsSummary hook — submits to private `deftai/product-signal` when enable + consent gates pass.\n\nLegend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.\n\n## When to Use\n\n- Operator says `product check-in`, `product pulse`, `partner feedback`, or `product signal`\n- Partner onboarding after ops enables `plan.policy.productSignal`\n- ⊗ Do NOT invoke from session:start or ambient rituals when disabled (#2693 D3)\n\n## Preconditions\n\n- ! `plan.policy.productSignal.enabled` MUST be true (`task policy:show --field=productSignal`)\n- ! Install-level consent MUST be recorded before outbound submit (`task product-signal:status`)\n- ! Consent schema v2 binds to the configured sinkRepo; legacy v1 consent authorizes only `deftai/product-signal` (#2767)\n- ! Re-consent after changing `plan.policy.productSignal.sinkRepo`; mismatch soft-skips as sink-unconsented\n- ⊗ Prompt or submit when `enabled` is false\n- ⊗ Block story work on sink errors — fail open (#2693 D16/D18)\n\n## Phase 1 — Gate\n\n```bash\ntask product-signal:status\ntask policy:show -- --field=productSignal\n```\n\n- ! If disabled: soft-skip with one line; exit skill\n- ! If headless/CI: fail open — no consent/interview prompts (#2693 D16)\n\n## Phase 2 — First-time consent (interactive only, D17)\n\nWhen enabled, interactive, and consent missing/revoked, ask:\n\n> May we collect usage metrics and related session signal from this install to improve Directive? This can include a short check-in plus minimized local summaries (value/health and related ledgers). Nothing is sent while this path is off or without your consent.\n>\n> If you are unsure, please check with your company before saying no — they are a Directive partner and may already expect this signal to be shared.\n>\n> Reply **yes** to consent, or **no** to decline.\n\n- **yes** → `task product-signal:consent -- --grant` (pass `--project-root` when using a custom sinkRepo); continue\n- **no** → soft-skip; do not badger every turn\n\n## Phase 3 — Interview (≤3 answers + optional NPS)\n\n- ! Ask at most three short questions plus optional NPS (0–10)\n- ~ Target ≤30s human time beyond first-time consent\n- ⊗ Paste secrets, paths, raw logs, or full USER.md into answers\n\n## Phase 4 — Assemble + validate + submit\n\n```bash\ntask product-signal:submit -- --surface pulse --dry-run\ntask product-signal:submit -- --surface pulse --nps 9\n```\n\n- ! On validation failure: show reason; no partial write\n- ! On sink ACL/network errors: soft-skip with hint; do not fail caller (#2693 D18)\n- ! Report issue URL on success\n\n## Private gaps (D19)\n\n- ! Record bugs/gaps as `Gap:` comments on the standing **pulse** thread (enable+consent sufficient)\n- ! Public promote to `deftai/directive` remains hard-confirm via `deft-directive-feedback` / `
|
|
239
|
+
"body": "# Deft Directive Product Signal — consented check-in (#2693)\n\nAgent-driven qualitative product-improvement signal for partner/trial installs. Lightweight interview, minimized local summaries (value/health/helped), optional skillsSummary hook — submits to private `deftai/product-signal` when enable + consent gates pass.\n\nLegend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.\n\n## When to Use\n\n- Operator says `product check-in`, `product pulse`, `partner feedback`, or `product signal`\n- Partner onboarding after ops enables `plan.policy.productSignal`\n- ⊗ Do NOT invoke from session:start or ambient rituals when disabled (#2693 D3)\n\n## Preconditions\n\n- ! `plan.policy.productSignal.enabled` MUST be true (`task policy:show --field=productSignal`)\n- ! Install-level consent MUST be recorded before outbound submit (`task product-signal:status`)\n- ! Consent schema v2 binds to the configured sinkRepo; legacy v1 consent authorizes only `deftai/product-signal` (#2767)\n- ! Re-consent after changing `plan.policy.productSignal.sinkRepo`; mismatch soft-skips as sink-unconsented\n- ⊗ Prompt or submit when `enabled` is false\n- ⊗ Block story work on sink errors — fail open (#2693 D16/D18)\n\n## Phase 1 — Gate\n\n```bash\ntask product-signal:status\ntask policy:show -- --field=productSignal\n```\n\n- ! If disabled: soft-skip with one line; exit skill\n- ! If headless/CI: fail open — no consent/interview prompts (#2693 D16)\n\n## Phase 2 — First-time consent (interactive only, D17)\n\nWhen enabled, interactive, and consent missing/revoked, ask:\n\n> May we collect usage metrics and related session signal from this install to improve Directive? This can include a short check-in plus minimized local summaries (value/health and related ledgers). Nothing is sent while this path is off or without your consent.\n>\n> If you are unsure, please check with your company before saying no — they are a Directive partner and may already expect this signal to be shared.\n>\n> Reply **yes** to consent, or **no** to decline.\n\n- **yes** → `task product-signal:consent -- --grant` (pass `--project-root` when using a custom sinkRepo); continue\n- **no** → soft-skip; do not badger every turn\n\n## Phase 3 — Interview (≤3 answers + optional NPS)\n\n- ! Ask at most three short questions plus optional NPS (0–10)\n- ~ Target ≤30s human time beyond first-time consent\n- ⊗ Paste secrets, paths, raw logs, or full USER.md into answers\n\n## Phase 4 — Assemble + validate + submit\n\n```bash\ntask product-signal:submit -- --surface pulse --dry-run\ntask product-signal:submit -- --surface pulse --nps 9\n```\n\n- ! On validation failure: show reason; no partial write\n- ! On sink ACL/network errors: soft-skip with hint; do not fail caller (#2693 D18)\n- ! Report issue URL on success\n\n## Private gaps (D19)\n\n- ! Record bugs/gaps as `Gap:` comments on the standing **pulse** thread (enable+consent sufficient)\n- ! Public promote to `deftai/directive` remains hard-confirm via `deft-directive-feedback` / `deft feedback:file`\n\n## Revoke\n\n```bash\ntask product-signal:consent -- --revoke\n# and/or disable: set plan.policy.productSignal.enabled false\n```\n\n## Anti-Patterns\n\n- ⊗ Ambient consent nag when disabled\n- ⊗ Fail-closed headless behavior\n- ⊗ Sticky forever-fail when sink is down\n- ⊗ Auto-file public framework-gap issues from pulses\n\n## Exit\n\ndeft-directive-product-signal complete — exiting skill.\n",
|
|
237
240
|
"frontmatter_extra": null
|
|
238
241
|
},
|
|
239
242
|
{
|
package/scm/github.md
CHANGED
|
@@ -531,7 +531,7 @@ Agent `edit_files` operations can fail when structured file sections contain Uni
|
|
|
531
531
|
|
|
532
532
|
This is the canonical ranking label for **a Directive consumer cannot complete an intended flow and has no reasonable workaround**. The range is install, first session, update, `task check`, and ship -- not onboarding alone. Do not invent a second ranking label for that class.
|
|
533
533
|
|
|
534
|
-
**Title classification (the one sanctioned exception, #3713):** `BLOCKER` in the title is permitted for this class, and is the **only** classification allowed in an issue title. Every other classification stays label-only. Reason: the filing population cannot apply labels -- GitHub requires push access to set them at issue creation. The token is an inbound flare; it never writes `adoption-blocker`. A privileged actor applies the label after the body-evidence test below. Absence of the token does not mean "not a blocker." `
|
|
534
|
+
**Title classification (the one sanctioned exception, #3713):** `BLOCKER` in the title is permitted for this class, and is the **only** classification allowed in an issue title. Every other classification stays label-only. Reason: the filing population cannot apply labels -- GitHub requires push access to set them at issue creation. The token is an inbound flare; it never writes `adoption-blocker`. A privileged actor applies the label after the body-evidence test below. Absence of the token does not mean "not a blocker." `deft feedback:file --blocker` is the consumer filing path that carries the token and this evidence. See also [`docs/framework-gap-filing.md`](../docs/framework-gap-filing.md).
|
|
535
535
|
|
|
536
536
|
**Release census (#3969 / #4917):** `task verify:consumer-hard-stops` blocks a cut only for open `blocks-release-tag`. `adoption-blocker` is the punch list and does not block a tag. The BLOCKER title flare does not by itself block a cut. Issue bodies are not read into the verdict.
|
|
537
537
|
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: deft-directive-feedback
|
|
3
3
|
description: >-
|
|
4
|
-
|
|
5
|
-
friction/gap reports, drafts deduped framework-gap
|
|
6
|
-
deftai/directive, and files upstream only after explicit
|
|
7
|
-
confirmation.
|
|
4
|
+
Mid-session and session-end framework-gap escalation for directive
|
|
5
|
+
consumers. Collects friction/gap reports, drafts deduped framework-gap
|
|
6
|
+
issues against deftai/directive, and files upstream only after explicit
|
|
7
|
+
operator confirmation. Use when the operator says "file a directive issue",
|
|
8
|
+
"file this upstream", or "report a framework gap".
|
|
8
9
|
---
|
|
9
10
|
<!-- AUTO-GENERATED by task packs:render -- DO NOT EDIT MANUALLY -->
|
|
10
11
|
<!-- Purpose: rendered skill -->
|
|
@@ -14,28 +15,30 @@ description: >-
|
|
|
14
15
|
|
|
15
16
|
# Deft Directive Feedback -- gap escalation to upstream
|
|
16
17
|
|
|
17
|
-
Conversational batched flow for filing framework gaps discovered during consumer sessions. Mirrors the confirmation gate from `deft-directive-article-review` -- the agent drafts and dedups; the operator approves before any upstream issue is created.
|
|
18
|
+
Conversational batched flow for filing framework gaps discovered during consumer sessions. Mirrors the confirmation gate from `deft-directive-article-review` -- the agent drafts and dedups; the operator approves before any upstream issue is created. House style for title/body/labels/dedup lives in [`docs/framework-gap-filing.md`](../../docs/framework-gap-filing.md).
|
|
18
19
|
|
|
19
20
|
Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
20
21
|
|
|
21
22
|
## When to Use
|
|
22
23
|
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
- After
|
|
24
|
+
- Mid-session when the operator says "file a directive issue", "file this upstream", "report a framework gap", or "directive feedback" -- even while `plan.policy.valueFeedback.upstreamPrompt` is OFF
|
|
25
|
+
- Session end when `friction:*` ledger signals or the operator reports a directive shortfall
|
|
26
|
+
- After the operator opts into upstream filing via the audited setter below
|
|
26
27
|
|
|
27
28
|
## Preconditions
|
|
28
29
|
|
|
29
30
|
- ! Run only from a **consumer project** -- the filing path no-ops inside the directive maintainer repo
|
|
30
|
-
- ! `plan.policy.valueFeedback.upstreamPrompt`
|
|
31
|
+
- ! Filing requires `plan.policy.valueFeedback.upstreamPrompt` ON. If OFF, draft with `deft feedback:file --dry-run` / `--json` (title+body still print), then ask the operator to enable via `deft policy:enable-value-feedback --confirm --upstream-prompt`. If declined, STOP safely -- do not hand-edit PROJECT-DEFINITION.
|
|
32
|
+
- ! Inspect current state with `deft policy:show --field=valueFeedback`
|
|
31
33
|
- ⊗ File upstream issues without explicit operator confirmation
|
|
32
|
-
- ⊗
|
|
34
|
+
- ⊗ Treat handwritten typed-block / PROJECT-DEFINITION edits as the primary audited setter
|
|
33
35
|
|
|
34
36
|
## Phase 1 -- Collect (batched)
|
|
35
37
|
|
|
36
38
|
- ! Gather concrete gap reports from the session: what was expected, what happened, and minimal reproduction context
|
|
37
39
|
- ! Batch multiple friction items into one upstream issue when they share a root cause; otherwise prepare separate drafts
|
|
38
40
|
- ~ Prefer attributed phrasing ("encoding gate blocked a valid file") over vague quality claims
|
|
41
|
+
- ! Follow [`docs/framework-gap-filing.md`](../../docs/framework-gap-filing.md) for title/BLOCKER, section shape, empty create labels, privileged `adoption-blocker`, dedup, and Refs
|
|
39
42
|
|
|
40
43
|
## Phase 1.5 -- Adoption-blocker judgment
|
|
41
44
|
|
|
@@ -46,23 +49,24 @@ Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
|
46
49
|
|
|
47
50
|
## Phase 2 -- Draft + dedup
|
|
48
51
|
|
|
49
|
-
- ! For each candidate report, run a dry draft:
|
|
52
|
+
- ! For each candidate report, run a dry draft (reuse the same report fields and target repo in Phase 3; confirmation adds `--confirm` and drops `--dry-run`/`--json`):
|
|
50
53
|
|
|
51
54
|
```bash
|
|
52
|
-
|
|
55
|
+
deft feedback:file --summary "<one-line summary>" --context "<session context>" --expected "<expected>" --actual "<actual>" --notes "<optional>" [--blocker --flow "<flow and version>" --alternatives "<alts>" --recovery-cost "<cost>"] [--dry-run|--json]
|
|
53
56
|
```
|
|
54
57
|
|
|
55
58
|
- ! Read the printed draft title/body with the operator before proceeding
|
|
56
59
|
- ! If the command reports a duplicate open issue, STOP and link the existing issue instead of filing again
|
|
57
60
|
- ⊗ Proceed past a duplicate-detection block without operator override
|
|
61
|
+
- ~ When go-task is installed, the Taskfile may wrap the same verb; prefer `deft feedback:file` as primary
|
|
58
62
|
|
|
59
63
|
## Phase 3 -- Confirm + file
|
|
60
64
|
|
|
61
65
|
- ! Present the final draft and ask for explicit yes/no confirmation
|
|
62
|
-
- ! Only after approval, re-run with `--confirm`:
|
|
66
|
+
- ! Only after approval, re-run the **same report fields and target repo** with `--confirm` added and without `--dry-run` or `--json`:
|
|
63
67
|
|
|
64
68
|
```bash
|
|
65
|
-
|
|
69
|
+
deft feedback:file --summary "<one-line summary>" --context "<session context>" --expected "<expected>" --actual "<actual>" --confirm [--blocker]
|
|
66
70
|
```
|
|
67
71
|
|
|
68
72
|
- ! Print the filed issue URL to the operator
|
|
@@ -80,3 +84,4 @@ task feedback:file -- --summary "<one-line summary>" --context "<session context
|
|
|
80
84
|
- ⊗ Treating `--confirm` as implicit from broad session approval -- require an explicit filing confirmation step
|
|
81
85
|
- ⊗ Infer "not a blocker" from an unmarked report -- absence of `BLOCKER` means not classified
|
|
82
86
|
- ⊗ Auto-apply `adoption-blocker` from a consumer-authored title
|
|
87
|
+
- ⊗ Hand-editing PROJECT-DEFINITION to flip `upstreamPrompt` instead of the audited setter
|
|
@@ -75,7 +75,7 @@ task product-signal:submit -- --surface pulse --nps 9
|
|
|
75
75
|
## Private gaps (D19)
|
|
76
76
|
|
|
77
77
|
- ! Record bugs/gaps as `Gap:` comments on the standing **pulse** thread (enable+consent sufficient)
|
|
78
|
-
- ! Public promote to `deftai/directive` remains hard-confirm via `deft-directive-feedback` / `
|
|
78
|
+
- ! Public promote to `deftai/directive` remains hard-confirm via `deft-directive-feedback` / `deft feedback:file`
|
|
79
79
|
|
|
80
80
|
## Revoke
|
|
81
81
|
|
|
@@ -89,17 +89,21 @@ deft authz:uat-suspend
|
|
|
89
89
|
deft authz:revoke -- grant-…
|
|
90
90
|
```
|
|
91
91
|
|
|
92
|
-
## Gate-override hatch (#5542)
|
|
92
|
+
## Gate-override hatch (#5542 / #5674)
|
|
93
93
|
|
|
94
94
|
Mint + admission APIs for an audited interactive override bound to a coverage-
|
|
95
|
-
applicability refuse.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
95
|
+
applicability refuse (#5542). Consumer wiring on pre-PR `coverage_headroom` /
|
|
96
|
+
`deft coverage:hotspots` lands as **exit 4** + distinct waived skip token with
|
|
97
|
+
admission-receipt re-verify (#5674). Measured Istanbul floor/headroom failure
|
|
98
|
+
still dominates when a coverage report exists. Exit 4 never maps to pass /
|
|
99
|
+
exit 0. Residual deposit keep-unknowns (run / hooks / codeql / approved-scope)
|
|
100
|
+
stay open on #5677. Classifier exact-path relief for ordinary managed
|
|
101
|
+
stamps/ledgers is #5665 — not this hatch.
|
|
99
102
|
|
|
100
103
|
```bash
|
|
101
104
|
deft authz:grant -- --template gate-override --target <refuseCode> \
|
|
102
105
|
--plan-ref <attemptId> --base-sha <sha> --head-sha <sha> --tree-hash <hash> [--confirm]
|
|
106
|
+
deft coverage:hotspots --attempt-id <attemptId>
|
|
103
107
|
```
|
|
104
108
|
|
|
105
109
|
| Rule | Detail |
|
|
@@ -107,11 +111,11 @@ deft authz:grant -- --template gate-override --target <refuseCode> \
|
|
|
107
111
|
| Mint provenance | `origin.kind=operator-cli` only via live `authz:grant` human-presence; `operator-session` non-admitting; refuse chat/parent/fixture consent |
|
|
108
112
|
| Binding | gate id + refuse code + `baseSha+headSha+treeHash` + attempt id (+ optional worktree/evaluator) |
|
|
109
113
|
| Admission | Atomic one-use via claim lock; inspection does **not** consume; same attempt reuses receipt; renew after revoke/expiry replaces under an attempt-id lock |
|
|
110
|
-
| Result arms (
|
|
114
|
+
| Result arms (#5674) | Live `waived` on coverage-hotspots + pre-PR evidence via exit 4 + waived skip token — **never** map to pass / exit 0; measured floor dominates when a report exists |
|
|
111
115
|
| Eligible refuse codes | Closed set (`unknown-path`, `dirty-tree`, …); non-overridable authenticity codes (`tree-mismatch`, `invalid-*`) dominate |
|
|
112
116
|
| Deferred peers | Empty list in v1 |
|
|
113
117
|
| Push/merge | Grant is `settings` only — no independent push/merge permission |
|
|
114
|
-
| Keep-outs | Does not fix #5541 classifier correctness; no fabricate green; no UAT silent suspend; no blanket env override |
|
|
118
|
+
| Keep-outs | Does not fix #5541 / #5665 classifier correctness; no fabricate green; no UAT silent suspend; no blanket env override |
|
|
115
119
|
|
|
116
120
|
Complementary hatches stay separate: `--allow-coverage-debt`, `policy:allow-*`,
|
|
117
121
|
`DEFT_ALLOW_*`, delivery-attempt `recordOperatorOverride`, `spec-drift-override`.
|
|
@@ -125,8 +129,10 @@ Complementary hatches stay separate: `--allow-coverage-debt`, `policy:allow-*`,
|
|
|
125
129
|
| Path write fence schema | #516 / #2443 |
|
|
126
130
|
| AFK session-auth / release verbs | #1095 — see `content/contracts/closed-verb-authz.md` (Wave 4; consumes these grants) |
|
|
127
131
|
| HMAC / hardware-keyed grants | non-goal for MVP |
|
|
128
|
-
| Classifier false-refuse correctness | #5541 (not absorbed by gate-override) |
|
|
132
|
+
| Classifier false-refuse correctness | #5541 / #5665 (not absorbed by gate-override) |
|
|
129
133
|
| Interactive gate waiver audit | #5542 (this hatch) |
|
|
134
|
+
| Pre-PR/hotspots waived-exit consumer + VERSION/lifecycle gitkeep inert | #5674 (leftover #5665/#5542) |
|
|
135
|
+
| Residual deposit keep-unknowns (run / hooks / codeql / approved-scope) | #5677 |
|
|
130
136
|
|
|
131
137
|
## Wave 4 consumers
|
|
132
138
|
|