Files
stack/agents/sage
jason.woltjeandClaude Opus 5.5 20ea5a0b64 fix(discord): row 25 approvers are user names, never Discord ids in tool text (#1509)
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]>
2026-09-26 16:30:11 -05:00
..

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.