Recovery fix (recovery-fixes-merge-and-tell; the operator: "you can deliver stuff yourself", 2026-11-08).
Symptom. The bus keeper on novox is unhealthy: "refused: mesh-knowledge_reviews: the option max-age-days is "none", not a whole number".
Cause. The indexer's judge accepts max-age-days: "none" for a bare stream (mesh-delivery judge/busstate.go noAge, with its own test row "a bare stream, complete"). The keeper's options.int reads only whole numbers, so the two parts read one manifest field differently.
Fix.options.ageDays reads "none" as no age limit, and the bare stream's plan uses it. A new row in TestEachTemplateIsPlannedUnderTheModulesNames fails without the fix.
Quick or thorough. I chose the quick fix: one function in the bus module, and this kind is met for the first time. The thorough fix is one shared reader of the template options in mesh-sdk catalogue, used by both the judge and the keeper; it is noted on issue 1966.
Checked locally.go vet ./... and go test ./... in modules/nats.
Delivery. This changes only the keeper's program (the tools artifact), so the bus server's container is not recreated. The bus module's policy is record, so its move waits for the operator's yes.
Recovery fix (recovery-fixes-merge-and-tell; the operator: "you can deliver stuff yourself", 2026-11-08).
**Symptom.** The bus keeper on novox is unhealthy: "refused: mesh-knowledge_reviews: the option max-age-days is \"none\", not a whole number".
**Cause.** The indexer's judge accepts `max-age-days: "none"` for a bare stream (mesh-delivery judge/busstate.go `noAge`, with its own test row "a bare stream, complete"). The keeper's `options.int` reads only whole numbers, so the two parts read one manifest field differently.
**Fix.** `options.ageDays` reads "none" as no age limit, and the bare stream's plan uses it. A new row in `TestEachTemplateIsPlannedUnderTheModulesNames` fails without the fix.
**Quick or thorough.** I chose the quick fix: one function in the bus module, and this kind is met for the first time. The thorough fix is one shared reader of the template options in mesh-sdk catalogue, used by both the judge and the keeper; it is noted on issue 1966.
**Checked locally.** `go vet ./...` and `go test ./...` in modules/nats.
**Delivery.** This changes only the keeper's program (the `tools` artifact), so the bus server's container is not recreated. The bus module's policy is record, so its move waits for the operator's yes.
**Undo.** Revert this merge.
https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
mesh-knowledge's stream reviews says max-age-days "none", which the indexer's judge accepts
(judge/busstate.go noAge), but the keeper refused it ("not a whole number"), so the stream was
never made and the keeper stayed unhealthy (2026-11-08, issue 1966). Quick fix; the thorough one,
one shared reader of the template options in mesh-sdk catalogue for the judge and the keeper, is
noted on issue 1966.
Claude-Session: https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
Deliverynovox/mesh-catalog@bc8cb3b153cf — merged since 2026-11-08T22:53:07Z
Source — source.main moved to novox/mesh-catalog@7fd4ed5898. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
Transitions
2026-11-08 22:53 (new) → proposed (announced): novox/mesh-catalog#635's head announced
2026-11-08 22:53 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail; or the check gates no merge (check-gates-merge false)
2026-11-08 22:53 ready → merged (merged): on the trunk its modules follow: merged there
The commit's note under refs/notes/mesh-plan keeps every transition of this change up to its merge: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-catalog@bc8cb3b153cf` — **merged** since 2026-11-08T22:53:07Z
**Source** — source.main moved to novox/mesh-catalog@7fd4ed589806. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Transitions**
- 2026-11-08 22:53 (new) → proposed (announced): novox/mesh-catalog#635's head announced
- 2026-11-08 22:53 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail; or the check gates no merge (check-gates-merge false)
- 2026-11-08 22:53 ready → merged (merged): on the trunk its modules follow: merged there
The commit's note under `refs/notes/mesh-plan` keeps every transition of this change up to its merge: `git log --notes=mesh-plan`.
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.
Recovery fix (recovery-fixes-merge-and-tell; the operator: "you can deliver stuff yourself", 2026-11-08).
Symptom. The bus keeper on novox is unhealthy: "refused: mesh-knowledge_reviews: the option max-age-days is "none", not a whole number".
Cause. The indexer's judge accepts
max-age-days: "none"for a bare stream (mesh-delivery judge/busstate.gonoAge, with its own test row "a bare stream, complete"). The keeper'soptions.intreads only whole numbers, so the two parts read one manifest field differently.Fix.
options.ageDaysreads "none" as no age limit, and the bare stream's plan uses it. A new row inTestEachTemplateIsPlannedUnderTheModulesNamesfails without the fix.Quick or thorough. I chose the quick fix: one function in the bus module, and this kind is met for the first time. The thorough fix is one shared reader of the template options in mesh-sdk catalogue, used by both the judge and the keeper; it is noted on issue 1966.
Checked locally.
go vet ./...andgo test ./...in modules/nats.Delivery. This changes only the keeper's program (the
toolsartifact), so the bus server's container is not recreated. The bus module's policy is record, so its move waits for the operator's yes.Undo. Revert this merge.
https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
mesh-knowledge's stream reviews says max-age-days "none", which the indexer's judge accepts (judge/busstate.go noAge), but the keeper refused it ("not a whole number"), so the stream was never made and the keeper stayed unhealthy (2026-11-08, issue 1966). Quick fix; the thorough one, one shared reader of the template options in mesh-sdk catalogue for the judge and the keeper, is noted on issue 1966. Claude-Session: https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5Delivery
novox/mesh-catalog@bc8cb3b153cf— merged since 2026-11-08T22:53:07ZSource — source.main moved to novox/mesh-catalog@7fd4ed5898. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.main, the wants and the haves.Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition of this change up to its merge:git log --notes=mesh-plan.