@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.
- package/.claude/commands/TechieFlow/agents/analyst.md +5 -8
- package/.claude/commands/TechieFlow/agents/architect.md +1 -10
- package/.claude/commands/TechieFlow/agents/flow-master.md +1 -0
- package/.claude/commands/TechieFlow/agents/verifier.md +1 -0
- package/.claude/commands/TechieFlow/tasks/_owner-language.md +27 -0
- package/.claude/commands/TechieFlow/tasks/_smoke-test-policy.md +1 -1
- package/.claude/commands/TechieFlow/tasks/_status-update-gate.md +4 -3
- package/.claude/commands/TechieFlow/tasks/amend-docs.md +6 -5
- package/.claude/commands/TechieFlow/tasks/build-phase.md +1 -1
- package/.claude/commands/TechieFlow/tasks/create-deep-research-prompt.md +4 -0
- package/.claude/commands/TechieFlow/tasks/create-doc.md +4 -0
- package/.claude/commands/TechieFlow/tasks/create-project-brief.md +22 -0
- package/.claude/commands/TechieFlow/tasks/day1-brownfield.md +3 -3
- package/.claude/commands/TechieFlow/tasks/day1-greenfield.md +3 -3
- package/.claude/commands/TechieFlow/tasks/facilitate-brainstorming-session.md +4 -0
- package/.claude/commands/TechieFlow/tasks/fix-issues.md +2 -2
- package/.claude/commands/TechieFlow/tasks/generate-html.md +7 -3
- package/.claude/commands/TechieFlow/tasks/handoff-phase.md +20 -18
- package/.claude/commands/TechieFlow/tasks/metrics-report.md +2 -0
- package/.claude/commands/TechieFlow/tasks/mockups.md +1 -1
- package/.claude/commands/TechieFlow/tasks/productguide.md +2 -2
- package/.claude/commands/TechieFlow/tasks/render-workflow-docs.md +1 -1
- package/.claude/commands/TechieFlow/tasks/triage-issues.md +2 -2
- package/.claude/commands/TechieFlow/tasks/verify-phase.md +1 -1
- package/.opencode/plugin/techieflow.js +181 -9
- package/.tfcore/agents/analyst.md +5 -8
- package/.tfcore/agents/architect.md +1 -10
- package/.tfcore/agents/flow-master.md +1 -0
- package/.tfcore/agents/verifier.md +1 -0
- package/.tfcore/hooks/block-git.sh +4 -2
- package/.tfcore/hooks/guard-build.sh +5 -1
- package/.tfcore/hooks/guard-db.sh +6 -4
- package/.tfcore/hooks/guard-metrics.sh +13 -1
- package/.tfcore/hooks/guard-status-html.sh +86 -2
- package/.tfcore/hooks/guard-verify-deps.sh +124 -0
- package/.tfcore/hooks/guard-verify.sh +8 -3
- package/.tfcore/hooks/sweep-artifacts.sh +46 -0
- package/.tfcore/routing.yaml +61 -0
- package/.tfcore/standards/owner-words.txt +23 -0
- package/.tfcore/tasks/_owner-language.md +27 -0
- package/.tfcore/tasks/_smoke-test-policy.md +1 -1
- package/.tfcore/tasks/_status-update-gate.md +4 -3
- package/.tfcore/tasks/amend-docs.md +6 -5
- package/.tfcore/tasks/build-phase.md +1 -1
- package/.tfcore/tasks/create-deep-research-prompt.md +4 -0
- package/.tfcore/tasks/create-doc.md +4 -0
- package/.tfcore/tasks/create-project-brief.md +22 -0
- package/.tfcore/tasks/day1-brownfield.md +3 -3
- package/.tfcore/tasks/day1-greenfield.md +3 -3
- package/.tfcore/tasks/facilitate-brainstorming-session.md +4 -0
- package/.tfcore/tasks/fix-issues.md +2 -2
- package/.tfcore/tasks/generate-html.md +7 -3
- package/.tfcore/tasks/handoff-phase.md +20 -18
- package/.tfcore/tasks/metrics-report.md +2 -0
- package/.tfcore/tasks/mockups.md +1 -1
- package/.tfcore/tasks/productguide.md +2 -2
- package/.tfcore/tasks/render-workflow-docs.md +1 -1
- package/.tfcore/tasks/triage-issues.md +2 -2
- package/.tfcore/tasks/verify-phase.md +1 -1
- package/.tfcore/telemetry/SCHEMA.md +61 -1
- package/.tfcore/telemetry/install-metrics.sh +3 -2
- package/.tfcore/telemetry/tf-metrics.sh +435 -21
- package/.tfcore/templates/v4custom/app-agents-md-tmpl.md +6 -0
- package/.tfcore/templates/v4custom/app-brd-tmpl.md +5 -3
- package/.tfcore/templates/v4custom/app-brief-tmpl.md +65 -0
- package/.tfcore/templates/v4custom/app-decision-request-tmpl.md +85 -0
- package/.tfcore/templates/v4custom/app-library-feedback-tmpl.md +86 -31
- package/.tfcore/templates/v4custom/app-phase-brd-tmpl.md +94 -0
- package/.tfcore/templates/v4custom/app-phase-uidesign-tmpl.md +60 -0
- package/.tfcore/templates/v4custom/app-uidesign-tmpl.md +4 -2
- package/.tfcore/templates/v4custom/build-subagent-prompt.md +2 -2
- package/.tfcore/templates/v4custom/html-render-shell.md +4 -2
- package/.tfcore/utils/__pycache__/tf-brd-status.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-checklist-edit.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-day1-files.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-devguide-list.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-doc-check.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-log-miss.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-misses-md.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-mockups-locate.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-opencode-audit.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-perf-grade.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-render-html.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-split-brd.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-status-facts.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-triage.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-verify-list.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-verify-verdict.cpython-312.pyc +0 -0
- package/.tfcore/utils/tf-assets-browser.mjs +96 -0
- package/.tfcore/utils/tf-assets.sh +97 -12
- package/.tfcore/utils/tf-brd-status.py +14 -5
- package/.tfcore/utils/tf-build-list.py +99 -11
- package/.tfcore/utils/tf-build-list.sh +5 -3
- package/.tfcore/utils/tf-build.sh +88 -15
- package/.tfcore/utils/tf-ci-repro.py +685 -0
- package/.tfcore/utils/tf-ci-repro.sh +24 -0
- package/.tfcore/utils/tf-devguide-list.py +47 -22
- package/.tfcore/utils/tf-doc-check.py +242 -10
- package/.tfcore/utils/tf-doc-tests.sh +79 -0
- package/.tfcore/utils/tf-emit.sh +413 -19
- package/.tfcore/utils/tf-feedback.sh +13 -0
- package/.tfcore/utils/tf-fix-close.sh +113 -31
- package/.tfcore/utils/tf-gitignore-audit.sh +50 -3
- package/.tfcore/utils/tf-goal.sh +105 -18
- package/.tfcore/utils/tf-harness.sh +9 -4
- package/.tfcore/utils/tf-lock.sh +29 -0
- package/.tfcore/utils/tf-log-miss.py +34 -8
- package/.tfcore/utils/tf-login.mjs +167 -0
- package/.tfcore/utils/tf-misses-md.py +24 -21
- package/.tfcore/utils/tf-misses-md.sh +5 -4
- package/.tfcore/utils/tf-mockup-parity.mjs +427 -63
- package/.tfcore/utils/tf-mockup-parity.sh +14 -2
- package/.tfcore/utils/tf-model-pick.sh +475 -0
- package/.tfcore/utils/tf-owner-text.py +233 -0
- package/.tfcore/utils/tf-owner-text.sh +14 -0
- package/.tfcore/utils/tf-phase.sh +33 -1
- package/.tfcore/utils/tf-portable.sh +230 -0
- package/.tfcore/utils/tf-render-html.py +80 -2
- package/.tfcore/utils/tf-routing-bind.sh +87 -1
- package/.tfcore/utils/tf-routing.sh +7 -0
- package/.tfcore/utils/tf-selfcheck.sh +356 -0
- package/.tfcore/utils/tf-split-brd.py +17 -2
- package/.tfcore/utils/tf-status-evidence.sh +11 -9
- package/.tfcore/utils/tf-status-facts.py +133 -44
- package/.tfcore/utils/tf-triage.py +62 -16
- package/.tfcore/utils/tf-triage.sh +2 -0
- package/.tfcore/utils/tf-verify-boot.sh +263 -43
- package/.tfcore/utils/tf-verify-emit.sh +20 -0
- package/.tfcore/utils/tf-verify-env.sh +33 -4
- package/.tfcore/utils/tf-verify-list.py +75 -8
- package/.tfcore/utils/tf-verify-screens.mjs +254 -43
- package/.tfcore/utils/tf-verify-screens.sh +18 -4
- package/.tfcore/utils/tf-verify-tests.sh +272 -28
- package/.tfcore/utils/tf-verify-verdict.py +59 -11
- package/.tfcore/utils/tf_defect.py +27 -0
- package/.tfcore/utils/tf_feedback.py +209 -0
- package/.tfcore/utils/tf_roadmap.py +35 -0
- package/README.md +19 -5
- package/docs/TechieFlow-Installation.md +5 -3
- package/opencode.jsonc +24 -0
- package/package.json +1 -1
- package/scripts/install.mjs +4 -0
- package/.tfcore/templates/architecture-tmpl.yaml +0 -650
- package/.tfcore/templates/brownfield-architecture-tmpl.yaml +0 -476
- package/.tfcore/templates/competitor-analysis-tmpl.yaml +0 -306
- package/.tfcore/templates/front-end-architecture-tmpl.yaml +0 -218
- package/.tfcore/templates/fullstack-architecture-tmpl.yaml +0 -823
- package/.tfcore/templates/market-research-tmpl.yaml +0 -252
- package/.tfcore/templates/project-brief-tmpl.yaml +0 -221
- 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
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
|
25
|
-
|
|
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 `
|
|
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).
|
|
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 (
|
|
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
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|