@techierathore/techieflow 1.0.2 → 1.0.4

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 (204) hide show
  1. package/.claude/commands/TechieFlow/agents/analyst.md +5 -13
  2. package/.claude/commands/TechieFlow/agents/architect.md +1 -16
  3. package/.claude/commands/TechieFlow/agents/flow-master.md +42 -215
  4. package/.claude/commands/TechieFlow/agents/verifier.md +24 -64
  5. package/.claude/commands/TechieFlow/tasks/_metrics-emit-gate.md +24 -117
  6. package/.claude/commands/TechieFlow/tasks/_owner-language.md +26 -0
  7. package/.claude/commands/TechieFlow/tasks/_smoke-test-policy.md +20 -84
  8. package/.claude/commands/TechieFlow/tasks/_status-update-gate.md +10 -74
  9. package/.claude/commands/TechieFlow/tasks/_yolo-mode.md +20 -58
  10. package/.claude/commands/TechieFlow/tasks/amend-docs.md +21 -143
  11. package/.claude/commands/TechieFlow/tasks/build-phase.md +14 -224
  12. package/.claude/commands/TechieFlow/tasks/create-deep-research-prompt.md +4 -0
  13. package/.claude/commands/TechieFlow/tasks/create-doc.md +4 -0
  14. package/.claude/commands/TechieFlow/tasks/create-project-brief.md +22 -0
  15. package/.claude/commands/TechieFlow/tasks/day1-brownfield.md +31 -505
  16. package/.claude/commands/TechieFlow/tasks/day1-greenfield.md +28 -213
  17. package/.claude/commands/TechieFlow/tasks/deploy-checklist.md +19 -0
  18. package/.claude/commands/TechieFlow/tasks/devguide.md +10 -219
  19. package/.claude/commands/TechieFlow/tasks/facilitate-brainstorming-session.md +4 -0
  20. package/.claude/commands/TechieFlow/tasks/fix-issues.md +10 -129
  21. package/.claude/commands/TechieFlow/tasks/generate-html.md +5 -1
  22. package/.claude/commands/TechieFlow/tasks/handoff-phase.md +18 -16
  23. package/.claude/commands/TechieFlow/tasks/log-miss.md +19 -158
  24. package/.claude/commands/TechieFlow/tasks/metrics-report.md +3 -1
  25. package/.claude/commands/TechieFlow/tasks/mockups.md +12 -117
  26. package/.claude/commands/TechieFlow/tasks/refresh-status.md +9 -130
  27. package/.claude/commands/TechieFlow/tasks/split-brd.md +10 -126
  28. package/.claude/commands/TechieFlow/tasks/triage-and-fix.md +14 -0
  29. package/.claude/commands/TechieFlow/tasks/triage-issues.md +11 -152
  30. package/.claude/commands/TechieFlow/tasks/verify-phase.md +36 -572
  31. package/.opencode/plugin/techieflow.js +40 -13
  32. package/.tfcore/agents/analyst.md +5 -13
  33. package/.tfcore/agents/architect.md +1 -16
  34. package/.tfcore/agents/flow-master.md +42 -215
  35. package/.tfcore/agents/verifier.md +24 -64
  36. package/.tfcore/core-config.yaml +10 -0
  37. package/.tfcore/hooks/block-git.sh +4 -4
  38. package/.tfcore/hooks/guard-artifacts.sh +2 -2
  39. package/.tfcore/hooks/guard-build.sh +76 -0
  40. package/.tfcore/hooks/guard-db.sh +90 -0
  41. package/.tfcore/hooks/guard-metrics.sh +68 -0
  42. package/.tfcore/hooks/guard-status-html.sh +116 -71
  43. package/.tfcore/hooks/guard-status.sh +43 -16
  44. package/.tfcore/hooks/guard-verify-deps.sh +124 -0
  45. package/.tfcore/hooks/guard-verify.sh +70 -48
  46. package/.tfcore/hooks/sweep-artifacts.sh +2 -2
  47. package/.tfcore/install-manifest.yaml +0 -18
  48. package/.tfcore/routing.yaml +86 -14
  49. package/.tfcore/standards/coding-standards-core.md +61 -0
  50. package/.tfcore/standards/coding-standards-dotnet.md +93 -0
  51. package/.tfcore/tasks/_metrics-emit-gate.md +24 -117
  52. package/.tfcore/tasks/_owner-language.md +26 -0
  53. package/.tfcore/tasks/_smoke-test-policy.md +20 -84
  54. package/.tfcore/tasks/_status-update-gate.md +10 -74
  55. package/.tfcore/tasks/_yolo-mode.md +20 -58
  56. package/.tfcore/tasks/amend-docs.md +21 -143
  57. package/.tfcore/tasks/build-phase.md +14 -224
  58. package/.tfcore/tasks/create-deep-research-prompt.md +4 -0
  59. package/.tfcore/tasks/create-doc.md +4 -0
  60. package/.tfcore/tasks/create-project-brief.md +22 -0
  61. package/.tfcore/tasks/day1-brownfield.md +31 -505
  62. package/.tfcore/tasks/day1-greenfield.md +28 -213
  63. package/.tfcore/tasks/deploy-checklist.md +19 -0
  64. package/.tfcore/tasks/devguide.md +10 -219
  65. package/.tfcore/tasks/facilitate-brainstorming-session.md +4 -0
  66. package/.tfcore/tasks/fix-issues.md +10 -129
  67. package/.tfcore/tasks/generate-html.md +5 -1
  68. package/.tfcore/tasks/handoff-phase.md +18 -16
  69. package/.tfcore/tasks/log-miss.md +19 -158
  70. package/.tfcore/tasks/metrics-report.md +3 -1
  71. package/.tfcore/tasks/mockups.md +12 -117
  72. package/.tfcore/tasks/refresh-status.md +9 -130
  73. package/.tfcore/tasks/split-brd.md +10 -126
  74. package/.tfcore/tasks/triage-and-fix.md +14 -0
  75. package/.tfcore/tasks/triage-issues.md +11 -152
  76. package/.tfcore/tasks/verify-phase.md +36 -572
  77. package/.tfcore/telemetry/SCHEMA.md +100 -8
  78. package/.tfcore/telemetry/tf-metrics.sh +564 -32
  79. package/.tfcore/templates/stack-defaults/dotnet.md +35 -0
  80. package/.tfcore/templates/stack-questions.md +77 -0
  81. package/.tfcore/templates/v4custom/app-agents-md-tmpl.md +3 -4
  82. package/.tfcore/templates/v4custom/app-architecture-tmpl.md +107 -115
  83. package/.tfcore/templates/v4custom/app-brd-tmpl.md +108 -184
  84. package/.tfcore/templates/v4custom/app-brief-tmpl.md +65 -0
  85. package/.tfcore/templates/v4custom/app-checklist-tmpl.md +48 -73
  86. package/.tfcore/templates/v4custom/app-claude-md-tmpl.md +1 -1
  87. package/.tfcore/templates/v4custom/app-coding-standards-tmpl.md +52 -0
  88. package/.tfcore/templates/v4custom/app-decision-request-tmpl.md +85 -0
  89. package/.tfcore/templates/v4custom/app-deployment-checklist-tmpl.md +86 -0
  90. package/.tfcore/templates/v4custom/app-devguide-tmpl.md +69 -146
  91. package/.tfcore/templates/v4custom/app-library-feedback-tmpl.md +86 -31
  92. package/.tfcore/templates/v4custom/app-phases-tmpl.md +35 -0
  93. package/.tfcore/templates/v4custom/app-productguide-tmpl.md +38 -35
  94. package/.tfcore/templates/v4custom/app-project-status-tmpl.md +63 -73
  95. package/.tfcore/templates/v4custom/app-uidesign-tmpl.md +62 -37
  96. package/.tfcore/templates/v4custom/app-usageguide-tmpl.md +69 -54
  97. package/.tfcore/templates/v4custom/build-invocation-ladder.md +17 -180
  98. package/.tfcore/templates/v4custom/build-subagent-prompt.md +17 -0
  99. package/.tfcore/templates/v4custom/html-render-shell.md +1 -1
  100. package/.tfcore/templates/v4custom/metrics-report-template.md +2 -2
  101. package/.tfcore/user-guide.md +0 -23
  102. package/.tfcore/utils/__pycache__/tf-brd-status.cpython-312.pyc +0 -0
  103. package/.tfcore/utils/__pycache__/tf-checklist-edit.cpython-312.pyc +0 -0
  104. package/.tfcore/utils/__pycache__/tf-codex-bind.cpython-312.pyc +0 -0
  105. package/.tfcore/utils/__pycache__/tf-codex-telemetry.cpython-312.pyc +0 -0
  106. package/.tfcore/utils/__pycache__/tf-day1-files.cpython-312.pyc +0 -0
  107. package/.tfcore/utils/__pycache__/tf-devguide-list.cpython-312.pyc +0 -0
  108. package/.tfcore/utils/__pycache__/tf-doc-check.cpython-312.pyc +0 -0
  109. package/.tfcore/utils/__pycache__/tf-log-miss.cpython-312.pyc +0 -0
  110. package/.tfcore/utils/__pycache__/tf-misses-md.cpython-312.pyc +0 -0
  111. package/.tfcore/utils/__pycache__/tf-mockups-locate.cpython-312.pyc +0 -0
  112. package/.tfcore/utils/__pycache__/tf-opencode-audit.cpython-312.pyc +0 -0
  113. package/.tfcore/utils/__pycache__/tf-perf-grade.cpython-312.pyc +0 -0
  114. package/.tfcore/utils/__pycache__/tf-render-html.cpython-312.pyc +0 -0
  115. package/.tfcore/utils/__pycache__/tf-split-brd.cpython-312.pyc +0 -0
  116. package/.tfcore/utils/__pycache__/tf-status-facts.cpython-312.pyc +0 -0
  117. package/.tfcore/utils/__pycache__/tf-triage.cpython-312.pyc +0 -0
  118. package/.tfcore/utils/__pycache__/tf-verify-list.cpython-312.pyc +0 -0
  119. package/.tfcore/utils/__pycache__/tf-verify-verdict.cpython-312.pyc +0 -0
  120. package/.tfcore/utils/tf-brd-status.py +176 -0
  121. package/.tfcore/utils/tf-brd-status.sh +19 -0
  122. package/.tfcore/utils/tf-build-list.py +211 -0
  123. package/.tfcore/utils/tf-build-list.sh +21 -0
  124. package/.tfcore/utils/tf-build.sh +143 -0
  125. package/.tfcore/utils/tf-cdp-relay.ps1 +64 -0
  126. package/.tfcore/utils/tf-checklist-edit.py +133 -0
  127. package/.tfcore/utils/tf-day1-files.py +208 -0
  128. package/.tfcore/utils/tf-day1-files.sh +20 -0
  129. package/.tfcore/utils/tf-devguide-list.py +249 -0
  130. package/.tfcore/utils/tf-devguide-list.sh +18 -0
  131. package/.tfcore/utils/tf-doc-check.py +1369 -0
  132. package/.tfcore/utils/tf-doc-check.sh +29 -0
  133. package/.tfcore/utils/tf-emit.sh +545 -18
  134. package/.tfcore/utils/tf-fix-close.sh +115 -0
  135. package/.tfcore/utils/tf-gitignore-audit.sh +50 -3
  136. package/.tfcore/utils/tf-goal.sh +284 -66
  137. package/.tfcore/utils/tf-harness.sh +4 -9
  138. package/.tfcore/utils/tf-log-miss.py +197 -0
  139. package/.tfcore/utils/tf-log-miss.sh +14 -0
  140. package/.tfcore/utils/tf-misses-md.py +208 -0
  141. package/.tfcore/utils/tf-misses-md.sh +14 -0
  142. package/.tfcore/utils/tf-mockups-locate.py +66 -0
  143. package/.tfcore/utils/tf-mockups-locate.sh +18 -0
  144. package/.tfcore/utils/tf-model-pick.sh +475 -0
  145. package/.tfcore/utils/tf-opencode-audit.py +23 -7
  146. package/.tfcore/utils/tf-perf-grade.py +97 -0
  147. package/.tfcore/utils/tf-perf-grade.sh +12 -0
  148. package/.tfcore/utils/tf-phase.sh +92 -0
  149. package/.tfcore/utils/tf-render-html.py +20 -0
  150. package/.tfcore/utils/tf-routing-bind.sh +97 -6
  151. package/.tfcore/utils/tf-routing.sh +13 -7
  152. package/.tfcore/utils/tf-selfcheck.sh +323 -0
  153. package/.tfcore/utils/tf-split-brd.py +309 -0
  154. package/.tfcore/utils/tf-split-brd.sh +22 -0
  155. package/.tfcore/utils/tf-status-evidence.sh +68 -0
  156. package/.tfcore/utils/tf-status-facts.py +358 -0
  157. package/.tfcore/utils/tf-status-facts.sh +20 -0
  158. package/.tfcore/utils/tf-triage.py +243 -0
  159. package/.tfcore/utils/tf-triage.sh +16 -0
  160. package/.tfcore/utils/tf-verify-boot.sh +250 -0
  161. package/.tfcore/utils/tf-verify-emit.sh +110 -0
  162. package/.tfcore/utils/tf-verify-env.sh +88 -0
  163. package/.tfcore/utils/tf-verify-list.py +270 -0
  164. package/.tfcore/utils/tf-verify-list.sh +13 -0
  165. package/.tfcore/utils/tf-verify-screens.mjs +355 -0
  166. package/.tfcore/utils/tf-verify-screens.sh +31 -0
  167. package/.tfcore/utils/tf-verify-tests.sh +166 -0
  168. package/.tfcore/utils/tf-verify-verdict.py +292 -0
  169. package/.tfcore/utils/tf-verify-verdict.sh +15 -0
  170. package/.tfcore/utils/tf-yolo.sh +59 -0
  171. package/README.md +120 -1145
  172. package/docs/TechieFlow-Installation.md +1 -5
  173. package/opencode.jsonc +37 -33
  174. package/package.json +1 -5
  175. package/scripts/install.mjs +56 -46
  176. package/.claude/commands/TechieFlow/tasks/advanced-elicitation.md +0 -117
  177. package/.claude/commands/TechieFlow/tasks/author-brd.md +0 -79
  178. package/.claude/commands/TechieFlow/tasks/document-project.md +0 -343
  179. package/.claude/commands/TechieFlow/tasks/execute-checklist.md +0 -86
  180. package/.claude/commands/TechieFlow/tasks/index-docs.md +0 -173
  181. package/.claude/commands/TechieFlow/tasks/kb-mode-interaction.md +0 -75
  182. package/.claude/commands/TechieFlow/tasks/shard-doc.md +0 -185
  183. package/.codex/config.toml +0 -46
  184. package/.codex/hooks.json +0 -63
  185. package/.codex/rules/techieflow.rules +0 -8
  186. package/.tfcore/hooks/codex-adapter.py +0 -248
  187. package/.tfcore/tasks/advanced-elicitation.md +0 -117
  188. package/.tfcore/tasks/author-brd.md +0 -79
  189. package/.tfcore/tasks/document-project.md +0 -343
  190. package/.tfcore/tasks/execute-checklist.md +0 -86
  191. package/.tfcore/tasks/index-docs.md +0 -173
  192. package/.tfcore/tasks/kb-mode-interaction.md +0 -75
  193. package/.tfcore/tasks/shard-doc.md +0 -185
  194. package/.tfcore/templates/architecture-tmpl.yaml +0 -650
  195. package/.tfcore/templates/brownfield-architecture-tmpl.yaml +0 -476
  196. package/.tfcore/templates/competitor-analysis-tmpl.yaml +0 -306
  197. package/.tfcore/templates/front-end-architecture-tmpl.yaml +0 -218
  198. package/.tfcore/templates/fullstack-architecture-tmpl.yaml +0 -823
  199. package/.tfcore/templates/market-research-tmpl.yaml +0 -252
  200. package/.tfcore/templates/project-brief-tmpl.yaml +0 -221
  201. package/.tfcore/utils/techieflow-doc-template.md +0 -325
  202. package/.tfcore/utils/tf-codex-bind.py +0 -196
  203. package/.tfcore/utils/tf-codex-telemetry.py +0 -60
  204. package/WORKFLOW.html +0 -1986
@@ -0,0 +1,35 @@
1
+ # TechieFlow — Stack Defaults: .NET
2
+
3
+ | | |
4
+ |---|---|
5
+ | Purpose | An answer set for `TechieFlow-Stack-Questions.md`. These are the defaults the framework's author uses for their own .NET / Blazor / MAUI projects. Naming this answer set at day-1 fills in the questions it covers; the agent asks the rest. |
6
+ | Audience | Owners of .NET projects using TechieFlow. Owners in other stacks write their own answer set with the same structure. |
7
+ | Status | Drafted in Session 2 of the reset (2026-09-04) from the author's answers. Becomes a file under `.tfcore/templates/stack-defaults/` in Session 3. Configuration document read by agents; not rendered to HTML. |
8
+ | Applies to | Projects that declare `stack: dotnet` and name this answer set. Change any row for a project by overriding it in that project's Architecture Stack Decisions section; the override wins. |
9
+
10
+ ---
11
+
12
+ ## Answers
13
+
14
+ | Q | Topic | Default | Still asked at day-1? |
15
+ |---|---|---|---|
16
+ | Q1 | Configuration | Non-secret configuration lives in `appsettings.json`, layered by `appsettings.{Environment}.json`. No other configuration mechanism is created. | No |
17
+ | Q2 | Secrets in development | Project user secrets (`dotnet user-secrets`), visible to the developer, never committed. `appsettings.Development.json` is committed and therefore never holds a real secret. A `secrets.example.json` in the project lists every key the application reads. | No |
18
+ | Q3 | Database | PostgreSQL, running in Docker, for development and production. Docker is always running on the development machine because WSL, where the harness runs, depends on it. If PostgreSQL is unreachable the container is stopped: the agent starts it and continues. Only if no PostgreSQL container exists at all does the agent stop and ask the owner for connection details. It never substitutes another engine and never creates its own database container. | No, unless no container exists |
19
+ | Q4 | Authentication | Two choices only: **AppManager**, the author's shared platform for identity, roles, licences and subscriptions, which counts as part of the application and not as an external integration; or a different mechanism named by the owner. | **Yes**: "AppManager, or something else?" |
20
+ | Q5 | Logging | Serilog, always, with file logging wired at startup before anything else can fail. | No |
21
+ | Q6 | Tests | xUnit, always. A test project exists from day-1. | No |
22
+ | Q7 | Layout and naming | `src/` and `tests/` at the root. The primary executable project is named exactly `<App>`; `<App>.App` is banned. Secondary heads take a descriptive suffix (`<App>.Api`, `<App>.Desktop`). | No |
23
+ | Q8 | User interface | TrBlazeUI for every Blazor head and every MAUI Blazor Hybrid head. Native controls for WinForms, WPF and non-Blazor MAUI heads. Rendering mode is chosen per project and recorded. | Rendering mode only |
24
+ | Q9 | Hosting | Web applications run containerised on a Bluehost VPS. The owner supplies a pipeline guidance document at UAT go-ahead, and a deployment checklist is produced from it. | Asked at UAT go-ahead, as the questionnaire specifies |
25
+ | Q10 | Production secrets | Decided when the owner asks for the production pipeline, after UAT. Until then no document states where production secrets live. | Asked after UAT |
26
+ | Q11 | Standing rules and prohibitions | 1. Never add a NuGet package without a line in the Architecture document saying why. 2. Never create a second configuration mechanism. 3. When TechieFlow, TrBlazeUI, TechieRag or any other internal library lacks something, record it in that library's feedback file and hold the feature until the library is fixed. Never implement a workaround. 4. Data access is always Dapper. 5. Database migrations live in a dedicated project named `<App>Db` (console or library) using the DbUp package. The web application runs the migration at startup, or the pipeline runs it after deployment. Never a `database` folder of loose scripts at the repository root. 6. Log files are written under the build output folder (`bin/`), which is git-ignored. Never at the repository root. 7. No unnecessary folders at the repository root (`data`, `database`, `scripts` and the like). Everything sits under `src/` or `tests/` according to what it belongs to. | No |
27
+
28
+ ---
29
+
30
+ ## Notes
31
+
32
+ - Q4 is asked on purpose even with this answer set, because the choice differs per product.
33
+ - Q3's "start the container, never create one" replaces the behaviour that produced TfLens's own database container: an agent that cannot reach the expected database restarts it or asks, and never builds an alternative.
34
+ - Q11.5 replaces the `database` folder of loose migration scripts that TfLens accumulated.
35
+ - Q11.3 is a standing framework convention restated as a stack rule so that it is recorded per project and its violations can be counted.
@@ -0,0 +1,77 @@
1
+ # TechieFlow — Stack Questions
2
+
3
+ | | |
4
+ |---|---|
5
+ | Purpose | The questions the framework asks the owner about a project's technology and conventions, when it asks them, and where the answers are recorded. The framework itself is technology-neutral; these answers are what make a project's documents and code specific. |
6
+ | Audience | Framework agents (the questionnaire is asked verbatim), project owners, contributors. |
7
+ | Status | Drafted in Session 2 of the reset (2026-09-04). Becomes a template under `.tfcore/templates/` in Session 3. Configuration document read by agents; not rendered to HTML. |
8
+ | Related | `TechieFlow-Stack-Defaults-DotNet.md` (an answer set), `TechieFlow-Requirements.md` (FR-01, FR-02) |
9
+
10
+ ---
11
+
12
+ ## 1. Principle
13
+
14
+ The framework never assumes a language, a UI library, a database, an authentication scheme, a test framework or a hosting target. Before any project document is written, the agent asks the questions below and records the answers in one place: the **Stack Decisions** section of the project's Architecture document. Every later command reads its stack facts from there and nowhere else.
15
+
16
+ An owner who always works in one stack answers once by naming an **answer set**, a file that holds their standard answers. The framework ships one answer set, `TechieFlow-Stack-Defaults-DotNet.md`, described as the defaults its author uses for their own .NET projects. Any owner may copy it, change it, or write a different one. Naming an answer set fills in every question it covers; the agent then asks only the questions the set leaves open.
17
+
18
+ ---
19
+
20
+ ## 2. When the questions are asked
21
+
22
+ | Moment | Questions | Why then |
23
+ |---|---|---|
24
+ | Day-1, before any document is written | Q1 to Q8 | Every document depends on the answers. |
25
+ | When the owner gives the go-ahead for user acceptance testing (UAT) | Q9 | Hosting decisions made earlier are guesses; by UAT the application is real. |
26
+ | When the owner asks for a production deployment pipeline, after UAT | Q10 | Production secrets and infrastructure are decided by the people who run production. |
27
+
28
+ In YOLO mode the agent does not skip the day-1 questions; it takes the answer set's value where one exists and stops with a clear message where none does. A document written without a recorded answer is a defect.
29
+
30
+ ---
31
+
32
+ ## 3. The questions
33
+
34
+ **Q1. Configuration.** Where does non-secret configuration live, and how is it layered per environment?
35
+
36
+ **Q2. Secrets in development.** Where do secrets live on a developer machine, and what must never be committed?
37
+
38
+ **Q3. Database.** Which database engine in development and which in production? Is a container for the database acceptable, and under what condition? What does the agent do if the database is not reachable?
39
+
40
+ **Q4. Authentication and authorisation.** Which identity mechanism: a shared platform, the framework's built-in identity, an external provider, or none? Who owns roles, licences and subscriptions?
41
+
42
+ **Q5. Logging.** Which logging library, which sinks, and is file logging mandatory?
43
+
44
+ **Q6. Tests.** Which test framework? Is a test project mandatory from day one? Which categories of test are expected (unit, integration, browser)?
45
+
46
+ **Q7. Solution layout and naming.** Folder layout for source and tests; naming rule for the primary executable project and for secondary heads.
47
+
48
+ **Q8. User interface.** Which UI framework or component library for each kind of head (web, mobile, desktop)? Which rendering mode by default?
49
+
50
+ **Q9. Hosting and deployment.** Where does the application run, in what form (container, service, static files), and is there a deployment guidance document to follow? Is a deployment checklist required?
51
+
52
+ **Q10. Production secrets and pipeline.** Where do production secrets live, and how does the pipeline inject them?
53
+
54
+ **Q11. Standing rules and prohibitions.** Anything an agent must always or never do in this repository that is not already enforced by a hook. Recorded as a list; the framework treats each item as a rule and tracks whether it is honoured. Two rules are present by default in every project, whatever the stack, and an owner may remove them only by saying so:
55
+
56
+ 1. Log files are written under the build output folder, which is git-ignored. Never at the repository root.
57
+ 2. No unnecessary folders at the repository root (`data`, `database`, `scripts` and the like). Everything sits under the source folder or the tests folder according to what it belongs to.
58
+
59
+ ---
60
+
61
+ ## 4. Where the answers go
62
+
63
+ The Architecture document gains a section, **Stack Decisions**, placed first, one row per question:
64
+
65
+ | Q | Decision | Source | Date |
66
+ |---|---|---|---|
67
+ | Q1 | `appsettings.json` plus `appsettings.{Environment}.json` | answer set: DotNet | 2026-09-04 |
68
+ | Q3 | PostgreSQL in a container for development and production | owner, day-1 | 2026-09-04 |
69
+ | … | | | |
70
+
71
+ "Source" is either the answer set name or "owner" with the moment it was asked. Q9 and Q10 rows are added when they are answered; until then they read "not yet asked (UAT)" and "not yet asked (production)". The Coding Standards document references this section instead of restating it.
72
+
73
+ ---
74
+
75
+ ## 5. What this replaces
76
+
77
+ Before this document, the framework had one standing technology decision (Serilog file logging) written into the day-1 tasks, the BRD template and the Architecture template, and no place for any other. Projects therefore invented their own arrangements at build time; TfLens ended with settings in three places. This questionnaire moves every such decision to day-1 and to one recorded location.
@@ -1,7 +1,7 @@
1
1
  # {AppName} — project session memory (all harnesses)
2
2
 
3
3
  <!-- This file is COMMITTED (unlike CLAUDE.md, which is gitignored and imports it).
4
- OpenCode and Codex auto-load AGENTS.md; Claude Code loads it through CLAUDE.md's
4
+ OpenCode auto-loads AGENTS.md; Claude Code loads it through CLAUDE.md's
5
5
  @AGENTS.md import. Keep everything in here harness-neutral — Claude-only
6
6
  material (permissions, tool preference) lives in app-claude-md-tmpl.md. -->
7
7
 
@@ -13,9 +13,9 @@ ALWAYS read and follow:
13
13
 
14
14
  ## Hard rules (non-negotiable — the harness enforces #1)
15
15
 
16
- 1. **Git is manual — agents NEVER run `git` or `gh`.** Not to commit, and not to read (`status`/`log`/`diff`/`grep`/`blame`). All harnesses enforce this mechanically: Claude Code via `.claude/settings.json` and `block-git.sh`; OpenCode via `opencode.jsonc` plus its plugin bridge; Codex via `.codex/rules/techieflow.rules` plus `.codex/hooks.json`. A blocked git call is the policy working, not an obstacle to route around. Evidence for status updates / "what changed" = the checklist Requirements Status table + the working-tree files (+ mtimes) + a fresh `dotnet build` (`.tfcore/tasks/_status-update-gate.md`). The OWNER commits, in a separate terminal.
16
+ 1. **Git is manual — agents NEVER run `git` or `gh`.** Not to commit, and not to read (`status`/`log`/`diff`/`grep`/`blame`). All harnesses enforce this mechanically: Claude Code via `.claude/settings.json` and `block-git.sh`; OpenCode via `opencode.jsonc` plus its plugin bridge. A blocked git call is the policy working, not an obstacle to route around. Evidence for status updates / "what changed" = the checklist Requirements Status table + the working-tree files (+ mtimes) + a fresh `dotnet build` (`.tfcore/tasks/_status-update-gate.md`). The OWNER commits, in a separate terminal.
17
17
  2. **Run the app yourself — the test harness is fully set up.** Headless Playwright + Chromium live in WSL; the Windows/MAUI dotnet bridge is rung #4 of the build ladder; MAUI Android/iOS/Mac Catalyst are driven over the Appium bridge (`core-config.yaml → runtimeVerification.appium`). NEVER ask the owner to boot the app, run a build, or execute a command — "can't run on Linux/WSL", "it targets Windows", "it's MAUI", "Playwright needs a GUI", "the dependent service is down" are BANNED excuses (`.tfcore/tasks/_smoke-test-policy.md`). Asking the owner is the LAST resort, only after the build ladder + `verify-phase §3a` escalation genuinely fail — and even then you still run the test yourself once they reply.
18
- 3. **The framework tree is invisible to search — a search that finds nothing is NOT proof a file is missing.** `.tfcore/`, `.claude/`, `.codex/`, `.opencode/` and `.agents/skills/` are hidden dot-directories AND gitignored here (deliberate — deployed framework copies are never committed). File search skips hidden paths *and* honours `.gitignore`, so it takes **both** (`rg -uu`; `--hidden` alone is not enough), and `git grep`/`git ls-files` see nothing at all. Confirm a framework file by **reading its literal path** — every one has a single canonical location, and whatever needs it names that path. Never write "not present in this tree" into a verdict, a checklist Remarks cell, a BRD row, or a blocker without having tried the path and failed: that false negative propagates into the docs and the next agent treats it as fact. If a framework file really is absent, the repo needs `update-framework.sh <repo>` run once on this machine — report that instead of reimplementing what it does. (`.tfcore/tasks/_status-update-gate.md` §"The framework tree is INVISIBLE to search".)
18
+ 3. **The framework tree is invisible to search — a search that finds nothing is NOT proof a file is missing.** `.tfcore/`, `.claude/`, `.opencode/` and `.agents/skills/` are hidden dot-directories AND gitignored here (deliberate — deployed framework copies are never committed). File search skips hidden paths *and* honours `.gitignore`, so it takes **both** (`rg -uu`; `--hidden` alone is not enough), and `git grep`/`git ls-files` see nothing at all. Confirm a framework file by **reading its literal path** — every one has a single canonical location, and whatever needs it names that path. Never write "not present in this tree" into a verdict, a checklist Remarks cell, a BRD row, or a blocker without having tried the path and failed: that false negative propagates into the docs and the next agent treats it as fact. If a framework file really is absent, the repo needs `update-framework.sh <repo>` run once on this machine — report that instead of reimplementing what it does. (`.tfcore/tasks/_status-update-gate.md` §"The framework tree is INVISIBLE to search".)
19
19
  4. **Native-head automation binds to the app's own window.** Drive a MAUI head only through a session attached to the app under test (Windows: launched PID → its top-level window handle; Android/iOS/Catalyst: the app's package/bundle id), interact element-by-element via `AutomationId`, and NEVER inject global keyboard/mouse input — it lands in whatever window happens to have focus, not the app (`verify-phase.md §3b`).
20
20
 
21
21
  ## Project basics
@@ -41,7 +41,6 @@ never silently worked around.
41
41
 
42
42
  ## Slash-command syntax (READ ME if a `/agent *command` invocation fails)
43
43
 
44
- **Codex:** use repository skills such as `$techieflow-build`, `$techieflow-verify`, and `$techieflow-refresh-status`, or ask for the skill by name in plain language. Skills load the canonical `.tfcore/tasks/*.md` workflow. When a task calls for fan-out, delegate to the registered `tf_builder`, `tf_test_writer`, `tf_explorer`, `trblazeui`, or `techierag` Codex role and wait for its result. Defining a role alone does not authorize delegation; the user request or applicable skill must call for it. Project config and hooks require repository trust; review changed hooks with `/hooks`.
45
44
 
46
45
  **Claude Code** registers TechieFlow-native agents under the path-derived namespace `TechieFlow:agents:<name>`. The short `/<agent>` form does NOT always resolve. When in doubt use the full form:
47
46
 
@@ -1,127 +1,119 @@
1
- # {AppName} — Architecture
2
-
3
- **Last updated:** {YYYY-MM-DD}
4
- **Status:** Current (brownfield) | Target (greenfield) | Current + planned target (brownfield with structural change)
5
-
6
- <!-- AGENT-ONLY AUTHORING NOTES. Everything in this comment is an instruction to the DRAFTING
7
- AGENT, not content for the document's human reader. Carry it into the generated document
8
- ONLY as this HTML comment (or drop it entirely) — NEVER as visible text: the owner reads
9
- the rendered HTML and must not see authoring instructions (generate-html.md strips any
10
- that leaked from older templates).
11
-
12
- DEPTH MANDATE: this is a HUMAN document, read as rendered HTML. Module rows in §4 with
13
- non-trivial behavior get a prose paragraph beneath the table, and every significant runtime
14
- flow beyond §3's primary path (background jobs, ingestion pipelines, auth handshakes,
15
- external-API round-trips) gets its own sequenceDiagram/flowchart. When harvesting source
16
- docs, preserve their architecture content — superset, never summary.
17
-
18
- MERMAID MANDATE: every diagram MUST follow the authoring rules in
19
- .tfcore/templates/v4custom/html-render-shell.md §5.5 — quote every node/edge/subgraph label
20
- (API["ASP.NET API (v2)"], not API[ASP.NET API (v2)]) and never use `end` as a node id.
21
- Unquoted special characters ( ( ) / & : , … ) in flowchart labels are the #1 cause of
22
- "Syntax error" diagrams in the rendered HTML.
1
+ <!-- tf-schema
2
+ doc: architecture
3
+ file: docs/{App}-Architecture.md
4
+ header: App, Kind, Size, Stack answer set, Date
5
+ section: Stack decisions | required
6
+ section: Solution structure | required
7
+ section: Component map | required
8
+ section: Data model | required
9
+ section: Cross-cutting | required
10
+ section: Decisions log | required
11
+ section: Module responsibilities | optional-small
12
+ section: Open questions | optional
13
+ rule: stack-rows
14
+ rule: head-project
15
+ budget: S 2500 3500 | M 4000 6000 | L 4000 6000
16
+ rule: stack-table
17
+ rule: solution-table
18
+ rule: request-flow
19
+ rule: er-diagram
20
+ rule: decisions-log
23
21
  -->
22
+ <!-- Authoring notes (agent only; never visible text).
23
+ Sections and order are fixed by the schema above. The Stack decisions table answers the stack
24
+ questions (.tfcore/templates/stack-questions.md); answers taken from an answer set cite it.
25
+ No Deployment section: hosting is decided after UAT and lives in the Deployment Checklist; how a
26
+ developer runs the app lives in the UsageGuide. Detailed per-screen flows live in the DevGuide.
27
+ A brownfield project describes the code as it is; a planned change is a Decisions log row with
28
+ Status "planned" naming the BRD item that drives it.
29
+ Mermaid: quote every label; never use `end` as a node id. -->
30
+
31
+ # {App} — Architecture
32
+
33
+ | | |
34
+ |---|---|
35
+ | App | {App} |
36
+ | Kind | app or library |
37
+ | Size | Small, Medium or Large |
38
+ | Stack answer set | {name, or "none"} |
39
+ | Date | {YYYY-MM-DD} |
40
+
41
+ ## 1. Stack decisions
42
+
43
+ One row per stack question. "Source" says where the answer came from: the answer set, the owner, or the existing code.
44
+
45
+ | Q | Topic | Decision | Source |
46
+ |---|---|---|---|
47
+ | Q1 | Configuration | {…} | {answer set / owner / code} |
48
+ | Q2 | Secrets in development | {…} | {…} |
49
+ | Q3 | Database | {…} | {…} |
50
+ | Q4 | Authentication | {…} | {…} |
51
+ | Q5 | Logging | {…} | {…} |
52
+ | Q6 | Tests | {…} | {…} |
53
+ | Q7 | Layout and naming | {…} | {…} |
54
+ | Q8 | User interface | {…} | {…} |
55
+ | Q11 | Standing rules | {…} | {…} |
56
+
57
+ ## 2. Solution structure
58
+
59
+ | Project | Kind | Purpose |
60
+ |---|---|---|
61
+ | `{App}` | {web app, desktop app, API, …} | {the primary head} |
62
+ | `{App}.Core` | class library | {…} |
63
+ | `{App}Db` | migrations project | {…} |
64
+ | `{App}.Tests` | test project | {…} |
65
+
66
+ ## 3. Component map
24
67
 
25
- ## Table of Contents
26
-
27
- <!-- Auto-maintained by the analyst/day-1 tasks. Use the slug rule from .tfcore/templates/v4custom/html-render-shell.md §1 so links work in both MD and rendered HTML. Update this list whenever you add/rename a section. -->
28
-
29
- 1. [Tech stack](#tech-stack)
30
- 2. [Component map](#component-map)
31
- 3. [Data flow — primary path](#data-flow-primary-path)
32
- 4. [Module responsibilities](#module-responsibilities)
33
- 5. [Cross-cutting concerns](#cross-cutting-concerns)
34
- 6. [Deployment architecture](#deployment-architecture)
35
- 7. [Architectural decisions (ADR-style log)](#architectural-decisions-adr-style-log)
36
- 8. [Target architecture (brownfield only — if enhancement changes structure)](#target-architecture-brownfield-only-if-enhancement-changes-structure)
37
- 9. [Open questions / risks](#open-questions-risks)
38
-
39
- ## 1. Tech stack
40
- | Layer | Choice | Version | Notes |
41
- |-------|--------|---------|-------|
42
- | Runtime | .NET 9 | … | … |
43
- | UI | Blazor [Server/WASM/Auto] + TrBlazeUI | … | … |
44
- | AI/RAG | TechieRag | … | If applicable |
45
- | DB | SQL Server / SQLite / Postgres | … | … |
46
- | Vector store | SqliteVec / PgVector / Qdrant | … | If RAG |
47
- | Auth | … | … | … |
48
-
49
- ## 2. Component map
50
68
  ```mermaid
51
69
  flowchart TB
52
- subgraph UI["Blazor UI"]
53
- Dash["Dashboard"]
54
- Settings["Settings"]
55
- end
56
- subgraph BE["Backend"]
57
- API["API"]
58
- Auth["Auth"]
59
- Rag["RAG service"]
60
- end
61
- subgraph Data["Data"]
62
- SQL[("SQL")]
63
- Vec[("Vector")]
64
- end
65
- UI --> API
66
- API --> Auth
67
- API --> Rag
68
- Rag --> Vec
69
- API --> SQL
70
+ UI["UI"] --> Svc["Services"]
71
+ Svc --> Data["Data access"]
72
+ Data --> DB[("Database")]
70
73
  ```
71
74
 
72
- ## 3. Data flow — primary path
73
- ```mermaid
74
- sequenceDiagram
75
- actor U
76
- participant UI
77
- participant API
78
- participant Svc as Service
79
- participant DB
80
- U->>UI: action
81
- UI->>API: HTTPS
82
- API->>Svc: call
83
- Svc->>DB: query
84
- DB-->>Svc: rows
85
- Svc-->>API: dto
86
- API-->>UI: json
87
- UI-->>U: render
88
- ```
75
+ **How a request travels** (one typical request, in words; per-screen detail is in the DevGuide):
76
+ 1. {The page calls …}
77
+ 2. {The service …}
78
+ 3. {The data access …}
79
+ 4. {The result is shown …}
80
+
81
+ ## 4. Data model
89
82
 
90
- ## 4. Module responsibilities
91
- | Module | Responsibility | Depends on |
92
- |--------|----------------|------------|
93
- | `src/{AppName}.Web` | UI host | Domain, Infra |
94
- | `src/{AppName}.Domain` | Entities, business rules | (none) |
95
- | `src/{AppName}.Infrastructure` | EF, external services | Domain |
96
- | `src/{AppName}.Rag` | TechieRag wiring (if applicable) | Domain |
97
-
98
- ## 5. Cross-cutting concerns
99
- - Logging — Serilog file-based logging (rolling file sink under `logs/`, wired at startup in EVERY executable head — web, API, MAUI, desktop, console; app code logs via `ILogger<T>`). This is a TechieFlow standing requirement, not a per-app choice — see Coding Standards §Logging.
100
- - Error handling — global middleware; ProblemDetails responses
101
- - Auth — JWT / cookie / Azure AD
102
- - Caching — IMemoryCache / Redis
103
- - Telemetry — OpenTelemetry / Application Insights
104
-
105
- ## 6. Deployment architecture
106
83
  ```mermaid
107
- flowchart LR
108
- Dev["Dev"] --> CI["GitHub Actions"]
109
- CI --> Reg["Container Reg"]
110
- Reg --> AKS["Azure App Service / AKS"]
111
- AKS --> ProdDB[("SQL")]
84
+ erDiagram
85
+ USER ||--o{ ENTRY : writes
86
+ ENTRY {
87
+ int EntryId PK
88
+ string Title
89
+ }
112
90
  ```
113
91
 
114
- ## 7. Architectural decisions (ADR-style log)
115
- - **ADR-001 — <decision>.** Reason: …
116
- - **ADR-002 — <decision>.** Reason: …
92
+ | Entity | Key fields | Notes |
93
+ |---|---|---|
94
+ | {Entity} | {…} | {…} |
117
95
 
118
- ## 8. Target architecture (brownfield only — if enhancement changes structure)
119
- ```mermaid
120
- flowchart TB
121
- Existing["existing module"] --> New["new / changed module"]
122
- New --> Removed["removed box (struck through in prose)"]
123
- ```
124
- Describe deltas: what's added, what's removed, what's renamed, migration path.
96
+ ## 5. Cross-cutting
97
+
98
+ - **Identity:** {AppManager API, or the mechanism chosen at Q4}.
99
+ - **Configuration:** {…}
100
+ - **Logging:** {…}
101
+ - **Errors:** {…}
102
+
103
+ ## 6. Decisions log
104
+
105
+ One row per decision. Every package added to the project has a row saying why.
106
+
107
+ | Date | Decision | Why | Status |
108
+ |---|---|---|---|
109
+ | {YYYY-MM-DD} | {…} | {…} | decided, planned, done |
110
+
111
+ ## 7. Module responsibilities
112
+
113
+ | Module | Responsibility | Depends on |
114
+ |---|---|---|
115
+ | {…} | {…} | {…} |
116
+
117
+ ## 8. Open questions
125
118
 
126
- ## 9. Open questions / risks
127
- - …
119
+ - {…}