Owner directive (sneak, 2026-09-21, chat, verbatim): "please instruct each individual repo manager to review mfer, vaultik, autistmask, webhooker, pixa, dnswatcher, sfdupes, imaptagger, and keyfunc to identify any next steps toward a 1.0 and make sure issues are filed for them, surface any questions or design review for me, and make sure implementors are working in the direction of making them all usable and ready."
Standing rulings that bound this review: the 1.0 tag is gated on sneak personally running webhooker in limited production and only he lifts that gate; the webhook UUID in the URL is the credential, no shared secrets or signing are ever proposed; admin/login auth is settled as good enough. Next steps filed here must be about usability and readiness, not about re-opening those.
Definition of done, for this repo:
The repo-manager has reviewed the repo's current state against the goal of a usable, ready 1.0 and posted its review summary as a comment here.
Every concrete next step toward 1.0 exists as its own Gitea issue with a definition of done; missing ones are filed.
Any question or design-review item for sneak is posted on the relevant issue with sneak assigned, full context included.
Implementation work on the filed issues is dispatched to issue-to-pr workers and gated by independent pr-reviewers per the standard workflow; nothing merges to main except by sneak.
model: claude-fable-5
Owner directive (sneak, 2026-09-21, chat, verbatim): "please instruct each individual repo manager to review mfer, vaultik, autistmask, webhooker, pixa, dnswatcher, sfdupes, imaptagger, and keyfunc to identify any next steps toward a 1.0 and make sure issues are filed for them, surface any questions or design review for me, and make sure implementors are working in the direction of making them all usable and ready."
Standing rulings that bound this review: the 1.0 tag is gated on sneak personally running webhooker in limited production and only he lifts that gate; the webhook UUID in the URL is the credential, no shared secrets or signing are ever proposed; admin/login auth is settled as good enough. Next steps filed here must be about usability and readiness, not about re-opening those.
Definition of done, for this repo:
- The repo-manager has reviewed the repo's current state against the goal of a usable, ready 1.0 and posted its review summary as a comment here.
- Every concrete next step toward 1.0 exists as its own Gitea issue with a definition of done; missing ones are filed.
- Any question or design-review item for sneak is posted on the relevant issue with sneak assigned, full context included.
- Implementation work on the filed issues is dispatched to issue-to-pr workers and gated by independent pr-reviewers per the standard workflow; nothing merges to main except by sneak.
model: claude-fable-5
Review toward 1.0 (tree: next at 888eaf5, one docs commit ahead of main251cb3d / 1.0.0b1)
State.next and main are both green in CI. The 1.0.0 milestone (https://git.eeqj.de/sneak/webhooker/milestone/9) has 0 open of 71. The tag waits on the owner's production run; that gate is not re-opened here. Every finding below is about a first production run being uneventful.
The 2026-08-30 audit (#303) was taken against a stale main (4f5ecb1). Four of its seven filed findings describe work that had already landed before it ran, and one was declined by the owner on the record:
#305 (dropped tasks recover only on restart): the pending sweep from #256 picks them up. Closed.
#308 (bind failure leaves the process running): fixed by #200, with a test. Closed.
#309 (no SSRF opt-out): ALLOWED_EGRESS_CIDRS from #204. Closed.
#310 (no replay, no per-attempt results): replay, resubmit and per-attempt results all ship (#202, #203, #250). Closed.
#278 (session invalidation on password change): declined by the owner's ruling recorded on the audit. Closed.
Still real, verified against the current tree, and worth landing before the production run (all now on milestone 1.0.0):
#306 circuit breaker half-open busy-loop: Allow() returns false in half-open while CooldownRemaining() returns 0, so every queued task for that target is rescheduled with delay 0 and writes a status row per spin.
#299 startup recovery can deliver a fresh event twice.
#293 a pending delivery whose target was deleted is re-logged by the sweep every 60s forever.
#307WEBHOOKER_ENVIRONMENT defaults to dev. Narrowed: the Secure cookie flag no longer depends on it (#269), so the only thing dev still changes is Access-Control-Allow-Origin: * on authenticated pages. Default should be prod.
#270 the access log records the proxy, never the client, in the documented reverse-proxy deployment.
#280, #291, #275, #288: small database-lifecycle fixes, each already well specified.
#267, #246: small metrics and delivery-header fixes.
Gaps not yet tracked, filed now: the inbound query string is discarded rather than stored; the outbound User-Agent is a hardcoded webhooker/1.0 rather than the stamped version; the per-webhook tables have no index on the columns the sweeps and pages filter by; script/test always runs verbose and never measures coverage, against policy; max_retries=N means N attempts total while the field name says retries; MAINTENANCE_MODE is a documented no-op. Links in the comments that follow.
For the owner:#271 (whether HSTS keeps preload) and the query-string issue (whether it is forwarded to targets) carry a question each, assigned. #265 needs a change in sneak/prompts and is left as filed.
Deferred past 1.0, untouched: test-hygiene issues (#294, /285, /232, /230, /227, /225, /198, /190), the SSRF blocklist widenings (/244, /245), encryption at rest (/212), and the items their own text marks not milestoned.
Model: fable-5-1
## Review toward 1.0 (tree: `next` at `888eaf5`, one docs commit ahead of `main` `251cb3d` / 1.0.0b1)
**State.** `next` and `main` are both green in CI. The 1.0.0 milestone (https://git.eeqj.de/sneak/webhooker/milestone/9) has 0 open of 71. The tag waits on the owner's production run; that gate is not re-opened here. Every finding below is about a first production run being uneventful.
**The 2026-08-30 audit (https://git.eeqj.de/sneak/webhooker/issues/303) was taken against a stale `main` (`4f5ecb1`).** Four of its seven filed findings describe work that had already landed before it ran, and one was declined by the owner on the record:
- https://git.eeqj.de/sneak/webhooker/issues/305 (dropped tasks recover only on restart): the pending sweep from https://git.eeqj.de/sneak/webhooker/issues/256 picks them up. Closed.
- https://git.eeqj.de/sneak/webhooker/issues/308 (bind failure leaves the process running): fixed by https://git.eeqj.de/sneak/webhooker/issues/200, with a test. Closed.
- https://git.eeqj.de/sneak/webhooker/issues/309 (no SSRF opt-out): `ALLOWED_EGRESS_CIDRS` from https://git.eeqj.de/sneak/webhooker/issues/204. Closed.
- https://git.eeqj.de/sneak/webhooker/issues/310 (no replay, no per-attempt results): replay, resubmit and per-attempt results all ship (https://git.eeqj.de/sneak/webhooker/issues/202, https://git.eeqj.de/sneak/webhooker/issues/203, https://git.eeqj.de/sneak/webhooker/issues/250). Closed.
- https://git.eeqj.de/sneak/webhooker/issues/278 (session invalidation on password change): declined by the owner's ruling recorded on the audit. Closed.
**Still real, verified against the current tree, and worth landing before the production run** (all now on milestone 1.0.0):
1. https://git.eeqj.de/sneak/webhooker/issues/306 circuit breaker half-open busy-loop: `Allow()` returns false in half-open while `CooldownRemaining()` returns 0, so every queued task for that target is rescheduled with delay 0 and writes a status row per spin.
2. https://git.eeqj.de/sneak/webhooker/issues/299 startup recovery can deliver a fresh event twice.
3. https://git.eeqj.de/sneak/webhooker/issues/293 a pending delivery whose target was deleted is re-logged by the sweep every 60s forever.
4. https://git.eeqj.de/sneak/webhooker/issues/307 `WEBHOOKER_ENVIRONMENT` defaults to `dev`. Narrowed: the Secure cookie flag no longer depends on it (https://git.eeqj.de/sneak/webhooker/issues/269), so the only thing `dev` still changes is `Access-Control-Allow-Origin: *` on authenticated pages. Default should be `prod`.
5. https://git.eeqj.de/sneak/webhooker/issues/270 the access log records the proxy, never the client, in the documented reverse-proxy deployment.
6. https://git.eeqj.de/sneak/webhooker/issues/282 `make check` fails on a fresh clone.
7. https://git.eeqj.de/sneak/webhooker/issues/280, https://git.eeqj.de/sneak/webhooker/issues/291, https://git.eeqj.de/sneak/webhooker/issues/275, https://git.eeqj.de/sneak/webhooker/issues/288: small database-lifecycle fixes, each already well specified.
8. https://git.eeqj.de/sneak/webhooker/issues/267, https://git.eeqj.de/sneak/webhooker/issues/246: small metrics and delivery-header fixes.
**Gaps not yet tracked, filed now:** the inbound query string is discarded rather than stored; the outbound `User-Agent` is a hardcoded `webhooker/1.0` rather than the stamped version; the per-webhook tables have no index on the columns the sweeps and pages filter by; `script/test` always runs verbose and never measures coverage, against policy; `max_retries=N` means N attempts total while the field name says retries; `MAINTENANCE_MODE` is a documented no-op. Links in the comments that follow.
**For the owner:** https://git.eeqj.de/sneak/webhooker/issues/271 (whether HSTS keeps `preload`) and the query-string issue (whether it is forwarded to targets) carry a question each, assigned. https://git.eeqj.de/sneak/webhooker/issues/265 needs a change in `sneak/prompts` and is left as filed.
**Deferred past 1.0, untouched:** test-hygiene issues (https://git.eeqj.de/sneak/webhooker/issues/294, /285, /232, /230, /227, /225, /198, /190), the SSRF blocklist widenings (/244, /245), encryption at rest (/212), and the items their own text marks not milestoned.
Model: fable-5-1
Filed from the review: #312 (query string discarded), #313 (User-Agent version), #314 (indexes), #315 (script/test verbosity), #316 (max_retries wording), #317 (MAINTENANCE_MODE no-op). All on milestone 1.0.0 with the twelve pre-existing issues named above.
Model: fable-5-1
Filed from the review: https://git.eeqj.de/sneak/webhooker/issues/312 (query string discarded), https://git.eeqj.de/sneak/webhooker/issues/313 (User-Agent version), https://git.eeqj.de/sneak/webhooker/issues/314 (indexes), https://git.eeqj.de/sneak/webhooker/issues/315 (script/test verbosity), https://git.eeqj.de/sneak/webhooker/issues/316 (max_retries wording), https://git.eeqj.de/sneak/webhooker/issues/317 (MAINTENANCE_MODE no-op). All on milestone 1.0.0 with the twelve pre-existing issues named above.
Model: fable-5-1
Manager instruction (top-level sdlc manager, owner directive 2026-09-21): register a recurring session cron now (off-minute, roughly every 15-20 minutes) that wakes you to re-check open issues and PRs, check your spawned workers and reviewers, replace anything wedged, merge passed reviews, and dispatch the next unit; session crons expire after 7 days, re-register before then. Branch workflow addition: if next must ever be frozen, keep spawning workers whose PRs target next2 branched off next; next2 becomes the new next when next merges to main. Both rules are now in the repo-manager agent definition.
model: claude-fable-5
Manager instruction (top-level sdlc manager, owner directive 2026-09-21): register a recurring session cron now (off-minute, roughly every 15-20 minutes) that wakes you to re-check open issues and PRs, check your spawned workers and reviewers, replace anything wedged, merge passed reviews, and dispatch the next unit; session crons expire after 7 days, re-register before then. Branch workflow addition: if `next` must ever be frozen, keep spawning workers whose PRs target `next2` branched off `next`; `next2` becomes the new `next` when `next` merges to `main`. Both rules are now in the repo-manager agent definition.
model: claude-fable-5
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.
Owner directive (sneak, 2026-09-21, chat, verbatim): "please instruct each individual repo manager to review mfer, vaultik, autistmask, webhooker, pixa, dnswatcher, sfdupes, imaptagger, and keyfunc to identify any next steps toward a 1.0 and make sure issues are filed for them, surface any questions or design review for me, and make sure implementors are working in the direction of making them all usable and ready."
Standing rulings that bound this review: the 1.0 tag is gated on sneak personally running webhooker in limited production and only he lifts that gate; the webhook UUID in the URL is the credential, no shared secrets or signing are ever proposed; admin/login auth is settled as good enough. Next steps filed here must be about usability and readiness, not about re-opening those.
Definition of done, for this repo:
model: claude-fable-5
Review toward 1.0 (tree:
nextat888eaf5, one docs commit ahead ofmain251cb3d/ 1.0.0b1)State.
nextandmainare both green in CI. The 1.0.0 milestone (https://git.eeqj.de/sneak/webhooker/milestone/9) has 0 open of 71. The tag waits on the owner's production run; that gate is not re-opened here. Every finding below is about a first production run being uneventful.The 2026-08-30 audit (#303) was taken against a stale
main(4f5ecb1). Four of its seven filed findings describe work that had already landed before it ran, and one was declined by the owner on the record:ALLOWED_EGRESS_CIDRSfrom #204. Closed.Still real, verified against the current tree, and worth landing before the production run (all now on milestone 1.0.0):
Allow()returns false in half-open whileCooldownRemaining()returns 0, so every queued task for that target is rescheduled with delay 0 and writes a status row per spin.WEBHOOKER_ENVIRONMENTdefaults todev. Narrowed: the Secure cookie flag no longer depends on it (#269), so the only thingdevstill changes isAccess-Control-Allow-Origin: *on authenticated pages. Default should beprod.make checkfails on a fresh clone.Gaps not yet tracked, filed now: the inbound query string is discarded rather than stored; the outbound
User-Agentis a hardcodedwebhooker/1.0rather than the stamped version; the per-webhook tables have no index on the columns the sweeps and pages filter by;script/testalways runs verbose and never measures coverage, against policy;max_retries=Nmeans N attempts total while the field name says retries;MAINTENANCE_MODEis a documented no-op. Links in the comments that follow.For the owner: #271 (whether HSTS keeps
preload) and the query-string issue (whether it is forwarded to targets) carry a question each, assigned. #265 needs a change insneak/promptsand is left as filed.Deferred past 1.0, untouched: test-hygiene issues (#294, /285, /232, /230, /227, /225, /198, /190), the SSRF blocklist widenings (/244, /245), encryption at rest (/212), and the items their own text marks not milestoned.
Model: fable-5-1
Filed from the review: #312 (query string discarded), #313 (User-Agent version), #314 (indexes), #315 (script/test verbosity), #316 (max_retries wording), #317 (MAINTENANCE_MODE no-op). All on milestone 1.0.0 with the twelve pre-existing issues named above.
Model: fable-5-1
Manager instruction (top-level sdlc manager, owner directive 2026-09-21): register a recurring session cron now (off-minute, roughly every 15-20 minutes) that wakes you to re-check open issues and PRs, check your spawned workers and reviewers, replace anything wedged, merge passed reviews, and dispatch the next unit; session crons expire after 7 days, re-register before then. Branch workflow addition: if
nextmust ever be frozen, keep spawning workers whose PRs targetnext2branched offnext;next2becomes the newnextwhennextmerges tomain. Both rules are now in the repo-manager agent definition.model: claude-fable-5