You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Split the agent route from its durable key: mutable address, optional immutable id (#468)
* feat(agent-spec): admit an optional immutable agent id and mutable address
Agent Spec gains the two fields decision 0015 separates from the positional
`identity`: an explicit catalog-global immutable `id` and an optional mutable
`address`. Both are optional during the DELTA-003 migration window; `id` is
required in the target grammar once every live and archived subject is migrated.
- `id` is opaque. Its only two producers are UUIDv7 for a new subject and the
frozen `<host>.<identity>` bus identity of a migrated legacy subject, and R26
reuses it verbatim as the canonical task ID and therefore as a session socket
path component, so validation refuses exactly what would stop being a usable
task ID rather than imposing the address grammar.
- `address` carries R24's grammar: at most 255 ASCII characters, dotted
1..=63-character segments of lowercase letters, digits, and hyphens, each
beginning and ending with a letter or digit.
- `effective_address()` falls back to the positional identity, `bus_address()`
host-qualifies it, and `effective_id()` answers with the value catalog ID
migration freezes, so a partially migrated catalog stays coherent.
Declaring either field twice is the shape refusal `identity` and `host` already
carry. No writer emits either field yet.
* feat(catalog): validate agent id and address uniqueness and project both
Catalog admission gains the two uniqueness rules R24 states, and the read
projections gain the fields R24 and decision 0015 require them to publish.
- `dup-id` now keys on the effective agent ID rather than the bus identity, so
one check covers a legacy duplicate identity, two explicit ids colliding
across hosts (an ID is catalog-global, never per-host), and an explicit id
claiming another subject's still-unmigrated frozen bus identity.
- `dup-address` is new: effective addresses are unique per resolved logical
host among running and suspended subjects. A retired subject releases its
address, so it neither claims nor collides. Explicit-vs-explicit and
explicit-vs-identity-fallback are the same collision.
- Roster and graph JSON append `id`, `address`, and nullable `busAddress`,
preserving existing field order and meanings. `identity` keeps its meaning as
the positional declaration key and legacy address fallback.
- The graph re-keys `id`, `parentId`, `rootId`, and `ancestorIds` onto the
effective agent ID so one namespace spans a partially migrated catalog; for an
unmigrated subject that value is its bus identity, so output is unchanged.
Archived-subject ID uniqueness joins these checks with the migration verb.
* fix(agent-spec): stop admitting a lone id or address as a spec candidate
`id` and `address` are two of the most common keys in arbitrary JSON/TOML, and
this predicate exists to keep such files out of the spec plane. Admitting them
turned a stray file beside a real declaration into a phantom agent — in the
roster and in `catalog graph` — and, because such a file carries no launch, also
stopped the catalog from admitting at all.
Nothing needs the two arms: every real declaration carries an identity, a driver
block, a launch, or `type = "service"`, and migration adds `id` to declarations
that are candidates for other reasons.
agent-identity: dev3.direct.omp.v6c4mkm2
agent-persona: generalist
agent-supervisor: unavailable
agent-tool: OMP
agent-tool-version: 18.1.2
agent-runtime: OMP 18.1.2
tooling-profile: dotfiles@7534055
* fix(agent-spec): restrict the agent id grammar to the closed safe set
The previous grammar admitted every printable ASCII byte except `/`, `\\`, and
`:` — so backtick, `$`, `;`, `&`, `|`, `*`, `?`, and quotes were all legal in a
value R26 reuses verbatim as the canonical task ID, as a session socket path
component, and in shell-adjacent bus text, where a backtick has already executed
a command on a live host (schickling/dotfiles#1614).
The grammar is now `[A-Za-z0-9._-]`. It stays wider than the address grammar on
purpose: a frozen legacy ID keeps the case and underscores its identity carried,
so freezing an admissible identity can never be refused here. No writer emits
`id` yet, so this narrows an unproduced namespace.
agent-identity: dev3.direct.omp.v6c4mkm2
agent-persona: generalist
agent-supervisor: unavailable
agent-tool: OMP
agent-tool-version: 18.1.2
agent-runtime: OMP 18.1.2
tooling-profile: dotfiles@7534055
* fix(catalog): register both duplicate keys in one pass on one host key
Two asymmetries between the `dup-id` and `dup-address` rules:
- `dup-address` keyed on the resolved logical host while `dup-id` keyed on an
empty placeholder, so under `--host h` a host-less declaration and an explicit
`host "h"` one — one physical subject — were reported only under the address
code. Both rules now read the same host key.
- Suppressing the address check for a declaration already refused for a
duplicate ID also left that declaration's address unregistered, so a third
subject could claim it undetected — including through `st2 agent address`,
whose gate re-runs exactly this rule. Both keys now register in one pass
before either is reported, and one physical conflict is still one diagnostic.
agent-identity: dev3.direct.omp.v6c4mkm2
agent-persona: generalist
agent-supervisor: unavailable
agent-tool: OMP
agent-tool-version: 18.1.2
agent-runtime: OMP 18.1.2
tooling-profile: dotfiles@7534055
0 commit comments