agmsg_self_name_on_action <team> <agent> [<project>] [<type>] takes project and
type as optional, and all three action callers omit them:
scripts/send.sh:32 agmsg_self_name_on_action "$TEAM" "$FROM"
scripts/inbox.sh:23 agmsg_self_name_on_action "$TEAM" "$AGENT"
scripts/history.sh:26 agmsg_self_name_on_action "$TEAM" "$AGENT"
The hook passes them straight through to the primitive, which writes the
placement record as <ref>\t<project>\t<type>. So a record written by the
action hook — the #1109 path, the one that exists for hand-started seats — has
two empty fields.
arrange.sh reads those fields and refuses:
IFS=$'\t' read -r ref project type < "$rec" || true
...
[ -n "$SOURCE_PROJECT" ] && [ -n "$SOURCE_TYPE" ] \
|| die "placement record for '$TEAM/$SOURCE' is missing project or type"
Reproduced end to end in an isolated skill dir, with the differential control:
source = a record with empty project/type
-> arrange: placement record for 'T/a' is missing project or type
source = a record that has them
-> gets past that line and fails later for an unrelated reason
(the fixture has no roster entry)
Measured on one machine's live store: 12 of 36 placement records have an
empty project or type, including seats that are in daily use. Those seats cannot
be used as the source of an arrange.
The two ways out look different in what they claim:
- the callers pass the project and type they already have (send.sh and inbox.sh
both know $PROJECT/$TYPE), so a record written on action carries the same
fields a record written at spawn or SessionStart does; or
arrange stops requiring fields that a legitimate writer does not supply,
which means deciding what it actually needs them for.
The first is smaller and keeps one shape for the record. Filing rather than
fixing because it is not in the path of the release-gate work in flight, and
because the second option is a question about arrange, not about the hook.
Found while checking that the #1130 fix had reached this machine's seats.
agmsg_self_name_on_action <team> <agent> [<project>] [<type>]takes project andtype as optional, and all three action callers omit them:
The hook passes them straight through to the primitive, which writes the
placement record as
<ref>\t<project>\t<type>. So a record written by theaction hook — the #1109 path, the one that exists for hand-started seats — has
two empty fields.
arrange.shreads those fields and refuses:Reproduced end to end in an isolated skill dir, with the differential control:
Measured on one machine's live store: 12 of 36 placement records have an
empty project or type, including seats that are in daily use. Those seats cannot
be used as the source of an
arrange.The two ways out look different in what they claim:
both know
$PROJECT/$TYPE), so a record written on action carries the samefields a record written at spawn or SessionStart does; or
arrangestops requiring fields that a legitimate writer does not supply,which means deciding what it actually needs them for.
The first is smaller and keeps one shape for the record. Filing rather than
fixing because it is not in the path of the release-gate work in flight, and
because the second option is a question about
arrange, not about the hook.Found while checking that the #1130 fix had reached this machine's seats.