mirror of
https://github.com/razzant/ouroboros.git
synced 2026-10-03 12:18:39 +00:00
A subagent row was identified everywhere by its stored `subagent_id`. Presets mint that id by position (`primary-builder`, `fast-scout`, ...) and Duplicate inherited it (`fast-scout_copy_pls35j`), so once the owner re-pointed a row the id lied to the model and to the owner exactly like the display `name` retired on 2026-08-30 did. The stored id is now a hidden join key (reviewer references, snapshots, custody and history keep following the row through it) and every model- and owner-facing surface names a row by its HANDLE: the route target as stored plus the facets set on that row (effort, non-default access, `@pin`, processing), e.g. `codex=gpt-6-astra/xhigh`. It is a pure function of ONE row, so a new sibling never renames a neighbour and a snapshot or history record recomputes its own name without the live roster. - One resolver (`subagent_runtime.resolve_configured_row`) serves `schedule_subagent` and `delegate_start`: a handle, else a stored id as a permanent silent alias; a string naming two rows is a typed `subagent_selector_conflict`. The actor-first start resolves its argument before comparing it with the bound snapshot, so a handle accepted at scheduling is no longer refused at the physical start. - Saves refuse two rows with an identical engine (Settings save, onboarding draft and completion; effective defaults, so an omitted session access IS `full`). Reads stay tolerant: twins saved earlier still load and are told apart as `<handle>~<subagent_id>`. In the editor Duplicate mints a neutral key and is born a draft whose card names its twin until an engine field changes. - The model catalog, unavailable-route alternatives, the startup receipt, the start result and the dated execution facts carry handles; history is named from each record's OWN identity (an old record without one shows its recorded route target), never mapped through today's roster. - The Review-lanes picker and its "ran as" line show the handle instead of `#<stored id>`; a JS twin of the projection is pinned to the Python one by a shared parity table, and a browser test opens the real picker at 1 and 10 rows, desktop and phone width. Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com> |
||
|---|---|---|
| .. | ||
| 01-role-and-authority.md | ||
| 02-naming-and-boundaries.md | ||
| 03-module-size-and-complexity.md | ||
| 04-core-governance-artifacts.md | ||
| 05-review-and-commit-protocol.md | ||
| 06-rules-by-change-class.md | ||
| 07-managed-update-rule.md | ||
| 08-mutation-attribution-rule.md | ||
| 09-process-custody-rule.md | ||
| 10-platform-abstraction-rule.md | ||
| 11-design-system.md | ||
| 12-mcp-client-integration.md | ||
| 13-gateway-boundary-pattern.md | ||
| 14-build-and-ci.md | ||