Jason's live check after the 20:58Z restart posted no Approve button. The
Discord Sage wrote DEC-009's required_approvers as names; the SetSpark
service stores approvers as discord:<id> and accepted the names, and the
connector correctly refused the approval request ("bad approver id").
- binding.mjs derives setspark.approvers from the binding's users (name to
id); a binding-set approvers key and duplicate names are refused. With
setspark set, a user id or name change refuses the reload (pi's approvers
are fixed at start).
- setspark.mjs: record_create/record_update map required_approvers names to
discord:<id> and refuse unknown names, ids, duplicates and non-lists
before any request, without echoing the value. hideIds turns mentions,
discord: values and standalone 17-20 digit runs into the user's name or
"unknown user" in every verb's text and refusal, including the service
message and code before they are cut. The connector's approval request
keeps the bare ids.
- tests: boundary test over nested, keyed, numeric, mention and cut ids;
a local contract fixture from create through validateRequest, with the
old name-stored shape still refused.
Rocko: R1 revise, R2 revise, R3 approve (81379830..., report da75219f...).
Suites on an index export: 24/90/43/17/14/15/63/18; Discord node tests 173/173.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Rocko development TUI
Run from any terminal:
/mnt/storage/src/mosaic-stack/agents/rocko/launch.sh
Rocko handles general Mosaic Stack development assignments under project lead
Sage. The launcher opens Claude Code in the repository with --model sonnet
and the display name Rocko. Sonnet is the selected CLI model alias; Rocko's
project persona is supplied by SOUL.md, not a separate custom Claude agent.
Use --check to validate the executable and context inputs without a model
call. This does not verify authentication or account access to Sonnet. Claude
Code uses its normal authentication, settings, permissions, and discovered
resources; this script does not copy credentials or bypass permissions.
Normal launches resume the exact Claude UUID recorded locally in
.pi/state/rocko/session-id. First launch creates a UUID; --fresh creates
another while retaining previous conversations in Claude's native storage.
Each private launch receipt under .pi/state/rocko/launches/ retains its UUID
and context snapshot. The launcher lock refuses concurrent Rocko launches
through this script; it does not lock sessions opened by other means.
If Claude exits before saving its first conversation, or its history is
removed, the saved UUID may not be resumable. Inspect the failure and use
--fresh explicitly to start again. The launcher does not fall back to the
latest unrelated project conversation. Old UUIDs in launch receipts can be
opened manually with claude --resume UUID from the project directory.
The prompt snapshot includes CONSTITUTION, STANDARDS, Rocko's SOUL, the live
Mosaic user profile, root AGENTS.md, and Rocko's CONTEXT.md. --soul FILE,
--constitution FILE, and --user FILE override individual inputs; relative
paths resolve from the repository root. Missing or empty inputs refuse launch.
The snapshot is appended to Claude's system prompt on each launch.
This is a host development session, not a managed fleet registration. It loads no Pi goal extension. The user or team lead supplies the assignment.