BookStack: what featkpr missed, 605 of 2,372, step by step
featkpr onboarded BookStack again from a fresh start with no help and checked each step against an answer key. For every step but one the key is independent of featkpr; for routes it is the same list the reader uses, so that row counts what was dropped. Of 2,372 things in the key, featkpr gathered 1,437 and missed 605 at the step that should have found them; the rest were lost because an earlier step missed them. The figure below counts them by step and by reason.
BookStack · commit 0f5164ec · the missed-items check of 26 Sep 2026, exported
the missed-items check: it reads every step
the audit's own words
bookstack:assign-sort-rule · not built: no adapter reads console commands: an entry point a person runs is never a candidatethe audit's own words
PUT /api/users/{id} · detector gap: the handler calls userCan with a computed name (no literal to read); the pass stored no presencethe audit's own words
DELETE /ajax/page/{id} · detector gap: no reply cites the route, and contains joins it to nothing a feature cites (no view or string of its page)the audit's own words
GET /ajax/tags/suggest/names · detector gap: the crawl reached it (other: not an HTML page) and no stored fact says so; only the crawl report holds itthe audit's own words
GET /api-tokens/{userId}/create · cap: the policy's no_shots listthe audit's own words
DELETE @resources/views/pages/parts/image-manager-form.blade.php:84 · detector gap: its action is not a URL the template spells (set by script, or a variable): no route to jointhe audit's own words
DELETE /api-tokens/{userId}/{tokenId} · cap: not on the policy's create-only allow-list (submit fills only allow-listed forms)the audit's own words
GET / → GET /books/{bookSlug}/chapter/{chapterSlug} · cap: every path passes through what the crawl made itself (a page carrying a submission's marker, or the record a writing GET made): held by 'flows clean'the audit's own words
GET / · cap: one tree per named feature, from its root: the naming cites the route (or what its page shows) and roots no feature's tree here, nor at an atom its gate readsthe audit's own words
DELETE /settings/users/{id}/mfa · refused · not built: an ungated leaf on DELETE /settings/users/{id}/mfa: every template declares gated shapes onlythe audit's own words
the seeded user 'M6 Content Only' (M6 Content-only reader) · cap: the crawl found /user/m6-content-only and the per-pattern cap left it outthe audit's own words
/api/docs/download · detector gap: the crawl downloaded it; its type, size and hash stay in the crawl reportA miss costs the steps after it
Why, across all steps
- 295a reader missed it the step ran, and its reader did not see this one
- 199a limit we set left out by a cap or an allow-list, on purpose for now
- 67not built yet no part of featkpr reads this kind of thing yet
- 28needed a record first the page needs an id no crawled page linked to
- 10needed another user only a signed-out visitor sees it, and no signed-out crawl ran
- 3nothing links to it no page renders it by a name the source spells
- 3kept out on purpose an off-host address the crawl never follows
Every step against every reason
See this change live, on a call #
Tim opens BookStack in featkpr with you: the map, the flows, any test and both of its runs.