Repository navigation
feat(actors): a model label on the actor row - #170
Conversation
Which model an Actor runs is visible today only inside its command line, as a runtime-specific flag, and not at all for Actors whose command does not name one. A board or a foreman that wants to choose between Actors by model has to parse commands, and a `model` key sent to actor_add or actor_update is dropped without an error. An Actor now carries an optional `model` label: set on actor_add, changed or cleared (with an empty string) on actor_update, returned on actor_list rows and in the actor.add event. It is trimmed and limited to 128 characters without control characters. It is a label for people and tools; launching does not read it. The CLI gains `--model` on `actor add` and `actor update`, and the MCP `cccc_actor` schema describes the key.
Main's retry-safe task creation appended a daemon test where this branch appended its own; both tests are kept.
|
Thanks for this contribution and the careful validation. Making an Actor’s model easier to identify is a useful goal, and I understand that this field is intentionally metadata only. My hesitation is with the public semantics: --model looks like launch configuration, while this value neither selects nor verifies the running model and can become stale after a model switch. Before asking you to revise the patch, could you share the concrete workflow that needs a separate machine-readable model declaration rather than the existing Actor title? If that distinction is necessary, we could discuss an explicitly named model_label, with clear operator-supplied semantics. I’d prefer to settle that requirement first. Please don’t expand this into runtime-specific command parsing or database inspection; keeping the integration small is important to us. |
|
The concrete workflow is an external work allocator. It reads Actor availability, joins each Actor to an operator-maintained model table, and uses that table’s cost/ranking preferences when placing work. We already do that lookup outside CCCC; the association currently comes from our own configuration and command-line conventions. A separate field would give clients a common read surface for that declaration without putting allocation policy in CCCC. The Actor title is the human-facing role/name. Using it as the model key would couple display naming to the allocator’s configuration: role titles and model declarations can change independently. I agree that If this workflow is in scope, I’m happy to discuss |
|
Thanks for clarifying the allocator workflow. That gives the separate field a concrete purpose, and your point about keeping role titles independent from model declarations makes sense. I’m comfortable reviewing a narrowly scoped revision using model_label and --model-label. Please keep the contract explicit: this is an optional, operator-maintained declaration. Absence means undeclared; it neither configures launching nor verifies the model serving a turn. Updating the label should not restart the Actor or alter its launch configuration. Please rename the field consistently across the contracts, CLI, MCP surface, documentation, and tests, without retaining the unmerged model name as an alias. Cost tables, rankings, allocation policy, and runtime detection should remain outside this change. Focused coverage for persistence, validation, clearing, and unchanged runtime behavior would be appropriate. No additional model registry or automatic synchronization is needed. Once revised, we can review the implementation against that scope. |
Preserve native-session launch guards while reconciling Actor arguments and validation. Use model_label and --model-label consistently without a model alias, and cover launch settings remaining unchanged.
The actor row says which runtime an Actor uses, but not which model it runs.
That shows up only inside the command line, as a runtime-specific flag, and
not at all for an Actor whose command does not name one. A foreman or a tool
that wants to pick between Actors by model has to parse commands. A
modelkey sent to
actor_addoractor_updatetoday is dropped without an error,and
cccc actor add --modelis rejected as an unknown argument.What changes.
modellabel. It is set onactor_add,changed on
actor_update, and cleared there with an empty string. Itappears on
actor_listrows and in theactor.addevent, and it is storedwith the group, so it survives a daemon restart.
characters; anything else is refused. An unset label is left out of the row
rather than shown as an empty string.
changes what runs. (fix(codex): open the thread on the model the command declares #156 is the other direction: it opens a Codex thread on
the model the command declares.)
--modelonactor addandactor update. The MCPcccc_actorschema describes the key foradd.How we built it.
f1d27838; headd4619924is the reviewed feature change merged with that base. The eight-file feature delta adds an optionalActor.modellabel with serde defaults and validates it in coreactors::addandactors::update.actor_add/actor_updaterequests pass it;resources/mcp_tools.jsonandCCCC_DAEMON_IPC_V1.mddescribe it.How we tested it.
integration_ops.rs), throughactor_add,actor_listandactor_update: a label with surrounding spaces is stored trimmed and is inthe
actor.addevent and the row; an update changes it; 129 characters anda label with a newline are refused and leave it unchanged; an empty string
clears it, and the row then has no
modelkey.actor add --modelandactor update --model "".a212cb04, before main advanced tof1d27838: run39763752925(2,716 tests: 2,715 passed, and onlyan_actor_carries_the_model_label_its_operator_gives_itfailed). The CLI parse test is excluded because it needs the new field to compile.3d3d10cb: both tests pass, with the rest of the contracts, core andMCP suites, the CLI's args tests and the daemon's integration ops
(609 tests).
-D warningsand rustfmt are clean.ccccCLI and the daemon socket; a foreman (a realactor process) adds a peer through the
cccc mcpstdio server.--modelis anunexpected argument on add and update; a
modelsent over the socket orMCP is accepted and dropped; a 129-character label and one with a newline
are accepted and dropped. The ninth check, that a labelled Actor starts
and runs, is a control and passes everywhere.
restart.
d4619924bb4fa3e4a0240ebb5c67c2ac2abac2fbpassed all six jobs, includingrust-linux,windows-smoke,web,quality,packageandci-required: run39771682941.Tested on: fork CI, GitHub-hosted
ubuntu-26.04runner (Ubuntu 26.04.1 LTS,image 20261012.163.1; the job log does not name the CPU).