@techierathore/techieflow 1.0.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/.claude/commands/TechieFlow/agents/analyst.md +5 -8
  2. package/.claude/commands/TechieFlow/agents/architect.md +1 -10
  3. package/.claude/commands/TechieFlow/agents/flow-master.md +1 -0
  4. package/.claude/commands/TechieFlow/agents/verifier.md +1 -0
  5. package/.claude/commands/TechieFlow/tasks/_owner-language.md +27 -0
  6. package/.claude/commands/TechieFlow/tasks/_smoke-test-policy.md +1 -1
  7. package/.claude/commands/TechieFlow/tasks/_status-update-gate.md +4 -3
  8. package/.claude/commands/TechieFlow/tasks/amend-docs.md +6 -5
  9. package/.claude/commands/TechieFlow/tasks/build-phase.md +1 -1
  10. package/.claude/commands/TechieFlow/tasks/create-deep-research-prompt.md +4 -0
  11. package/.claude/commands/TechieFlow/tasks/create-doc.md +4 -0
  12. package/.claude/commands/TechieFlow/tasks/create-project-brief.md +22 -0
  13. package/.claude/commands/TechieFlow/tasks/day1-brownfield.md +3 -3
  14. package/.claude/commands/TechieFlow/tasks/day1-greenfield.md +3 -3
  15. package/.claude/commands/TechieFlow/tasks/facilitate-brainstorming-session.md +4 -0
  16. package/.claude/commands/TechieFlow/tasks/fix-issues.md +2 -2
  17. package/.claude/commands/TechieFlow/tasks/generate-html.md +7 -3
  18. package/.claude/commands/TechieFlow/tasks/handoff-phase.md +20 -18
  19. package/.claude/commands/TechieFlow/tasks/metrics-report.md +2 -0
  20. package/.claude/commands/TechieFlow/tasks/mockups.md +1 -1
  21. package/.claude/commands/TechieFlow/tasks/productguide.md +2 -2
  22. package/.claude/commands/TechieFlow/tasks/render-workflow-docs.md +1 -1
  23. package/.claude/commands/TechieFlow/tasks/triage-issues.md +2 -2
  24. package/.claude/commands/TechieFlow/tasks/verify-phase.md +1 -1
  25. package/.opencode/plugin/techieflow.js +181 -9
  26. package/.tfcore/agents/analyst.md +5 -8
  27. package/.tfcore/agents/architect.md +1 -10
  28. package/.tfcore/agents/flow-master.md +1 -0
  29. package/.tfcore/agents/verifier.md +1 -0
  30. package/.tfcore/hooks/block-git.sh +4 -2
  31. package/.tfcore/hooks/guard-build.sh +5 -1
  32. package/.tfcore/hooks/guard-db.sh +6 -4
  33. package/.tfcore/hooks/guard-metrics.sh +13 -1
  34. package/.tfcore/hooks/guard-status-html.sh +86 -2
  35. package/.tfcore/hooks/guard-verify-deps.sh +124 -0
  36. package/.tfcore/hooks/guard-verify.sh +8 -3
  37. package/.tfcore/hooks/sweep-artifacts.sh +46 -0
  38. package/.tfcore/routing.yaml +61 -0
  39. package/.tfcore/standards/owner-words.txt +23 -0
  40. package/.tfcore/tasks/_owner-language.md +27 -0
  41. package/.tfcore/tasks/_smoke-test-policy.md +1 -1
  42. package/.tfcore/tasks/_status-update-gate.md +4 -3
  43. package/.tfcore/tasks/amend-docs.md +6 -5
  44. package/.tfcore/tasks/build-phase.md +1 -1
  45. package/.tfcore/tasks/create-deep-research-prompt.md +4 -0
  46. package/.tfcore/tasks/create-doc.md +4 -0
  47. package/.tfcore/tasks/create-project-brief.md +22 -0
  48. package/.tfcore/tasks/day1-brownfield.md +3 -3
  49. package/.tfcore/tasks/day1-greenfield.md +3 -3
  50. package/.tfcore/tasks/facilitate-brainstorming-session.md +4 -0
  51. package/.tfcore/tasks/fix-issues.md +2 -2
  52. package/.tfcore/tasks/generate-html.md +7 -3
  53. package/.tfcore/tasks/handoff-phase.md +20 -18
  54. package/.tfcore/tasks/metrics-report.md +2 -0
  55. package/.tfcore/tasks/mockups.md +1 -1
  56. package/.tfcore/tasks/productguide.md +2 -2
  57. package/.tfcore/tasks/render-workflow-docs.md +1 -1
  58. package/.tfcore/tasks/triage-issues.md +2 -2
  59. package/.tfcore/tasks/verify-phase.md +1 -1
  60. package/.tfcore/telemetry/SCHEMA.md +61 -1
  61. package/.tfcore/telemetry/install-metrics.sh +3 -2
  62. package/.tfcore/telemetry/tf-metrics.sh +435 -21
  63. package/.tfcore/templates/v4custom/app-agents-md-tmpl.md +6 -0
  64. package/.tfcore/templates/v4custom/app-brd-tmpl.md +5 -3
  65. package/.tfcore/templates/v4custom/app-brief-tmpl.md +65 -0
  66. package/.tfcore/templates/v4custom/app-decision-request-tmpl.md +85 -0
  67. package/.tfcore/templates/v4custom/app-library-feedback-tmpl.md +86 -31
  68. package/.tfcore/templates/v4custom/app-phase-brd-tmpl.md +94 -0
  69. package/.tfcore/templates/v4custom/app-phase-uidesign-tmpl.md +60 -0
  70. package/.tfcore/templates/v4custom/app-uidesign-tmpl.md +4 -2
  71. package/.tfcore/templates/v4custom/build-subagent-prompt.md +2 -2
  72. package/.tfcore/templates/v4custom/html-render-shell.md +4 -2
  73. package/.tfcore/utils/__pycache__/tf-brd-status.cpython-312.pyc +0 -0
  74. package/.tfcore/utils/__pycache__/tf-checklist-edit.cpython-312.pyc +0 -0
  75. package/.tfcore/utils/__pycache__/tf-day1-files.cpython-312.pyc +0 -0
  76. package/.tfcore/utils/__pycache__/tf-devguide-list.cpython-312.pyc +0 -0
  77. package/.tfcore/utils/__pycache__/tf-doc-check.cpython-312.pyc +0 -0
  78. package/.tfcore/utils/__pycache__/tf-log-miss.cpython-312.pyc +0 -0
  79. package/.tfcore/utils/__pycache__/tf-misses-md.cpython-312.pyc +0 -0
  80. package/.tfcore/utils/__pycache__/tf-mockups-locate.cpython-312.pyc +0 -0
  81. package/.tfcore/utils/__pycache__/tf-opencode-audit.cpython-312.pyc +0 -0
  82. package/.tfcore/utils/__pycache__/tf-perf-grade.cpython-312.pyc +0 -0
  83. package/.tfcore/utils/__pycache__/tf-render-html.cpython-312.pyc +0 -0
  84. package/.tfcore/utils/__pycache__/tf-split-brd.cpython-312.pyc +0 -0
  85. package/.tfcore/utils/__pycache__/tf-status-facts.cpython-312.pyc +0 -0
  86. package/.tfcore/utils/__pycache__/tf-triage.cpython-312.pyc +0 -0
  87. package/.tfcore/utils/__pycache__/tf-verify-list.cpython-312.pyc +0 -0
  88. package/.tfcore/utils/__pycache__/tf-verify-verdict.cpython-312.pyc +0 -0
  89. package/.tfcore/utils/tf-assets-browser.mjs +96 -0
  90. package/.tfcore/utils/tf-assets.sh +97 -12
  91. package/.tfcore/utils/tf-brd-status.py +14 -5
  92. package/.tfcore/utils/tf-build-list.py +99 -11
  93. package/.tfcore/utils/tf-build-list.sh +5 -3
  94. package/.tfcore/utils/tf-build.sh +88 -15
  95. package/.tfcore/utils/tf-ci-repro.py +685 -0
  96. package/.tfcore/utils/tf-ci-repro.sh +24 -0
  97. package/.tfcore/utils/tf-devguide-list.py +47 -22
  98. package/.tfcore/utils/tf-doc-check.py +242 -10
  99. package/.tfcore/utils/tf-doc-tests.sh +79 -0
  100. package/.tfcore/utils/tf-emit.sh +413 -19
  101. package/.tfcore/utils/tf-feedback.sh +13 -0
  102. package/.tfcore/utils/tf-fix-close.sh +113 -31
  103. package/.tfcore/utils/tf-gitignore-audit.sh +50 -3
  104. package/.tfcore/utils/tf-goal.sh +105 -18
  105. package/.tfcore/utils/tf-harness.sh +9 -4
  106. package/.tfcore/utils/tf-lock.sh +29 -0
  107. package/.tfcore/utils/tf-log-miss.py +34 -8
  108. package/.tfcore/utils/tf-login.mjs +167 -0
  109. package/.tfcore/utils/tf-misses-md.py +24 -21
  110. package/.tfcore/utils/tf-misses-md.sh +5 -4
  111. package/.tfcore/utils/tf-mockup-parity.mjs +427 -63
  112. package/.tfcore/utils/tf-mockup-parity.sh +14 -2
  113. package/.tfcore/utils/tf-model-pick.sh +475 -0
  114. package/.tfcore/utils/tf-owner-text.py +233 -0
  115. package/.tfcore/utils/tf-owner-text.sh +14 -0
  116. package/.tfcore/utils/tf-phase.sh +33 -1
  117. package/.tfcore/utils/tf-portable.sh +230 -0
  118. package/.tfcore/utils/tf-render-html.py +80 -2
  119. package/.tfcore/utils/tf-routing-bind.sh +87 -1
  120. package/.tfcore/utils/tf-routing.sh +7 -0
  121. package/.tfcore/utils/tf-selfcheck.sh +356 -0
  122. package/.tfcore/utils/tf-split-brd.py +17 -2
  123. package/.tfcore/utils/tf-status-evidence.sh +11 -9
  124. package/.tfcore/utils/tf-status-facts.py +133 -44
  125. package/.tfcore/utils/tf-triage.py +62 -16
  126. package/.tfcore/utils/tf-triage.sh +2 -0
  127. package/.tfcore/utils/tf-verify-boot.sh +263 -43
  128. package/.tfcore/utils/tf-verify-emit.sh +20 -0
  129. package/.tfcore/utils/tf-verify-env.sh +33 -4
  130. package/.tfcore/utils/tf-verify-list.py +75 -8
  131. package/.tfcore/utils/tf-verify-screens.mjs +254 -43
  132. package/.tfcore/utils/tf-verify-screens.sh +18 -4
  133. package/.tfcore/utils/tf-verify-tests.sh +272 -28
  134. package/.tfcore/utils/tf-verify-verdict.py +59 -11
  135. package/.tfcore/utils/tf_defect.py +27 -0
  136. package/.tfcore/utils/tf_feedback.py +209 -0
  137. package/.tfcore/utils/tf_roadmap.py +35 -0
  138. package/README.md +19 -5
  139. package/docs/TechieFlow-Installation.md +5 -3
  140. package/opencode.jsonc +24 -0
  141. package/package.json +1 -1
  142. package/scripts/install.mjs +4 -0
  143. package/.tfcore/templates/architecture-tmpl.yaml +0 -650
  144. package/.tfcore/templates/brownfield-architecture-tmpl.yaml +0 -476
  145. package/.tfcore/templates/competitor-analysis-tmpl.yaml +0 -306
  146. package/.tfcore/templates/front-end-architecture-tmpl.yaml +0 -218
  147. package/.tfcore/templates/fullstack-architecture-tmpl.yaml +0 -823
  148. package/.tfcore/templates/market-research-tmpl.yaml +0 -252
  149. package/.tfcore/templates/project-brief-tmpl.yaml +0 -221
  150. package/.tfcore/utils/techieflow-doc-template.md +0 -325
@@ -58,3 +58,9 @@ If `/trblazeui` or `/techierag` is missing: run `dotnet build` (the NuGet target
58
58
  Under Claude Code, if `/flow-master *render-workflow-docs <App>` returns "Unknown command", use `/TechieFlow:agents:flow-master *render-workflow-docs <App>` instead. (Under OpenCode `/flow-master` is the registered agent name — there is no fuller form to fall back to.)
59
59
 
60
60
  After the agent is loaded, every TechieFlow-native agent (analyst, architect, flow-master, verifier) accepts `*command args` style invocations. trblazeui and techierag are free-form personas — normally `flow-master *build-phase <App>` calls them as sub-agents, but you can also drive them directly with prompts like `Implement REQ-UI-* from docs/<App>-Checklist.md to match the mockups in docs/mockups/.`
61
+
62
+ How to talk to me:
63
+ 1. Rate your confidence. Tag any claim you are not sure of: [Certain] with evidence, [Likely] a strong inference, [Guessing] filling a gap. If most of a reply is guessing, say so in the first line.
64
+ 2. Uncomfortable answer first. If there is something I will not want to hear, it is the first sentence, not the third paragraph.
65
+ 3. No warm-up. No "great question", no "there are several ways to look at this", no restating my question. Start with the most useful sentence.
66
+ 4. Disagree with structure: "I disagree because [reason]. I would do [alternative]. The risk in your approach is [downside]." Then do what I decide.
@@ -25,9 +25,11 @@ rule: mockup-links
25
25
  Size and requirement cap: Small up to 10 screens, one role, 50 requirements; Medium up to 20 screens,
26
26
  100 requirements; Large is split into phases, each phase its own BRD. Every routed page is a screen;
27
27
  dialogs, tabs and panels are regions of their page and are listed under it.
28
- Large project: one BRD per phase, phase 1 in docs/{App}-BRD.md, phase n in docs/{App}-Pn-BRD.md; the
29
- header gains a row "| Phase | n of m |", Size is the phase's own size (Small or Medium), and BRD-N
30
- runs on from the previous phase's last id. The phase plan is docs/{App}-Phases.md.
28
+ Large project: one BRD per phase, phase 1 in docs/{App}-BRD.md from this template, phase n in
29
+ docs/{App}-Pn-BRD.md from app-phase-brd-tmpl.md, which carries only that phase's screens and
30
+ requirements; this file keeps the whole application's scope, users, non-functionals, constraints
31
+ and risks. The header gains a row "| Phase | n of m |", Size is the phase's own size (Small or
32
+ Medium), and BRD-N runs on from the previous phase's last id. The phase plan is docs/{App}-Phases.md.
31
33
  Mermaid: quote every label (A["Order (v2)"]); never use `end` as a node id. -->
32
34
 
33
35
  # {App} — Business Requirements
@@ -0,0 +1,65 @@
1
+ <!-- tf-schema
2
+ doc: brief
3
+ file: docs/{App}-Brief.md
4
+ header: App, Date
5
+ section: What it is | required | max 150
6
+ section: Who it is for | required | max 150
7
+ section: Must do | required
8
+ section: Out of scope | required | max 150
9
+ section: Open questions | optional | max 150
10
+ rule: brief-must-do
11
+ rule: no-glossary
12
+ target-lines: 60
13
+ max-lines: 120
14
+ -->
15
+ <!-- Authoring notes (agent only; never visible text).
16
+
17
+ The brief is the input to day-1: `*day1-greenfield` and `*day1-brownfield` read it
18
+ and turn it into the Architecture, the BRD and the mockups. Its whole job is to be
19
+ ONE PAGE the owner can read and correct in two minutes, before anything expensive
20
+ is built on it.
21
+
22
+ It replaced a 221-line inherited template (2026-09-08) whose twelve sections —
23
+ executive summary, problem statement, proposed solution, goals and metrics, KPIs,
24
+ post-MVP vision, expansion opportunities — produced a document nobody read and
25
+ nothing checked. What the framework's own review says a brief is: "a one-page
26
+ brief: product, users, must-do, out of scope". That is what this template holds.
27
+
28
+ Each "Must do" line becomes one or more BRD items at day-1, so write them as
29
+ things the product does, one per line, numbered. Not features to build: outcomes
30
+ a user gets. If a line needs a paragraph to explain it, it is two lines.
31
+
32
+ "Open questions" is where a decision the owner has not taken goes, so day-1 asks
33
+ rather than assumes. An empty brief with three honest open questions is worth more
34
+ than a full one built on guesses. -->
35
+
36
+ # {App} — Brief
37
+
38
+ | | |
39
+ |---|---|
40
+ | App | {App} |
41
+ | Date | {YYYY-MM-DD} |
42
+
43
+ ## What it is
44
+
45
+ {Two or three sentences, at most 150 words. What the product does, in the words you
46
+ would use to a person who has never heard of it. No technology.}
47
+
48
+ ## Who it is for
49
+
50
+ {Who uses it and what they are trying to get done. Name each role. At most 150 words.}
51
+
52
+ ## Must do
53
+
54
+ 1. {One thing the product does, as an outcome a user gets.}
55
+ 2. {Another.}
56
+ 3. {Another.}
57
+
58
+ ## Out of scope
59
+
60
+ {What this is deliberately not doing, so day-1 does not build it. At most 150 words.}
61
+
62
+ ## Open questions
63
+
64
+ {A decision not yet taken, one per line, so day-1 asks instead of assuming. Delete the
65
+ section when there are none.}
@@ -0,0 +1,85 @@
1
+ <!-- tf-schema
2
+ doc: decision-request
3
+ file: docs/{App}-Decision-Request.md
4
+ header: App, Written, Waiting on
5
+ section: What happened | required | max 250
6
+ section: What I need you to decide | required
7
+ section: What I do when you answer | required | max 200
8
+ section: Copy this back to me | required | max 250
9
+ entries: What I need you to decide |
10
+ per-entry: 150 300
11
+ rule: entry-decision-options
12
+ rule: entry-recommendation
13
+ rule: paste-back-block
14
+ rule: no-glossary
15
+ target-lines: 120
16
+ max-lines: 260
17
+ -->
18
+ <!-- Authoring notes (agent only; never visible text).
19
+
20
+ WHEN TO WRITE ONE. A command has hit a choice only the owner can make and the
21
+ answer changes what gets built. Write this file, render it to HTML, and say one
22
+ line in the terminal: which file to open, and that it holds N decisions. Never
23
+ argue the decision out in the terminal — that fills the context and buries the
24
+ question. Everything the owner needs is in the file.
25
+
26
+ WHO READS IT. The owner, and nobody else. No task ever loads a Decision Request
27
+ as input, and it is never named in core-config.yaml. The way the answer comes
28
+ back is the owner pasting the block from §"Copy this back to me" — that pasted
29
+ prompt is the input, and the file's job is done the moment it is answered.
30
+
31
+ HOW IT IS WRITTEN. Plain, simple English, the way you would explain it to
32
+ someone who has not read a line of the framework. No coined terms. No framework
33
+ shorthand. No requirement ids in the question itself — name the thing, not its
34
+ number. If a word needs defining, it is the wrong word: change it. A glossary
35
+ section is refused by `rule: no-glossary`, because a document that has to teach
36
+ its own vocabulary before it can ask its question was written for the wrong
37
+ reader.
38
+
39
+ WHAT IT IS NOT. Not a defect report — that is the feedback file. Not an
40
+ architecture decision record — that is DECISIONS.md, written after the fact.
41
+ This file asks a question and then stops existing: when it is answered, it moves
42
+ unchanged to docs/OldDocs/ and the live name is free for the next one.
43
+
44
+ ONE LIVE FILE. All open decisions go in this one file as separate entries. Never
45
+ a dated copy, never a -v2. -->
46
+
47
+ # {App} — decisions I need from you
48
+
49
+ | | |
50
+ |---|---|
51
+ | App | {App} |
52
+ | Written | {YYYY-MM-DD} |
53
+ | Waiting on | {N} decisions. Nothing has been changed yet. |
54
+
55
+ ## What happened
56
+
57
+ {Two short paragraphs, at most 250 words. What was being done, what stopped it, and
58
+ why the choice is yours rather than something to be worked out. Plain words.}
59
+
60
+ ## What I need you to decide
61
+
62
+ ### {1. The short name of the choice}
63
+
64
+ {One paragraph: what the choice actually is, in plain words.}
65
+
66
+ | Option | What happens | What it costs |
67
+ |---|---|---|
68
+ | **A — {name}** | {what the project looks like afterwards} | {work, and what is given up} |
69
+ | **B — {name}** | {what the project looks like afterwards} | {work, and what is given up} |
70
+
71
+ **My recommendation: {A}** — {one sentence saying why.}
72
+
73
+ ## What I do when you answer
74
+
75
+ {The steps, in order, one line each. What gets edited, what gets re-checked, roughly
76
+ how long. So the answer is given with the consequences in view.}
77
+
78
+ ## Copy this back to me
79
+
80
+ {One fenced block per decision. Each block is a complete instruction that stands on
81
+ its own — the owner pastes it and nothing else needs saying.}
82
+
83
+ ```
84
+ {App}: decision 1 — go with option A. {The one thing that changes.}
85
+ ```
@@ -1,31 +1,86 @@
1
- <!-- ============================================================
2
- ONE FEEDBACK FILE PER LIBRARY — never a combined file.
3
- TrBlazeUI and TechieRag are separate codebases with separate
4
- teams; each team receives (or pulls) only its own file:
5
- docs/{AppName}-TrBlazeUI-Feedback.md (issue IDs TR-NNN)
6
- docs/{AppName}-TechieRag-Feedback.md (issue IDs TR-RAG-NNN)
7
- A future library {LibName} gets docs/{AppName}-{LibName}-Feedback.md
8
- with its own ID prefix (WORKFLOW.html §9.1).
9
- Create a library's file on the FIRST issue for that library;
10
- substitute {Library} and the ID prefix below.
11
- ============================================================ -->
12
-
13
- # {Library} Feedback — surfaced during {AppName}
14
-
15
- ## Summary (filled by /flow-master on consolidation)
16
- - 0 blockers, 0 major, 0 minor, 0 nice-to-have
17
- - Last consolidated: {YYYY-MM-DD}
18
-
19
- ## Issues
20
-
21
- <!-- Append entries as gaps are found. IDs are append-only, never renumbered.
22
- TrBlazeUI → TR-NNN · TechieRag → TR-RAG-NNN -->
23
-
24
- ### TR-001 — <short title>
25
- - **Severity:** blocker | major | minor | nice-to-have
26
- - **Repro:** <minimal code snippet>
27
- - **Expected:** …
28
- - **Actual:** …
29
- - **Encountered in:** REQ-UI-013
30
- - **Workaround:** <what you did in app code>
31
- - **Suggested fix:** <hypothesis for the library team>
1
+ <!-- tf-schema
2
+ doc: feedback
3
+ file: docs/{App}-{Upstream}-Feedback.md
4
+ header: App, Upstream, Updated
5
+ section: Summary | required | max 200
6
+ section: Entries | required
7
+ section: Replies from* | optional
8
+ section: Resolution status* | optional
9
+ entries: Entries |
10
+ per-entry: 120 250
11
+ rule: entry-feedback-fields
12
+ rule: entry-blocks-line
13
+ rule: feedback-blocking-count
14
+ rule: no-glossary
15
+ -->
16
+ <!-- Authoring notes (agent only; never visible text).
17
+
18
+ ONE FEEDBACK FILE PER UPSTREAM — never a combined file. Each upstream owns a
19
+ separate codebase and receives only its own file:
20
+
21
+ docs/{App}-TrBlazeUI-Feedback.md ids TR-NNN (the UI library)
22
+ docs/{App}-TechieRag-Feedback.md ids TR-RAG-NNN (the RAG library)
23
+ docs/{App}-TechieFlow-Feedback.md ids TF-NNN (the framework itself)
24
+
25
+ A future library {LibName} gets docs/{App}-{LibName}-Feedback.md with its own
26
+ prefix. Create the file on the FIRST entry for that upstream.
27
+
28
+ REPORTING IS NEVER REFUSED. If something upstream is wrong, file it — whatever
29
+ the severity, whatever the day. What this schema constrains is the SHAPE, not
30
+ the right to report:
31
+
32
+ 1. Every entry says whether it BLOCKS the work, in one word. That is the field
33
+ the owner reads first, and it decides whether the run stops.
34
+ 2. A non-blocking entry is filed and the work CONTINUES. Never stop, never ask,
35
+ never write a page of analysis about it mid-run. One entry, then carry on.
36
+ 3. 250 words for the REPORT, hard: the eight fields, and nothing else. An entry is
37
+ a bug report, not an essay. Evidence goes in a code block, not in prose.
38
+ Working-out that is genuinely worth keeping goes under a `#### Detail` heading
39
+ inside the entry, and is not counted — so a thorough analysis costs nothing and
40
+ an unreadable entry is still refused.
41
+ 4. Plain English. No coined terms, no framework shorthand, no word the reader
42
+ would have to look up. If you find yourself writing a glossary, the words
43
+ are wrong — change the words. `rule: no-glossary` refuses the section.
44
+ 5. A decision for the owner does NOT go in this file. It goes in a Decision
45
+ Request (`app-decision-request-tmpl.md`), which is written for the owner and
46
+ carries the prompt to paste back.
47
+
48
+ "Replies from {Upstream}" holds the upstream team's answers, newest block first.
49
+ Ids are append-only and never renumbered. A fixed entry keeps its body and gains
50
+ a resolution line; the record of what was wrong is the point. -->
51
+
52
+ # {Upstream} feedback — found while building {App}
53
+
54
+ | | |
55
+ |---|---|
56
+ | App | {App} |
57
+ | Upstream | {Upstream} |
58
+ | Updated | {YYYY-MM-DD} |
59
+
60
+ ## Summary
61
+
62
+ {N} entries: {n} blocking now, {n} filed and not blocking, {n} fixed upstream.
63
+
64
+ {One sentence naming what is blocked right now, or the sentence "Nothing is blocked."}
65
+
66
+ ## Entries
67
+
68
+ ### {TF-001} — {one line saying what is wrong}
69
+
70
+ - **Severity:** blocker | major | minor
71
+ - **Blocks:** yes — {the row or command that cannot proceed} | no — {what was done instead, and the work carried on}
72
+ - **Repro:** {the shortest command or snippet that shows it}
73
+ - **Expected:** {what should have happened}
74
+ - **Actual:** {what happened}
75
+ - **Encountered in:** {REQ-UI-013, or the command that was running}
76
+ - **Workaround:** {what was done in this project, or "none"}
77
+ - **Suggested fix:** {one concrete change for the upstream team}
78
+
79
+ #### Detail
80
+
81
+ {Optional, and not counted against the 250 words: the root cause, the reasoning, the
82
+ longer version of the fix. Everything above must stand on its own without it.}
83
+
84
+ ## Replies from {Upstream}
85
+
86
+ <!-- The upstream team's answers, newest block first. Left in full: this is the record. -->
@@ -0,0 +1,94 @@
1
+ <!-- tf-schema
2
+ doc: brd
3
+ file: docs/{App}-P{n}-BRD.md
4
+ header: App, Kind, Size, Status, Date
5
+ section: Summary | required | max 200
6
+ section: Screens and flow | required
7
+ section: Requirements | required
8
+ section: Non-functional requirements | optional
9
+ section: Development status | required
10
+ section: Where the rest lives | required
11
+ budget: S 6000 8000 | M 10000 15000 | L 10000 15000
12
+ rule: brd-ledger
13
+ rule: screens-table
14
+ rule: mockup-links
15
+ rule: phase-pointer
16
+ -->
17
+ <!-- Authoring notes (agent only; never visible text).
18
+ A phase BRD is phase 2 onward of a Large project. Phase 1 is docs/{App}-BRD.md, written from
19
+ app-brd-tmpl.md, and it holds everything that belongs to the whole application: Scope, Users and
20
+ roles, the Non-functional requirements that apply everywhere, the Context diagram, Constraints and
21
+ assumptions, and Risks. A phase BRD never repeats them: two copies of the same fact become two
22
+ answers the day one of them is amended (TfLens TF-024, 2026-09-11). It holds this phase's screens,
23
+ this phase's requirements, and a "Where the rest lives" table that links back to phase 1.
24
+ "Non-functional requirements" is here only when this phase adds its own, for example a speed
25
+ budget on one of its screens; its ids run on like every other item.
26
+ The header carries "| Phase | n of m |" (the checker refuses the file without it). Size is the
27
+ phase's own size, Small or Medium. BRD-N runs on from the previous phase's last id and is never
28
+ renumbered. Sections and order are fixed by the schema above; the order is the whole-project
29
+ BRD's, with the sections a phase does not carry left out. -->
30
+
31
+ # {App} — Business Requirements — Phase {n}: {Phase name}
32
+
33
+ | | |
34
+ |---|---|
35
+ | App | {App} |
36
+ | Kind | app or library |
37
+ | Size | Small or Medium (this phase on its own) |
38
+ | Phase | {n} of {m} |
39
+ | Status | Draft, Approved |
40
+ | Date | {YYYY-MM-DD} |
41
+
42
+ ## 1. Summary
43
+
44
+ {What this phase adds, for whom, and why it comes at this point. At most 200 words.}
45
+
46
+ ## 2. Screens and flow
47
+
48
+ One row per routed page this phase adds; dialogs are written exactly as in the phase-1 BRD.
49
+
50
+ | Screen | Route | Role | Mockup | Fields |
51
+ |---|---|---|---|---|
52
+ | {Screen name} | `/route` | {Role} | [mockup](mockups/{screen-slug}.html) | {field, field, field} |
53
+
54
+ **Primary journey:**
55
+ 1. {The user opens … and …}
56
+
57
+ ## 3. Requirements
58
+
59
+ One item per thing the verifier will test, grouped under a `###` heading per screen. Same rules as the phase-1 BRD: an acceptance line is at most 30 words, target 20, and holds one behaviour.
60
+
61
+ ### {Screen name}
62
+
63
+ {One plain sentence: what this screen does, for whom.}
64
+
65
+ - **BRD-{N}** — {Title}. *Screen:* {Screen name} · *Mockup:* [mockup](mockups/{screen-slug}.html)
66
+ - *Acceptance:* When {actor} {does what} on {screen}, then {a result a browser robot can observe}.
67
+
68
+ ## 4. Non-functional requirements
69
+
70
+ Only what this phase adds. The ones that apply to the whole application are in the phase-1 BRD.
71
+
72
+ | Id | Area | Requirement | Measure |
73
+ |---|---|---|---|
74
+ | BRD-{N} | Performance | {…} | perf-budget: p95 load <= 2000ms @ concurrency 1 |
75
+
76
+ ## 5. Development status
77
+
78
+ Written by the status gate after every build, verify and handoff; not by hand.
79
+
80
+ **Snapshot as of {YYYY-MM-DD}.** Live per-requirement status: `PROJECT-STATUS.md` and the Requirements Status table in `docs/{App}-P{n}-Checklist.md`.
81
+
82
+ | Screen | Requirements | Verified | Open | Status |
83
+ |---|---|---|---|---|
84
+ | {Screen} | {n} | {n} | {n} | Planned, In progress, Partial, Done |
85
+
86
+ ## 6. Where the rest lives
87
+
88
+ | What | Where |
89
+ |---|---|
90
+ | Scope, users and roles, the context diagram | [phase 1 BRD]({App}-BRD.md) |
91
+ | Non-functional requirements for the whole application | [phase 1 BRD]({App}-BRD.md) |
92
+ | Constraints, assumptions and risks | [phase 1 BRD]({App}-BRD.md) |
93
+ | Every phase, its screens and its BRD range | [{App}-Phases.md]({App}-Phases.md) |
94
+ | This phase's work list | [{App}-P{n}-Checklist.md]({App}-P{n}-Checklist.md) |
@@ -0,0 +1,60 @@
1
+ <!-- tf-schema
2
+ doc: uidesign
3
+ file: docs/{App}-P{n}-UIDesign.md
4
+ header: App, Kind, Size
5
+ section: Screens | required
6
+ section: Where the rest lives | required
7
+ entries: Screens | Screen:
8
+ per-entry: 250 400
9
+ rule: entry-mockup
10
+ rule: entry-regions-table
11
+ rule: entry-fields-table
12
+ rule: entry-states
13
+ rule: mockup-links
14
+ rule: phase-pointer
15
+ -->
16
+ <!-- Authoring notes (agent only; never visible text).
17
+ A phase UIDesign is phase 2 onward of a Large project. Phase 1 is docs/{App}-UIDesign.md, written
18
+ from app-uidesign-tmpl.md, and it holds everything the whole application shares: the UI library
19
+ and theme in its header, the Design system, the one Click-through flow across every phase (the
20
+ mockup folder is one set), and the Branding guide. A phase UIDesign never repeats them — two
21
+ copies become two answers the day one changes (owner, 2026-09-11, after TfLens TF-024). It holds
22
+ one `### Screen: Name (/route)` per screen in this phase's row of docs/{App}-Phases.md, written
23
+ exactly as in phase 1, and a "Where the rest lives" table linking back to the phase-1 UIDesign.
24
+ A new screen that changes the flow is added to phase 1's Click-through flow, not drawn here.
25
+ The header carries "| Phase | n of m |" (the checker refuses the file without it). -->
26
+
27
+ # {App} — UI Design — Phase {n}: {Phase name}
28
+
29
+ | | |
30
+ |---|---|
31
+ | App | {App} |
32
+ | Kind | app or library |
33
+ | Size | Small or Medium (this phase on its own) |
34
+ | Phase | {n} of {m} |
35
+
36
+ ## Screens
37
+
38
+ ### Screen: {Name} (`/route`)
39
+
40
+ **Mockup:** [mockups/{screen-slug}.html](mockups/{screen-slug}.html) · **Roles:** {who reaches it} · **BRD:** BRD-{N}
41
+
42
+ | Region | Control | Shows or binds |
43
+ |---|---|---|
44
+ | {Main list} | {control} | {…} |
45
+
46
+ | Field | Type | Required | Validation |
47
+ |---|---|---|---|
48
+ | {Title} | text | yes | {1 to 120 characters} |
49
+
50
+ **Dialogs opened here:** {Dialog name: fields …; or "none"}
51
+
52
+ **States:** empty: {…} · loading: {…} · error: {…}
53
+
54
+ ## Where the rest lives
55
+
56
+ | What | Where |
57
+ |---|---|
58
+ | UI library, theme and the design system | [phase 1 UI design]({App}-UIDesign.md) |
59
+ | The click-through flow across every phase | [phase 1 UI design]({App}-UIDesign.md) |
60
+ | This phase's requirements | [{App}-P{n}-BRD.md]({App}-P{n}-BRD.md) |
@@ -21,8 +21,10 @@ rule: mockup-links
21
21
  already shows. Use only controls that exist in the UI library's catalogue; a missing control goes
22
22
  to the library feedback file, not into a workaround. The set of screens must equal the BRD's
23
23
  Screens and flow table. For a library, this document is optional.
24
- Large project: one UIDesign per phase (docs/{App}-UIDesign.md, docs/{App}-P2-UIDesign.md, …) with a
25
- header row "| Phase | n of m |"; its screens are exactly that phase's row in docs/{App}-Phases.md.
24
+ Large project: one UIDesign per phase with a header row "| Phase | n of m |"; its screens are exactly
25
+ that phase's row in docs/{App}-Phases.md. Phase 1 is this template and keeps what every phase shares
26
+ (library, theme, design system, the one click-through flow, branding); phase n is
27
+ docs/{App}-Pn-UIDesign.md from app-phase-uidesign-tmpl.md, screens only, linking back here.
26
28
  The mockup folder stays one click-through set across every phase. -->
27
29
 
28
30
  # {App} — UI Design
@@ -1,5 +1,5 @@
1
1
  <!-- build-subagent-prompt.md — the prompt build-phase gives every cluster sub-agent.
2
- Filled by tf-build-list.sh --prompts: {App} {Cluster} {Builder} {Section} {Rows} {Mockups} {Checklist}.
2
+ Filled by tf-build-list.sh --prompts: {App} {Cluster} {Builder} {Section} {Rows} {Mockups} {Checklist} {UsageGuide}.
3
3
  Library agents (trblazeui, techierag) never read .tfcore/ tasks, so the two standing rules
4
4
  reach them only through this text. Keep it short; the rows carry the detail. -->
5
5
  You are building cluster {Cluster} of {App} ({Section}) as the {Builder}. Implement exactly these rows, nothing else:
@@ -10,7 +10,7 @@ Read first: `docs/{App}-Coding-Standards.md` (and the standard files it names un
10
10
 
11
11
  Two standing rules:
12
12
  1. Git is manual. Never run `git` or `gh` for any purpose. Record your row ids in the checklist Remarks (`[REQ-…]`), not in commits.
13
- 2. Smoke it yourself before you return: `bash .tfcore/utils/tf-build.sh` must PASS, then boot the app and open every screen you touched with headless Playwright (or the native driver the ladder names); the data must show and nothing may overlap; use a test user from `docs/{App}-UsageGuide.md`, never an invented one. A green compiler is not a smoke.
13
+ 2. Smoke it yourself before you return: `bash .tfcore/utils/tf-build.sh` must PASS, then boot the app and open every screen you touched with headless Playwright (or the native driver the ladder names); the data must show and nothing may overlap; use a test user from `{UsageGuide}`, never an invented one. A green compiler is not a smoke.
14
14
 
15
15
  Unit tests for every FN, RAG and NFR row go under `tests/unit/`. Run-generated files go under `tests/.artifacts/`, never at the repository root.
16
16
 
@@ -23,7 +23,7 @@ Each rendered HTML file is:
23
23
  - A **single self-contained `.html` file**, no external CSS, no external JS except the two `<script>` tags below (mermaid + svg-pan-zoom from jsdelivr CDN).
24
24
  - Sibling to the source MD (same filename, `.html` extension).
25
25
  - **Light + dark theme with a persisted toggle** (§2 + §3 + §7). Default is chosen by **time of day** on first open — light between 07:00 and 19:00 local, softened dark otherwise — then the user's explicit toggle choice (saved in `localStorage` as `tf-theme`) wins on every later visit. Light is a **warm off-white** (never harsh bright white); dark is a softened near-black. Monospace for code/pre, sans for body.
26
- - **Only human-readable docs are ever rendered to HTML** (BRD, Architecture, UsageGuide, DevGuide, PROJECT-STATUS). The **checklists are AI-agent working documents — never render them to HTML** (they are read by agents in markdown; an HTML mirror just wastes tokens and drifts). If you are about to emit a `*-Checklist.html`, STOP — that is banned.
26
+ - **Only human-readable docs are ever rendered to HTML** (BRD, Architecture, UsageGuide, DevGuide, ProductGuide, PROJECT-STATUS, a Decision Request). **An agent working document is never rendered to HTML** — it is read in markdown, and an HTML mirror wastes tokens and drifts from the source. Three are banned by name, and `tf-render-html.py` refuses all three with exit 2: the **requirements checklist** `{App}-Checklist.md`, the **miss log** `{App}-Misses.md`, and an **upstream feedback file** `{App}-{Upstream}-Feedback.md`. If you are about to emit a `*-Checklist.html`, a `*-Misses.html` or a `*-Feedback.html`, STOP — that is banned. The test for anything else: if the only reader is an agent, it stays markdown.
27
27
  - Working anchor links from any auto-generated or hand-written TOC to its target heading.
28
28
  - Copy buttons on every **code** `<pre>` — but NOT on `pre.mermaid` (a button injected there corrupts the diagram source mermaid reads → "Syntax error"; mermaid blocks get copy/export from their own diagram toolbar).
29
29
  - Mermaid toolbar on every rendered diagram.
@@ -216,6 +216,8 @@ The trailing `<a class="anchor-link">` lets users grab a deep link by hovering.
216
216
 
217
217
  **Preserve hand-written anchors.** Some source docs place explicit non-heading anchors like `<a id="d-req-ui-001"></a>` directly above a list item, and a table cell links to them with `[view](#d-req-ui-001)`. This is how the Requirements Status table's **Details** column jumps to each REQ's detail entry. Emit every such `<a id="...">` verbatim in the HTML and keep the matching `href="#..."` link intact — do NOT drop them, renumber them, or run them through the heading-slug function. Dropping them silently breaks the Details links (the exact class of bug the user keeps reporting).
218
218
 
219
+ **Links to sibling documents open their HTML (2026-09-29).** A relative link to a `.md` file is written with `.html` when that page's HTML already sits beside the rendered page, or is written by the same render run; its `#anchor` is kept. Otherwise it stays `.md`: a markdown file with no rendered twin (an agent document, the checklist, the miss log, a feedback file) is never pointed at an HTML page that does not exist. Web links, absolute paths and `#anchor`-only links are never changed. So render a split guide's index together with its pages, or after them, and its links open the rendered pages.
220
+
219
221
  ---
220
222
 
221
223
  ## 5. Mermaid block conversion
@@ -489,7 +491,7 @@ The inline `<div class="toc-inline">` mirrors the MD Table of Contents. When the
489
491
 
490
492
  - [ ] CSS palette matches §2 verbatim (themed `:root` light + `html[data-theme="dark"]` overrides; no hardcoded hex colors reintroduced in the body rules)
491
493
  - [ ] Page skeleton matches §3 — flash-free theme-init `<script>` in `<head>` + the `#themeToggle` button present; §7 JS wires the toggle and Mermaid's theme follows `data-theme`
492
- - [ ] This is a human-readable doc (BRD / Architecture / UsageGuide / DevGuide / PROJECT-STATUS) — NOT a checklist (checklists are never rendered to HTML)
494
+ - [ ] This is a human-readable doc (BRD / Architecture / UsageGuide / DevGuide / PROJECT-STATUS) — NOT a checklist, miss log or feedback file (those are never rendered to HTML)
493
495
  - [ ] Every H2/H3/H4 has `id="{slug}"` matching §1 algorithm
494
496
  - [ ] Every TOC entry (MD inline AND HTML inline/sidebar) uses the same slug
495
497
  - [ ] Every mermaid fence is wrapped in `<div class="diagram">` with the §5 toolbar