formwork-kit 0.1.0__py3-none-any.whl
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.
- formwork_cli/__init__.py +326 -0
- formwork_cli/kit/COSTS.md +111 -0
- formwork_cli/kit/adapters/claude-code/README.md +53 -0
- formwork_cli/kit/adapters/claude-code/settings.json +46 -0
- formwork_cli/kit/adapters/codex/README.md +43 -0
- formwork_cli/kit/adapters/cursor/README.md +45 -0
- formwork_cli/kit/adapters/gemini-cli/README.md +47 -0
- formwork_cli/kit/build +410 -0
- formwork_cli/kit/check/checks/config-shape +123 -0
- formwork_cli/kit/check/checks/decision-ids +159 -0
- formwork_cli/kit/check/checks/doc-links +133 -0
- formwork_cli/kit/check/checks/generated-current +74 -0
- formwork_cli/kit/check/checks/guard-wired +139 -0
- formwork_cli/kit/check/checks/kit-integrity +199 -0
- formwork_cli/kit/check/checks/predictions-first +127 -0
- formwork_cli/kit/check/checks/role-shape +172 -0
- formwork_cli/kit/check/checks/rule-labels +135 -0
- formwork_cli/kit/check/fixtures/config-shape/must-fail/documents-a-section-that-does-not-exist/.formwork.toml +5 -0
- formwork_cli/kit/check/fixtures/config-shape/must-fail/documents-a-section-that-does-not-exist/formwork/guide.md +13 -0
- formwork_cli/kit/check/fixtures/config-shape/must-fail/rules-as-a-switchboard/.formwork.toml +8 -0
- formwork_cli/kit/check/fixtures/config-shape/must-pass/layers-kept-apart/.formwork.toml +5 -0
- formwork_cli/kit/check/fixtures/decision-ids/must-fail/a-placeholder-shipped/docs/decisions/0003-still-pending.md +7 -0
- formwork_cli/kit/check/fixtures/decision-ids/must-fail/superseded-by-nothing/docs/decisions/0002-old.md +6 -0
- formwork_cli/kit/check/fixtures/decision-ids/must-fail/two-decisions-one-number/docs/decisions/0007-first.md +6 -0
- formwork_cli/kit/check/fixtures/decision-ids/must-fail/two-decisions-one-number/docs/decisions/0007-second.md +6 -0
- formwork_cli/kit/check/fixtures/decision-ids/must-pass/clean-numbering/docs/decisions/0001-the-first.md +6 -0
- formwork_cli/kit/check/fixtures/decision-ids/must-pass/clean-numbering/docs/decisions/0002-the-second.md +6 -0
- formwork_cli/kit/check/fixtures/decision-ids/must-pass/clean-numbering/docs/decisions/0003-the-third.md +6 -0
- formwork_cli/kit/check/fixtures/decision-ids/must-pass/nothing-recorded-yet/docs/decisions/README.md +3 -0
- formwork_cli/kit/check/fixtures/doc-links/must-fail/never-written/index.md +7 -0
- formwork_cli/kit/check/fixtures/doc-links/must-fail/renamed-file/architecture-notes.md +3 -0
- formwork_cli/kit/check/fixtures/doc-links/must-fail/renamed-file/guide.md +8 -0
- formwork_cli/kit/check/fixtures/doc-links/must-pass/links-resolve/architecture-notes.md +1 -0
- formwork_cli/kit/check/fixtures/doc-links/must-pass/links-resolve/guide.md +5 -0
- formwork_cli/kit/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/.claude/agents/sample.md +22 -0
- formwork_cli/kit/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/.codex/agents/sample.toml +22 -0
- formwork_cli/kit/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/.formwork.toml +1 -0
- formwork_cli/kit/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/.gemini/agents/sample.md +23 -0
- formwork_cli/kit/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/formwork/build +349 -0
- formwork_cli/kit/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/formwork/roles/method/sample.md +18 -0
- formwork_cli/kit/check/fixtures/generated-current/must-pass/generated-and-current/.claude/agents/sample.md +20 -0
- formwork_cli/kit/check/fixtures/generated-current/must-pass/generated-and-current/.codex/agents/sample.toml +22 -0
- formwork_cli/kit/check/fixtures/generated-current/must-pass/generated-and-current/.formwork.toml +1 -0
- formwork_cli/kit/check/fixtures/generated-current/must-pass/generated-and-current/.gemini/agents/sample.md +23 -0
- formwork_cli/kit/check/fixtures/generated-current/must-pass/generated-and-current/formwork/build +349 -0
- formwork_cli/kit/check/fixtures/generated-current/must-pass/generated-and-current/formwork/roles/method/sample.md +18 -0
- formwork_cli/kit/check/fixtures/generated-current/must-pass/nothing-is-generated-here/README.md +3 -0
- formwork_cli/kit/check/fixtures/guard-wired/must-fail/declared-but-no-file/.formwork.toml +1 -0
- formwork_cli/kit/check/fixtures/guard-wired/must-fail/file-but-not-wired/.claude/settings.json +1 -0
- formwork_cli/kit/check/fixtures/guard-wired/must-fail/file-but-not-wired/.formwork.toml +1 -0
- formwork_cli/kit/check/fixtures/guard-wired/must-pass/declared-and-wired/.claude/settings.json +1 -0
- formwork_cli/kit/check/fixtures/guard-wired/must-pass/declared-and-wired/.formwork.toml +1 -0
- formwork_cli/kit/check/fixtures/guard-wired/must-pass/nothing-declared/README.md +1 -0
- formwork_cli/kit/check/fixtures/kit-integrity/must-fail/a-check-went-missing/formwork/check/checks/still-here +2 -0
- formwork_cli/kit/check/fixtures/kit-integrity/must-fail/a-check-went-missing/state/fingerprints.txt +2 -0
- formwork_cli/kit/check/fixtures/kit-integrity/must-fail/a-guard-was-altered/formwork/guard/git-boundary +3 -0
- formwork_cli/kit/check/fixtures/kit-integrity/must-fail/a-guard-was-altered/state/fingerprints.txt +1 -0
- formwork_cli/kit/check/fixtures/kit-integrity/must-pass/everything-matches/formwork/guard/git-boundary +2 -0
- formwork_cli/kit/check/fixtures/kit-integrity/must-pass/everything-matches/state/fingerprints.txt +1 -0
- formwork_cli/kit/check/fixtures/predictions-first/must-fail/argued-with-no-predictions/docs/rounds/0004-the-storage-question/architect.md +3 -0
- formwork_cli/kit/check/fixtures/predictions-first/must-fail/argued-with-no-predictions/docs/rounds/0004-the-storage-question/researcher.md +3 -0
- formwork_cli/kit/check/fixtures/predictions-first/must-fail/argued-with-no-predictions/docs/rounds/0004-the-storage-question/round.md +4 -0
- formwork_cli/kit/check/fixtures/predictions-first/must-pass/a-round-that-has-not-argued-yet/docs/rounds/0006-not-started/round.md +3 -0
- formwork_cli/kit/check/fixtures/predictions-first/must-pass/no-rounds-at-all/docs/README.md +3 -0
- formwork_cli/kit/check/fixtures/predictions-first/must-pass/predictions-on-record/docs/rounds/0005-the-shape-of-a-brief/architect.md +3 -0
- formwork_cli/kit/check/fixtures/predictions-first/must-pass/predictions-on-record/docs/rounds/0005-the-shape-of-a-brief/predictions.md +4 -0
- formwork_cli/kit/check/fixtures/predictions-first/must-pass/predictions-on-record/docs/rounds/0005-the-shape-of-a-brief/researcher.md +3 -0
- formwork_cli/kit/check/fixtures/role-shape/must-fail/claims-a-grant-binds-everywhere/formwork/roles/README.md +6 -0
- formwork_cli/kit/check/fixtures/role-shape/must-fail/claims-a-grant-binds-everywhere/formwork/roles/complete.md +18 -0
- formwork_cli/kit/check/fixtures/role-shape/must-fail/missing-a-section/formwork/roles/vague.md +16 -0
- formwork_cli/kit/check/fixtures/role-shape/must-fail/spawn-without-being-lead/formwork/roles/eager.md +18 -0
- formwork_cli/kit/check/fixtures/role-shape/must-fail/two-roles-one-job/formwork/roles/first.md +18 -0
- formwork_cli/kit/check/fixtures/role-shape/must-fail/two-roles-one-job/formwork/roles/second.md +18 -0
- formwork_cli/kit/check/fixtures/role-shape/must-pass/well-formed/formwork/roles/complete.md +18 -0
- formwork_cli/kit/check/fixtures/rule-labels/must-fail/claims-enforcement-that-does-not-exist/formwork/rules/core.md +9 -0
- formwork_cli/kit/check/fixtures/rule-labels/must-fail/no-catches/formwork/rules/core.md +9 -0
- formwork_cli/kit/check/fixtures/rule-labels/must-fail/unlabelled/formwork/rules/core.md +7 -0
- formwork_cli/kit/check/fixtures/rule-labels/must-pass/well-formed/formwork/rules/core.md +10 -0
- formwork_cli/kit/check/run +340 -0
- formwork_cli/kit/check/test_gate.py +222 -0
- formwork_cli/kit/first-run.md +204 -0
- formwork_cli/kit/fw +121 -0
- formwork_cli/kit/glossary.md +160 -0
- formwork_cli/kit/guard/git-boundary +627 -0
- formwork_cli/kit/guard/protected-files +748 -0
- formwork_cli/kit/guard/quality-gate +260 -0
- formwork_cli/kit/guard/test_boundary.py +273 -0
- formwork_cli/kit/guard/test_protection.py +254 -0
- formwork_cli/kit/guard/test_quality_gate.py +156 -0
- formwork_cli/kit/install +395 -0
- formwork_cli/kit/limits.md +141 -0
- formwork_cli/kit/loop.md +82 -0
- formwork_cli/kit/roles/HOW-TO-ADD-A-ROLE.md +105 -0
- formwork_cli/kit/roles/TEMPLATE.md +26 -0
- formwork_cli/kit/roles/method/architect.md +269 -0
- formwork_cli/kit/roles/method/challenger.md +243 -0
- formwork_cli/kit/roles/method/lead.md +280 -0
- formwork_cli/kit/roles/method/record-keeper.md +206 -0
- formwork_cli/kit/roles/method/researcher.md +246 -0
- formwork_cli/kit/roles/method/reviewer.md +207 -0
- formwork_cli/kit/roles/packs/accessibility.md +236 -0
- formwork_cli/kit/roles/packs/ai.md +248 -0
- formwork_cli/kit/roles/packs/analyst.md +233 -0
- formwork_cli/kit/roles/packs/backend.md +425 -0
- formwork_cli/kit/roles/packs/brainstormer.md +190 -0
- formwork_cli/kit/roles/packs/data.md +212 -0
- formwork_cli/kit/roles/packs/devops.md +203 -0
- formwork_cli/kit/roles/packs/frontend.md +224 -0
- formwork_cli/kit/roles/packs/integrations.md +215 -0
- formwork_cli/kit/roles/packs/legal.md +251 -0
- formwork_cli/kit/roles/packs/marketing.md +206 -0
- formwork_cli/kit/roles/packs/mobile.md +202 -0
- formwork_cli/kit/roles/packs/performance.md +192 -0
- formwork_cli/kit/roles/packs/product.md +217 -0
- formwork_cli/kit/roles/packs/security.md +267 -0
- formwork_cli/kit/roles/packs/sre.md +203 -0
- formwork_cli/kit/roles/packs/tester.md +246 -0
- formwork_cli/kit/roles/packs/user-researcher.md +218 -0
- formwork_cli/kit/roles/packs/ux.md +205 -0
- formwork_cli/kit/roles/packs/visual.md +199 -0
- formwork_cli/kit/roles/packs/writer.md +198 -0
- formwork_cli/kit/round.md +131 -0
- formwork_cli/kit/rules/core.md +195 -0
- formwork_cli/kit/rules/full.md +493 -0
- formwork_cli/kit/templates/brief.md +68 -0
- formwork_cli/kit/templates/decision.md +93 -0
- formwork_cli/kit/templates/predictions.md +54 -0
- formwork_cli/kit/templates/report.md +52 -0
- formwork_cli/kit/templates/round.md +77 -0
- formwork_cli/kit/test_install.py +165 -0
- formwork_cli/kit/troubleshooting.md +247 -0
- formwork_cli/kit-page/FORMWORK.md +182 -0
- formwork_kit-0.1.0.dist-info/METADATA +308 -0
- formwork_kit-0.1.0.dist-info/RECORD +137 -0
- formwork_kit-0.1.0.dist-info/WHEEL +4 -0
- formwork_kit-0.1.0.dist-info/entry_points.txt +2 -0
- formwork_kit-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# When something goes wrong
|
|
2
|
+
|
|
3
|
+
Find the message you saw. Every entry says what happened, why, and what to do.
|
|
4
|
+
|
|
5
|
+
> [!TIP]
|
|
6
|
+
> **`command not found: formwork`?**
|
|
7
|
+
>
|
|
8
|
+
> Everything on this page also works with `formwork/fw` from the top of your
|
|
9
|
+
> project, and that needs nothing installed:
|
|
10
|
+
>
|
|
11
|
+
> ```
|
|
12
|
+
> formwork/fw check
|
|
13
|
+
> formwork/fw record
|
|
14
|
+
> ```
|
|
15
|
+
>
|
|
16
|
+
> **If you did install it and still get this**, pip put the command somewhere
|
|
17
|
+
> your shell does not look. It says so in a warning when it installs. Add that
|
|
18
|
+
> folder to your PATH, or use `pipx install formwork-kit` instead, which
|
|
19
|
+
> handles this for you.
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
If your problem is not here, it belongs here. Open an issue with the exact
|
|
24
|
+
message and it will be added.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## The gate is red
|
|
29
|
+
|
|
30
|
+
### `kit-integrity: N protected file(s) differ from the record`
|
|
31
|
+
|
|
32
|
+
**What happened.** A file that enforces something has changed since the last
|
|
33
|
+
time you recorded it.
|
|
34
|
+
|
|
35
|
+
**Why.** Either you changed it on purpose, or something else did.
|
|
36
|
+
|
|
37
|
+
**What to do.** Look at what changed first:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
git diff <the file it named>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
If you meant it, record the new state:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
formwork record
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Why you and not the agent.** Recording says every one of these files is as
|
|
50
|
+
you intend it. An agent that could do that could change a guard and then tell
|
|
51
|
+
the kit it was fine.
|
|
52
|
+
|
|
53
|
+
### `no fingerprints recorded at ~/.formwork/fingerprints.txt`
|
|
54
|
+
|
|
55
|
+
**What happened.** There is no record to compare against.
|
|
56
|
+
|
|
57
|
+
**Why.** A fresh machine, a fresh clone, or you moved `FORMWORK_STATE_DIR`.
|
|
58
|
+
|
|
59
|
+
The record lives outside your project, one file per project, in
|
|
60
|
+
`~/.formwork/fingerprints/`. It does not travel with a clone, which is the
|
|
61
|
+
point: a record kept beside the thing it describes protects nothing.
|
|
62
|
+
|
|
63
|
+
**What to do.** Run the installer again. It takes the first record for you:
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
formwork install --runtime claude-code
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### `guard-wired: runtime 'X' is declared, but .../hooks.json does not exist`
|
|
70
|
+
|
|
71
|
+
**What happened.** Your settings say you use tool X, and the hooks for X are
|
|
72
|
+
not wired up.
|
|
73
|
+
|
|
74
|
+
**Why.** The kit ships a wiring file for Claude Code only.
|
|
75
|
+
|
|
76
|
+
**What to do.** Open your agent's page in `formwork/adapters/`. It says what to
|
|
77
|
+
put in that file. Red is correct until then: nothing is guarding you yet.
|
|
78
|
+
|
|
79
|
+
### `doc-links: N link(s) point at nothing`
|
|
80
|
+
|
|
81
|
+
**What happened.** A markdown link points at a file that is not there.
|
|
82
|
+
|
|
83
|
+
**What to do.** Fix the link or create the file. The message gives you the file
|
|
84
|
+
and the line number.
|
|
85
|
+
|
|
86
|
+
### `generated-current: N generated file(s) are not current`
|
|
87
|
+
|
|
88
|
+
**What happened.** You edited a role, or edited a generated copy by hand, or
|
|
89
|
+
deleted a role and left its copy behind.
|
|
90
|
+
|
|
91
|
+
**What to do.**
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
formwork roles
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**If you edited a generated file by hand**, move your change into the source
|
|
98
|
+
file in `formwork/roles/` first. The next regeneration will throw your edit
|
|
99
|
+
away.
|
|
100
|
+
|
|
101
|
+
**If you deleted a role**, `formwork roles` will not clean up after you. Delete
|
|
102
|
+
the generated copy too, then run it:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
rm .claude/agents/<the role>.md
|
|
106
|
+
formwork roles
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### `role-shape: N problem(s) across N role(s)`
|
|
110
|
+
|
|
111
|
+
**What happened.** A role is missing something, or two roles claim the same
|
|
112
|
+
job.
|
|
113
|
+
|
|
114
|
+
**What to do.** The message names the file and the problem. Every role needs
|
|
115
|
+
four frontmatter fields and five sections. Copy `formwork/roles/TEMPLATE.md` if
|
|
116
|
+
you are unsure.
|
|
117
|
+
|
|
118
|
+
### `N check(s) present but not executable`
|
|
119
|
+
|
|
120
|
+
**What happened.** A check file lost its execute permission.
|
|
121
|
+
|
|
122
|
+
**What to do.**
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
chmod +x formwork/check/checks/*
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Why this stops everything.** A check that cannot run has not passed. Before
|
|
129
|
+
this was caught, the gate reported green while quietly skipping it.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## A command was refused
|
|
134
|
+
|
|
135
|
+
### `REFUSED by the version-control boundary`
|
|
136
|
+
|
|
137
|
+
**What happened.** The agent tried to commit, push, merge or something like it.
|
|
138
|
+
|
|
139
|
+
**This is working correctly.** You do those, not the agent.
|
|
140
|
+
|
|
141
|
+
**What to do.** Run the command yourself.
|
|
142
|
+
|
|
143
|
+
**If it refused something read-only**, that is a bug and worth reporting. The
|
|
144
|
+
guard should allow anything that only looks.
|
|
145
|
+
|
|
146
|
+
**To turn it off for one session:**
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
FORMWORK_GIT_BOUNDARY=off
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### `REFUSED by self-protection`
|
|
153
|
+
|
|
154
|
+
**What happened.** Something tried to change a file that enforces a rule.
|
|
155
|
+
|
|
156
|
+
**What to do.** If you meant it, make the change yourself in your editor, then
|
|
157
|
+
record the new state with `kit-integrity --record .`.
|
|
158
|
+
|
|
159
|
+
**To turn it off for one session:**
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
FORMWORK_PROTECT_FILES=warn
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### `REFUSED: the aggregate is red, so this turn cannot conclude`
|
|
166
|
+
|
|
167
|
+
**What happened.** The gate is red and the turn tried to end.
|
|
168
|
+
|
|
169
|
+
**What to do.** Read what the gate said and fix that.
|
|
170
|
+
|
|
171
|
+
**It gives up after three.** Then it stands aside and says so in capitals, so
|
|
172
|
+
a stuck turn is not stuck for ever.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## The installer
|
|
177
|
+
|
|
178
|
+
### `Cannot tell which runtime this project uses`
|
|
179
|
+
|
|
180
|
+
**What happened.** There is no `.claude`, `.codex`, `.cursor` or `.gemini`
|
|
181
|
+
folder, so it cannot guess.
|
|
182
|
+
|
|
183
|
+
**What to do.** Tell it:
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
formwork install --runtime claude-code
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### `more than one runtime is set up here`
|
|
190
|
+
|
|
191
|
+
**What happened.** You have folders for several tools.
|
|
192
|
+
|
|
193
|
+
**What to do.** Same as above. Say which one.
|
|
194
|
+
|
|
195
|
+
### `NOT FINISHED` after installing
|
|
196
|
+
|
|
197
|
+
**What happened.** It did what it could and stopped.
|
|
198
|
+
|
|
199
|
+
**What to do.** Read the list it printed. It names the file you need to write
|
|
200
|
+
and the page that tells you what goes in it.
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Nothing is being blocked at all
|
|
205
|
+
|
|
206
|
+
**Check the hooks are wired.**
|
|
207
|
+
|
|
208
|
+
```
|
|
209
|
+
formwork check
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
If `guard-wired` passes, the hooks are in place.
|
|
213
|
+
|
|
214
|
+
**Check the strength setting.** Look in `.formwork.toml`. If it says `warn` or
|
|
215
|
+
`off`, that is why.
|
|
216
|
+
|
|
217
|
+
**Check your shell.** An environment variable overrides the file:
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
echo $FORMWORK_GIT_BOUNDARY $FORMWORK_PROTECT_FILES $FORMWORK_GATE
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**Check your tool.** Only Claude Code has been watched refusing a real command.
|
|
224
|
+
On the other three, wiring is documented and untried.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Something is being blocked that should not be
|
|
229
|
+
|
|
230
|
+
**This matters as much as the opposite.** A guard that is wrong about ordinary
|
|
231
|
+
work gets switched off, and then nothing is guarded. Report it: the command you
|
|
232
|
+
ran is all anybody needs.
|
|
233
|
+
|
|
234
|
+
Meanwhile:
|
|
235
|
+
|
|
236
|
+
```
|
|
237
|
+
FORMWORK_GIT_BOUNDARY=off
|
|
238
|
+
FORMWORK_PROTECT_FILES=off
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## Nothing here matches
|
|
244
|
+
|
|
245
|
+
Run `formwork check` and `formwork demo`. If both look right and the problem
|
|
246
|
+
is still there, it is probably a real bug. Open an issue with the exact message
|
|
247
|
+
and what you ran.
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# Formwork
|
|
2
|
+
|
|
3
|
+
A way of running a project with coding agents.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## The loop
|
|
8
|
+
|
|
9
|
+
Everything is one loop. Only the size changes.
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
BRIEF → WORK → CHECK → REPORT → STOP → you say go → BRIEF …
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
| Size | How long | The brief is | The report is |
|
|
16
|
+
|---|---|---|---|
|
|
17
|
+
| task | minutes | one line | files changed, check result |
|
|
18
|
+
| checkpoint | one sitting | six headings | the full list |
|
|
19
|
+
| round | hours to days | a question per role | a round record |
|
|
20
|
+
| phase | weeks | what it settles | one document |
|
|
21
|
+
| milestone | months | a direction | — |
|
|
22
|
+
|
|
23
|
+
Each one answers four questions: what it produces, what must be true before it
|
|
24
|
+
starts, who says go, and **what would tell us it failed.**
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## What is blocked
|
|
29
|
+
|
|
30
|
+
These do not ask you. They refuse.
|
|
31
|
+
|
|
32
|
+
| Rule | Enforced by |
|
|
33
|
+
|---|---|
|
|
34
|
+
| The agent never writes to version control | `formwork/guard/git-boundary` |
|
|
35
|
+
| One command runs every check | `formwork check` |
|
|
36
|
+
| Every check ships with an input that breaks it | `formwork check` |
|
|
37
|
+
| Every rule is labelled, and names a real check | `formwork/check/checks/rule-labels` |
|
|
38
|
+
| Documents link only to files that exist | `formwork/check/checks/doc-links` |
|
|
39
|
+
| A declared runtime is actually wired up | `formwork/check/checks/guard-wired` |
|
|
40
|
+
| The agent does not quietly alter the kit's own files | `formwork/guard/protected-files` |
|
|
41
|
+
| A turn does not end while the aggregate is red | `formwork/guard/quality-gate` |
|
|
42
|
+
|
|
43
|
+
> [!NOTE]
|
|
44
|
+
> **The last one refuses three times in a session, then stands aside**, so a
|
|
45
|
+
> genuinely stuck turn is not trapped for ever. Change it with `gate_budget`.
|
|
46
|
+
|
|
47
|
+
Run them:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
formwork check everything, on your project
|
|
51
|
+
formwork demo watch each check refuse a broken input
|
|
52
|
+
formwork check --list what exists
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**If you did not install the command**, every one of these works by path
|
|
56
|
+
instead: `formwork/fw check`, `formwork/fw demo`, `formwork/fw roles`. Run
|
|
57
|
+
`formwork/fw` on its own to see the list.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## What is advice
|
|
62
|
+
|
|
63
|
+
Everything else. **46 rules**, in two files.
|
|
64
|
+
|
|
65
|
+
- `formwork/rules/core.md` — 13. You meet these every day.
|
|
66
|
+
- `formwork/rules/full.md` — 33. Read one when you hit the situation it covers.
|
|
67
|
+
|
|
68
|
+
> [!TIP]
|
|
69
|
+
> Every rule says what it catches. None of them tells you a story, because the
|
|
70
|
+
> stories belong to somebody else's project.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Some of this will look like fussiness
|
|
75
|
+
|
|
76
|
+
Several of these rules were learned from failures you have not had.
|
|
77
|
+
|
|
78
|
+
Each one states what it catches. **If you never hit that, delete it** from
|
|
79
|
+
`formwork/rules/core.md`, so losing a rule is a line in your version control
|
|
80
|
+
with your name on it.
|
|
81
|
+
|
|
82
|
+
There is no `[rules]` switch in `.formwork.toml`, and a check refuses one if you
|
|
83
|
+
add it. A rule switched off in a settings file disappears quietly. A rule
|
|
84
|
+
deleted from the rules file does not.
|
|
85
|
+
|
|
86
|
+
A rule you follow without understanding gets dropped quietly later anyway.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Settings
|
|
91
|
+
|
|
92
|
+
This is the whole file, and the installer writes it for you:
|
|
93
|
+
|
|
94
|
+
```toml
|
|
95
|
+
[bindings]
|
|
96
|
+
runtime = "claude-code" # which tool you use
|
|
97
|
+
|
|
98
|
+
[strength]
|
|
99
|
+
git_boundary = "block" # block | warn | off
|
|
100
|
+
protect_files = "block" # block | warn | off
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
`[strength]` tunes how hard the enforced guards bite. `[bindings]` is your
|
|
104
|
+
setup. There is no third section: see above.
|
|
105
|
+
|
|
106
|
+
**Two more keys exist and both live in `[strength]`:**
|
|
107
|
+
|
|
108
|
+
```toml
|
|
109
|
+
aggregate_gate = "block" # block | warn | off. The turn-end gate
|
|
110
|
+
gate_budget = 3 # how many times it refuses before standing aside
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
For one session only:
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
FORMWORK_GIT_BOUNDARY=off
|
|
117
|
+
FORMWORK_PROTECT_FILES=warn
|
|
118
|
+
FORMWORK_GATE=off
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Your team
|
|
124
|
+
|
|
125
|
+
`formwork/roles/` holds 27 roles. Six run the method. Twenty-one do the work,
|
|
126
|
+
grouped into packs.
|
|
127
|
+
|
|
128
|
+
**All of them are available. There is no switch yet**, and this page says so
|
|
129
|
+
rather than describing one that does not exist.
|
|
130
|
+
|
|
131
|
+
Adding your own is copying `TEMPLATE.md`, filling in five sections and four
|
|
132
|
+
frontmatter fields. A role missing any of them does not load.
|
|
133
|
+
|
|
134
|
+
The installer generates them for your runtime. To regenerate after an edit:
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
formwork roles
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## What it cannot do
|
|
143
|
+
|
|
144
|
+
The guards are pattern matching over a command line. They stop the ordinary
|
|
145
|
+
path and not a determined one.
|
|
146
|
+
|
|
147
|
+
[`formwork/limits.md`](formwork/limits.md) lists exactly what got past an audit, what
|
|
148
|
+
was closed afterwards, and what cannot be closed this way. Read it before
|
|
149
|
+
trusting any of this further than it deserves.
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Two things here you will not find elsewhere
|
|
154
|
+
|
|
155
|
+
**A check that refuses rather than advises.** Most tooling tells you something
|
|
156
|
+
is wrong and lets the work continue. This stops the turn.
|
|
157
|
+
|
|
158
|
+
**Rules about what counts as evidence.** A figure is reported together with the
|
|
159
|
+
command behind it. Anything unmeasured says so in capitals. A check that nobody has
|
|
160
|
+
watched fail is not treated as proof of anything.
|
|
161
|
+
|
|
162
|
+
Both came out of real use. Neither has been tried by anybody else yet, and the
|
|
163
|
+
kit would rather say that than imply a crowd that does not exist.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## What it costs
|
|
168
|
+
|
|
169
|
+
Nobody has measured what one round costs in money. Not once. `formwork/COSTS.md`
|
|
170
|
+
says so plainly, gives the part that can be measured for free, and says what
|
|
171
|
+
would establish the rest.
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Where to start
|
|
176
|
+
|
|
177
|
+
[`formwork/first-run.md`](formwork/first-run.md). Fifteen minutes, on your own
|
|
178
|
+
project.
|
|
179
|
+
|
|
180
|
+
Then [`formwork/loop.md`](formwork/loop.md) for the working loop, and
|
|
181
|
+
[`formwork/round.md`](formwork/round.md) when a decision is expensive enough to
|
|
182
|
+
be worth a round.
|