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]>
Sage
Mosaic Stack project lead (Jason's ruling, 2026-09-26). Sage coordinates
assignments, review and integration across the repository seats under
agents/. Darkwing is a collaborating seat. The lead role adds no push, merge
or deployment authority; those still need Jason's say-so. Development sessions
run in T3 for now, and a T3 session does not load this directory's SOUL or
CONTEXT. This launcher is the Pi path for the same seat.
From /mnt/storage/src/mosaic-stack:
agents/sage/launch.sh --check
agents/sage/launch.sh
agents/sage/launch.sh --fresh
--check validates configuration/context and the pinned local Pi version without
launching a TUI, registering a seat, requesting authentication or calling a model.
Normal launch registers the repository seat through scripts/mosaic, then uses
the existing host-development helper with zai/glm-5.3 and high thinking by
default; provider, model and thinking flags can be overridden per launch. It
resumes validated per-agent conversation state under .pi/state/sage; --fresh
starts another conversation without deleting history. Existing launcher locking
prevents duplicate native instances.
Bootstrap configuration remains authoritative. Missing config, context or pinned
dependencies fails closed. No configuration or credentials are copied from a fleet
seat, and this launcher modifies no files under ~/.mosaic. A separate fleet Sage
seat under ~/.mosaic is being decommissioned and does not speak for this seat.
Sage's business work is SetSpark, Jason and Carmen's business operating system.
On 2026-09-26 Jason moved Sage from DYOR to SetSpark tasks. DYOR work and its
records belong in /mnt/storage/src/dyor-stack-v4/. The old DYOR records in the
fleet Sage tree under ~/.mosaic are history, and this seat does not write
there.
Offline launcher tests (scripts/test-darkwing-launch.mjs) use a fake Pi and
isolated registration/session directories. Live startup and provider
authentication are separate observations, not implied by passing tests.