feat(console): one console, many services — the cross-service registry#81
Merged
Conversation
U4 slice 1. Within one app there is nothing to configure: fleets are store-discovered and the app's admin surface speaks for all of them. ACROSS services there is nothing to discover — a payments service cannot know a claims service exists — so the registry is config, read from `console.config.json` next to the console. Adding a service is a config change, never a rebuild; `?base=` stays the dev override; no file at all means one same-origin service, which is normal rather than a fault. Switching service RE-DISCOVERS: each service gets its own console instance keyed by name, so a payments panel can never be drawn under a claims heading because the shell reused a component. A registry that cannot be read is announced, not swallowed. An operator who configured four services and quietly sees one is looking at the wrong console — which is exactly when they are trying to find an outage. Proof: the smoke writes a registry naming the THREE real apps it already runs (open, auth-floored, tenant-scoped) and Playwright switches between them — each refusing in its own way, each re-discovered on arrival. 16/16 green; console unit 115. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Owner
Author
|
Review agent v1 — 1 finding(s). The human decides; hard-stop labels need explicit resolution.
Calibration: mark each finding accepted/dismissed in a reply — dismiss rate >40%/class revises that class (strategy §5). |
The invariant I wrote in the same PR — an operator who configured four services must not quietly see fewer — held only when EVERY entry was unusable. A registry with one bad entry among good ones dropped it silently: the console still works, still looks right, and is missing a service. That is the dangerous shape, not the empty one. Nameless entries are now counted and named, and the banner distinguishes the two cases: fell back to this service only, versus incomplete. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Owner
Author
|
R1 accepted — and it caught my own stated invariant failing: the report fired only when every entry was unusable. A registry with one bad entry among good ones dropped it silently, which is the dangerous shape (the console still works and still looks right). Nameless entries are now counted and named, and the banner distinguishes "fell back to this service only" from "incomplete — missing a service you configured". Three new tests, including the singular/plural count. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
U4 slice 1.
Within one app there is nothing to configure — fleets are store-discovered and the app's admin surface speaks for all of them. Across services there is nothing to discover: a payments service cannot know a claims service exists. So the registry is config, read from
console.config.jsonnext to the console.?base=stays the dev override and the way to point the console at a service that did not serve it.Switching service re-discovers: each service gets its own console instance keyed by name, so a payments panel can never be drawn under a claims heading because the shell reused a component.
Proof
The smoke already runs three real apps; it now writes a registry naming them and Playwright switches between them:
…and back to
open, freshly discovered. 16/16 green; console unit 115 (14 new).The registry file is per-deployment config, so the smoke writes its own and
.gitignorekeeps it out of the tree.🤖 Generated with Claude Code