@techierathore/techieflow 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/.claude/commands/TechieFlow/agents/analyst.md +0 -5
  2. package/.claude/commands/TechieFlow/agents/architect.md +0 -6
  3. package/.claude/commands/TechieFlow/agents/flow-master.md +41 -215
  4. package/.claude/commands/TechieFlow/agents/verifier.md +23 -64
  5. package/.claude/commands/TechieFlow/tasks/_metrics-emit-gate.md +24 -117
  6. package/.claude/commands/TechieFlow/tasks/_smoke-test-policy.md +20 -84
  7. package/.claude/commands/TechieFlow/tasks/_status-update-gate.md +10 -74
  8. package/.claude/commands/TechieFlow/tasks/_yolo-mode.md +20 -58
  9. package/.claude/commands/TechieFlow/tasks/amend-docs.md +20 -143
  10. package/.claude/commands/TechieFlow/tasks/build-phase.md +14 -224
  11. package/.claude/commands/TechieFlow/tasks/day1-brownfield.md +31 -505
  12. package/.claude/commands/TechieFlow/tasks/day1-greenfield.md +28 -213
  13. package/.claude/commands/TechieFlow/tasks/deploy-checklist.md +19 -0
  14. package/.claude/commands/TechieFlow/tasks/devguide.md +10 -219
  15. package/.claude/commands/TechieFlow/tasks/fix-issues.md +10 -129
  16. package/.claude/commands/TechieFlow/tasks/log-miss.md +19 -158
  17. package/.claude/commands/TechieFlow/tasks/metrics-report.md +1 -1
  18. package/.claude/commands/TechieFlow/tasks/mockups.md +12 -117
  19. package/.claude/commands/TechieFlow/tasks/refresh-status.md +9 -130
  20. package/.claude/commands/TechieFlow/tasks/split-brd.md +10 -126
  21. package/.claude/commands/TechieFlow/tasks/triage-and-fix.md +14 -0
  22. package/.claude/commands/TechieFlow/tasks/triage-issues.md +11 -152
  23. package/.claude/commands/TechieFlow/tasks/verify-phase.md +36 -572
  24. package/.opencode/plugin/techieflow.js +39 -12
  25. package/.tfcore/agents/analyst.md +0 -5
  26. package/.tfcore/agents/architect.md +0 -6
  27. package/.tfcore/agents/flow-master.md +41 -215
  28. package/.tfcore/agents/verifier.md +23 -64
  29. package/.tfcore/core-config.yaml +10 -0
  30. package/.tfcore/hooks/block-git.sh +4 -4
  31. package/.tfcore/hooks/guard-artifacts.sh +2 -2
  32. package/.tfcore/hooks/guard-build.sh +76 -0
  33. package/.tfcore/hooks/guard-db.sh +90 -0
  34. package/.tfcore/hooks/guard-metrics.sh +56 -0
  35. package/.tfcore/hooks/guard-status-html.sh +116 -71
  36. package/.tfcore/hooks/guard-status.sh +43 -16
  37. package/.tfcore/hooks/guard-verify.sh +70 -48
  38. package/.tfcore/hooks/sweep-artifacts.sh +2 -2
  39. package/.tfcore/install-manifest.yaml +0 -18
  40. package/.tfcore/routing.yaml +25 -14
  41. package/.tfcore/standards/coding-standards-core.md +61 -0
  42. package/.tfcore/standards/coding-standards-dotnet.md +93 -0
  43. package/.tfcore/tasks/_metrics-emit-gate.md +24 -117
  44. package/.tfcore/tasks/_smoke-test-policy.md +20 -84
  45. package/.tfcore/tasks/_status-update-gate.md +10 -74
  46. package/.tfcore/tasks/_yolo-mode.md +20 -58
  47. package/.tfcore/tasks/amend-docs.md +20 -143
  48. package/.tfcore/tasks/build-phase.md +14 -224
  49. package/.tfcore/tasks/day1-brownfield.md +31 -505
  50. package/.tfcore/tasks/day1-greenfield.md +28 -213
  51. package/.tfcore/tasks/deploy-checklist.md +19 -0
  52. package/.tfcore/tasks/devguide.md +10 -219
  53. package/.tfcore/tasks/fix-issues.md +10 -129
  54. package/.tfcore/tasks/log-miss.md +19 -158
  55. package/.tfcore/tasks/metrics-report.md +1 -1
  56. package/.tfcore/tasks/mockups.md +12 -117
  57. package/.tfcore/tasks/refresh-status.md +9 -130
  58. package/.tfcore/tasks/split-brd.md +10 -126
  59. package/.tfcore/tasks/triage-and-fix.md +14 -0
  60. package/.tfcore/tasks/triage-issues.md +11 -152
  61. package/.tfcore/tasks/verify-phase.md +36 -572
  62. package/.tfcore/telemetry/SCHEMA.md +43 -7
  63. package/.tfcore/telemetry/tf-metrics.sh +152 -17
  64. package/.tfcore/templates/project-brief-tmpl.yaml +1 -1
  65. package/.tfcore/templates/stack-defaults/dotnet.md +35 -0
  66. package/.tfcore/templates/stack-questions.md +77 -0
  67. package/.tfcore/templates/v4custom/app-agents-md-tmpl.md +3 -4
  68. package/.tfcore/templates/v4custom/app-architecture-tmpl.md +107 -115
  69. package/.tfcore/templates/v4custom/app-brd-tmpl.md +108 -184
  70. package/.tfcore/templates/v4custom/app-checklist-tmpl.md +48 -73
  71. package/.tfcore/templates/v4custom/app-claude-md-tmpl.md +1 -1
  72. package/.tfcore/templates/v4custom/app-coding-standards-tmpl.md +52 -0
  73. package/.tfcore/templates/v4custom/app-deployment-checklist-tmpl.md +86 -0
  74. package/.tfcore/templates/v4custom/app-devguide-tmpl.md +69 -146
  75. package/.tfcore/templates/v4custom/app-phases-tmpl.md +35 -0
  76. package/.tfcore/templates/v4custom/app-productguide-tmpl.md +38 -35
  77. package/.tfcore/templates/v4custom/app-project-status-tmpl.md +63 -73
  78. package/.tfcore/templates/v4custom/app-uidesign-tmpl.md +62 -37
  79. package/.tfcore/templates/v4custom/app-usageguide-tmpl.md +69 -54
  80. package/.tfcore/templates/v4custom/build-invocation-ladder.md +17 -180
  81. package/.tfcore/templates/v4custom/build-subagent-prompt.md +17 -0
  82. package/.tfcore/templates/v4custom/metrics-report-template.md +2 -2
  83. package/.tfcore/user-guide.md +0 -23
  84. package/.tfcore/utils/__pycache__/tf-brd-status.cpython-312.pyc +0 -0
  85. package/.tfcore/utils/__pycache__/tf-checklist-edit.cpython-312.pyc +0 -0
  86. package/.tfcore/utils/__pycache__/tf-codex-bind.cpython-312.pyc +0 -0
  87. package/.tfcore/utils/__pycache__/tf-codex-telemetry.cpython-312.pyc +0 -0
  88. package/.tfcore/utils/__pycache__/tf-day1-files.cpython-312.pyc +0 -0
  89. package/.tfcore/utils/__pycache__/tf-devguide-list.cpython-312.pyc +0 -0
  90. package/.tfcore/utils/__pycache__/tf-doc-check.cpython-312.pyc +0 -0
  91. package/.tfcore/utils/__pycache__/tf-log-miss.cpython-312.pyc +0 -0
  92. package/.tfcore/utils/__pycache__/tf-misses-md.cpython-312.pyc +0 -0
  93. package/.tfcore/utils/__pycache__/tf-mockups-locate.cpython-312.pyc +0 -0
  94. package/.tfcore/utils/__pycache__/tf-opencode-audit.cpython-312.pyc +0 -0
  95. package/.tfcore/utils/__pycache__/tf-perf-grade.cpython-312.pyc +0 -0
  96. package/.tfcore/utils/__pycache__/tf-render-html.cpython-312.pyc +0 -0
  97. package/.tfcore/utils/__pycache__/tf-split-brd.cpython-312.pyc +0 -0
  98. package/.tfcore/utils/__pycache__/tf-status-facts.cpython-312.pyc +0 -0
  99. package/.tfcore/utils/__pycache__/tf-triage.cpython-312.pyc +0 -0
  100. package/.tfcore/utils/__pycache__/tf-verify-list.cpython-312.pyc +0 -0
  101. package/.tfcore/utils/__pycache__/tf-verify-verdict.cpython-312.pyc +0 -0
  102. package/.tfcore/utils/tf-brd-status.py +176 -0
  103. package/.tfcore/utils/tf-brd-status.sh +19 -0
  104. package/.tfcore/utils/tf-build-list.py +191 -0
  105. package/.tfcore/utils/tf-build-list.sh +20 -0
  106. package/.tfcore/utils/tf-build.sh +143 -0
  107. package/.tfcore/utils/tf-cdp-relay.ps1 +64 -0
  108. package/.tfcore/utils/tf-checklist-edit.py +133 -0
  109. package/.tfcore/utils/tf-day1-files.py +208 -0
  110. package/.tfcore/utils/tf-day1-files.sh +20 -0
  111. package/.tfcore/utils/tf-devguide-list.py +249 -0
  112. package/.tfcore/utils/tf-devguide-list.sh +18 -0
  113. package/.tfcore/utils/tf-doc-check.py +1267 -0
  114. package/.tfcore/utils/tf-doc-check.sh +29 -0
  115. package/.tfcore/utils/tf-emit.sh +203 -13
  116. package/.tfcore/utils/tf-fix-close.sh +83 -0
  117. package/.tfcore/utils/tf-goal.sh +193 -62
  118. package/.tfcore/utils/tf-harness.sh +4 -9
  119. package/.tfcore/utils/tf-log-miss.py +197 -0
  120. package/.tfcore/utils/tf-log-miss.sh +14 -0
  121. package/.tfcore/utils/tf-misses-md.py +211 -0
  122. package/.tfcore/utils/tf-misses-md.sh +13 -0
  123. package/.tfcore/utils/tf-mockups-locate.py +66 -0
  124. package/.tfcore/utils/tf-mockups-locate.sh +18 -0
  125. package/.tfcore/utils/tf-opencode-audit.py +23 -7
  126. package/.tfcore/utils/tf-perf-grade.py +97 -0
  127. package/.tfcore/utils/tf-perf-grade.sh +12 -0
  128. package/.tfcore/utils/tf-phase.sh +74 -0
  129. package/.tfcore/utils/tf-routing-bind.sh +10 -5
  130. package/.tfcore/utils/tf-routing.sh +6 -7
  131. package/.tfcore/utils/tf-split-brd.py +304 -0
  132. package/.tfcore/utils/tf-split-brd.sh +22 -0
  133. package/.tfcore/utils/tf-status-evidence.sh +68 -0
  134. package/.tfcore/utils/tf-status-facts.py +309 -0
  135. package/.tfcore/utils/tf-status-facts.sh +20 -0
  136. package/.tfcore/utils/tf-triage.py +243 -0
  137. package/.tfcore/utils/tf-triage.sh +16 -0
  138. package/.tfcore/utils/tf-verify-boot.sh +250 -0
  139. package/.tfcore/utils/tf-verify-emit.sh +110 -0
  140. package/.tfcore/utils/tf-verify-env.sh +88 -0
  141. package/.tfcore/utils/tf-verify-list.py +270 -0
  142. package/.tfcore/utils/tf-verify-list.sh +13 -0
  143. package/.tfcore/utils/tf-verify-screens.mjs +283 -0
  144. package/.tfcore/utils/tf-verify-screens.sh +22 -0
  145. package/.tfcore/utils/tf-verify-tests.sh +123 -0
  146. package/.tfcore/utils/tf-verify-verdict.py +283 -0
  147. package/.tfcore/utils/tf-verify-verdict.sh +15 -0
  148. package/.tfcore/utils/tf-yolo.sh +59 -0
  149. package/README.md +114 -1149
  150. package/docs/TechieFlow-Installation.md +1 -5
  151. package/opencode.jsonc +13 -33
  152. package/package.json +1 -5
  153. package/scripts/install.mjs +52 -46
  154. package/.claude/commands/TechieFlow/tasks/advanced-elicitation.md +0 -117
  155. package/.claude/commands/TechieFlow/tasks/author-brd.md +0 -79
  156. package/.claude/commands/TechieFlow/tasks/document-project.md +0 -343
  157. package/.claude/commands/TechieFlow/tasks/execute-checklist.md +0 -86
  158. package/.claude/commands/TechieFlow/tasks/index-docs.md +0 -173
  159. package/.claude/commands/TechieFlow/tasks/kb-mode-interaction.md +0 -75
  160. package/.claude/commands/TechieFlow/tasks/shard-doc.md +0 -185
  161. package/.codex/config.toml +0 -46
  162. package/.codex/hooks.json +0 -63
  163. package/.codex/rules/techieflow.rules +0 -8
  164. package/.tfcore/hooks/codex-adapter.py +0 -248
  165. package/.tfcore/tasks/advanced-elicitation.md +0 -117
  166. package/.tfcore/tasks/author-brd.md +0 -79
  167. package/.tfcore/tasks/document-project.md +0 -343
  168. package/.tfcore/tasks/execute-checklist.md +0 -86
  169. package/.tfcore/tasks/index-docs.md +0 -173
  170. package/.tfcore/tasks/kb-mode-interaction.md +0 -75
  171. package/.tfcore/tasks/shard-doc.md +0 -185
  172. package/.tfcore/utils/tf-codex-bind.py +0 -196
  173. package/.tfcore/utils/tf-codex-telemetry.py +0 -60
  174. package/WORKFLOW.html +0 -1986
@@ -17,7 +17,7 @@ You need four things on the machine.
17
17
  |---|---|---|
18
18
  | Node.js 20 or newer | Runs the installer. Nothing is added to your project. | `node --version` |
19
19
  | bash | The framework's guard hooks and helper scripts run under bash. macOS and Linux have it. On Windows, work inside WSL or Git Bash. | `bash --version` |
20
- | Python 3.10 or newer | Powers the HTML renderer, the telemetry writer and the guard hooks. An older Python 3 works but skips the Codex files. | `python3 --version` |
20
+ | Python 3 | Powers the HTML renderer, the telemetry writer and the guard hooks. | `python3 --version` |
21
21
  | Claude Code or OpenCode | The harness that runs the agents. Either one. Both work from the same install. | `claude --version` or `opencode --version` |
22
22
 
23
23
  For a .NET project you also need the .NET SDK. Run `dotnet --version` to check.
@@ -42,8 +42,6 @@ The npm package itself holds the framework folders, this document and a `scripts
42
42
  | `.opencode/opencode.jsonc` | The framework's OpenCode configuration. OpenCode reads the personas and tasks straight from `.tfcore/` through it. | Refreshed. |
43
43
  | `.opencode/command/generate-html.md` | The short `/generate-html` command for OpenCode. | Added on update only. |
44
44
  | `opencode.jsonc` | The root OpenCode configuration, for your own additions. | Refreshed only when it holds nothing of yours, with the old file kept as `opencode.jsonc.bak`. |
45
- | `.codex/` and `.agents/skills/` | The Codex adapter, generated from the same personas and tasks. | Refreshed. `config.toml` is yours and is kept. |
46
- | `WORKFLOW.html` | The human workflow guide. Open it in a browser. | Refreshed. |
47
45
  | `.tf-scaffold-note.txt` | A note with your next command. Delete it when read. | Left alone. |
48
46
  | `docs/metrics/` | Five empty telemetry files and a README. This is your project's history: commit it. | Left alone. |
49
47
  | `.gitignore` | Lines that keep the copies above out of your commits. Appended, never rewritten. | Appended. |
@@ -242,7 +240,6 @@ The installer and the updater never write to:
242
240
  - `.tfcore/core-config.yaml` and `.tfcore/routing.yaml` after the first install
243
241
  - `.claude/settings.local.json`
244
242
  - `.claude/commands/trblazeui.md`, `.claude/commands/techierag.md` and the same names under `.opencode/command/`. These come from the NuGet packages.
245
- - `.codex/config.toml` after the first install
246
243
  - `opencode.jsonc` at the root when it holds a key of your own
247
244
 
248
245
  Existing lines in `.gitignore` and `.gitattributes` are never rewritten. The managed lines are appended once and recognised on every later run.
@@ -316,7 +313,6 @@ It installs the framework if it is not there yet, then removes the leftover pack
316
313
  | The framework is under `node_modules/@techierathore/techieflow/` and nowhere else | You ran `npm install`. See section 9. Run `npx @techierathore/techieflow@latest install`. |
317
314
  | `bash was not found` | On Windows, run the command inside WSL or Git Bash. |
318
315
  | `python3 was not found` | Install Python 3 and run the command again. On macOS: `brew install python3`. On Ubuntu or WSL: `sudo apt-get install -y python3`. |
319
- | `Codex bindings could not be generated` | Your Python is older than 3.10. Everything except the Codex files is installed. Upgrade Python and run `update` to add them. |
320
316
  | `Refusing to install into the framework itself` | You ran the command inside a clone of this repository. Pass `--target=<your project>`. |
321
317
  | `does not look installed` on update | The folder has no `.tfcore/`. Run `install` first. |
322
318
  | Claude Code does not show the `/TechieFlow:agents:analyst` command | Restart Claude Code in the project folder. Check that `.claude/commands/TechieFlow/agents/analyst.md` exists. |
package/opencode.jsonc CHANGED
@@ -253,7 +253,7 @@
253
253
  "sudo *": "ask"
254
254
  }
255
255
  },
256
- "description": "Madhav — the single super-agent. Orchestrates the full pipeline (*run-workflow, *phase) with parallel subagents, runs the unified build (*build-phase — calls /trblazeui + /techierag as sub-agents), fixes bugs from screenshots (*fix-issues), analyzes + logs human-found bugs without fixing (*triage-issues), records a single missed requirement in seconds (*log-miss), reports development telemetry (*metrics), and handles doc/status utilities (*render-workflow-docs, *generate-html, *handoff-phase, *refresh-status, *devguide) plus any one-off task."
256
+ "description": "Madhav — the TechieFlow master: build (*build-phase), fix (*fix-issues), triage (*triage-issues), log a miss (*log-miss), amend documents (*amend-docs), DevGuide and ProductGuide, handoff, refresh-status, metrics, HTML rendering, YOLO. The analyst owns day-1; the verifier owns *verify.",
257
257
  },
258
258
  "flow-architect": {
259
259
  "prompt": "{file:./.tfcore/agents/architect.md}",
@@ -839,19 +839,23 @@
839
839
  },
840
840
  "techieflow:tasks:fix-issues": {
841
841
  "template": "{file:./.tfcore/tasks/fix-issues.md}",
842
- "description": "Bug-fix front door: given a folder of screenshots (+ optional description), reproduce with Playwright, triage (layout/data/logic/RAG), fan fixes to the right builder, re-smoke (data+visual) + re-verify, update docs. Driven by /flow-master."
842
+ "description": "Fixes the bugs in a folder of screenshots: triages and logs them, builds the fix through the builders in FIX mode, smokes, re-verifies the touched rows, closes the misses with the fix cost (tf-fix-close.sh). Driven by /flow-master."
843
843
  },
844
844
  "techieflow:tasks:log-miss": {
845
845
  "template": "{file:./.tfcore/tasks/log-miss.md}",
846
- "description": "The 20-second front door for 'you missed this': turns one sentence about something an agent got wrong into a misses.jsonl record (what was missed, which phase/agent/model let it through, who found it) plus the checklist line — demotion with a dated miss Remark, or a new Planned row when nothing owns it. Never boots the app, never reproduces, never edits code. Driven by /flow-master."
846
+ "description": "The twenty-second record: one sentence from the owner becomes one miss record and one checklist line through tf-log-miss.sh. Never boots, never fixes. Driven by /flow-master."
847
847
  },
848
848
  "techieflow:tasks:triage-issues": {
849
849
  "template": "{file:./.tfcore/tasks/triage-issues.md}",
850
- "description": "ANALYZE-ONLY bug front door for human-found (UAT/production) bugs: reproduce with Playwright, triage to the owning REQ, log in the checklist (demote to Needs re-verify / new Planned rows), optional scoped regression re-verify, update PROJECT-STATUS with the *fix-issues pointer. NEVER edits code. Driven by /flow-master."
850
+ "description": "Analyse-only front door for bugs a person found: reproduces each on its screen, logs it in the checklist and the telemetry through tf-triage.sh (demote, new, note, close), never edits code. Driven by /flow-master."
851
+ },
852
+ "techieflow:tasks:triage-and-fix": {
853
+ "template": "{file:./.tfcore/tasks/triage-and-fix.md}",
854
+ "description": "The owner's whole bug sequence in YOLO: compare every screen to its mockup, triage the reported bugs, log every root cause with its cost, fix, log every fix with its cost, refresh the metrics, one summary per step. Driven by /flow-master."
851
855
  },
852
856
  "techieflow:tasks:verify-phase": {
853
857
  "template": "{file:./.tfcore/tasks/verify-phase.md}",
854
- "description": "Autonomous verification of a scope (ui | functional | all | REQ list | legacy phase-N) — filters the one Checklist by REQ prefix; applies the data-render + visual-truth gates; verdicts land in the Checklist Requirements Status table."
858
+ "description": "Verifies every checklist row in a scope (ui | functional | all | REQ list) against the running app: boots it, runs the seven checks in order through the tf-verify-* scripts, writes the verdicts into the checklist and the telemetry. YOLO by default. Driven by /verifier."
855
859
  },
856
860
  "techieflow:tasks:handoff-phase": {
857
861
  "template": "{file:./.tfcore/tasks/handoff-phase.md}",
@@ -873,14 +877,14 @@
873
877
  "template": "{file:./.tfcore/tasks/generate-html.md}",
874
878
  "description": "Render any markdown file(s) or a non-recursive directory to self-contained HTML using the shared shell."
875
879
  },
876
- "techieflow:tasks:author-brd": {
877
- "template": "{file:./.tfcore/tasks/author-brd.md}",
878
- "description": "Interactively extend docs/{AppName}-BRD.md with confirmed BRD-N requirements (per-item elicitation)."
879
- },
880
880
  "techieflow:tasks:amend-docs": {
881
881
  "template": "{file:./.tfcore/tasks/amend-docs.md}",
882
882
  "description": "Fold an evolving concept / changed requirements into the EXISTING day-1 docs IN PLACE: surgically amends BRD + Architecture (append-only IDs), ripples to PROJECT-STATUS / BRD §4 / checklists, re-renders HTML. Incremental alternative to re-running day1-*."
883
883
  },
884
+ "techieflow:tasks:deploy-checklist": {
885
+ "template": "{file:./.tfcore/tasks/deploy-checklist.md}",
886
+ "description": "Deployment Checklist: the steps to put the application on its host, one document per hosting target, written after UAT from the owner's pipeline guidance document and the Stack answers Q9 and Q10 (docs/TechieFlow-Document-Schemas.md §3.10). Never deploys. Driven by /flow-master."
887
+ },
884
888
  "techieflow:tasks:productguide": {
885
889
  "template": "{file:./.tfcore/tasks/productguide.md}",
886
890
  "description": "End-user Product Guide: screenshot-illustrated, task-oriented how-to manual for external users (what each screen is for + how to do things) — the user-facing sibling of the DevGuide, reusing its captured screenshots. Always MD + HTML. On-demand. Driven by /flow-master."
@@ -889,10 +893,6 @@
889
893
  "template": "{file:./.tfcore/tasks/devguide.md}",
890
894
  "description": "Generate/refresh the screen-by-screen Developer Guide: traces every screen/control from Razor page → service → data-access → stored proc/query, per user role, documenting the code AS BUILT. Single doc for small apps, split per role for large ones; --update refreshes only changed screens."
891
895
  },
892
- "techieflow:tasks:document-project": {
893
- "template": "{file:./.tfcore/tasks/document-project.md}",
894
- "description": "Generate comprehensive documentation for existing projects optimized for AI development agents."
895
- },
896
896
  "techieflow:tasks:create-doc": {
897
897
  "template": "{file:./.tfcore/tasks/create-doc.md}",
898
898
  "description": "Create a document from a YAML-driven TechieFlow template (interactive, section by section)."
@@ -904,26 +904,6 @@
904
904
  "techieflow:tasks:facilitate-brainstorming-session": {
905
905
  "template": "{file:./.tfcore/tasks/facilitate-brainstorming-session.md}",
906
906
  "description": "Run a structured brainstorming session; results land in docs/brainstorming-session-results.md."
907
- },
908
- "techieflow:tasks:advanced-elicitation": {
909
- "template": "{file:./.tfcore/tasks/advanced-elicitation.md}",
910
- "description": "Reflective/brainstorming actions for deeper exploration and iterative refinement of drafted content."
911
- },
912
- "techieflow:tasks:execute-checklist": {
913
- "template": "{file:./.tfcore/tasks/execute-checklist.md}",
914
- "description": "Validate a document or work product against one of the TechieFlow checklists."
915
- },
916
- "techieflow:tasks:index-docs": {
917
- "template": "{file:./.tfcore/tasks/index-docs.md}",
918
- "description": "Maintain docs/index.md by scanning all documentation files and indexing them with descriptions."
919
- },
920
- "techieflow:tasks:kb-mode-interaction": {
921
- "template": "{file:./.tfcore/tasks/kb-mode-interaction.md}",
922
- "description": "User-friendly interface to the TechieFlow knowledge base."
923
- },
924
- "techieflow:tasks:shard-doc": {
925
- "template": "{file:./.tfcore/tasks/shard-doc.md}",
926
- "description": "Split a large document into smaller documents by level-2 sections, preserving content integrity."
927
907
  }
928
908
  }
929
909
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@techierathore/techieflow",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "TechieFlow: a spec-driven development framework for AI coding agents, for Claude Code and OpenCode. One command installs it into any project.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -33,11 +33,7 @@
33
33
  ".opencode/command",
34
34
  "!.opencode/command/trblazeui.md",
35
35
  "!.opencode/command/techierag.md",
36
- ".codex/config.toml",
37
- ".codex/hooks.json",
38
- ".codex/rules",
39
36
  "opencode.jsonc",
40
- "WORKFLOW.html",
41
37
  "scripts/install.mjs",
42
38
  "scripts/npm-postinstall.mjs",
43
39
  "scripts/npm-cleanup.mjs",
@@ -20,7 +20,7 @@
20
20
  // scripts/test-install.mjs proves that by running both routes and comparing the results.
21
21
  //
22
22
  // Needs: node, bash and python3. The framework's own helper scripts (telemetry setup,
23
- // build-output ignore audit, Codex bindings) are run exactly as the shell scripts run them.
23
+ // build-output ignore audit) are run exactly as the shell scripts run them.
24
24
 
25
25
  import { spawnSync } from "node:child_process";
26
26
  import {
@@ -201,7 +201,7 @@ function checkTools() {
201
201
  }
202
202
  pythonCommand = findPython();
203
203
  if (!pythonCommand) {
204
- throw new Error("python3 was not found. It powers the HTML renderer, the telemetry writer, the Codex bindings and every guard hook.\n"
204
+ throw new Error("python3 was not found. It powers the HTML renderer, the telemetry writer and every guard hook.\n"
205
205
  + " Install it and run this command again:\n"
206
206
  + " macOS: brew install python3\n"
207
207
  + " Ubuntu / WSL: sudo apt-get install -y python3\n"
@@ -237,8 +237,8 @@ function ensureSafeTarget() {
237
237
  // Same lines, same patterns and same header text as the shell scripts. Append-only: an
238
238
  // entry already present in any anchored or slash variant is respected, nothing is rewritten.
239
239
  const frameworkIgnore = {
240
- lines: [".tfcore/", ".claude/", ".opencode/", ".codex/", ".agents/skills/", "/CLAUDE.md", "/WORKFLOW.html", "/opencode.jsonc", "/.tf-scaffold-note.txt"],
241
- patterns: [/^\/?\.tfcore\/?$/, /^\/?\.claude\/?$/, /^\/?\.opencode\/?$/, /^\/?\.codex\/?$/, /^\/?\.agents\/skills\/?$/, /^\/?CLAUDE\.md$/, /^\/?WORKFLOW\.html$/, /^\/?opencode\.jsonc$/, /^\/?\.tf-scaffold-note\.txt$/],
240
+ lines: [".tfcore/", ".claude/", ".opencode/", "/CLAUDE.md", "/opencode.jsonc", "/.tf-scaffold-note.txt"],
241
+ patterns: [/^\/?\.tfcore\/?$/, /^\/?\.claude\/?$/, /^\/?\.opencode\/?$/, /^\/?CLAUDE\.md$/, /^\/?opencode\.jsonc$/, /^\/?\.tf-scaffold-note\.txt$/],
242
242
  header: ["# TechieFlow framework — deployed copies, never commit (managed by scaffold/update-framework.sh)"],
243
243
  label: "framework entries",
244
244
  };
@@ -353,6 +353,22 @@ const canonicalSettings = String.raw`{
353
353
  {
354
354
  "type": "command",
355
355
  "command": "bash \"$CLAUDE_PROJECT_DIR/.tfcore/hooks/guard-artifacts.sh\""
356
+ },
357
+ {
358
+ "type": "command",
359
+ "command": "bash \"$CLAUDE_PROJECT_DIR/.tfcore/hooks/guard-status.sh\""
360
+ },
361
+ {
362
+ "type": "command",
363
+ "command": "bash \"$CLAUDE_PROJECT_DIR/.tfcore/hooks/guard-metrics.sh\""
364
+ },
365
+ {
366
+ "type": "command",
367
+ "command": "bash \"$CLAUDE_PROJECT_DIR/.tfcore/hooks/guard-db.sh\""
368
+ },
369
+ {
370
+ "type": "command",
371
+ "command": "bash \"$CLAUDE_PROJECT_DIR/.tfcore/hooks/guard-build.sh\""
356
372
  }
357
373
  ]
358
374
  },
@@ -363,6 +379,10 @@ const canonicalSettings = String.raw`{
363
379
  "type": "command",
364
380
  "command": "bash \"$CLAUDE_PROJECT_DIR/.tfcore/hooks/guard-status.sh\""
365
381
  },
382
+ {
383
+ "type": "command",
384
+ "command": "bash \"$CLAUDE_PROJECT_DIR/.tfcore/hooks/guard-metrics.sh\""
385
+ },
366
386
  {
367
387
  "type": "command",
368
388
  "command": "bash \"$CLAUDE_PROJECT_DIR/.tfcore/hooks/guard-verify.sh\""
@@ -426,7 +446,6 @@ Added (only missing files filled — re-runs are safe):
426
446
  .tfcore/ ← TechieFlow v4 customized (agents, tasks, templates)
427
447
  .claude/commands/ ← Claude Code slash commands (TechieFlow agents)
428
448
  .claude/settings.json ← yolo-except-git-writes permissions
429
- WORKFLOW.html ← the human workflow guide (open in a browser; §17 = macOS / Windows / Linux)
430
449
  opencode.jsonc ← OpenCode config (loads agents/tasks from .tfcore/ via {file:...} refs)
431
450
  .gitignore ← framework entries appended (deployed copies stay uncommitted)
432
451
 
@@ -468,7 +487,6 @@ Folders/files created (only missing files filled — re-runs are safe):
468
487
  .tfcore/ ← TechieFlow v4 customized (agents, tasks, templates)
469
488
  .claude/commands/ ← Claude Code slash commands (TechieFlow agents)
470
489
  .claude/settings.json ← yolo-except-git-writes permissions
471
- WORKFLOW.html ← the human workflow guide (open in a browser; §17 = macOS / Windows / Linux)
472
490
  opencode.jsonc ← OpenCode config (loads agents/tasks from .tfcore/ via {file:...} refs)
473
491
  .gitignore ← framework entries appended (deployed copies stay uncommitted)
474
492
  tests/playwright/ tests/unit/ src/
@@ -515,15 +533,20 @@ function deployOpenCodeBridge() {
515
533
  writeText(join(target, ".opencode", "opencode.jsonc"), openCodeConfigCopy());
516
534
  }
517
535
 
518
- function deployCodexAdapter() {
519
- say(" .codex/ + .agents/skills/ — Codex adapter");
520
- if (dryRun) { say(" WOULD preserve/create .codex/config.toml; refresh hooks/rules; regenerate agents/skills"); return; }
521
- for (const folder of [".codex/agents", ".codex/rules", ".agents/skills"]) mkdirSync(join(target, folder), { recursive: true });
522
- copyFile(join(sourceRoot, ".codex", "config.toml"), join(target, ".codex", "config.toml"), { onlyIfMissing: true });
523
- copyFile(join(sourceRoot, ".codex", "hooks.json"), join(target, ".codex", "hooks.json"));
524
- copyFile(join(sourceRoot, ".codex", "rules", "techieflow.rules"), join(target, ".codex", "rules", "techieflow.rules"));
525
- const result = runPython([join(target, ".tfcore", "utils", "tf-codex-bind.py"), target]);
526
- if (result.status !== 0) say(" ⚠ Codex bindings could not be generated (python3 required)");
536
+ // The Codex adapter was removed on 2026-09-07 (D-14, FR-42) and WORKFLOW.html was dropped the
537
+ // same day: it was a second full description of the process, last revised before the reset, and
538
+ // it still taught commands that no longer exist. Both are taken out of a project that has them.
539
+ // Nothing here is project content: .codex/ held a config file plus generated bindings,
540
+ // .agents/skills/ was generated in full from .tfcore/tasks/, and WORKFLOW.html was a copy.
541
+ function removeRetiredFiles() {
542
+ for (const path of [".codex", ".agents/skills", "WORKFLOW.html"]) {
543
+ const full = join(target, path);
544
+ if (!existsSync(full)) continue;
545
+ if (dryRun) { say(` ${would}remove ${path} — no longer part of the framework`); continue; }
546
+ rmSync(full, { recursive: true, force: true });
547
+ say(` removed ${path} — no longer part of the framework`);
548
+ }
549
+ if (!dryRun) { try { rmdirSync(join(target, ".agents")); say(" removed the emptied .agents/"); } catch {} }
527
550
  }
528
551
 
529
552
  function deployHousekeeping() {
@@ -619,13 +642,11 @@ async function install() {
619
642
  say(" syncing agent files from .tfcore/agents/ → .claude/commands/TechieFlow/agents/");
620
643
  copyTree(dryRun ? join(sourceRoot, ".tfcore", "agents") : join(target, ".tfcore", "agents"), join(target, ".claude", "commands", "TechieFlow", "agents"));
621
644
  // 4. reference files at the root, only if missing
622
- copyFile(join(sourceRoot, "WORKFLOW.html"), join(target, "WORKFLOW.html"), { onlyIfMissing: true });
623
645
  copyFile(join(sourceRoot, "opencode.jsonc"), join(target, "opencode.jsonc"), { onlyIfMissing: true });
624
646
  // 4b. OpenCode bridge, always refreshed
625
647
  deployOpenCodeBridge();
626
- // 4c. Codex adapter
627
- deployCodexAdapter();
628
- if (!dryRun) say(" Codex adapter installed — trust this repository and review /hooks before relying on guards");
648
+ // 4c. files earlier versions deployed and the framework no longer ships
649
+ removeRetiredFiles();
629
650
  // 5. Claude Code permissions, only if missing
630
651
  if (writeText(join(target, ".claude", "settings.json"), `${canonicalSettings}\n`, { onlyIfMissing: true })) { if (!dryRun) say(" created .claude/settings.json"); }
631
652
  else say(" .claude/settings.json already exists — preserved");
@@ -650,13 +671,15 @@ async function install() {
650
671
  say("");
651
672
  say(`Next: cd "${target}"`);
652
673
  if (greenfield) say(" dotnet new sln + blazor + add TrBlazeUI/TechieRag NuGets + dotnet build");
653
- say(" open WORKFLOW.html in a browser");
654
674
  say(` start Claude Code or OpenCode and run the ${greenfield ? "greenfield" : "brownfield"} day-1 command from .tf-scaffold-note.txt`);
655
675
  }
656
676
 
657
677
  // ---------------------------------------------------------------- update (update-framework.sh)
658
678
 
659
- const frameworkSubdirs = ["agents", "tasks", "telemetry", "templates", "checklists", "data", "utils", "hooks", "workflows", "agent-teams"];
679
+ // Keep this in step with FRAMEWORK_SUBDIRS in update-framework.sh. `standards` arrived with the
680
+ // document schemas and was missing here, so a project migrated from the old layout came out
681
+ // without its coding standards (found by scripts/test-install.mjs, 2026-09-07).
682
+ const frameworkSubdirs = ["agents", "tasks", "telemetry", "templates", "checklists", "data", "utils", "hooks", "standards", "workflows", "agent-teams"];
660
683
  const frameworkTopFiles = ["enhanced-ide-development-workflow.md", "user-guide.md", "working-in-the-brownfield.md", "install-manifest.yaml", "TOKEN-GUIDE.md"];
661
684
  const legacyConfigPattern = /\.bmad-core|bmad-(master|orchestrator|analyst|architect|verifier)|BMad:/;
662
685
 
@@ -866,16 +889,10 @@ function update() {
866
889
  deployOpenCodeBridge();
867
890
  refreshRootOpenCodeConfig();
868
891
 
869
- // 4b. Codex adapter
870
- deployCodexAdapter();
871
- if (!dryRun) say(" Codex hooks changed or installed — trust this repository and review /hooks");
892
+ // 4b. files earlier versions deployed and the framework no longer ships
893
+ removeRetiredFiles();
872
894
  for (const file of libraryPersonas) if (existsSync(join(target, ".opencode", "command", file))) say(` .opencode/command/${file} — preserved (NuGet-deployed)`);
873
895
 
874
- // 4. WORKFLOW.html, always refreshed
875
- if (existsSync(join(sourceRoot, "WORKFLOW.html"))) {
876
- copyFile(join(sourceRoot, "WORKFLOW.html"), join(target, "WORKFLOW.html"));
877
- say(" WORKFLOW.html");
878
- }
879
896
  // 5. NuGet persona shims: gap-fill only, never an overwrite
880
897
  shimLegacyPersonas({ gapOnly: true });
881
898
  // 6, 7. messages about stale references in files the owner owns
@@ -924,29 +941,18 @@ function uninstall() {
924
941
  plan(".opencode/opencode.jsonc");
925
942
  plan(".opencode/opencode.json", "(generated by routing)");
926
943
  for (const file of shippedFiles(".opencode/command", ".md")) if (!libraryPersonas.has(file)) plan(`.opencode/command/${file}`);
927
- plan(".codex/hooks.json");
928
- plan(".codex/rules/techieflow.rules");
929
- if (existsSync(join(target, ".codex", "config.toml"))) {
930
- if (sameAsShipped(".codex/config.toml", ".codex/config.toml")) plan(".codex/config.toml");
931
- else keep(".codex/config.toml", "you changed it");
932
- }
933
- const codexAgents = join(target, ".codex", "agents");
934
- if (existsSync(codexAgents)) for (const f of readdirSync(codexAgents)) {
935
- if (f.endsWith(".toml") && /description = "TechieFlow [a-z-]+ (specialist|role)\."/.test(read(join(codexAgents, f)))) plan(`.codex/agents/${f}`);
936
- else keep(`.codex/agents/${f}`, "not written by the framework");
937
- }
938
- const skills = join(target, ".agents", "skills");
939
- if (existsSync(skills)) for (const f of readdirSync(skills)) if (f.startsWith("techieflow-")) plan(`.agents/skills/${f}`);
944
+ // Retired on 2026-09-07 but still present in a project set up by an older version.
945
+ for (const path of [".codex", ".agents/skills"]) if (existsSync(join(target, path))) plan(path, "(retired Codex adapter)");
940
946
  for (const lib of [".trblazeui", ".techierag"]) {
941
947
  if (!existsSync(join(target, lib))) continue;
942
948
  const rest = readdirSync(join(target, lib)).filter((f) => f !== ".codex-agent-package-owned" && f !== ".gitignore");
943
949
  plan(`${lib}/.codex-agent-package-owned`);
944
950
  if (rest.length === 0) plan(`${lib}/.gitignore`);
945
951
  }
946
- for (const [path, shipped] of [["WORKFLOW.html", "WORKFLOW.html"], ["opencode.jsonc", "opencode.jsonc"]]) {
947
- if (!existsSync(join(target, path))) continue;
948
- if (sameAsShipped(path, shipped)) plan(path);
949
- else keep(path, "you changed it");
952
+ if (existsSync(join(target, "WORKFLOW.html"))) plan("WORKFLOW.html", "(retired human workflow guide)");
953
+ if (existsSync(join(target, "opencode.jsonc"))) {
954
+ if (sameAsShipped("opencode.jsonc", "opencode.jsonc")) plan("opencode.jsonc");
955
+ else keep("opencode.jsonc", "you changed it");
950
956
  }
951
957
  plan(".tf-scaffold-note.txt");
952
958
  const hook = join(target, ".git", "hooks", "pre-commit");
@@ -1,117 +0,0 @@
1
- # Advanced Elicitation Task
2
-
3
- ## Purpose
4
-
5
- - Provide optional reflective and brainstorming actions to enhance content quality
6
- - Enable deeper exploration of ideas through structured elicitation techniques
7
- - Support iterative refinement through multiple analytical perspectives
8
- - Usable during template-driven document creation or any chat conversation
9
-
10
- ## Usage Scenarios
11
-
12
- ### Scenario 1: Template Document Creation
13
-
14
- After outputting a section during document creation:
15
-
16
- 1. **Section Review**: Ask user to review the drafted section
17
- 2. **Offer Elicitation**: Present 9 carefully selected elicitation methods
18
- 3. **Simple Selection**: User types a number (0-8) to engage method, or 9 to proceed
19
- 4. **Execute & Loop**: Apply selected method, then re-offer choices until user proceeds
20
-
21
- ### Scenario 2: General Chat Elicitation
22
-
23
- User can request advanced elicitation on any agent output:
24
-
25
- - User says "do advanced elicitation" or similar
26
- - Agent selects 9 relevant methods for the context
27
- - Same simple 0-9 selection process
28
-
29
- ## Task Instructions
30
-
31
- ### 1. Intelligent Method Selection
32
-
33
- **Context Analysis**: Before presenting options, analyze:
34
-
35
- - **Content Type**: Technical specs, user stories, architecture, requirements, etc.
36
- - **Complexity Level**: Simple, moderate, or complex content
37
- - **Stakeholder Needs**: Who will use this information
38
- - **Risk Level**: High-impact decisions vs routine items
39
- - **Creative Potential**: Opportunities for innovation or alternatives
40
-
41
- **Method Selection Strategy**:
42
-
43
- 1. **Always Include Core Methods** (choose 3-4):
44
- - Expand or Contract for Audience
45
- - Critique and Refine
46
- - Identify Potential Risks
47
- - Assess Alignment with Goals
48
-
49
- 2. **Context-Specific Methods** (choose 4-5):
50
- - **Technical Content**: Tree of Thoughts, ReWOO, Meta-Prompting
51
- - **User-Facing Content**: Agile Team Perspective, Stakeholder Roundtable
52
- - **Creative Content**: Innovation Tournament, Escape Room Challenge
53
- - **Strategic Content**: Red Team vs Blue Team, Hindsight Reflection
54
-
55
- 3. **Always Include**: "Proceed / No Further Actions" as option 9
56
-
57
- ### 2. Section Context and Review
58
-
59
- When invoked after outputting a section:
60
-
61
- 1. **Provide Context Summary**: Give a brief 1-2 sentence summary of what the user should look for in the section just presented
62
-
63
- 2. **Explain Visual Elements**: If the section contains diagrams, explain them briefly before offering elicitation options
64
-
65
- 3. **Clarify Scope Options**: If the section contains multiple distinct items, inform the user they can apply elicitation actions to:
66
- - The entire section as a whole
67
- - Individual items within the section (specify which item when selecting an action)
68
-
69
- ### 3. Present Elicitation Options
70
-
71
- **Review Request Process:**
72
-
73
- - Ask the user to review the drafted section
74
- - In the SAME message, inform them they can suggest direct changes OR select an elicitation method
75
- - Present 9 intelligently selected methods (0-8) plus "Proceed" (9)
76
- - Keep descriptions short - just the method name
77
- - Await simple numeric selection
78
-
79
- **Action List Presentation Format:**
80
-
81
- ```text
82
- **Advanced Elicitation Options**
83
- Choose a number (0-8) or 9 to proceed:
84
-
85
- 0. [Method Name]
86
- 1. [Method Name]
87
- 2. [Method Name]
88
- 3. [Method Name]
89
- 4. [Method Name]
90
- 5. [Method Name]
91
- 6. [Method Name]
92
- 7. [Method Name]
93
- 8. [Method Name]
94
- 9. Proceed / No Further Actions
95
- ```
96
-
97
- **Response Handling:**
98
-
99
- - **Numbers 0-8**: Execute the selected method, then re-offer the choice
100
- - **Number 9**: Proceed to next section or continue conversation
101
- - **Direct Feedback**: Apply user's suggested changes and continue
102
-
103
- ### 4. Method Execution Framework
104
-
105
- **Execution Process:**
106
-
107
- 1. **Retrieve Method**: Access the specific elicitation method from the elicitation-methods data file
108
- 2. **Apply Context**: Execute the method from your current role's perspective
109
- 3. **Provide Results**: Deliver insights, critiques, or alternatives relevant to the content
110
- 4. **Re-offer Choice**: Present the same 9 options again until user selects 9 or gives direct feedback
111
-
112
- **Execution Guidelines:**
113
-
114
- - **Be Concise**: Focus on actionable insights, not lengthy explanations
115
- - **Stay Relevant**: Tie all elicitation back to the specific content being analyzed
116
- - **Identify Personas**: For multi-persona methods, clearly identify which viewpoint is speaking
117
- - **Maintain Flow**: Keep the process moving efficiently
@@ -1,79 +0,0 @@
1
- # author-brd
2
-
3
- Author or extend a Business Requirements Document (BRD) with stable BRD-N requirement IDs, using interactive elicitation. The analyst NEVER assumes a requirement — each candidate is confirmed by the user before it lands in the BRD.
4
-
5
- > **When to use:** this is the INTERACTIVE alternative for extending an existing BRD requirement-by-requirement. For creating a project's BRD, the default path is `*day1-brownfield` / `*day1-greenfield` (bulk draft, no per-item confirmation).
6
-
7
- ## Purpose
8
-
9
- Produce a BRD where every business/functional requirement has a unique, stable, append-only ID (`BRD-1`, `BRD-2`, …) that downstream agents (UI agent, orchestrator, verifier) can declare and verify against. Eliminate the "implicit requirement" problem by forcing per-item user confirmation.
10
-
11
- ## elicit
12
-
13
- elicit=true — this task REQUIRES user interaction. Never skip elicitation for efficiency.
14
-
15
- ## Inputs
16
-
17
- - `{AppName}` argument (required for the canonical filename; ask once if missing).
18
- - `{topic}` argument (optional) — the product/feature area. If absent, ask once: "What's the topic / product area for this BRD?"
19
- - Existing BRD path. Resolve in this order: `core-config.yaml → customTechnicalDocuments`, then `docs/{AppName}-BRD.md` (legacy fallbacks: `docs/brd.md`, `docs/BRD.md`). If found, OPEN it and continue from the highest existing BRD-N. If not found, create `docs/{AppName}-BRD.md` from `.tfcore/templates/v4custom/app-brd-tmpl.md` (feature catalog + §10 BRD-N ledger shape — NOT ad-hoc "Phase N" sections).
20
-
21
- ## SEQUENTIAL Execution
22
-
23
- ### 1. Read or scaffold the BRD
24
-
25
- - If the resolved BRD exists: read it, parse all existing `BRD-{N}` IDs, and record the highest N. New requirements continue from N+1.
26
- - If absent: scaffold `docs/{AppName}-BRD.md` from `.tfcore/templates/v4custom/app-brd-tmpl.md` (leave unconfirmed sections empty; confirmed requirements land in the §10 ledger).
27
- - Ask the user which areas they want to scope today.
28
-
29
- ### 2. Drive elicitation per area, one at a time
30
-
31
- For each area the user wants to cover (UI, data, workflow, NFRs, etc.):
32
-
33
- 1. Generate a numbered list of CANDIDATE requirements for that area — 3 to 7 items, written as one-line "user can X" / "system shall Y" statements. Do NOT assign BRD-N IDs yet.
34
- 2. Present the list and ask the user to (a) accept, (b) reject, (c) refine, or (d) add their own — one item at a time. Use this exact prompt format:
35
- ```
36
- Candidate requirements for {area}:
37
- 1. {candidate}
38
- 2. {candidate}
39
- ...
40
- For each, reply: keep / drop / refine: <new text>. Or add a new one with: add: <text>.
41
- ```
42
- 3. After the user processes each item, assign the next BRD-N to every KEPT or REFINED item, in the order they were confirmed. Show the assignments back:
43
- ```
44
- Assigned:
45
- - BRD-{N}: {final text}
46
- - BRD-{N+1}: {final text}
47
- ```
48
- 4. Append the assigned requirements to the §10 Functional-requirements ledger of the resolved BRD file (and flesh out / create the owning feature-catalog entry).
49
-
50
- Repeat for each area until the user says they're done with this BRD pass.
51
-
52
- ### 3. NFRs and acceptance criteria (optional pass)
53
-
54
- If the user wants NFRs (performance, accessibility, browser support, etc.) or acceptance criteria for any BRD-N, run the same elicitation pattern. NFRs get their own BRD-N IDs (do NOT use a separate `NFR-N` series — keep one ID space so the verifier can grade everything uniformly).
55
-
56
- ### 4. Final output
57
-
58
- Append/refresh the footer block of the BRD:
59
- ```
60
- ---
61
- Last updated: {YYYY-MM-DD}
62
- Highest BRD ID: BRD-{N}
63
- ```
64
-
65
- Print a compact summary to the user:
66
- ```
67
- BRD updated → docs/{AppName}-BRD.md
68
- Added: BRD-{a}..BRD-{b} ({count} requirements)
69
- Phases touched: {list}
70
- ```
71
-
72
- HALT.
73
-
74
- ## Hard rules
75
-
76
- - elicit=true — never batch-confirm; one item at a time.
77
- - BRD-N IDs are append-only — never renumber an existing ID even if the user removes a requirement later (mark it `~~BRD-N~~ (removed)` instead).
78
- - Requirements are written as observable outcomes, not implementation hints. The verifier needs to be able to test them.
79
- - The analyst writes the BRD; the analyst does NOT implement anything.