@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.
Files changed (80) hide show
  1. package/contracts/human-origin-authz.md +14 -8
  2. package/dist/coverage-hotspots.d.ts +3 -0
  3. package/dist/coverage-hotspots.js +42 -2
  4. package/dist/occupancy-release.d.ts +5 -0
  5. package/dist/occupancy-release.js +11 -3
  6. package/dist/policy.d.ts +2 -0
  7. package/dist/policy.js +6 -0
  8. package/dist/triage-actions.js +10 -2
  9. package/docs/framework-gap-filing.md +85 -0
  10. package/docs/product-signal.md +1 -1
  11. package/package.json +1 -1
  12. package/packs/skills/skills-pack-0.1.json +6 -3
  13. package/scm/github.md +1 -1
  14. package/skills/deft-directive-feedback/SKILL.md +19 -14
  15. package/skills/deft-directive-product-signal/SKILL.md +1 -1
  16. package/vendor/directive-content/contracts/human-origin-authz.md +14 -8
  17. package/vendor/directive-content/docs/framework-gap-filing.md +85 -0
  18. package/vendor/directive-content/docs/product-signal.md +1 -1
  19. package/vendor/directive-content/packs/skills/skills-pack-0.1.json +6 -3
  20. package/vendor/directive-content/scm/github.md +1 -1
  21. package/vendor/directive-content/skills/deft-directive-feedback/SKILL.md +19 -14
  22. package/vendor/directive-content/skills/deft-directive-product-signal/SKILL.md +1 -1
  23. package/vendor/directive-core/dist/.tsbuildinfo +1 -1
  24. package/vendor/directive-core/dist/coverage-applicability/evaluate.d.ts.map +1 -1
  25. package/vendor/directive-core/dist/coverage-applicability/evaluate.js +39 -0
  26. package/vendor/directive-core/dist/coverage-applicability/evaluate.js.map +1 -1
  27. package/vendor/directive-core/dist/coverage-hotspots/evaluate.d.ts +24 -5
  28. package/vendor/directive-core/dist/coverage-hotspots/evaluate.d.ts.map +1 -1
  29. package/vendor/directive-core/dist/coverage-hotspots/evaluate.js +89 -8
  30. package/vendor/directive-core/dist/coverage-hotspots/evaluate.js.map +1 -1
  31. package/vendor/directive-core/dist/hooks/dispatcher.d.ts.map +1 -1
  32. package/vendor/directive-core/dist/hooks/dispatcher.js +10 -2
  33. package/vendor/directive-core/dist/hooks/dispatcher.js.map +1 -1
  34. package/vendor/directive-core/dist/init-deposit/skill-discovery-deposit.d.ts.map +1 -1
  35. package/vendor/directive-core/dist/init-deposit/skill-discovery-deposit.js +15 -0
  36. package/vendor/directive-core/dist/init-deposit/skill-discovery-deposit.js.map +1 -1
  37. package/vendor/directive-core/dist/intake/issue-ingest.d.ts +13 -0
  38. package/vendor/directive-core/dist/intake/issue-ingest.d.ts.map +1 -1
  39. package/vendor/directive-core/dist/intake/issue-ingest.js +164 -21
  40. package/vendor/directive-core/dist/intake/issue-ingest.js.map +1 -1
  41. package/vendor/directive-core/dist/pre-pr-controller/controller.d.ts.map +1 -1
  42. package/vendor/directive-core/dist/pre-pr-controller/controller.js +118 -12
  43. package/vendor/directive-core/dist/pre-pr-controller/controller.js.map +1 -1
  44. package/vendor/directive-core/dist/pre-pr-controller/index.d.ts +1 -1
  45. package/vendor/directive-core/dist/pre-pr-controller/index.d.ts.map +1 -1
  46. package/vendor/directive-core/dist/pre-pr-controller/index.js +1 -1
  47. package/vendor/directive-core/dist/pre-pr-controller/index.js.map +1 -1
  48. package/vendor/directive-core/dist/pre-pr-controller/phases.d.ts +5 -0
  49. package/vendor/directive-core/dist/pre-pr-controller/phases.d.ts.map +1 -1
  50. package/vendor/directive-core/dist/pre-pr-controller/phases.js +10 -0
  51. package/vendor/directive-core/dist/pre-pr-controller/phases.js.map +1 -1
  52. package/vendor/directive-core/dist/scope/promote-from-issue.d.ts +2 -1
  53. package/vendor/directive-core/dist/scope/promote-from-issue.d.ts.map +1 -1
  54. package/vendor/directive-core/dist/scope/promote-from-issue.js +17 -61
  55. package/vendor/directive-core/dist/scope/promote-from-issue.js.map +1 -1
  56. package/vendor/directive-core/dist/session/occupancy-recovery.d.ts +10 -0
  57. package/vendor/directive-core/dist/session/occupancy-recovery.d.ts.map +1 -1
  58. package/vendor/directive-core/dist/session/occupancy-recovery.js +43 -7
  59. package/vendor/directive-core/dist/session/occupancy-recovery.js.map +1 -1
  60. package/vendor/directive-core/dist/session/occupancy.d.ts +47 -1
  61. package/vendor/directive-core/dist/session/occupancy.d.ts.map +1 -1
  62. package/vendor/directive-core/dist/session/occupancy.js +240 -33
  63. package/vendor/directive-core/dist/session/occupancy.js.map +1 -1
  64. package/vendor/directive-core/dist/session/session-start.d.ts.map +1 -1
  65. package/vendor/directive-core/dist/session/session-start.js +6 -1
  66. package/vendor/directive-core/dist/session/session-start.js.map +1 -1
  67. package/vendor/directive-core/dist/triage/actions/index.d.ts +8 -5
  68. package/vendor/directive-core/dist/triage/actions/index.d.ts.map +1 -1
  69. package/vendor/directive-core/dist/triage/actions/index.js +248 -22
  70. package/vendor/directive-core/dist/triage/actions/index.js.map +1 -1
  71. package/vendor/directive-core/dist/triage/actions/types.d.ts +16 -2
  72. package/vendor/directive-core/dist/triage/actions/types.d.ts.map +1 -1
  73. package/vendor/directive-core/dist/triage/bulk/index.d.ts +8 -1
  74. package/vendor/directive-core/dist/triage/bulk/index.d.ts.map +1 -1
  75. package/vendor/directive-core/dist/triage/bulk/index.js +30 -11
  76. package/vendor/directive-core/dist/triage/bulk/index.js.map +1 -1
  77. package/vendor/directive-core/dist/value/feedback-file.d.ts +5 -0
  78. package/vendor/directive-core/dist/value/feedback-file.d.ts.map +1 -1
  79. package/vendor/directive-core/dist/value/feedback-file.js +26 -4
  80. package/vendor/directive-core/dist/value/feedback-file.js.map +1 -1
@@ -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)
@@ -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` / `task feedback:file` (hard confirm)
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)
@@ -94,17 +94,20 @@
94
94
  },
95
95
  {
96
96
  "id": "deft-directive-feedback",
97
- "description": "Batched session-end 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. Gated on plan.policy.valueFeedback upstreamPrompt.",
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- Session end when `friction:*` ledger signals or operator reports a directive shortfall\n- Operator says \"file this upstream\", \"report a framework gap\", or \"directive feedback\"\n- After enabling `plan.policy.valueFeedback.upstreamPrompt` during onboarding\n\n## Preconditions\n\n- ! Run only from a **consumer project** -- the filing path no-ops inside the directive maintainer repo\n- ! `plan.policy.valueFeedback.upstreamPrompt` MUST be ON (`task policy:show --field=valueFeedback`)\n- ⊗ File upstream issues without explicit operator confirmation\n- ⊗ Invoke when `valueFeedback.enabled` is OFF\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\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:\n\n```bash\ntask 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>\"]\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\n## Phase 3 -- Confirm + file\n\n- ! Present the final draft and ask for explicit yes/no confirmation\n- ! Only after approval, re-run with `--confirm`:\n\n```bash\ntask 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",
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` / `task 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",
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
  {
@@ -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." `task feedback:file --blocker` is the consumer filing path that carries the token and this evidence.
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
- Batched session-end gap escalation for directive consumers. Collects
5
- friction/gap reports, drafts deduped framework-gap issues against
6
- deftai/directive, and files upstream only after explicit operator
7
- confirmation. Gated on plan.policy.valueFeedback upstreamPrompt.
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
- - Session end when `friction:*` ledger signals or operator reports a directive shortfall
24
- - Operator says "file this upstream", "report a framework gap", or "directive feedback"
25
- - After enabling `plan.policy.valueFeedback.upstreamPrompt` during onboarding
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` MUST be ON (`task policy:show --field=valueFeedback`)
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
- - ⊗ Invoke when `valueFeedback.enabled` is OFF
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
- task 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>"]
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
- task feedback:file -- --summary "<one-line summary>" --context "<session context>" --expected "<expected>" --actual "<actual>" --confirm [--blocker]
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` / `task feedback:file`
78
+ - ! Public promote to `deftai/directive` remains hard-confirm via `deft-directive-feedback` / `deft feedback:file`
79
79
 
80
80
  ## Revoke
81
81