feat(board): session attention, Discord rows, task attribution and relaunch activity (rows 18, 22, #1511, #1512)

One cumulative control-board, webui and seat state. The four rows edit the
same files (scan.mjs, page.html, README.md, app.js), so they land together,
each on its own receipt:

- Row 18, Discord connector rows on the board (#1509): R3 approved by
  Darkwing and Dewey, Gitea comment 26257, manifest 254403b8. Jason
  accepted the visual test.
- Row 22, board attention status (#1503): Filbert approved R1, comment
  26248, manifest e40b58ec; restart receipt 26249.
- #1511, task attribution (row 6 code phase): R2 approved by Filbert and
  Dewey, manifest d4c96395. docs/TOOLS.md carries the approved --by usage
  line (tools-usage.patch 86bcba3c).
- #1512, relaunch activity (row 6 pilot): R1 approved by Darkwing and
  Dewey, candidate manifest 47769fad. All seven source files match it.

Row 16, internal development bootstrap (#1510): the seven files outside
shared records match Filbert's R1 pins, receipt 26204 (agents/researcher/*,
scripts/test-darkwing-launch.mjs, the bootstrap plan).

packages/webui/src/public/app.js is committed at its #1512 R1 pin ce7d79a4.
The working copy holds Dewey's unreviewed return-flow candidate on top of
that, and it stays uncommitted.

Also: the four row briefs and Darkwing's evidence records under
agents/darkwing/work, including the 2026-09-26 tree manifest and the #1512
re-run against 21e3e908. Serial acceptance command: 397/397, three runs.
The failures that only show when tests run concurrently are in #1509 engine
tests, and they reproduce on clean HEAD.

Suites on the exact staged tree: config 24, task 90, foundation 43,
conductor 17, release 14, auth 15, discord 63; package union 397/397
(serial); test-darkwing-launch 5/5.

Shared records (BUILD-LOG, QUEUE, CURRENT, DEFERRED, SESSIONS, AGENTS.md,
agents/README.md) follow in Sage's records commit.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-09-26 14:54:18 -05:00
co-authored by Claude Opus 5.5
parent 21e3e908b6
commit af4203ca92
67 changed files with 2417 additions and 78 deletions
+1 -1
View File
@@ -134,7 +134,7 @@ Push is never automatic.
```bash
scripts/mosaic launch <seat|seat-dir> [--task TEXT] [--project NAME] [--workspace PATH] [--harness NAME] [--repo PATH] [--config PATH] [-- args...]
scripts/mosaic seat task <seat> <text> [--layout repo|fleet|unknown] [--config PATH]
scripts/mosaic seat task <seat> <text> [--by NAME] [--layout repo|fleet|unknown] [--config PATH]
```
Runs a seat's `launch.sh` unchanged (arguments after `--` pass through) and
@@ -0,0 +1,42 @@
# Board attention status correction
Jason accepted discovery/reply tests 1-4, then reported Researcher still showing
waiting after its completed reply. He approved separating idle from explicit
requests for human input. This is a #1503 acceptance defect, not new chat scope.
Darkwing authors; internal Filbert independently reviews. Baseline observed on
refactor: d9745a451004699256af32c2145df40df9f5b4a5. Preserve existing shared edits
and Dewey's UI work. Source scope: control-board scanner, tests and README,
AGENTS.md status guidance, the downstream packages/webui/tests/fixture.mjs waiting
case and scoped tracking records. Dewey confirmed no overlapping ownership. No home-directory or
fleet changes, agent restarts, new public JSON fields, approval/control authority,
text classification service or unrelated UI changes.
## Rule and evidence
Completed normal assistant replies are idle. A completed assistant reply requests
human attention only when its first nonblank text line is exactly prefixed
`Input needed: ` followed by a nonempty request. This readable status convention
is explicit, not a guess based on questions, sentiment, or turn completion.
Quoted examples, user/tool messages and thinking blocks do not signal attention.
Tool activity and errors retain their existing precedence. The latest message
wins; a later ordinary completed reply clears the previous request.
The signal is advisory display state, never permission to perform an action.
Agents use it only for Jason's decision/input, not a wait on another agent or a
routine completion. Existing conversations without the signal become idle after
normal completion. Earlier unstated human blockers cannot be inferred safely.
Seen acknowledges a specific waiting/error event. It hides that event from the
attention list but does not resolve a genuine input request. New explicit requests
reappear; ordinary completions do not. No change to existing API enum or fields.
Acceptance: reproduce BOARD_REPLY_OK incorrectly becoming waiting, test completed
replies/explicit requests/quoted and stale markers/tool activity/errors/Seen,
run scanner/server and relevant downstream regressions, and obtain exact-candidate
independent review. Verify the corrected classification against Researcher's
actual session without editing it. Running-board replacement and operator retest
must be reported separately from source tests; no unattended service restart.
Before implementation: new attention tests reproduce two failures, including
BOARD_REPLY_OK being classified as waiting. One precedence test already passes.
@@ -0,0 +1,60 @@
# Repository-native development bootstrap
Tracking: #1510, created and read-back verified as Darkwing. Branch `refactor`.
Observed shared HEAD after initial checks: `dc5902aafded4042b6a919d9a6aec9f78febe935`.
Other owners have dirty shared docs and active work; they are not adopted here.
Owner-authorized source work. Jason directs Darkwing to coordinate development
through Darkwing, Dewey, Filbert, Rocko and Researcher in the canonical checkout,
`/mnt/storage/src/mosaic-stack`. No `~/.mosaic` launcher/provisioning changes.
No live fleet stop or migration. This assignment supersedes fleet expansion as
the current development priority, not the retained foundation's worker policies.
## Delivery boundary
Darkwing authors; Filbert independently reviews. Keep other agents' existing
changes and completed records, including Dewey's UI work and Sage's DYOR scope.
Allowed source work is the internal team documentation and Researcher's missing
native entry/context/recovery files, the existing native launcher regression
suite, and scoped queue/current/session/build tracking. Preserve agent.json and
roles/contracts; explicit host mode does not widen a managed worker's authority.
No new engine installation, credentials, home-directory launcher, native process
launch, fleet task dispatch, deployment or unrelated runtime change.
Researcher uses the validated configured Pi model, the smallest consistent
choice rather than a new provider/model decision. Darkwing/Dewey defaults,
Filbert's pinned Codex configuration and Rocko's Sonnet wrapper are unchanged.
## Acceptance
1. All five internal agents have repository launch entry points and current
coordination guidance. Researcher has the same per-agent validation and
recovery behavior as the existing native Pi seats.
2. Offline fake-engine tests cover context, registration, first/fresh/resume,
malformed history, missing configuration/resources and duplicate-instance
refusal. All data and registrations stay in test fixtures.
3. Real launcher `--check` succeeds without a TUI, authentication/model request,
seat registration or home-directory writes. This is configuration evidence,
not actual engine/provider interoperability.
4. No managed role/config/contract changes, no edits to `~/.mosaic`, and no
migration or interruption of live seats. Existing unrelated diffs remain.
5. Independent exact-candidate review before claiming source readiness. No
deployment or unapproved publication follows automatically from this task.
## Current source checkpoint
Researcher previously had only a managed agent.json and fleet-labelled SOUL.
Added native launcher, CONTEXT, README and the existing session validation
behavior; changed its persona to the internal research role. Added Researcher to
the existing isolated Pi launcher suite. All four Pi seats and Rocko's offline
suite pass, six tests total. No real engine launched.
All five real launcher `--check` calls pass with no TUI, authentication request,
model call or seat registration. Next: obtain internal Filbert's independent
exact-candidate review. New launches read the
updated source context; existing running sessions do not reload it implicitly.
The approved CHAT-01C local commit and its Git receive-pack authorization gate
remain separate. Do not use this assignment to modify external provisioning or
publish unrelated local commits.
@@ -0,0 +1,65 @@
# Discord connector board row
Current authorized queue item: row 18, #1509, pilot plan section 11. Jason
assigned this to Darkwing and now explicitly requires automatic continuation to
the next authorized item after each accepted iteration. This starts row 18,
not unrelated gated work. Preserve the accepted row-22 attention correction.
## Ownership and scope
Filbert implements in the canonical checkout on refactor. Darkwing independently
reviews the exact candidate; Dewey reviews any visible presentation change.
Single writer for this implementation: Filbert. Existing dirty files remain
owned by their authors and must not be reset, adopted or overwritten.
Allowed implementation paths: packages/control-board source/tests/README and
minimal packages/webui source/tests changes needed to display the connector
and refuse replies. No connector source, bindings, secrets, launchers, systemd
units, live service changes or files under ~/.mosaic. No commits or publication
by the implementer. Darkwing owns shared tracking records.
## Existing contract to implement
The original accepted connector brief supplies the interface:
- Discover one row per <dataRoot>/discord/<binding>.json, with 0600 regular
non-symlink files. Project fleet, agent `<seat> (discord: <binding>)`.
Validate only safe name/seat identity for discovery; never dereference or
expose token paths, Discord/user/channel IDs, or the rest of the binding.
- Sessions are under <dataRoot>/sessions/discord-<binding>.
- Reuse the connector's read-only readPid/ownerState identity checks from
packages/discord/src/journal.mjs. A positive live PID plus matching start
tick and boot ID is necessary. Missing, corrupt, dead or unverifiable owners
cannot be reported live. Do not signal, recover, unlock or rewrite anything.
- Show STOP presence as braked without interpreting its private contents.
Liveness and braking must be distinguishable. Existing completed-reply idle
semantics still apply to session activity.
- Refuse board replies server-side for connector rows even if a stale or
forged registration claims a tmux destination. The UI must not offer reply.
- Avoid filesystem traversal, symlink reads and disclosure of private binding
fields. A malformed binding must not manufacture an actionable row. Report
discovery failures safely rather than dumping private content or credentials.
Daily counters are optional in the original brief and excluded from this first
row. No new ingress, controller, Discord API calls or engine/model calls.
## Acceptance and handoff
Implement and test discovery/privacy, positive and negative process identity,
STOP/braked display, ordinary session state, server-side reply refusal and
unchanged ordinary-agent replies. Test both board and WebUI integration with
isolated fixtures. Preserve the accepted attention regression coverage.
Return an exact frozen candidate, changed paths and reproducible test results.
The author does not self-approve. Darkwing and Dewey return scoped independent
verdicts before integration. Source tests do not prove live service transitions.
A read-only observation of the running connector is allowed after source review;
no live service stop/brake/restart or backend replacement is inferred. Existing
protected-operation and operator-acceptance gates remain in force.
## Continuation correction
Darkwing previously said he was continuing to this item but performed no action
before ending the turn. Jason called out the violation. This entry records the
actual start and ownership; a promise or dispatch is not completion. While the
author works, Darkwing prepares independent acceptance and reconciles records.
+45
View File
@@ -0,0 +1,45 @@
# Task attribution, row 6 code phase
Jason accepted row 18 and has explicitly required automatic continuation after
accepted iterations. This starts the next already-briefed item, row 6 of QUEUE,
under the existing control-board MVP plan's Piece 5. The newer standing start
instruction replaces that piece's historical Sunday start-message scheduling;
its ordering and protected-action gates remain. Use repository-native agents,
not fleet launchers. Rows 9-13 still wait for row 6 completion.
## Source assignment
Rocko implements the code phase from the internal agents/rocko profile in the
canonical checkout, refactor. Filbert independently reviews backend/schema/tests;
Dewey independently reviews presentation. Darkwing coordinates and owns tracking.
The existing Rocko native process uses the older tmux socket; this is not a
managed fleet worker assignment or authority to change its launcher.
Implement the already-approved taskSetBy requirement: mosaic seat task records
an explicit --by NAME, otherwise MOSAIC_AGENT_NAME, otherwise unknown. Board
serialization and both current board presentations display it by the task source.
This is caller-supplied attribution, never authenticated identity or authorization.
Scope: packages/seat source/tests/docs, packages/control-board source/tests/docs,
and minimal WebUI presentation/tests. Preserve existing attention and Discord-row
changes exactly except the necessary additive integration. No launcher, connector,
role, credential, home, live registration or service changes; no commits/push by
the author. Use isolated fixtures, not actual seat task mutation during development.
Acceptance:
- Explicit --by wins over environment; absent/empty environment gives unknown.
Invalid explicit input refuses before writing. Values are bounded and escaped.
- Existing registration records without taskSetBy still load, showing unknown.
No breaking registration version change or implicit migration of old files.
- Preserve unrelated registration fields and original startedAt on task updates.
- Display attribution only for the task actually selected: no stale registration
attribution on a transcript-derived task, and no borrowing native attribution
for a Discord connector's fixed task. Attribution never enables replies/access.
- Isolated CLI/schema/scanner/browser regressions, exact frozen handoff and
independent review. Existing accepted behavior remains covered.
This code phase precedes the plan's specified first Filbert behavior assignment,
Relaunched seat shows the old last message. Do not start that concurrently.
Gate F and its human-message evidence are not claimed by this code phase; record
actual future dates, not the old plan's anticipated 2026-09-13 measurement.
No live backend replacement or publication follows automatically from source tests.
@@ -0,0 +1,35 @@
# Relaunch activity, row 6 behavior assignment
Jason confirmed the #1511 table tag and inspector wording. The code phase's
bounded local delivery is accepted. Under his standing continuation mandate,
start Piece 5's already-specified first Filbert assignment from the control-board
MVP plan: Relaunched seat shows the old last message.
Filbert is sole source author. Darkwing independently reviews backend and tests;
Dewey reviews presentation. Work in the canonical refactor checkout. Preserve
accepted attention, Discord and task-attribution changes and all other owners'
changes. Frozen prior candidates remain unchanged.
Scope: minimal packages/control-board scanner/presentation/tests/docs changes
and corresponding WebUI presentation/tests when needed. If a live matching
registration's startedAt is newer than recorded session activity, show
'relaunched at X, no messages since' instead of presenting an old message as
current activity. Preserve historical transcript data. After new session activity,
normal presentation resumes. Stale/dead registrations must not assert a relaunch.
No effect on connector owner identity or fixed connector task.
Prove the old behavior first with isolated fixtures. Cover newer launch vs old
activity, equality, subsequent new activity, stale registration and unknown/missing
activity. Preserve attention/Seen, task attribution and reply authorization.
Do not silently redesign those semantics. Return an exact frozen candidate,
changed/inherited pins and reproducible tests for both independent reviewers.
No launcher, Claude discovery, credential, role, home, live registration or
service changes by the author. No commits/push or shared tracking edits by the
author. No real seat relaunch is needed for the source fixture tests. Darkwing
owns tracking and any separately authorized integration.
Publication remains a separate gate, including prior unpublished dependencies.
Do not claim Gate F or issue closure from fixture tests. Its eventual evidence
must use the actual assignment dates and demonstrate no direct Jason-to-Filbert
work messages; never backdate the old plan's anticipated 2026-09-13 metric.