Problem
The attention model recognises exactly two machines. normalizeHost in src/server/attention/buildAttentionModel.ts:
const folded = asciiUpper(value.trim());
return folded === "M5" || folded === "M1" ? folded : null;
A record whose host_id is anything else is not merely labelled unknown — its card is dropped:
`Record ${idText(record)} names host ${quoted(...)}, which is neither M5 nor M1; the card is suppressed.`
and the same function decides the payload's dashboard_host, so a dashboard whose AGENT_COORD_MACHINE_ID is not M5 or M1 reports dashboard_host: "UNKNOWN" and emits a dashboard_host_unknown diagnostic on every read.
The consequence for anyone who is not running this specific two-machine setup: the Human Attention view is inert. Every card is suppressed, the page shows the empty state, and the only hint is a diagnostic naming two machine identifiers that mean nothing to them. This package is published under MIT and installed by name, so "M5" and "M1" are, in effect, a private allowlist shipped as product behavior.
Why this is filed rather than fixed in place
The two-host union is the approved design from issue #125 and the 2026-09-04 design, and it is load-bearing in the shared types (AttentionCardHost), the model, the client's render allowlist, and the cross-host "open on M5:" affordance. Widening it is a product decision with a real design question behind it, not a patch.
The design question
What is a host, once it is not a fixed pair? Candidates, roughly in increasing order of work:
- Configured allowlist.
AGENT_COORD_KNOWN_HOSTS (defaulting to the current pair for compatibility) with the same normalisation and suppression rules. Smallest change; keeps the closed-set guarantee that makes the render allowlist safe.
- Any well-formed host identifier, bounded and projected like every other untrusted string, with
dashboard_host compared case-folded. Suppression then applies only to records with no usable host at all. Removes the allowlist but requires deciding the identifier's shape and its render bound.
- Dashboard-relative only. Keep the local machine id as the only privileged value: a card is "here" or "elsewhere", and "elsewhere" prints the record's projected host string.
Option 1 unblocks other users with the least risk. Option 3 is probably where this wants to end up, because it makes the concept relative rather than enumerated.
Evidence
src/server/attention/buildAttentionModel.ts — normalizeHost, the unknown_host suppression path, and dashboardHost.
src/shared/attention.ts — AttentionCardHost as the literal union.
- Verified at
main 6bdf70726f7accc4ad31e19cda51e56a903fe21d.
Found by the post-merge audit of batch acd-attention-1a-20260906 (tracker #134).
Problem
The attention model recognises exactly two machines.
normalizeHostinsrc/server/attention/buildAttentionModel.ts:A record whose
host_idis anything else is not merely labelled unknown — its card is dropped:and the same function decides the payload's
dashboard_host, so a dashboard whoseAGENT_COORD_MACHINE_IDis notM5orM1reportsdashboard_host: "UNKNOWN"and emits adashboard_host_unknowndiagnostic on every read.The consequence for anyone who is not running this specific two-machine setup: the Human Attention view is inert. Every card is suppressed, the page shows the empty state, and the only hint is a diagnostic naming two machine identifiers that mean nothing to them. This package is published under MIT and installed by name, so "M5" and "M1" are, in effect, a private allowlist shipped as product behavior.
Why this is filed rather than fixed in place
The two-host union is the approved design from issue #125 and the 2026-09-04 design, and it is load-bearing in the shared types (
AttentionCardHost), the model, the client's render allowlist, and the cross-host "open on M5:" affordance. Widening it is a product decision with a real design question behind it, not a patch.The design question
What is a host, once it is not a fixed pair? Candidates, roughly in increasing order of work:
AGENT_COORD_KNOWN_HOSTS(defaulting to the current pair for compatibility) with the same normalisation and suppression rules. Smallest change; keeps the closed-set guarantee that makes the render allowlist safe.dashboard_hostcompared case-folded. Suppression then applies only to records with no usable host at all. Removes the allowlist but requires deciding the identifier's shape and its render bound.Option 1 unblocks other users with the least risk. Option 3 is probably where this wants to end up, because it makes the concept relative rather than enumerated.
Evidence
src/server/attention/buildAttentionModel.ts—normalizeHost, theunknown_hostsuppression path, anddashboardHost.src/shared/attention.ts—AttentionCardHostas the literal union.main6bdf70726f7accc4ad31e19cda51e56a903fe21d.Found by the post-merge audit of batch
acd-attention-1a-20260906(tracker #134).