Researched the sibling project's Python tooling (security-game/tools/: a documented inventory README, tools/tests/ on stdlib unittest with requirements-tools.txt, a check_docs.py documentation gate, clean-worktree rule for generators, paid-API tools kept human-triggered) and encoded the applicable parts here.
AGENTS.md — two new sections
Python and shell tooling
Fix the tool, not the artefact — a manual asset fix means the tool is missing a step.
Improve over fork — extend rather than duplicate; factor shared code after two or three uses.
One script one job; fail loudly; result files under /tmp/gigline/ for Unreal commandlets; absolute paths into Blender/Unreal sandboxes; clean worktree for generators (.blend/.umap check out read-only); network/paid tools human-triggered with HTTP 429 back-off; measure, don't assert (print counts/holes/percentiles so a claim can be re-checked).
Document every tool in the README inventory beside it (Tools/, Geo/, Art/blender/).
Test the pure parts in Tools/tests/ with stdlib unittest, no Blender/Unreal process.
Architecture documentation
Docs/Architecture/ is arc42 in Markdown; a table maps each kind of change (new module, runtime flow, packaging, decision, quality goal, risk, term) to the section that must be updated in the same change.
Describe what exists (plans stay in ROADMAP.md/TODO.md); ADRs are append-only; keep the combined architecture.md in sync; prettier --check must pass.
Extracted classify_height() out of block_height_report.main() so the roof/shelter rule (the v0.1.2 finding) is testable — demonstrating the "extract logic from main() to test it" rule.
Tools/README.md: tests section + input-injection rows; the stale TEMP-QA row replaced with the real gigline.SetupLogs cvar and -qaselftest phases.
Docs/Architecture/05 + architecture.md: tools table extended and linked to the new rules (kept in sync per the new rule).
## Summary
Researched the sibling project's Python tooling (`security-game/tools/`: a documented inventory README, `tools/tests/` on stdlib `unittest` with `requirements-tools.txt`, a `check_docs.py` documentation gate, clean-worktree rule for generators, paid-API tools kept human-triggered) and encoded the applicable parts here.
### `AGENTS.md` — two new sections
**Python and shell tooling**
- **Fix the tool, not the artefact** — a manual asset fix means the tool is missing a step.
- **Improve over fork** — extend rather than duplicate; factor shared code after two or three uses.
- One script one job; fail loudly; result files under `/tmp/gigline/` for Unreal commandlets; absolute paths into Blender/Unreal sandboxes; clean worktree for generators (`.blend`/`.umap` check out read-only); network/paid tools human-triggered with HTTP 429 back-off; **measure, don't assert** (print counts/holes/percentiles so a claim can be re-checked).
- **Document every tool** in the README inventory beside it (`Tools/`, `Geo/`, `Art/blender/`).
- **Test the pure parts** in `Tools/tests/` with stdlib `unittest`, no Blender/Unreal process.
**Architecture documentation**
- `Docs/Architecture/` is arc42 in Markdown; a table maps each kind of change (new module, runtime flow, packaging, decision, quality goal, risk, term) to the section that must be updated **in the same change**.
- Describe what exists (plans stay in `ROADMAP.md`/`TODO.md`); ADRs are append-only; keep the combined `architecture.md` in sync; `prettier --check` must pass.
### Made the referenced scaffolding real
- `Tools/tests/` — README + `__init__.py` + **12 passing tests**: `input_emulation` ioctl/key-code encoding and `block_height_report` height classification.
- `requirements-tools.txt` (`requests`).
- Extracted `classify_height()` out of `block_height_report.main()` so the roof/shelter rule (the `v0.1.2` finding) is testable — demonstrating the "extract logic from main() to test it" rule.
- `Tools/README.md`: tests section + input-injection rows; the stale TEMP-QA row replaced with the real `gigline.SetupLogs` cvar and `-qaselftest` phases.
- `Docs/Architecture/05` + `architecture.md`: tools table extended and linked to the new rules (kept in sync per the new rule).
Verification: `python3 -m unittest discover -s Tools/tests -t Tools -p 'test_*.py'` → 12 tests OK; `prettier --check` clean on all touched Markdown.
Researched the sibling project's tooling discipline (tools/README inventory,
tools/tests with stdlib unittest, check_docs gate, clean-worktree rule, paid-API
tools human-triggered) and encoded it for this repository:
AGENTS.md gains two sections.
- 'Python and shell tooling': fix the tool not the artefact; improve over fork;
one script one job; fail loudly; result files for Unreal commandlets; absolute
paths into sandboxes; clean worktree for generators (.blend/.umap are
read-only on checkout); network/paid tools human-triggered with 429 back-off;
measure don't assert; document every tool in the README inventory; test the
pure parts.
- 'Architecture documentation': Docs/Architecture is arc42 in Markdown; a table
mapping each kind of change to the section that must be updated; describe what
exists, ADRs append-only, keep architecture.md in sync, prettier --check.
Made the referenced scaffolding real rather than aspirational:
- Tools/tests/ (README + __init__) with 12 passing unittest tests covering
input_emulation's ioctl/key-code encoding and block_height_report's height
classification.
- requirements-tools.txt (requests).
- Extracted classify_height() out of block_height_report.main() so the roof/
shelter rule is testable — the rule itself came from the v0.1.2 finding.
- Tools/README: tests section, input-injection rows, and the removed TEMP-QA row
replaced by the real cvar/self-test description.
- Docs/Architecture 05 + architecture.md: tools table extended (input injection,
tests) and a link to the tool rules; kept in sync per the new rule.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Researched the sibling project's Python tooling (
security-game/tools/: a documented inventory README,tools/tests/on stdlibunittestwithrequirements-tools.txt, acheck_docs.pydocumentation gate, clean-worktree rule for generators, paid-API tools kept human-triggered) and encoded the applicable parts here.AGENTS.md— two new sectionsPython and shell tooling
/tmp/gigline/for Unreal commandlets; absolute paths into Blender/Unreal sandboxes; clean worktree for generators (.blend/.umapcheck out read-only); network/paid tools human-triggered with HTTP 429 back-off; measure, don't assert (print counts/holes/percentiles so a claim can be re-checked).Tools/,Geo/,Art/blender/).Tools/tests/with stdlibunittest, no Blender/Unreal process.Architecture documentation
Docs/Architecture/is arc42 in Markdown; a table maps each kind of change (new module, runtime flow, packaging, decision, quality goal, risk, term) to the section that must be updated in the same change.ROADMAP.md/TODO.md); ADRs are append-only; keep the combinedarchitecture.mdin sync;prettier --checkmust pass.Made the referenced scaffolding real
Tools/tests/— README +__init__.py+ 12 passing tests:input_emulationioctl/key-code encoding andblock_height_reportheight classification.requirements-tools.txt(requests).classify_height()out ofblock_height_report.main()so the roof/shelter rule (thev0.1.2finding) is testable — demonstrating the "extract logic from main() to test it" rule.Tools/README.md: tests section + input-injection rows; the stale TEMP-QA row replaced with the realgigline.SetupLogscvar and-qaselftestphases.Docs/Architecture/05+architecture.md: tools table extended and linked to the new rules (kept in sync per the new rule).Verification:
python3 -m unittest discover -s Tools/tests -t Tools -p 'test_*.py'→ 12 tests OK;prettier --checkclean on all touched Markdown.