@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.
- package/.claude/commands/TechieFlow/agents/analyst.md +0 -5
- package/.claude/commands/TechieFlow/agents/architect.md +0 -6
- package/.claude/commands/TechieFlow/agents/flow-master.md +41 -215
- package/.claude/commands/TechieFlow/agents/verifier.md +23 -64
- package/.claude/commands/TechieFlow/tasks/_metrics-emit-gate.md +24 -117
- package/.claude/commands/TechieFlow/tasks/_smoke-test-policy.md +20 -84
- package/.claude/commands/TechieFlow/tasks/_status-update-gate.md +10 -74
- package/.claude/commands/TechieFlow/tasks/_yolo-mode.md +20 -58
- package/.claude/commands/TechieFlow/tasks/amend-docs.md +20 -143
- package/.claude/commands/TechieFlow/tasks/build-phase.md +14 -224
- package/.claude/commands/TechieFlow/tasks/day1-brownfield.md +31 -505
- package/.claude/commands/TechieFlow/tasks/day1-greenfield.md +28 -213
- package/.claude/commands/TechieFlow/tasks/deploy-checklist.md +19 -0
- package/.claude/commands/TechieFlow/tasks/devguide.md +10 -219
- package/.claude/commands/TechieFlow/tasks/fix-issues.md +10 -129
- package/.claude/commands/TechieFlow/tasks/log-miss.md +19 -158
- package/.claude/commands/TechieFlow/tasks/metrics-report.md +1 -1
- package/.claude/commands/TechieFlow/tasks/mockups.md +12 -117
- package/.claude/commands/TechieFlow/tasks/refresh-status.md +9 -130
- package/.claude/commands/TechieFlow/tasks/split-brd.md +10 -126
- package/.claude/commands/TechieFlow/tasks/triage-and-fix.md +14 -0
- package/.claude/commands/TechieFlow/tasks/triage-issues.md +11 -152
- package/.claude/commands/TechieFlow/tasks/verify-phase.md +36 -572
- package/.opencode/plugin/techieflow.js +39 -12
- package/.tfcore/agents/analyst.md +0 -5
- package/.tfcore/agents/architect.md +0 -6
- package/.tfcore/agents/flow-master.md +41 -215
- package/.tfcore/agents/verifier.md +23 -64
- package/.tfcore/core-config.yaml +10 -0
- package/.tfcore/hooks/block-git.sh +4 -4
- package/.tfcore/hooks/guard-artifacts.sh +2 -2
- package/.tfcore/hooks/guard-build.sh +76 -0
- package/.tfcore/hooks/guard-db.sh +90 -0
- package/.tfcore/hooks/guard-metrics.sh +56 -0
- package/.tfcore/hooks/guard-status-html.sh +116 -71
- package/.tfcore/hooks/guard-status.sh +43 -16
- package/.tfcore/hooks/guard-verify.sh +70 -48
- package/.tfcore/hooks/sweep-artifacts.sh +2 -2
- package/.tfcore/install-manifest.yaml +0 -18
- package/.tfcore/routing.yaml +25 -14
- package/.tfcore/standards/coding-standards-core.md +61 -0
- package/.tfcore/standards/coding-standards-dotnet.md +93 -0
- package/.tfcore/tasks/_metrics-emit-gate.md +24 -117
- package/.tfcore/tasks/_smoke-test-policy.md +20 -84
- package/.tfcore/tasks/_status-update-gate.md +10 -74
- package/.tfcore/tasks/_yolo-mode.md +20 -58
- package/.tfcore/tasks/amend-docs.md +20 -143
- package/.tfcore/tasks/build-phase.md +14 -224
- package/.tfcore/tasks/day1-brownfield.md +31 -505
- package/.tfcore/tasks/day1-greenfield.md +28 -213
- package/.tfcore/tasks/deploy-checklist.md +19 -0
- package/.tfcore/tasks/devguide.md +10 -219
- package/.tfcore/tasks/fix-issues.md +10 -129
- package/.tfcore/tasks/log-miss.md +19 -158
- package/.tfcore/tasks/metrics-report.md +1 -1
- package/.tfcore/tasks/mockups.md +12 -117
- package/.tfcore/tasks/refresh-status.md +9 -130
- package/.tfcore/tasks/split-brd.md +10 -126
- package/.tfcore/tasks/triage-and-fix.md +14 -0
- package/.tfcore/tasks/triage-issues.md +11 -152
- package/.tfcore/tasks/verify-phase.md +36 -572
- package/.tfcore/telemetry/SCHEMA.md +43 -7
- package/.tfcore/telemetry/tf-metrics.sh +152 -17
- package/.tfcore/templates/project-brief-tmpl.yaml +1 -1
- package/.tfcore/templates/stack-defaults/dotnet.md +35 -0
- package/.tfcore/templates/stack-questions.md +77 -0
- package/.tfcore/templates/v4custom/app-agents-md-tmpl.md +3 -4
- package/.tfcore/templates/v4custom/app-architecture-tmpl.md +107 -115
- package/.tfcore/templates/v4custom/app-brd-tmpl.md +108 -184
- package/.tfcore/templates/v4custom/app-checklist-tmpl.md +48 -73
- package/.tfcore/templates/v4custom/app-claude-md-tmpl.md +1 -1
- package/.tfcore/templates/v4custom/app-coding-standards-tmpl.md +52 -0
- package/.tfcore/templates/v4custom/app-deployment-checklist-tmpl.md +86 -0
- package/.tfcore/templates/v4custom/app-devguide-tmpl.md +69 -146
- package/.tfcore/templates/v4custom/app-phases-tmpl.md +35 -0
- package/.tfcore/templates/v4custom/app-productguide-tmpl.md +38 -35
- package/.tfcore/templates/v4custom/app-project-status-tmpl.md +63 -73
- package/.tfcore/templates/v4custom/app-uidesign-tmpl.md +62 -37
- package/.tfcore/templates/v4custom/app-usageguide-tmpl.md +69 -54
- package/.tfcore/templates/v4custom/build-invocation-ladder.md +17 -180
- package/.tfcore/templates/v4custom/build-subagent-prompt.md +17 -0
- package/.tfcore/templates/v4custom/metrics-report-template.md +2 -2
- package/.tfcore/user-guide.md +0 -23
- 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-codex-bind.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-codex-telemetry.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-brd-status.py +176 -0
- package/.tfcore/utils/tf-brd-status.sh +19 -0
- package/.tfcore/utils/tf-build-list.py +191 -0
- package/.tfcore/utils/tf-build-list.sh +20 -0
- package/.tfcore/utils/tf-build.sh +143 -0
- package/.tfcore/utils/tf-cdp-relay.ps1 +64 -0
- package/.tfcore/utils/tf-checklist-edit.py +133 -0
- package/.tfcore/utils/tf-day1-files.py +208 -0
- package/.tfcore/utils/tf-day1-files.sh +20 -0
- package/.tfcore/utils/tf-devguide-list.py +249 -0
- package/.tfcore/utils/tf-devguide-list.sh +18 -0
- package/.tfcore/utils/tf-doc-check.py +1267 -0
- package/.tfcore/utils/tf-doc-check.sh +29 -0
- package/.tfcore/utils/tf-emit.sh +203 -13
- package/.tfcore/utils/tf-fix-close.sh +83 -0
- package/.tfcore/utils/tf-goal.sh +193 -62
- package/.tfcore/utils/tf-harness.sh +4 -9
- package/.tfcore/utils/tf-log-miss.py +197 -0
- package/.tfcore/utils/tf-log-miss.sh +14 -0
- package/.tfcore/utils/tf-misses-md.py +211 -0
- package/.tfcore/utils/tf-misses-md.sh +13 -0
- package/.tfcore/utils/tf-mockups-locate.py +66 -0
- package/.tfcore/utils/tf-mockups-locate.sh +18 -0
- package/.tfcore/utils/tf-opencode-audit.py +23 -7
- package/.tfcore/utils/tf-perf-grade.py +97 -0
- package/.tfcore/utils/tf-perf-grade.sh +12 -0
- package/.tfcore/utils/tf-phase.sh +74 -0
- package/.tfcore/utils/tf-routing-bind.sh +10 -5
- package/.tfcore/utils/tf-routing.sh +6 -7
- package/.tfcore/utils/tf-split-brd.py +304 -0
- package/.tfcore/utils/tf-split-brd.sh +22 -0
- package/.tfcore/utils/tf-status-evidence.sh +68 -0
- package/.tfcore/utils/tf-status-facts.py +309 -0
- package/.tfcore/utils/tf-status-facts.sh +20 -0
- package/.tfcore/utils/tf-triage.py +243 -0
- package/.tfcore/utils/tf-triage.sh +16 -0
- package/.tfcore/utils/tf-verify-boot.sh +250 -0
- package/.tfcore/utils/tf-verify-emit.sh +110 -0
- package/.tfcore/utils/tf-verify-env.sh +88 -0
- package/.tfcore/utils/tf-verify-list.py +270 -0
- package/.tfcore/utils/tf-verify-list.sh +13 -0
- package/.tfcore/utils/tf-verify-screens.mjs +283 -0
- package/.tfcore/utils/tf-verify-screens.sh +22 -0
- package/.tfcore/utils/tf-verify-tests.sh +123 -0
- package/.tfcore/utils/tf-verify-verdict.py +283 -0
- package/.tfcore/utils/tf-verify-verdict.sh +15 -0
- package/.tfcore/utils/tf-yolo.sh +59 -0
- package/README.md +114 -1149
- package/docs/TechieFlow-Installation.md +1 -5
- package/opencode.jsonc +13 -33
- package/package.json +1 -5
- package/scripts/install.mjs +52 -46
- package/.claude/commands/TechieFlow/tasks/advanced-elicitation.md +0 -117
- package/.claude/commands/TechieFlow/tasks/author-brd.md +0 -79
- package/.claude/commands/TechieFlow/tasks/document-project.md +0 -343
- package/.claude/commands/TechieFlow/tasks/execute-checklist.md +0 -86
- package/.claude/commands/TechieFlow/tasks/index-docs.md +0 -173
- package/.claude/commands/TechieFlow/tasks/kb-mode-interaction.md +0 -75
- package/.claude/commands/TechieFlow/tasks/shard-doc.md +0 -185
- package/.codex/config.toml +0 -46
- package/.codex/hooks.json +0 -63
- package/.codex/rules/techieflow.rules +0 -8
- package/.tfcore/hooks/codex-adapter.py +0 -248
- package/.tfcore/tasks/advanced-elicitation.md +0 -117
- package/.tfcore/tasks/author-brd.md +0 -79
- package/.tfcore/tasks/document-project.md +0 -343
- package/.tfcore/tasks/execute-checklist.md +0 -86
- package/.tfcore/tasks/index-docs.md +0 -173
- package/.tfcore/tasks/kb-mode-interaction.md +0 -75
- package/.tfcore/tasks/shard-doc.md +0 -185
- package/.tfcore/utils/tf-codex-bind.py +0 -196
- package/.tfcore/utils/tf-codex-telemetry.py +0 -60
- package/WORKFLOW.html +0 -1986
|
@@ -1,90 +1,65 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
<!-- tf-schema
|
|
2
|
+
doc: checklist
|
|
3
|
+
file: docs/{App}-Checklist.md
|
|
4
|
+
header: App, Size
|
|
5
|
+
section: Goal | required | max 120
|
|
6
|
+
section: Requirements Status | required
|
|
7
|
+
rule: checklist-rows
|
|
8
|
+
-->
|
|
9
|
+
<!-- Authoring notes (agent only). An agent document: never rendered, never reviewed by the owner.
|
|
10
|
+
Sections: Goal, Requirements Status (the one table), then one section per page or group holding
|
|
11
|
+
the detail entries. No other sections: bugs, UAT findings and feedback go to the misses stream.
|
|
12
|
+
Row rules (tf-doc-check.sh refuses the file otherwise):
|
|
13
|
+
- header exactly | ID | Requirement | Status | % | Remarks | Details |
|
|
14
|
+
- ID is REQ-UI-, REQ-FN-, REQ-RAG- or REQ-NFR- plus three digits; row count within the size cap
|
|
15
|
+
- Status is one of the fixed values; Verified is written only by a verify run (hook)
|
|
16
|
+
- % is 0, 25, 50, 75 or 100
|
|
17
|
+
- Details links to the entry's anchor in this file
|
|
18
|
+
- every entry names its BRD-N item; UI rows link a mockup that exists
|
|
19
|
+
- exactly one acceptance line per entry: "When <actor> <does what> on <screen>, then <observable result>"
|
|
20
|
+
("Given …," may precede it; NFR rows name the measurement instead of a screen); at most 30 words,
|
|
21
|
+
target 20, one behaviour per row (a bundled line is split into rows); the title is everyday words
|
|
22
|
+
- a perf-budget line is copied verbatim from the BRD, never invented:
|
|
23
|
+
perf-budget: <p50|p95|max> <ttfb|load> <= <N>ms [@ concurrency <N>]
|
|
24
|
+
- Remarks holds the current state only, at most 60 words; history lives in gates.jsonl and misses.jsonl
|
|
25
|
+
Prefix routing: REQ-UI- built from the mockups by the UI sub-agent; REQ-RAG- by the RAG sub-agent;
|
|
26
|
+
REQ-FN- and REQ-NFR- by the build phase. `*verify ui|functional|all` filters this table by prefix.
|
|
27
|
+
Large project: one checklist per phase (docs/{App}-Checklist.md, docs/{App}-P2-Checklist.md, …), a
|
|
28
|
+
header row "| Phase | n of m |", REQ numbers running on across phases. tf-split-brd.sh does this. -->
|
|
29
|
+
|
|
30
|
+
# {App} — Checklist
|
|
31
|
+
|
|
32
|
+
| | |
|
|
33
|
+
|---|---|
|
|
34
|
+
| App | {App} |
|
|
35
|
+
| Size | Small, Medium or Large |
|
|
13
36
|
|
|
14
37
|
## Goal
|
|
15
|
-
<one paragraph; ties back to BRD §1. This single checklist is the whole app's work list — UI, functional, RAG, and NFR requirements live together, distinguished only by their REQ prefix.>
|
|
16
38
|
|
|
17
|
-
|
|
39
|
+
{One paragraph tying back to the BRD summary. This single checklist is the whole work list.}
|
|
18
40
|
|
|
19
|
-
|
|
20
|
-
SINGLE SOURCE OF TRUTH for the WHOLE app (UI + functional +
|
|
21
|
-
RAG + NFR). There is exactly ONE checklist per app — the two
|
|
22
|
-
former files (UI-Checklist / Functional-Checklist) were merged
|
|
23
|
-
into this one. Build, self-smoke, and the verifier ALL write
|
|
24
|
-
their outcomes into THIS table — never into a separate dated
|
|
25
|
-
results file. One row per REQ, grouped by prefix:
|
|
26
|
-
REQ-UI-* → built by /trblazeui (from the mockups)
|
|
27
|
-
REQ-FN-* → built by the unified build-phase
|
|
28
|
-
REQ-RAG-* → built by /techierag
|
|
29
|
-
REQ-NFR-* → built by the unified build-phase
|
|
30
|
-
Scopes (`*verify ui|functional|all`) filter THIS table by
|
|
31
|
-
prefix — they do NOT pick a separate file. Update Status + % +
|
|
32
|
-
Remarks every time work (implementation, smoke, or verify)
|
|
33
|
-
touches the REQ. Bugs and change notes live in the Remarks
|
|
34
|
-
column, NOT in docs/qa/*.md.
|
|
35
|
-
============================================================ -->
|
|
41
|
+
## Requirements Status
|
|
36
42
|
|
|
37
43
|
| ID | Requirement | Status | % | Remarks | Details |
|
|
38
44
|
|----|-------------|--------|---|---------|---------|
|
|
39
|
-
| REQ-UI-001
|
|
40
|
-
| REQ-FN-001
|
|
41
|
-
| REQ-
|
|
42
|
-
| REQ-NFR-001 | <short name> | Not Started | 0% | — | [view](#d-req-nfr-001) |
|
|
43
|
-
|
|
44
|
-
**Status values:** `Not Started` · `In Progress` · `Implemented` (code done, not yet verified) · `Verified` (self-smoke or verifier PASS — acceptance AND data-render AND visual gates all pass) · `Done (pre-existing)` (migrated from an earlier dev plan as already complete — build agents must NOT rebuild; terminal like `Verified`) · `Needs re-verify` (a defect or change was logged — must be re-run before it can return to `Verified`) · `PARTIAL` (some acceptance unmet — say what in Remarks) · `FAIL` (verifier ran and failed — bug in Remarks) · `Blocked` (external/library gap — link the TR-/TR-RAG- entry in Remarks) · `N/A`.
|
|
45
|
-
|
|
46
|
-
**% guide:** `0` not started · `25` scaffolded · `50` in progress · `75` implemented-unverified · `100` verified.
|
|
47
|
-
|
|
48
|
-
**Remarks:** date + what was done / what is missing / bug or library reference. This is the home for bugs and change notes — do not spawn a separate file. Visual-gate failures are prefixed `⚠ visual:`; security findings `⚠ SECURITY`.
|
|
49
|
-
|
|
50
|
-
## UI / Pages
|
|
45
|
+
| REQ-UI-001 | {short name} | Not Started | 0% | — | [view](#d-req-ui-001) |
|
|
46
|
+
| REQ-FN-001 | {short name} | Not Started | 0% | — | [view](#d-req-fn-001) |
|
|
47
|
+
| REQ-NFR-001 | {short name} | Not Started | 0% | — | [view](#d-req-nfr-001) |
|
|
51
48
|
|
|
52
|
-
|
|
53
|
-
Details column above links straight to it in both Markdown and rendered HTML.
|
|
54
|
-
UI REQs are built by /trblazeui from the approved mockups (docs/{AppName}-UIDesign.md
|
|
55
|
-
+ docs/mockups/*.html); cite the mockup screen each REQ realizes.
|
|
49
|
+
**Status values:** `Not Started` · `In Progress` · `Implemented` · `Verified` · `Done (pre-existing)` · `Needs re-verify` · `PARTIAL` · `FAIL` · `Blocked` · `Owner-UAT` · `N/A`. `Owner-UAT` marks a row only the owner can close, by following the UsageGuide test plan; the verifier cannot reach it from this machine.
|
|
56
50
|
|
|
57
|
-
|
|
58
|
-
Acceptance bullet — split-brd copies it across unchanged. It is machine-read by
|
|
59
|
-
verify-phase §4c, which grades speed only where such a line exists. Never add one
|
|
60
|
-
that the BRD did not state, and never paraphrase it: the grammar is
|
|
61
|
-
perf-budget: <p50|p95|max> <ttfb|load> <= <N>ms [@ concurrency <N>] -->
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
### Page: Dashboard (`/dashboard`)
|
|
51
|
+
## Page: {Screen name} (`/route`)
|
|
65
52
|
|
|
66
53
|
<a id="d-req-ui-001"></a>
|
|
67
|
-
- **REQ-UI-001** —
|
|
68
|
-
- *Acceptance:*
|
|
69
|
-
|
|
70
|
-
## Functional requirements
|
|
54
|
+
- **REQ-UI-001** — {what the screen shows}. *BRD:* BRD-{N} · *Mockup:* mockups/{screen-slug}.html
|
|
55
|
+
- *Acceptance:* When {actor} opens {screen}, then {what is visible, with real data, at desktop and mobile widths}.
|
|
71
56
|
|
|
72
57
|
<a id="d-req-fn-001"></a>
|
|
73
|
-
- **REQ-FN-001** —
|
|
74
|
-
|
|
75
|
-
<!-- Example of a perf-gated NFR row (only where the BRD declared the budget):
|
|
76
|
-
<a id="d-req-nfr-001"></a>
|
|
77
|
-
- **REQ-NFR-001** — Public pages stay responsive under normal load. (BRD-N)
|
|
78
|
-
- *Acceptance:* pages return 200 and render their data; perf-budget: p95 load <= 2000ms @ concurrency 1
|
|
79
|
-
-->
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
## RAG / AI requirements (→ /techierag)
|
|
83
|
-
|
|
84
|
-
<a id="d-req-rag-001"></a>
|
|
85
|
-
- **REQ-RAG-001** — <trigger / acceptance via TechieRag>.
|
|
58
|
+
- **REQ-FN-001** — {what the user can do}. *BRD:* BRD-{N}
|
|
59
|
+
- *Acceptance:* When {actor} {does what} on {screen}, then {observable result}.
|
|
86
60
|
|
|
87
61
|
## Non-functional
|
|
88
62
|
|
|
89
63
|
<a id="d-req-nfr-001"></a>
|
|
90
|
-
- **REQ-NFR-001** —
|
|
64
|
+
- **REQ-NFR-001** — {the requirement}. *BRD:* BRD-{N}
|
|
65
|
+
- *Acceptance:* When {the measurement is taken}, then {the value within its limit}; perf-budget: p95 load <= 2000ms @ concurrency 1
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
| Confirm a **framework** file exists | Glob/Grep for its name — **returns nothing even when it is there** | **Read** the literal path (`.tfcore/…`) — see below |
|
|
27
27
|
| Loop over a list of files | `for f in ...; do ...; done` | Multiple parallel Read/Edit calls in one assistant turn |
|
|
28
28
|
|
|
29
|
-
**Glob and Grep cannot see the framework tree.** `.tfcore/`, `.claude
|
|
29
|
+
**Glob and Grep cannot see the framework tree.** `.tfcore/`, `.claude/` and `.opencode/` are hidden dot-directories *and* are gitignored in this repo (deliberately — the deployed framework copies are never committed). Grep is ripgrep-backed: it skips hidden paths AND honours `.gitignore`, so it needs **both** flags — `rg --hidden --no-ignore`, i.e. `rg -uu`. `--hidden` alone is not enough. Glob, `git grep` and `git ls-files` are blind for the same reasons.
|
|
30
30
|
|
|
31
31
|
So **a search returning nothing is not evidence that a framework file is missing.** Confirm framework files by **Read**ing the literal path (every one has exactly one canonical location, and whatever needs it names that path). Never report one as absent without having tried the path first — that false negative gets written into the checklist and the BRD, where the next agent inherits it as fact. If a framework file really is gone, the repo needs `update-framework.sh <repo>` run once on this machine; say that rather than working around it. Full rule: `.tfcore/tasks/_status-update-gate.md` §"The framework tree is INVISIBLE to search".
|
|
32
32
|
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<!-- tf-schema
|
|
2
|
+
doc: coding-standards
|
|
3
|
+
file: docs/{App}-Coding-Standards.md
|
|
4
|
+
header: App, Stack answer set, Date
|
|
5
|
+
section: Standards applied | required
|
|
6
|
+
section: Project rules | required
|
|
7
|
+
section: Enforcement | required
|
|
8
|
+
budget: S 800 1200 | M 800 1200 | L 800 1200
|
|
9
|
+
rule: standards-pointer
|
|
10
|
+
-->
|
|
11
|
+
<!-- Authoring notes (agent only; never visible text).
|
|
12
|
+
The standards themselves live in the framework and are not copied here:
|
|
13
|
+
.tfcore/standards/coding-standards-core.md (every project, technology-neutral)
|
|
14
|
+
.tfcore/standards/coding-standards-<stack>.md (the stack's answer set, e.g. dotnet)
|
|
15
|
+
This file says which of those apply and lists only the rules specific to this project.
|
|
16
|
+
The Project rules table is often empty; a mixed-technology build rule or a per-project naming
|
|
17
|
+
choice is the kind of thing that belongs here. Fixed budget for every size. -->
|
|
18
|
+
|
|
19
|
+
# {App} — Coding Standards
|
|
20
|
+
|
|
21
|
+
| | |
|
|
22
|
+
|---|---|
|
|
23
|
+
| App | {App} |
|
|
24
|
+
| Stack answer set | {name, or "none"} |
|
|
25
|
+
| Date | {YYYY-MM-DD} |
|
|
26
|
+
|
|
27
|
+
## Standards applied
|
|
28
|
+
|
|
29
|
+
| File | Applies | Notes |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| `.tfcore/standards/coding-standards-core.md` | yes | every project |
|
|
32
|
+
| `.tfcore/standards/coding-standards-{stack}.md` | yes | {from the Stack answer set} |
|
|
33
|
+
|
|
34
|
+
Per-project choices the stack file leaves open:
|
|
35
|
+
|
|
36
|
+
| Choice | Decision |
|
|
37
|
+
|---|---|
|
|
38
|
+
| {e.g. instance-field prefix} | {…} |
|
|
39
|
+
|
|
40
|
+
## Project rules
|
|
41
|
+
|
|
42
|
+
Rules that hold in this project only. Empty is a valid answer.
|
|
43
|
+
|
|
44
|
+
| Rule | Why | Since |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| {…} | {…} | {YYYY-MM-DD} |
|
|
47
|
+
|
|
48
|
+
## Enforcement
|
|
49
|
+
|
|
50
|
+
- **Editor configuration:** `.editorconfig` at the repository root carries the machine-checkable subset.
|
|
51
|
+
- **Analyzers:** {which, or "none"}.
|
|
52
|
+
- **Verifier checks:** the standards check runs the greps listed in the stack file's Enforcement section, plus: {any project-specific grep, or "none"}.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
<!-- tf-schema
|
|
2
|
+
doc: deployment-checklist
|
|
3
|
+
file: docs/{App}-Deployment-Checklist.md
|
|
4
|
+
header: App, Hosting target, Pipeline document, Date, Proven
|
|
5
|
+
section: Who does what | required
|
|
6
|
+
section: Secrets and settings | required
|
|
7
|
+
section: Before the first deploy | required
|
|
8
|
+
section: Deploy | required
|
|
9
|
+
section: After the deploy | required
|
|
10
|
+
section: Rollback | required
|
|
11
|
+
section: Routine operations | required
|
|
12
|
+
section: Troubleshooting | required
|
|
13
|
+
section: Proven | required
|
|
14
|
+
budget: S 2500 4000 | M 2500 4000 | L 2500 4000
|
|
15
|
+
rule: deploy-who-table
|
|
16
|
+
rule: deploy-secrets-once
|
|
17
|
+
rule: deploy-checkboxes
|
|
18
|
+
rule: deploy-proven
|
|
19
|
+
-->
|
|
20
|
+
<!-- Authoring notes (agent only; never visible text).
|
|
21
|
+
One document per hosting target, produced after UAT from the owner's pipeline guidance document
|
|
22
|
+
and the Stack answers Q9 (hosting) and Q10 (production secrets and pipeline). Running the
|
|
23
|
+
application locally is NOT in it; that is the UsageGuide's Execution guide.
|
|
24
|
+
Every item in sections 3 to 6 is a checkbox ("- [ ]") with one action and one observable result;
|
|
25
|
+
no narrative paragraphs anywhere. Each secret or setting name appears in exactly one row of the
|
|
26
|
+
Secrets and settings table and is never re-described elsewhere. Proven says "never" until a real
|
|
27
|
+
deploy has been executed, then the date. Schema: docs/TechieFlow-Document-Schemas.md §3.10. -->
|
|
28
|
+
|
|
29
|
+
# {App} — Deployment Checklist
|
|
30
|
+
|
|
31
|
+
| | |
|
|
32
|
+
|---|---|
|
|
33
|
+
| App | {App} |
|
|
34
|
+
| Hosting target | {one target: VPS, Docker host, IIS, Azure App Service, …} |
|
|
35
|
+
| Pipeline document | {path of the owner's pipeline guidance document} |
|
|
36
|
+
| Date | {YYYY-MM-DD} |
|
|
37
|
+
| Proven | never |
|
|
38
|
+
|
|
39
|
+
## 1. Who does what
|
|
40
|
+
|
|
41
|
+
| Step | Done by |
|
|
42
|
+
|---|---|
|
|
43
|
+
| {Build and publish the artefact} | pipeline |
|
|
44
|
+
| {Approve the release} | owner |
|
|
45
|
+
|
|
46
|
+
## 2. Secrets and settings
|
|
47
|
+
|
|
48
|
+
| Name | Where it is set | What breaks without it |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| {CONNECTION_STRING} | {host environment variable} | {the application cannot start} |
|
|
51
|
+
|
|
52
|
+
## 3. Before the first deploy
|
|
53
|
+
|
|
54
|
+
- [ ] {One action} — {the result that shows it worked}
|
|
55
|
+
|
|
56
|
+
## 4. Deploy
|
|
57
|
+
|
|
58
|
+
- [ ] {One action} — {the result that shows it worked}
|
|
59
|
+
|
|
60
|
+
## 5. After the deploy
|
|
61
|
+
|
|
62
|
+
- [ ] {The command to run} — {the output that proves it worked}
|
|
63
|
+
|
|
64
|
+
## 6. Rollback
|
|
65
|
+
|
|
66
|
+
- [ ] {One action} — {the result that shows it worked}
|
|
67
|
+
|
|
68
|
+
A rollback does not undo: {database migrations; …}.
|
|
69
|
+
|
|
70
|
+
## 7. Routine operations
|
|
71
|
+
|
|
72
|
+
| Task | Command |
|
|
73
|
+
|---|---|
|
|
74
|
+
| {Restart the service} | `{command}` |
|
|
75
|
+
|
|
76
|
+
## 8. Troubleshooting
|
|
77
|
+
|
|
78
|
+
| Symptom | Cause | Fix |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| {…} | {…} | {…} |
|
|
81
|
+
|
|
82
|
+
## 9. Proven
|
|
83
|
+
|
|
84
|
+
| What | Executed for real | When |
|
|
85
|
+
|---|---|---|
|
|
86
|
+
| {Deploy to the target} | no | — |
|
|
@@ -1,167 +1,90 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
Purpose) ARE reader-facing and stay visible.
|
|
17
|
-
|
|
18
|
-
DEPTH MANDATE (read before drafting): every screen entry must connect the visible UI to the
|
|
19
|
-
code that produces it: the Razor page/component (with file path), each meaningful CONTROL on
|
|
20
|
-
it, and the full DATA LINEAGE for each control/action — Razor component → service method →
|
|
21
|
-
data-access method → stored procedure name / SQL query. If a value is calculated, say where
|
|
22
|
-
and how. "It's handled in the service" is NOT acceptable — name the method and the file.
|
|
23
|
-
A developer who has never seen the code must be able to open this guide, find the screen,
|
|
24
|
-
and know exactly which files to open to fix a bug.
|
|
25
|
-
|
|
26
|
-
TWO RULES THAT KEEP THIS GUIDE TRUE (not hallucinated):
|
|
27
|
-
• Landing-truth — a screen's "Reached via" / where a role lands after login MUST be read from
|
|
28
|
-
the routing/redirect code (the NavigateTo(...) after login, the default @page "/", the auth
|
|
29
|
-
redirect) and cite file:line. NEVER infer it from the folder a page lives in or its name
|
|
30
|
-
(e.g. don't assume an Admin lands on an Admin Dashboard just because the page is under Admin/).
|
|
31
|
-
• Render-truth — confirm the data actually REACHES AND RENDERS in each control, not merely
|
|
32
|
-
that a method/proc exists. Check the @if guards, whether the query's columns map to the
|
|
33
|
-
model (case/underscore), computed getters that can throw/blank, and required component
|
|
34
|
-
parameters that must be declared (e.g. a grid's Pagination). Tag each control renders /
|
|
35
|
-
renders-empty (suspected defect — why) / {unresolved — TODO}; a suspected defect is also
|
|
36
|
-
logged to the checklist.
|
|
1
|
+
<!-- tf-schema
|
|
2
|
+
doc: devguide
|
|
3
|
+
file: docs/{App}-DevGuide.md
|
|
4
|
+
header: App, Kind, Size, Verified on, Date
|
|
5
|
+
section: Architecture cheat-sheet | required | max 300
|
|
6
|
+
section: Roles and menu map | app
|
|
7
|
+
section: Screen-by-screen code map | required
|
|
8
|
+
section: Cross-cutting flows | required
|
|
9
|
+
section: Known issues | required
|
|
10
|
+
entries: Screen-by-screen code map |
|
|
11
|
+
per-entry: 300 450
|
|
12
|
+
budget: S 4000 6000 | M 7000 10000 | L 7000 10000
|
|
13
|
+
rule: entry-screenshot
|
|
14
|
+
rule: entry-call-chain
|
|
15
|
+
rule: entry-break-table
|
|
37
16
|
-->
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
17
|
+
<!-- Authoring notes (agent only; never visible text).
|
|
18
|
+
A developer's map from each screen to the code that serves it, written so they can set breakpoints
|
|
19
|
+
and debug it. Documents the code AS BUILT, read at file:line; never inferred from folder names.
|
|
20
|
+
One `###` per screen (per component for a UI library, linked to the sample-app screen that shows it;
|
|
21
|
+
per public service for a service library: registration, call chain, where to break; owner 2026-09-06).
|
|
22
|
+
Each entry: the screenshot captured from the running app; one "Call chain:" line, page method to
|
|
23
|
+
service class and method to data-access class and method; a where-to-break table, one row per step:
|
|
24
|
+
file and line, function, the variable to watch, the value it should hold. Line numbers are as of
|
|
25
|
+
"Verified on"; the function name is what to search for when a line has moved.
|
|
26
|
+
Produced when the build completes the checklist; refreshed at handoff.
|
|
27
|
+
Large project: one DevGuide per phase (docs/{App}-DevGuide.md, docs/{App}-P2-DevGuide.md, …) with a
|
|
28
|
+
header row "| Phase | n of m |". Cross-cutting flows are written once, in phase 1; a later phase
|
|
29
|
+
repeats them only if it changed them, otherwise one line points at phase 1's section. -->
|
|
30
|
+
|
|
31
|
+
# {App} — Developer Guide
|
|
32
|
+
|
|
33
|
+
| | |
|
|
34
|
+
|---|---|
|
|
35
|
+
| App | {App} |
|
|
36
|
+
| Kind | app or library |
|
|
37
|
+
| Size | Small, Medium or Large |
|
|
38
|
+
| Verified on | {YYYY-MM-DD, the run the screenshots and line numbers come from} |
|
|
39
|
+
| Date | {YYYY-MM-DD} |
|
|
61
40
|
|
|
62
41
|
## Architecture cheat-sheet
|
|
63
42
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
| UI (Blazor) | `src/{AppName}.Web` | Razor pages/components, layouts, nav menu | `Pages/`, `Components/`, `Shared/NavMenu.razor` |
|
|
69
|
-
| App services | `src/{AppName}.Application` (or `.Services`) | Business logic, orchestration | `DashboardService`, `KundliService` |
|
|
70
|
-
| Data access | `src/{AppName}.Infrastructure` (or `.Data`) | Repositories, DbContext, Dapper queries | `KundliRepository`, `AppDbContext` |
|
|
71
|
-
| Database | `database/` / `src/{AppName}.Db` | Tables, stored procs, seed scripts | `usp_*.sql`, migrations |
|
|
43
|
+
```mermaid
|
|
44
|
+
flowchart LR
|
|
45
|
+
UI["Pages"] --> Svc["Services"] --> Data["Data access"] --> DB[("Database")]
|
|
46
|
+
```
|
|
72
47
|
|
|
73
|
-
|
|
74
|
-
|
|
48
|
+
| Layer | Project or folder | What lives here |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| UI | `src/{App}/Pages` | {…} |
|
|
51
|
+
| Services | `src/{App}.Core/Services` | {…} |
|
|
52
|
+
| Data access | `src/{App}.Core/Data` | {…} |
|
|
75
53
|
|
|
76
54
|
## Roles and menu map
|
|
77
55
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
| Role |
|
|
81
|
-
|------|----------------------------|----------------------------------------------|----------------------|-------------|
|
|
82
|
-
| {App Admin} | {admin@…} | {`[Authorize(Roles="Admin")]` / policy name} | {Dashboard, Users, Settings, …} | [{App}-DevGuide-AppAdmin.md](./{AppName}-DevGuide-AppAdmin.md) |
|
|
83
|
-
| {App Manager} | {manager@…} | {…} | {Dashboard, Reports, …} | [{App}-DevGuide-AppManager.md](./{AppName}-DevGuide-AppManager.md) |
|
|
84
|
-
| {End user} | {user1@…} | {…} | {Home, Profile, …} | [{App}-DevGuide-EndUser.md](./{AppName}-DevGuide-EndUser.md) |
|
|
85
|
-
|
|
86
|
-
For each role, list the **menu → menu-item → screen** mapping so a developer knows, for a given role, what appears and what each item opens:
|
|
87
|
-
|
|
88
|
-
### {Role} — menu structure
|
|
89
|
-
- **{Menu group}** → **{Menu item}** → opens `{Route}` (`{RazorFile}`) — see [§4 {Role} · {Screen}](#role--screen)
|
|
90
|
-
- ...
|
|
56
|
+
| Role | Test user | Menu items and the screen each opens |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| {Role} | {user #} | {Menu → screen (`/route`)} |
|
|
91
59
|
|
|
92
60
|
## Screen-by-screen code map
|
|
93
61
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
### {Role} · {Screen / Page name}
|
|
62
|
+
### {Screen name} (`/route`)
|
|
99
63
|
|
|
100
|
-
|
|
101
|
-
- **Razor file:** `src/{AppName}.Web/Pages/Dashboard.razor` (+ code-behind `Dashboard.razor.cs` if present)
|
|
102
|
-
- **Reached via:** {Menu group → menu item}; **Log in as:** {test user from UsageGuide}
|
|
103
|
-
- **What this screen does:** {one or two lines}
|
|
104
|
-
- **Visual status:** {✅ looks-right (runtime-confirmed {date}) | ⚠ visual-broken (DEFECT — {what} @ {width}, {date}) | static-only (unconfirmed)}
|
|
64
|
+

|
|
105
65
|
|
|
106
|
-
**
|
|
66
|
+
**Call chain:** `{Page}.razor.cs:{HandleX}` → `{Service}.{Method}` → `{DataAccess}.{Method}` → `{table or procedure}`
|
|
107
67
|
|
|
108
|
-
|
|
68
|
+
| File and line | Function | Watch | Expected value |
|
|
69
|
+
|---|---|---|---|
|
|
70
|
+
| `src/{App}/Pages/{Page}.razor.cs:127` | `HandleX` | `aModel.Email` | the email typed in the box |
|
|
71
|
+
| `src/{App}.Core/Services/{Service}.cs:54` | `{Method}` | `vResult` | {…} |
|
|
72
|
+
| `src/{App}.Core/Data/{DataAccess}.cs:31` | `{Method}` | `vRows.Count` | {…} |
|
|
109
73
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
**Screen flowchart** — show every meaningful control on the screen and where its data comes from. (Follow the Mermaid authoring rules in `.tfcore/templates/v4custom/html-render-shell.md §5.5` — quote every label, never use `end` as a node id.)
|
|
114
|
-
|
|
115
|
-
```mermaid
|
|
116
|
-
flowchart TD
|
|
117
|
-
P["Dashboard.razor"] --> C1["Kundli list (grid)"]
|
|
118
|
-
P --> C2["Ruling-Planet chart"]
|
|
119
|
-
P --> C3["Ruling-Planet table"]
|
|
120
|
-
C1 --> S1["DashboardService.GetKundliList()"]
|
|
121
|
-
C2 --> S2["DashboardService.GetRulingPlanets()"]
|
|
122
|
-
C3 --> S2
|
|
123
|
-
S1 --> R1["KundliRepository.QueryList()"]
|
|
124
|
-
S2 --> R2["KundliRepository.QueryRulingPlanets()"]
|
|
125
|
-
R1 --> DB1[("usp_GetKundliList")]
|
|
126
|
-
R2 --> DB2[("usp_RulingPlanets")]
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
**Controls on this screen**
|
|
130
|
-
|
|
131
|
-
| Control | Type | Purpose | Populated / calculated by |
|
|
132
|
-
|---------|------|---------|---------------------------|
|
|
133
|
-
| {Kundli list} | {grid} | {lists kundlis for the tenant} | {`DashboardService.GetKundliList()`} |
|
|
134
|
-
| {Ruling-Planet chart} | {chart} | {shows current ruling planets} | {`DashboardService.GetRulingPlanets()` — values computed in `RulingPlanetCalculator`} |
|
|
135
|
-
|
|
136
|
-
**Data lineage** — the full path for each control/action. This is the heart of the guide.
|
|
137
|
-
|
|
138
|
-
| Control / Action | Razor component (file) | Service method (file) | Data-access method (file) | Stored proc / Query | Notes / calculation |
|
|
139
|
-
|------------------|------------------------|-----------------------|---------------------------|---------------------|---------------------|
|
|
140
|
-
| {Load Kundli list} | {`Dashboard.razor` line ~40} | {`DashboardService.GetKundliList()`} | {`KundliRepository.QueryList()`} | {`usp_GetKundliList`} | {paged; tenant-filtered} |
|
|
141
|
-
| {Ruling-Planet chart} | {`Dashboard.razor` `<RulingPlanetChart>`} | {`DashboardService.GetRulingPlanets()`} | {`KundliRepository.QueryRulingPlanets()`} | {`usp_RulingPlanets`} | {planet strengths computed in `RulingPlanetCalculator.Compute()` from the proc rows} |
|
|
142
|
-
| {Save / submit action} | {…} | {…} | {…} | {…} | {…} |
|
|
143
|
-
|
|
144
|
-
**Business rules / calculations on this screen**
|
|
145
|
-
- {Any non-trivial computation, validation, or derived value — name the method that does it.}
|
|
146
|
-
|
|
147
|
-
**Known issues / gotchas**
|
|
148
|
-
- {Anything fragile, any TR-NNN library gap, any `Blocked` REQ touching this screen.}
|
|
149
|
-
|
|
150
|
-
_(Repeat the `### {Role} · {Screen}` block for every screen the role can reach.)_
|
|
151
|
-
|
|
152
|
-
---
|
|
74
|
+
**Calculations on this screen:** {method name and what it computes, or "none"}
|
|
153
75
|
|
|
154
76
|
## Cross-cutting flows
|
|
155
77
|
|
|
156
|
-
|
|
78
|
+
### Sign-in
|
|
79
|
+
**Call chain:** {…}
|
|
80
|
+
|
|
81
|
+
| File and line | Function | Watch | Expected value |
|
|
82
|
+
|---|---|---|---|
|
|
83
|
+
| {…} | {…} | {…} | {…} |
|
|
157
84
|
|
|
158
|
-
|
|
85
|
+
### Configuration, logging, errors
|
|
86
|
+
{One line each: where it is wired, file and line.}
|
|
159
87
|
|
|
160
|
-
|
|
161
|
-
2. Open §4, find that role + screen, find the control in the **Data lineage** table.
|
|
162
|
-
3. Walk the lineage **top-down**: Razor component → service method → data-access method → stored proc/query. The bug is in one of those four.
|
|
163
|
-
4. If the visible value is *calculated*, the lineage row names the calculator method — check it.
|
|
164
|
-
5. After fixing, re-run the screen's walkthrough in `docs/{AppName}-UsageGuide.md`, then re-generate this guide (`*devguide {AppName}`) if the code path changed.
|
|
88
|
+
## Known issues
|
|
165
89
|
|
|
166
|
-
|
|
167
|
-
_Generated/refreshed by `*devguide {AppName}`. Reflects the code as built at the time shown in the subtitle — regenerate after code changes._
|
|
90
|
+
- {one line each, with the REQ or feedback id}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<!-- tf-schema
|
|
2
|
+
doc: phases
|
|
3
|
+
file: docs/{App}-Phases.md
|
|
4
|
+
header: App, Kind, Size, Date
|
|
5
|
+
section: Phases | required
|
|
6
|
+
budget: S 300 600 | M 300 600 | L 300 600
|
|
7
|
+
rule: phases-table
|
|
8
|
+
-->
|
|
9
|
+
<!-- Authoring notes (agent only; never visible text).
|
|
10
|
+
Large projects only. One row per phase; each phase fits Medium on its own (at most 20 screens,
|
|
11
|
+
100 requirements). Phase 1 keeps the plain file names (docs/{App}-BRD.md, -Checklist, -UIDesign,
|
|
12
|
+
-DevGuide); phase 2 onward are docs/{App}-P2-BRD.md and so on. BRD-N and REQ- ids run on across
|
|
13
|
+
phases and are never reused, so the ranges never overlap. An item added to an earlier phase after a
|
|
14
|
+
later phase exists takes the next free id and the row gets a second range: "BRD-1 to BRD-73, BRD-111 to BRD-118". Every screen sits in exactly one phase;
|
|
15
|
+
the screens of a phase are exactly the "### Screen:" entries of that phase's UIDesign.
|
|
16
|
+
Status is planned, building or done. The phase being worked is appPhase in core-config.yaml
|
|
17
|
+
(bash .tfcore/utils/tf-day1-files.sh {App} --phase N); handoff moves it on.
|
|
18
|
+
tf-doc-check.sh --app {App} refuses a screen in two phases, an id in two phases, a BRD id outside
|
|
19
|
+
its phase's range, and a phase row without its BRD file. -->
|
|
20
|
+
|
|
21
|
+
# {App} — Phases
|
|
22
|
+
|
|
23
|
+
| | |
|
|
24
|
+
|---|---|
|
|
25
|
+
| App | {App} |
|
|
26
|
+
| Kind | app |
|
|
27
|
+
| Size | Large |
|
|
28
|
+
| Date | {YYYY-MM-DD} |
|
|
29
|
+
|
|
30
|
+
## Phases
|
|
31
|
+
|
|
32
|
+
| Phase | Name | Screens | BRD range | Status |
|
|
33
|
+
|---|---|---|---|---|
|
|
34
|
+
| 1 | {Name} | {Screen, Screen, Screen} | BRD-1 to BRD-{N} | planned |
|
|
35
|
+
| 2 | {Name} | {Screen, Screen} | BRD-{N+1} to BRD-{M} | planned |
|