Everything this talk cites, and what it takes from each. Links verified 27 August 2026.
Katacombs — Quality Sensors Demo
https://github.com/SDiamante13/katacombs-kata-ts
Everything demonstrated today, running and yours to copy.
main deliberately carries no src/,
so you can point the apparatus at your own project instead of deleting a
half-built text
adventure first:
scripts/guides/, the coaching text that travels with
every findingSENSORS.md, how each sensor is built and why;
INSTALL.md, the order to copy them in andThe game itself is built a slice at a time, one branch each, so you
can watch the sensors fire
against real work rather than a fixture:
slice
0 — walking skeleton ·
slice
1 — look around ·
slice
2 — open the way ·
slice
3 — carry things
Birgitta Böckeler — Maintainability sensors for coding
agents
https://martinfowler.com/articles/sensors-for-coding-agents.html
Where the word sensor comes from, and the distinction between
computational and inferential
ones. Her honest failure is the one this talk builds on: asking an
agent, via a markdown guide,
to check its own sensors proved unreliable.
Ivett Ördög — habit-hooks
https://github.com/habit-hooks/habit-hooks
Pair a coaching guide with each finding instead of shipping a bare
metric. Her line is the one
worth remembering: once the agent refactors to appease the linter, the
signal is gone too.
Emily Bache and Ivett Ördög — How to Stop AI from Ruining
Your Codebase
https://www.youtube.com/watch?v=6AgndHSkHFI
The interview the talk quotes from. The agent that split a function
mid-thought and named the
half buildLinesAndTotal — the "and" is the confession — and
the run that gave both halves the
same name. Emily's framing of guides plus sensors as a harness you
define yourself.
Liina Suoniemi — prompt-vs-metric-eval
https://github.com/LiinaSuoniemi/prompt-vs-metric-eval
Pre-registered, independent evidence that coaching beats a bare metric.
Read the per-smell
figures rather than the pooled headline, which averages in an arm that
could not score.
Giles Edwards-Alexander — The economic benefit of
refactoring
https://martinfowler.com/articles/exploring-gen-ai/refactoring-economic-benefit.html
159,564 → 27,360 input tokens for the identical change, with line count
and output tokens held
flat. The price tag on the whole argument.
Martin Fowler — Design Stamina Hypothesis
https://martinfowler.com/bliki/DesignStaminaHypothesis.html
Neglect design and every feature costs more than the one before it.
Agents write faster, so the
payoff line arrives sooner.
Michael Feathers — The Deep Synergy Between Testability and
Good Design (talk)
https://www.youtube.com/watch?v=4cVZvoFGJTU
Why a test that reads as a specification is a design signal, not a
testing preference.
Kent Beck — "I'm not a great developer. I'm a
good developer with great habits."
The habits argument runs through Extreme Programming Explained
(Addison-Wesley).
Peter Naur — Programming as Theory Building
(1985)
https://pages.cs.wisc.edu/~remzi/Naur.pdf
Understanding lives in people, not in artifacts. The spine of the
closing beat.
Katacombs of Shoreditch, by Marco Consolaro, in
Agile Technical Practices Distilled
by Pedro M. Santos, Marco Consolaro and Alessandro Di Gioia
(Packt)
https://www.packtpub.com/product/agile-technical-practices-distilled/9781838980849
The brief in the repo README is a paraphrase, credited.
| Tool | Tier | Link |
|---|---|---|
| ESLint | structural | https://eslint.org/ |
| jscpd | duplication | https://github.com/kucherenko/jscpd |
| gitleaks | secrets | https://github.com/gitleaks/gitleaks |
| Stryker | mutation (JS/TS) | https://stryker-mutator.io/ |
| husky | trigger tier 2 | https://typicode.github.io/husky/ |
| asciinema | how the clips were recorded | https://asciinema.org/ |
| Structural | Mutation | Design (computable) | |
|---|---|---|---|
| Java | PMD · Checkstyle | PIT | ArchUnit |
| Python | Ruff | mutmut | import-linter |
| Go | golangci-lint | — | — |
| Rust | clippy | cargo-mutants | — |
| PHP | — | Infection | deptrac |
| JS/TS | ESLint | Stryker | dependency-cruiser |
A blank means we could not verify an equivalent, not that none exists.