caddy's reconcile_routes crashes with "{} is not iterable", so every public_web route change is abandoned and static-site consumers cannot deploy #1401
Open
opened 2026-09-21 06:23:07 +00:00 by forgejo-admin
·
1 comment
No Branch/Tag specified
main
changeset-release/main
fix/static-converge-skips-paused
jeremybanka/fj-shell-completions
fix/deploy-preserves-terraform-state
polecat/ce-f4pu
polecat/ce-6otx
polecat/ce-cfzx
polecat/ce-b9gk
polecat/ce-fzl8
polecat/ce-e41c
docs/host-suite-live-check
polecat/ce-d5q5
polecat/ce-sxb3
polecat/ce-wlrd
polecat/ce-60d6
polecat/ce-ce95
polecat/ce-bmbd
polecat/ce-bfut
design/main-runs-what-the-mac-cannot
polecat/ce-5aph
polecat/ce-6ide
polecat/ce-p55w
polecat/ce-qyo1
polecat/ce-8ece
polecat/ce-tgz7
polecat/ce-yzpr
fix/publish-skip-module
polecat/ce-94oi
polecat/ce-ix76
fix/empty-package-name-changeset
polecat/ce-78xh
polecat/ce-ojdn
polecat/ce-w0vp
polecat/ce-pjkv
polecat/ce-75xu
polecat/ce-3eud
polecat/ce-ywxr
polecat/ce-7m72
polecat/ce-3964
polecat/ce-9653
polecat/ce-q10u
polecat/ce-esbz
fleet-readiness-sweep
polecat/ce-o6gq
polecat/ce-dtah
polecat/ce-muia
polecat/ce-rzf8
polecat/ce-zdsc
polecat/ce-8mxz
census/ce-1m8r
polecat/ce-mlva
wip/crew-cli-bun142-20260909
jeremybanka/scoped-transit-service-access
chore/agent-agnostic-config
crew-cli/bun-1.4.2
polecat/ce-5l3r
per-module-jail-policy
fix/bake-consumer-mode-skips-restage
fix/register-module-deploy-keep-flag
fix/pack-staging-keeps-hook-runtime
polecat/ce-trpw
design/generated-is-ephemeral
polecat/ce-gkn8
design/control-plane-stops-building-modules
polecat/ce-a2id
polecat/ce-dmo7
polecat/ce-8832
polecat/ce-i0k-rebased
polecat/ce-r1rx
polecat/ce-5kg5
polecat/ce-2k87
polecat/ce-qzh7
polecat/ce-5bkj
plan/gascity-dev-module
polecat/ce-5b1v
mayor/mise-github-token-401
mayor/release-pins-bun-via-mise
polecat/ce-5bum
polecat/ce-h04y
polecat/ce-pvii
polecat/ce-vmq1
polecat/ce-2p9d
polecat/ce-l0e5
polecat/ce-2r5y
polecat/ce-23cv
polecat/ce-35kg
polecat/ce-ig0z
polecat/ce-yuzi
polecat/ce-ypsl
polecat/ce-lbnu
mayor/e2e-suite-recovery-status-2026-09-07
polecat/ce-qzxm
polecat/ce-rvps
polecat/ce-23gb
polecat/ce-aqza
polecat/ce-21hp
polecat/ce-7jbk
polecat/ce-g6o6
polecat/ce-3ei3
polecat/ce-bltm
polecat/ce-gxxz
polecat/ce-06ar
polecat/ce-ywix
wip/ce-r1rx-slit-preserved
polecat/ce-uols
polecat/ce-d0pv
e2e-suite-recovery
crew-e2e-census
e2e-rig-perf
oscar/block-timing-drop-marker
jeremybanka/burner
jeremybanka/firewall-managed-address-placement
jeremybanka/module-update-package-retention
jeremybanka/scoped-isp-transit-access
polecat/ce-sdit
ce-i0k
ce-eltf
polecat/ce-2ni
polecat/ce-xe4
chore/openspec-slice-driven
polecat/ce-ujm
local-merge-gate-typescript
polecat/ce-7o0
polecat/ce-91c
polecat/ce-3eb
polecat/ce-1ed
polecat/ce-116
refinery-full-gates
docs/reconcile-openspec-status
hook-mgmt-backup-framework
ce-9mb-firewall-chain
hook-boundary-group-e
docs/consolidate-agent-memories
ci-gate-defects
hook-jail-wire-caller
multi-instance-impl
bwrap-deb-depends
apparmor-ci-gates
design-persist-managed-ingress
reconcile-hpb-tasks
archive-completed-changes
fix-version-pr-circular-dep
web-ui-console-impl
control-plane-api-name
claude-md-blind-checks
fix-publish-side-bump
publish-sweep-revisions
alert-board-icon-seam
hook-name-sweep-revisions
fix-release-ordering
hook-mount-set
e2e-bubblewrap
hook-jail-profile
builder-bubblewrap
record-premise-pattern
submodules-quarantine-dns
hook-boundary-stage2
stage3-declaration-driven-injection
jb-managed-domains-closeout
module-icons
submodules-trigger
jb-golden-dnsmasq
submodules-design-correction
owned-system-module-ids
stage3-retire-injection
jb-group8-dhcp-e2e
jb-dns-notify
fix-e2e-build-context
hook-boundary-stage1
stage4-static-content-converge
jb-group7-replication-e2e
jb-group7-register-transfer-peer
stage3-blocker-note
jb-group5-isp-transit
stage2-capability-declares-tables
jb-publish-transfer-peer-contract
jb-group6-transit-e2e
jb-group7-transfer-peer
jb-group7-dns-secondary
claude-md-never-say-lan
jb-ticks-and-secondary-inventory
fix-forgejo-concurrency
module-upstream-upgrades
sync-web-ui-specs-main
web-ui-explore
claude-md-trust-direction
sync-web-ui-specs
stage1-provider-arrival-backfill
jb-group1-capabilities-api
jb-group3-reference-driven-secrets
jb-group2-capability-selection
scope-capability-secret-gate
stage0-finish-migration-delivery
integrate-jeremybanka-fork-proposal
openspec-capability-owned-tables
fix-stale-lockfile
celilo-triage-skill
docs-ci-status-state-trap
close-module-integrity-rigor
caddy-acme-waitfor
probe-http-impl
fix-mcp-server-bus-flake
fix-mcp-server-test-flake
multi-instance-modules
opsx-archive-complete
probe-http-capabilities
firewall-drift-normalisation
wire-check-schema-ci
module-integrity-apply
iptables-live-rule-drift
wg-reconcile-peers-onto-main
wg-list-peers-hook
wg-reconcile-peers
fix-generated-files-overwrite
module-integrity-rigor
fix-spec-pointers
sync-spec-module-pause
sync-spec-wireguard-manager
sync-spec-external-web
sync-spec-network-declaration
sync-spec-proxmox-simulator
merging-rule-reconcile
airportd-network-thrash
propose-nightly-issue-triage
wg-peer-hooks-pending
publish-time-script-scan
openspec-validate-gate
baseline-issue-refs
dedup-hook-context
no-ssh-remaining-tasks
hook-name-list-peers
wg-apply-peers-in-place
probe-primitive-redesign
wg-manager-logout
fix-mcp-ssh-leak
secrets-are-generated
remove-902-workaround
ipam-reservation-edit
aspect-fanout-upstream-dns
aspect-fanout-impl
fix-cics-upstream-dns
archive-wgm-app-oidc
wg-manager-oidc
aspect-fanout-new-systems
spec-artifacts-reach-details
browser-artifacts
design-corrections-browser-runtime
managed-browser-runtime
module-barrier-gate
celilo-module-barrier-audit
playwright-platform-design
consumer-removal-modules
consumer-removal-cleanup
tasks-truth
wireguard-manager-e2e
mcp-dev-server-scaffold-changeset
fix/responder-pkill
design-ratify-implementation
caddy-internal
hook-names-one-list
wireguard-manager-module
consumer-cleanup-hook
fix/ci-timeout-misdiagnosis
manager-app-client
docs/land-the-proposal-rule
provider-knows-its-consumer
fix-sweep-skip-attribution
fix-apt-publish-prefix
fix-core-interview-gate
private-web-framework-impl
fix-integrity-blocks-import
reconcile-clients-hook-impl
fix-collection-integrity
fix-machine-occupancy
fix-doctor-host-liveness
fix-machine-alert-key
wireguard-manager-app
release-manual-dispatch
fix-inbound-ack-grammar
fix-operation-error-masking
capability-inventory-docs
reconcile-clients-hook
private-web-capability
wireguard-provides-control-plane-vpn
fix-is-in-subnet
control-plane-vpn-capability
test/proxmox-client-over-msw
wireguard-peer-authority
fix/e2e-show-config-fail-fast
fix/db-busy-timeout
wireguard-manager-explore
networks-declared
docs/decision-brief-2-2
networks-supersede-disclosure
wireguard-internal-endpoint
derived-config-cli-surface
derived-recompute
declared-networks-proposals
ci-release-on-push
docs-designs-live-in-openspec
fw-migration-doc
fw-wireguard-selfsufficient
fw-e2e-classification
fw-interface-list
fw-baseline-enforcement
cadence-overrides-health
cadence-overrides-retention
cadence-overrides
axon-dhcp-pool
fw-converge-findings
fw-iptables-selectors
backup-frequency
axon-custom-dns
dhcp-dns-reassert
fw-wireguard-declare-order
backup-envelope-oom
forgejo-bundle-binary
forgejo-checksum-conditional
fix-d1-justification
forgejo-backup-manual
fw-audit-interface-classification
fw-retire-classifiers
remove-clack
fw-shared-classifier
ci-drop-duplicate-gate-step
remove-errors-not-prompts
ci-run-integration-tests
slim-ci-test-logs
fw-two-hop-wan-owner
stop-infra-provisioned-only
fw-e2e-declared-legs
release-deliver-version
cele2e-preflight
module-pause
fw-wireguard-wan-grep
fix-test-migrations-folder
fw-e2e-topology-coverage
fw-e2e-public-edge-renumber
openspec-module-pause-lifecycle
fix-backup-hook-budgets
name-the-iss-numbers
name-the-iss-numbers-code
firewall-interface-classification
fix-signal-backup-dir
axon-router-module
slim-claude-md-and-ignore-beads
converge-prev-baseline
archive-public-dns-reachability
public-dns-reachability-modules
inspect-failed-deliveries
fix-module-ip-fallout
dns-registrar-contract
public-dns-reachability
fix-module-publish-gate
pin-core-subscriber-naming
www-public-reachability
forgejo-runner-org-scope
doctor-core-subscribers
honor-subscriber-timeout
release-unblock
fix-phantom-backup-records
implement-park-unanswerable-interviews
source-forge-runner-scopes
claudemd-seed-legacy-state
npm-cache-node-unpin-ip
wireguard-rollout-refresh
wellspring-fleet-alerts
park-unanswerable-interviews
fix-dispatcher-unit-scope
claudemd-semver-is-mine
upgrade-restarts-dispatcher
headless-breaking-update-consent
smoke-always-reports
ci-single-validate-run
biome-excludes-generated-files
e2e-module-import-sigint
disk-space-monitor
backup-staging-leak-rate-correction
fix-astro-imports
firewall-converge-safety
visualizer-mask-placement
mgr-disk-space
lint-typecheck-every-package
sweep-abandoned-operations
fix-dup-dispatchers
wellspring-menubar-archive
wellspring-observation
wellspring-menubar
wellspring-phase1
visualizer-pulse-glow-perf
wellspring-network-doctor
storage-set-path
fix-icon-board-flake
e2e-sim-address-space
seal-sim-apt
document-poll-cd
transport-read-staleness
release-pin-delivery-version
persist-read-outcome
signal-health-contract
deb-decoupled-from-npm
fix-bus-concurrent-open
event-bus-busy-timeout
lockfile-version-sync
e2e-teardown-volumes
signal-release-touch
fix-module-dirty-scope
ci-watching-guidance
release-publish-decoupled
fix-interview-answer-grammar
commit-bun-lock
e2e-ack-suite
pack-test-ci-diag
mcp-docs-shipping
e2e-ack-coverage
fix-ack-counter
mcp-devserver-ci-gap
audit-checks-that-cannot-fail
framework-config-keys
forgiving-ack-parser
module-log-tail
fix-e2e-cleanup-without-compose
signal-note-to-self-ack
unignore-e2e-changesets
fix-e2e-network-leak
agent-coordination-guardrails
celilo-release-skill-ci
scheduled-backup-runner
fix-default-backup-storage
fix-poll-cd-not-running
pin-node-toolchain
signal-ack-roundtrip
escalation-policy-not-applied
sticky-container-storage
fix-stuck-operation-lock
e2e-audit
close-wordpress-static-publish
ci-comment-placement
typechecking-modules
fix-public-dns-source-ip
cpanel-provider-release-touch
signal-healthcheck-test-types
isitup-no-signal
fix-machines-reachable-local
signal-notification-import
alerting-failure-reasons
alerting-notify-visibility
fix-release-idempotent
signal-tpl-comment
signal-types-drift
signal-terraform
audit-fleet-rollout
docs/rollout-release-path
alerting
wordpress-impl
chore/remove-dead-derived-persistence
docs/hook-owned-state-pr
docs/hook-owned-state
wordpress
wireguard
propose/wireguard-module
fix/dns-aspect-secure-mgmt
fix/secure-mgmt-config-keys
fix/pins-in-version-phase
fix/consumer-pins-0.7.1
fix/module-versions-and-inventory
fix/aspect-local-connection
feat/recognize-management-network
docs/changeset-protocol
fix/registry-hostname-guard
fix/technitium-dhcp-hang
propose/firewall-converge-safety
fix/release-single-publisher
fix/skills-mcp-transport
fix/release-jq
fix/apt-publish-step
fix/deb-nfpm
chore/bump-capability-pins
fix/detect-no-git
fix/release-pat
fix/npm-auth-npmrc
fix/changeset-e2e-ignored
e2e-web
openspec
polecat/nux/ce-qdv@mrsg3ack
polecat/slit/ce-af5@mrsg3ndq
polecat/furiosa/ce-1ch@mrsg2vji
polecat/rictus/ce-u2c@mrsgkt02
polecat/toast/ce-di8@mrsgk7lt
polecat/rictus/ce-qrn@mrsfnkur
feat/visualizer-flow-lee-seeds
module-versioning-guidance
polecat/cheedo/ce-2vu@mrsdn18c
polecat/dag/ce-jje@mrsdit5n
polecat/furiosa/ce-2vu@mrsdf07i
polecat/keeper/ce-8g3@mrsdkj67
polecat/slit/ce-7aa@mrsdh4ke
ce-s23-design
mcp-dev-server-scaffold-tests
polecat/furiosa/ce-foa@mrqn59em
polecat/furiosa/ce-foa@mrqngd71
polecat/nux/ce-lp0@mrqna61g
unified-mgmt
mcp-dev-server
fix/workspace-package-graph
ce-1bb-celilo-core-in-pack-lists
land-stranded-e2e-design-docs
ce-dae-single-source-repo-root
ce-dbc-findmonorepoRoot-probe
polecat/rictus/ce-77i.5@mri9qtq4
polecat/dementus/ce-77i.6@mri9r8uk
polecat/rictus/ce-77i.2@mri7f1dk
e2e-0.9.1-release
polecat/rictus/ce-77i.1@mri541xq
polecat/furiosa/ce-l3j@mri4zszv
celilo-mcp-service
fix-zsh-completion-apostrophe
release-cli-0.11.0
api-conversion
polecat/nux/ce-nwn
release/npm-version-bumps
polecat/furiosa/ce-um6@mrfhmnk3
polecat/nux/ce-z5i
polecat/nux/ce-3rs@mrfilctn
polecat/cheedo/ce-z1b.5@mr5cx775
polecat/ace/ce-22d@mr5ctvea
npm-fleet-registry
polecat/valkyrie/ce-22d@mr58074a
npm-consumer-path
polecat/cheedo/ce-22d@mr586n8c
v2-report-out
polecat-idle
polecat/furiosa/hq-s1l@mr2eirhf
polecat/furiosa/ce-c56-cardgrid
chore/ponytail-dedup
iss-fullstack-acme-race
ship-cli-0.9.1
iss-258-shuffle-no-ambient-red
iss-255-self-diagnosing-waits
iss-254-pollution-boundary
fix-aspect-responder-hang
iss-257-celilo-computer-collision
fix-260-technitium-net0-zone
chore/ponytail-dead-code-cleanup
iss-cele2e-flake-instrumentation
release-iss-0156-publish
iss-install-sh-waitfor-diag
release-iss-0156-versions
iss-firewall-ssh-timeout-robustness
ISS-0156
e2e-contention
iss-241-222-cele2e-fixes
iss-cele2e-diagnostics
migrate-issues-log
iss-0150-read-model
subsystem-inventory
iss-0168-backup-gate-stale-manifest
upgrade-foregjo
hotfix-celilo-0.8.1
release-celilo-0.8.0
iss-0157-tmpfs-fix
cele2e-isolated-suite
modules-capabilities-0.5.0
reconcile-celilo-version
iss-0151-module-version-engine
iss-0150-resize
standards-instance-sizing
docs-lunacycle-deployed
iss-app-cd-stale-manifest
docs-build-bus-status
docs-no-allow-stale
celilo-website-source-dir-build
build-bus-rollout
e2e-output-fixes
fix-vision-typo
celilo-visualizer
ci-pattern-git-native-mise
fix-runner-node
build-bus-e2e
build-bus
iss-celilo-install-mode
iss-0138-module-upgrade
build-bus-phase-issues
docs-build-bus-rework
fix-mise-double-encoding
step4-workflows-and-labels
release-cli-alpha12
fix-vm-state-parsing
release-cli-alpha11
fix-vm-template-qcow2-extension
fix-vm-template-import-content
iss-0133-worktree-deps-misleading-failure
release-cli-alpha9
iss-0069-infra-config-contract
iss-0127-headless-interview
docs-ci-local-gates-procedure
iss-0090-deploy-follows-reality
iss-0060-pt2-reconcile-display
iss-0060-proxmox-introspect-reconcile
iss-0103-e2e-pack-explicit-rewrite
iss-0132-node-capacity-check
release-cli-alpha8
docs-claude-md-vitest-fix
iss-0131-no-mgmt-server-build
iss-0130-silent-recreation
iss-phase-d-builder-vm
release-cli-alpha7
proxmox-vm-template-build
forgejo-builder-runtime
fix-duplicate-iss-0123
phase2-design
vantage-fleet-pr
phase1-ci-validation
v4.1.0
v4.0.0
v3.1.0
v3.0.0
v2.3.0
v2.2.1
v2.2.0
v2.1.0
v1.14.0
v1.13.0
v1.12.0
v1.10.0
v1.9.0
v1.8.0
v1.7.0
v1.6.0
v1.5.0
v1.4.0
v1.3.0
v1.2.0
v1.1.0
v1.0.0
v0.27.0
v0.26.1
v0.26.0
v0.25.1
v0.25.0
v0.24.1
v0.24.0
v0.23.0
v0.21.0
v0.20.0
v0.19.0
v0.18.0
v0.17.0
v0.16.2
v0.15.0
v0.14.4
v0.14.2
v0.14.1
v0.14.0
v0.13.3
v0.13.2
v0.13.1
v0.12.1
@celilo/cli@0.8.0
Labels
Clear labels
autofix-approved
Operator has approved unattended work on this issue. ONLY a human applies this label; /celilo-triage is forbidden from applying it.
autofix-candidate
Nominated by /celilo-triage as small, well-specified and mechanically checkable. Applied by the agent; awaiting operator review.
category:bug
category:codegen
category:design
category:docs
category:enhancement
category:feature
category:policy
category:task
category:tech-debt
category:tooling
e2e-confidence
Initiative: make cele2e trustworthy — isolation, self-diagnosis, no silent no-ops
in-progress
severity:high
severity:low
severity:medium
No labels
autofix-approved
autofix-candidate
category:bug
category:codegen
category:design
category:docs
category:enhancement
category:feature
category:policy
category:task
category:tech-debt
category:tooling
e2e-confidence
in-progress
severity:high
severity:low
severity:medium
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
celilo/celilo#1401
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
caddy.reconcile-web-routesis the only subscriber topublic_web.routes_changed.Its handler exits 1 with
{} is not iterableand is retried 3 times and thenabandoned, so the route change is never applied. The consumer's deploy then
fails with a message that describes a timeout, not a crash:
0 ok, 0 failed of 1is the tell. The change was never counted, because thehandler died before reporting either outcome.
Evidence
celilo events list-failedon celilo-mgr, 2026-09-21. Ten deliveries, every onestatus: abandoned,attempts: 3, all onpublic_web.routes_changed:Identical for eventIds 73337, 73338, 73339, 73340, 73341, 73342, 73379, 73380,
and 55594 (an older instance, so this is not new tonight).
Likely cause
modules/caddy/scripts/reconcile-routes.ts:??guardsnull/undefinedonly. IfgetAllRoutes()resolves to{}— anempty object rather than an empty array — the coalesce does not fire,
{}flows into
convergeCaddy, and the first iteration over it throws exactly{} is not iterable.I read that line in a worktree, not on the deployed
caddy@3.0.0+2, so confirmthe deployed copy before fixing. The runtime error is not in doubt; the specific
line is my inference from it.
Worth establishing why
getAllRoutes()yields{}: an empty-resultserialisation across the capability boundary is the obvious candidate, and if so
the same shape may affect other capability getters, which is a wider fix than
hardening this one call site.
Impact — this is not a corner case
It blocks every static-site consumer from deploying. Observed tonight:
bna-yard-sale— a new install. Public DNS registered fine(
bna-yard-sale.organdwww.→ 75.164.228.76), but the site block and certnever appear. Module stuck in
DEPLOYINGacross four attempts.celilo-website— has been failing its 15-minute registry poll repeatedlywith this exact deadline message, burning a
+Nbuild revision on eachattempt (1.0.5+2 → +3 → +4 → +5 → +6 → +7 → +8 → 1.0.6+1 all visible in the
failed-delivery log). That is days of silent failure attributed to a timeout.
Reverse-proxy registrations are not affected:
forgejo(
registerReverseProxy) andcelilo-apt-repo(register_route) both succeededtonight through the same subscriber. So the crash appears specific to the route
shape produced by
publishStaticSite. Confirm that split — it is the fastestroute to a minimal reproduction.
Scope
modules/caddy/scripts/reconcile-routes.ts, thegetAllRoutes()coalesce.convergeCaddy/reconcileCaddyfile— whichever iteration actually throws.web_routes.getAllRoutes(): establish what it returns when there are no rows,or when the caller is the provider itself, and whether
{}is ever a legalresult.
Acceptance
publishStaticSiteroute change that makesreconcile_routesthrow, before any fix.reconcile_routesdoes not crash on any resultgetAllRoutes()canlegally return. If
{}is not legal, fix it at the source rather thanonly defending at the call site.
handler failure, not "did not finish within the deadline". A crash and a
timeout must not be indistinguishable to the operator — that is what hid
this for days.
celilo-websiteupgrades cleanly through the registry poll withoutburning a build revision per attempt.
getAllRoutes()returning an emptynon-array. Mutation-test it — revert the fix and watch it fail.
Related
when filing that one. #1399's
no dispatcher running — not waitingis realand separately measured. But the
deadline (0 ok, 0 failed of N)failures Iattributed to dispatcher lag there are this bug. Two defects, one visible
symptom. Correcting #1399 accordingly.
publishStaticSite … sourceDir. Different failure, also onstatic-site consumers; those fail earlier, at request validation, and never
reach the reconcile.
Measured 2026-09-21 during the fleet-readiness sweep (ce-42q4.3).
The crash does not reproduce on the deployed code
Measured on celilo-mgr, 2026-09-21 06:25–06:31Z, against the deployed
caddy@3.0.0+2:celilo module run-hook caddy reconcile_routes --debug→✓ Caddy converged: 11 hostname(s), 16 route(s), 4 site(s), 5 companion redirect(s), 2 module(s) recorded in ERROR. Clean, no crash.public_web.routes_changedevents have been delivered since the dispatcher restarted at 05:46Z — 73821 (triggeredBy: bna-yard-sale, 05:51Z) and 73873 (a probe I emitted, 06:29Z). Neither failed.celilo events list-failed --subscriber caddy.reconcile-web-routesstill shows the same 10,latestFinishedAt00:52Z. Nothing new.So the ten abandoned deliveries all predate 05:46Z and something between 00:52Z and 05:51Z stopped it. I could not establish what. Worth ruling out first: the subscriber's handler is
celilo events run-hook caddy reconcile-web-routes, a fresh subprocess against the on-disk binary each tick, so a stale long-running dispatcher is not the mechanism — that was my first theory and it is wrong.The
{}source is therefore unestablished, and the branch below does not claim to fix it.What the branch does fix
Branch
polecat/ce-yc9n(beadce-yc9n).Acceptance item 3 — a crash must not read as a timeout. Root-caused, and it is in
bus.markFailed: a retried failure is writtenstatus='pending'withlast_errorset (packages/event-bus/src/bus.ts:532).waitForRouteReconcilecounts only settled deliveries, so the deadline expires with0 ok, 0 failed of 1while the handler's own words sit unread in the row.RouteReconcileWaitResultnow carrieslastError, and both the timeout and failed-delivery errors quote it. Test:carries the crashing handler error out of a timeout.Acceptance item 5 — recurrence gate.
requireRouteTableinmodules/caddy/scripts/reconcile.ts, used byreconcile-routes.tsandsetup-network.ts. It throws on a non-array rather than coercing to[]— an empty route table is a legitimate state that renders the holding page, so coercing would converge caddy into serving nothing and drop every site block, silently. The message names the capability and the shape, which is what turns the next occurrence into an obtainable minimal repro (item 1).Both gates were watched failing under mutation, not reasoned about.
Items 1, 2 and 4 are NOT met and should stay open: no minimal repro, no source-level fix for
{}, andcelilo-website's registry poll is unverified across a full cycle.Gates:
biomeexit 0 (Checked 1930 files),check:typecheck27/27,check:modules0 fail,celilo-events21 pass, caddy scripts 19 pass.caddybumped to 3.0.1;@celilo/clichangeset added.