feat(discord): writes on write-marked roots, web fetch and search, held prompts (#1509)
Row 23. write_file and edit_file for roots marked write: true under the same fence as reads; web_fetch (https only, public addresses, pinned connection, capped body) and web_search through SearXNG; extension renamed to tools.mjs. Engine holds a prompt while pi is busy and sends it as its own run, so a second message mid-turn no longer folds into the first (live defect). fake-pi models the real follow-up folding. Suite 52/52, node tests 129. rev-code-02 APPROVED round 3, comment 26362, tree dbd2ce9a. Records: QUEUE rows 23-24, CURRENT, BUILD-LOG phase, SESSIONS, row 24 brief (git verbs, D5-D7 ruled). Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
@@ -254,3 +254,4 @@ are never rewritten or removed; corrections are new entries.
|
||||
- 2026-09-13 UTC — coordinator (Claude) — Discord service unit (#1509, QUEUE row 17): `run --supervised` and `recover`, exit 3 for brakes, `scripts/discord-service.sh`, systemd user unit; suite 40/40 (95 node tests); Sage seat migrated from tmux to `mosaic-discord@shared-signals`, kill and brake checks passed live. Committed; push on Jason's say-so.
|
||||
- 2026-09-13 UTC — coordinator (Claude) — Discord binding reload and per-user channels (#1509, QUEUE rows 19–20): `reload`/SIGHUP with fixed keys refused, `reloads.jsonl`, user `channels` allowlist; suite 41/41, 101 node tests; Carmen enrolled live by reload at 00:03 UTC, her first message pending; row 18 assigned to darkwing by Jason.
|
||||
- 2026-09-14 UTC — coordinator (Claude) — Discord read-only tools (#1509, QUEUE row 21): `tools` binding key, host pi extension `list_dir`/`read_file`/`search` confined to declared roots, engine settles on `agent_end`, tool calls in the turn record; rev-code-02 round 2 APPROVE (26276) after four round 1 findings were fixed; suite 48/48, 116 node tests; committed locally, not pushed; live check in #sage-admin next.
|
||||
2026-09-17T02:05:47Z | coordinator (Claude, #1509) | Row 23 Discord writes + web tools: built, round 3 pinned (comment 26361), SearXNG live on loopback, engine held-prompt defect fixed live; row 24 git verbs briefed with D5–D7 ruled | in review, uncommitted, no push
|
||||
|
||||
+7
-2
@@ -182,9 +182,14 @@ user entry may carry `channels`, an allowlist of listed channel ids.
|
||||
unit `[email protected]` (one instance per binding, restart on
|
||||
failure, exit 3 never retried, SIGTERM on `systemctl --user stop`, SIGHUP on
|
||||
`systemctl --user reload`). An optional `tools` key in the binding declares
|
||||
read-only roots; pi then runs with its own tools off and the package's
|
||||
file roots; pi then runs with its own tools off and the package's
|
||||
extension providing `list_dir`, `read_file` and `search` confined to those
|
||||
roots, with each call in the turn record. `tools` is a fixed key: changing
|
||||
roots, plus `write_file` and `edit_file` for roots marked `"write": true`
|
||||
(temp file and rename, no folder creation, no dot-prefixed path, no
|
||||
credential shapes), and `web_fetch` and `web_search` when `tools.web`
|
||||
names a SearXNG instance (https only, public addresses only, three
|
||||
redirects, capped body, html to text), with each call in the turn record.
|
||||
Sage has no git; the operator commits from the terminal. `tools` is a fixed key: changing
|
||||
it needs a stop and start. Records
|
||||
under `<dataRoot>/discord/<binding>/`: `inbox.jsonl`, `outbox.jsonl`,
|
||||
`drops.jsonl`, `admissions.jsonl`, `notices.jsonl`, `reloads.jsonl`, write-once `turns/<id>.json`. Suite:
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
# Discord Sage: git for the strategy repository (#1509, QUEUE row 24)
|
||||
|
||||
Jason's word, 2026-09-16, after the first write from Discord landed:
|
||||
"Sage will need to have git tooling to commit, push, pull, etc. for the
|
||||
shared-signals repo." This replaces the row 23 rule that Jason commits
|
||||
from the terminal.
|
||||
|
||||
## 1. Outcome
|
||||
|
||||
A decision reached in Discord ends up committed and pushed to
|
||||
`shared-signals` on GitHub, by Sage, in the same conversation, with the
|
||||
commit and push in the turn record. Sage still has no shell and no git
|
||||
anywhere else.
|
||||
|
||||
## 2. What is built
|
||||
|
||||
Four fixed verbs in the extension, each a `git` child process with a
|
||||
fixed argument list, run only in a root that is marked `"write": true`
|
||||
and is a git work tree. No verb takes free-form arguments.
|
||||
|
||||
- `git_status(root)`: branch, ahead/behind, changed paths. Read only.
|
||||
- `git_commit(root, message, paths?)`: stages the named paths (or every
|
||||
change under the root when omitted), refuses a dot-prefixed path or a
|
||||
path outside the root, refuses an empty message or one over 500
|
||||
characters, refuses when nothing is staged, commits with author
|
||||
`Sage <[email protected]>` and a trailer naming the Discord author
|
||||
by role (`Requested-by: Jason` or `Carmen`, never an id). Returns the
|
||||
short hash.
|
||||
- `git_pull(root)`: `git pull --ff-only origin <current branch>`. A
|
||||
non-fast-forward result is refused with the reason and nothing is
|
||||
merged or rebased.
|
||||
- `git_push(root)`: `git push origin <current branch>`, current branch
|
||||
only, never `--force`, never a tag, never another remote.
|
||||
|
||||
Fences shared by all four: the root's work tree must be clean of
|
||||
conflicts and not mid-merge or mid-rebase; the current branch must be
|
||||
the one the binding names (`"branch": "main"`), so a detached head or
|
||||
another branch refuses; 60 s timeout; stdout and stderr are captured,
|
||||
trimmed to 4 KiB and returned as data; exit codes become fixed refusals.
|
||||
|
||||
Credentials: the connector already runs with `MOSAIC_AGENT_NAME=sage`.
|
||||
The engine adds `MOSAIC_GIT_IDENTITY=sage` to the child environment and
|
||||
the repository's existing helper (`git-credential-mosaic`) resolves the
|
||||
seat's GitHub token at push time. The token is never read, printed,
|
||||
journaled or passed as an argument; a push failure returns git's message
|
||||
with any `https://…@` form masked.
|
||||
|
||||
Binding (`tools` key, fixed):
|
||||
|
||||
```json
|
||||
{ "name": "shared-signals", "path": "…/shared-signals", "write": true,
|
||||
"git": { "branch": "main", "identity": "sage" } }
|
||||
```
|
||||
|
||||
Without `git` on a root, no git verbs are offered for it. The prompt
|
||||
paragraph says which root has git, that a commit is real once pushed,
|
||||
and that Sage reports the hash.
|
||||
|
||||
## 3. Not built
|
||||
|
||||
No shell, no arbitrary git arguments, no branches, no force, no tags, no
|
||||
other remotes, no rebase, no reset, no history rewriting, no git in the
|
||||
Mosaic roots. A pull that needs a merge stops and says so; Jason resolves
|
||||
it from the terminal.
|
||||
|
||||
## 4. Evidence
|
||||
|
||||
- `packages/discord/tests/git.test.mjs` against a local bare remote:
|
||||
status, commit with the trailer, pull ff-only, push; refusals for an
|
||||
empty message, a dot path, a path outside the root, a non-ff pull, a
|
||||
detached head, another branch, a conflicted tree; no token in any
|
||||
argument list or output.
|
||||
- Suite: the extension exposes the four verbs only with a `git` key.
|
||||
- Live: Jason asks in #ideas for a decision to be written, committed
|
||||
and pushed; the GitHub commit shows Sage as author and the trailer;
|
||||
the turn record shows write, commit and push.
|
||||
|
||||
## 5. Rulings from Jason (2026-09-16, evening)
|
||||
|
||||
- D5. Identity: the sage seat's GitHub token (`github-jetrich-sage`
|
||||
in the seat's secrets, resolved by the existing helper), author
|
||||
`Sage <[email protected]>`. Ruled: "That email works is acceptable."
|
||||
- D6. Push every time. Ruled against the recommendation to push only on
|
||||
request: "This will be fatal. Failure to automatically push will result
|
||||
in stale data." So every commit pushes at once; a commit whose push
|
||||
fails is reported as such in the reply and the turn record, and the
|
||||
next commit retries the push.
|
||||
- D7. Reviewer: rev-code-02 on #1509. Ruled: "agree".
|
||||
|
||||
## 6. Shared-signals record protocol (briefed 2026-09-17 by shared-signals-05)
|
||||
|
||||
Verified against `origin/main` of `jetrich/shared-signals` (tooling landed in `8f0d946`; main at `7aa88ad` on 2026-09-17):
|
||||
`tools/vault_lock.py`, `tools/validate_vault.py`, `docs/ID-REGISTRY.txt`,
|
||||
`docs/RECORDS.md` "Reserving IDs and locking files", AGENTS.md step 4.
|
||||
A record's id must be reserved in the registry before the file exists,
|
||||
the registry is append-only and committed, `validate_vault.py` fails a
|
||||
commit whose ids are not registered or are used twice, and a file being
|
||||
edited for more than a moment is locked per clone under `.vault-locks/`
|
||||
(gitignored, fcntl, default TTL 3600 s). Owner comes from
|
||||
`VAULT_LOCK_OWNER`, then `MOSAIC_AGENT_NAME`, then git user.name; the
|
||||
connector already sets `MOSAIC_AGENT_NAME` to the seat, so locks read
|
||||
"sage" with no change.
|
||||
|
||||
What this means for the verbs, since Sage never gets a shell:
|
||||
|
||||
- `git_commit` runs `python3 tools/validate_vault.py` in the root first
|
||||
and refuses the commit, with the validator's first lines, when it fails.
|
||||
It also runs `vault_lock.py check` on the staged paths and refuses when
|
||||
another owner holds one.
|
||||
- A new fixed tool `reserve_id` (prefix BUS, PRJ, SS, DEC or REF plus a
|
||||
title) runs `vault_lock.py reserve` and returns the id; the registry line
|
||||
it appends is staged with the record in the next commit. `write_file` of
|
||||
a new record without a reserved id is not blocked by the connector; the
|
||||
validator catches it at commit, and the prompt tells Sage to reserve
|
||||
first.
|
||||
- `write_file` and `edit_file` take the clone lock for the path around the
|
||||
write (`lock`, write, `unlock`), so a terminal contributor on the same
|
||||
clone sees the claim. A live lock held by another owner refuses the write
|
||||
with that owner's name in the reply.
|
||||
- Staging is by explicit path only: Sage's changed records plus the
|
||||
registry. Jason's own uncommitted files in the same clone (the write root
|
||||
is his clone) are never swept in. `git_pull` is ff-only and refuses when
|
||||
the paths it would touch are dirty.
|
||||
- Push after every commit (D6). A push that fails is said in the reply and
|
||||
retried by the next commit.
|
||||
|
||||
These scripts are Python in the shared-signals repo, not Mosaic code; the
|
||||
connector calls them as fixed argv, never through a shell, and only inside
|
||||
the root marked writable.
|
||||
|
||||
## 7. Order
|
||||
|
||||
After row 23's web tools are reviewed. Git verbs, tests, suite, review,
|
||||
local commit, then the binding change and a live check.
|
||||
@@ -0,0 +1,108 @@
|
||||
# Discord Sage: writes into the strategy repository, and web research (#1509, QUEUE row 23)
|
||||
|
||||
Jason's word, 2026-09-16: "We need A + web. The agent needs to be able to
|
||||
research." Option A was: writing confined to the `shared-signals` root,
|
||||
no shell. This brief adds web reach to that.
|
||||
|
||||
## 1. Outcome
|
||||
|
||||
A Discord message to Sage can end with a file written or changed inside
|
||||
the `shared-signals` repository, and Sage can read pages on the web while
|
||||
answering. Nothing else on the host becomes reachable. Every write and
|
||||
every web call is in the turn record.
|
||||
|
||||
## 2. What is built
|
||||
|
||||
Two more tools in the Mosaic extension (`packages/discord/extension/
|
||||
readonly-tools.mjs`, to be renamed `tools.mjs` with the rules in
|
||||
`src/tools.mjs`):
|
||||
|
||||
- `write_file(root, path, text)`: creates or replaces a file. Allowed only
|
||||
in roots the binding marks `"write": true`. Same path rules as reads
|
||||
(names not paths, no `..`, no dot segments, symlink walk refused), plus:
|
||||
the parent directory must already exist under the root, the target is a
|
||||
regular file or absent, `.git/` and any dot-prefixed path are refused,
|
||||
the text is at most `maxFileBytes`, a temp file and rename so a
|
||||
half-written file never exists, and the credential shapes refuse the
|
||||
write the same way they refuse a read.
|
||||
- `edit_file(root, path, old, new)`: one exact replacement of a string
|
||||
that occurs exactly once. Same fences as `write_file`.
|
||||
|
||||
Two web tools:
|
||||
|
||||
- `web_fetch(url)`: GET only, `https` only, redirects followed at most
|
||||
three times and re-checked, no private or link-local addresses after
|
||||
name resolution, response capped at `maxFetchBytes`, HTML reduced to
|
||||
text before the model sees it, 15 s timeout. No cookies, no auth
|
||||
headers, a fixed User-Agent naming the bot.
|
||||
- `web_search(query)`: a query to a SearXNG instance named in the
|
||||
binding (D1), `GET /search?q=…&format=json`, no key. Returns title,
|
||||
url and snippet, at most 10 results. The instance url must be
|
||||
`http://127.0.0.1` or `https`; the query is sent as one parameter.
|
||||
|
||||
Binding changes (`tools` key, still fixed, needs a restart):
|
||||
|
||||
```json
|
||||
"tools": {
|
||||
"roots": [
|
||||
{ "name": "stack-docs", "path": "…/mosaic-stack/docs" },
|
||||
{ "name": "sage", "path": "…/mosaic-stack/agents/sage" },
|
||||
{ "name": "shared-signals", "path": "…/shared-signals", "write": true }
|
||||
],
|
||||
"maxFileBytes": 262144,
|
||||
"maxCallsPerTurn": 12,
|
||||
"web": { "searxng": "http://127.0.0.1:8888", "maxFetchBytes": 1048576 }
|
||||
}
|
||||
```
|
||||
|
||||
Without `web`, no web tools are offered. Without any `write: true` root,
|
||||
no write tools are offered, and the prompt paragraph stays as today.
|
||||
|
||||
The system prompt paragraph names which roots are writable and says a
|
||||
write is real only once Jason commits it. Sage cannot run git, so the
|
||||
answer names the file it changed.
|
||||
|
||||
## 3. What is not built
|
||||
|
||||
No shell. No git from Sage: Jason commits from the terminal after
|
||||
`git diff`. No writes to the Mosaic repository roots. No POST or forms on
|
||||
the web. No per-user tool gating (Carmen gets the same tools where she is
|
||||
allowed to write; see D2).
|
||||
|
||||
## 4. Evidence
|
||||
|
||||
- `packages/discord/tests/tools.test.mjs`: refused write outside a
|
||||
writable root, into `.git`, through a symlinked parent, over a FIFO,
|
||||
past the cap, with a credential shape; a happy path that leaves the
|
||||
exact bytes; an edit with zero or two matches refused; a temp file
|
||||
never left behind after a refused rename.
|
||||
- Web tests against a local `http.createServer`: redirect to a private
|
||||
address refused, size cap, timeout, non-https refused, HTML to text.
|
||||
- Suite check: the extension exposes exactly the tools the binding
|
||||
enables, and a binding without `web` exposes none of the web tools.
|
||||
- Live: Jason asks in #ideas for a naming shortlist written to
|
||||
`vault/Businesses/…`; the file appears, the turn record shows the
|
||||
write and the web calls, `git status` in shared-signals shows one
|
||||
new file.
|
||||
|
||||
## 5. Jason's rulings (2026-09-16)
|
||||
|
||||
- D1. Search goes through SearXNG, a self-hosted metasearch with a JSON
|
||||
API and no key, so Sage is tied to no search vendor. The binding names
|
||||
the instance url (`"web": {"searxng": "http://127.0.0.1:8888"}`); the
|
||||
tool calls `/search?q=…&format=json` and returns title, url and
|
||||
snippet, at most 10. No instance runs on this host yet, so this piece
|
||||
includes a SearXNG container under the user's podman or docker, bound
|
||||
to localhost, `format=json` enabled in its settings. Jason's words:
|
||||
"I hate to tie Sage to Z.ai. If I can't [switch] providers, we need
|
||||
flexibility."
|
||||
- D2. Only Jason and Carmen work with the repository and Sage. Both may
|
||||
write. The binding's user list already enforces who reaches Sage.
|
||||
- D3. Any https host; private and link-local addresses refused.
|
||||
- D4. Reviewer: rev-code-02 on #1509, as row 21.
|
||||
|
||||
## 6. Order
|
||||
|
||||
Writes first (a day, with the tests), then web fetch and search, then
|
||||
the SearXNG container and the live check. Each part is a separate local commit on `refactor`, no
|
||||
push without Jason's word.
|
||||
@@ -368,3 +368,7 @@ git history + Gitea issues.
|
||||
- 2026-09-13 — Discord connector iteration 2 (#1509, QUEUE row 17): systemd user service `mosaic-discord@<binding>` with a supervised run that clears a dead lock and never retries a brake (exit 3). Sage seat now runs under systemd, not tmux. Next: control board row.
|
||||
- 2026-09-13 — Discord connector iterations 4 and 5 (#1509, QUEUE rows 19–20): `reload` verb and `systemctl --user reload` apply channels, users, limits and guildName to the running connector, fixed keys refused, attempts journaled in `reloads.jsonl`; per-user channel allowlist; Carmen enrolled live by a reload at 00:03 UTC (all listed rooms except #sage-admin). Suite 41/41, 101 node tests. Commit caaef941 plus records. Row 18 (board row) is darkwing's by Jason's ruling.
|
||||
- 2026-09-14 — Discord connector iteration 6 (#1509, QUEUE row 21): read-only tools through a Mosaic pi extension confined to declared roots (Jason's R1–R7: repo `docs/` and `agents/sage/`, every listed user including Carmen, 8 calls a message, 400 lines a read, 256 KiB a file, refusals said plainly, `tools` a fixed key). rev-code-02 approved round 2 (26276). Suite 41 → 48, node tests 101 → 116. Next: live check in #sage-admin, then attachments.
|
||||
- 2026-09-16 — Discord Sage ops (#1509), Jason's word: every text channel of Shared Signals added in mention mode (#sage-admin stays open, Carmen's one-channel allowlist unchanged), and `/mnt/storage/src/shared-signals` added as a third read-only root. Threads had been silent because their parent #ideas was unlisted, not a code defect. Private binding only; check passed, service restarted; receipt in the Sage evidence dir. New channels created later need adding by reload.
|
||||
- 2026-09-16 (coordinator, #1509 row 23): part 1 writes built: `write_file`/`edit_file` for roots marked `write: true`, temp file plus rename, same fences as reads plus parent-must-exist, no dot paths, no credential shapes; `enabledToolNames` drives `--tools`, the extension and the check line; suite 49/49. Pinned for rev-code-02 round 1 (tree in the #1509 comment). Live finding: after the prompt fix Sage still repeated "ruling Q16" and "two read-only folders" with zero tool calls, because pi resumed the session that held every earlier refusal; the old session file was archived to the sage evidence dir and the service restarted with a fresh session. Writes and web reach Sage only after row 23 lands in the binding.
|
||||
- 2026-09-16 (coordinator, #1509 row 23): part 2 web built: `src/web.mjs` with `webFetch` (https only, public addresses only, connection pinned to the vetted address, three re-vetted redirects, 1 MiB cap, html to text) and `webSearch` (SearXNG json, ten results); enabled only when the binding `tools.web` key is set. The full-suite hang was a race in `tests/engine.test.mjs` (busy asserted before `agent_settled`, fake pi never stopped); the test now waits for the settle and stops in `finally`. Suite 52/52, node 128. Round 2 pinned for rev-code-02 (comment 26358, aggregate 287af5da, tree 1721584c). Next: verdict, local commit of my 17 paths only, then SearXNG container on 127.0.0.1:8888 and the live check.
|
||||
- 2026-09-16 (coordinator, #1509 row 23): part 3 live: SearXNG container `mosaic-searxng` (image searxng/searxng:latest, settings in the data root, formats html and json, limiter off) on 127.0.0.1:8888; binding `tools.web` added (backup in the sage evidence dir); check ok; service restarted. Jason's first turn in #sage-admin searched, fetched who.is, listed the folder and wrote `vault/Businesses/naming.md`. Defect seen in the same exchange: his second message during the turn went to pi as a follow-up, pi folded it into the same run, the first answer was never posted and the second failed as settled-without-turn. Fixed in `engine-pi.mjs` (held prompts, one run each), fake pi now models real follow-up semantics, suite 52/52 node 129, round 3 pinned (comment 26361, aggregate e30c2319, tree dbd2ce9a), service restarted with the fix. Row 24 rulings: D5 seat identity with `[email protected]`, D6 push every commit (Jason: not pushing means stale data), D7 rev-code-02.
|
||||
|
||||
@@ -46,6 +46,8 @@ Gaps found while working go to `docs/plans/DEFERRED.md`, not here.
|
||||
| 19 | Discord connector: binding reload without a restart (`reload` verb, SIGHUP, `systemctl --user reload`); channels, users, limits and guildName apply in place, identity, engine and context stay fixed, an invalid file is refused and the old binding kept (MVP iteration 4) | coordinator | #1509 | done: caaef941; live 00:03 UTC: reload applied Carmen's entry with no restart, unknown key refused by the CLI (exit 2), fixed key refused in the process with the binding kept, `systemctl --user reload` applied; suite 41/41 (101 node tests); receipt `mvp4-5-reload-carmen-*.json` | edit the binding, run `scripts/discord.sh reload shared-signals`, the change applies with no restart, a broken edit is refused and journaled | `2026-09-13_discord-connector-pilot.md` section 11 |
|
||||
| 20 | Discord connector: per-user channel allowlist in the binding and Carmen enrolled (all listed rooms except #sage-admin) (MVP iteration 5) | coordinator | #1509 | done: caaef941 (`users[].channels` allowlist, `channel-not-for-user` drop); Carmen enrolled live by reload 00:03 UTC; her first message is the remaining check | Carmen gets a reply in #general and silence in #sage-admin; Jason unchanged | `2026-09-13_discord-connector-pilot.md` section 11 |
|
||||
| 21 | Discord connector: read-only tools for the Discord Sage through a Mosaic pi extension confined to declared roots (MVP iteration 6) | coordinator; reviewer per Q12 | #1509 | approved: rev-code-02 round 2 verdict 26276 (tree 43f0329b); committed locally; live check in #sage-admin with Jason next; Jason ruled R1–R7 2026-09-14 (roots docs/ and agents/sage/, Carmen included) | Sage answers a question from a file under a declared root with the reads in the turn record; a read outside the roots is refused and recorded | `2026-09-14_discord-readonly-tools.md` |
|
||||
| 23 | Discord connector: writes confined to the `shared-signals` root plus web fetch and search for the Discord Sage (MVP iteration 7) | coordinator; reviewer per Q12 | #1509 | in review: parts 1 and 2 (writes, web fetch and search) built 2026-09-16, suite 52/52, node 128; round 3 pinned for rev-code-02 on #1509 comment 26361 (supersedes rounds 1–2; adds the engine held-prompt fix); part 3 done live 2026-09-17 (SearXNG container on loopback, binding web key, restart; first live turn searched, fetched and wrote vault/Businesses/naming.md); Jason ruled D1–D4 2026-09-16 (SearXNG, Jason and Carmen write, any https host, rev-code-02) | Sage writes a naming shortlist into the repository from #ideas with the write and web calls in the turn record; a write outside the root is refused | `2026-09-16_discord-write-and-web-tools.md` |
|
||||
| 24 | Discord connector: git verbs (status, commit, pull ff-only, push) for the Discord Sage on the `shared-signals` root, seat identity through the existing credential helper (MVP iteration 8) | coordinator; reviewer per Q12 | #1509 | briefed 2026-09-16 at Jason's word ("Sage will need to have git tooling"); D5–D7 ruled 2026-09-16 evening (seat identity, push every commit, rev-code-02); starts after row 23 review | Sage commits and pushes a decision file from #ideas; GitHub shows Sage as author with a Requested-by trailer; no token in any record | `2026-09-16_discord-git-tools.md` |
|
||||
|
||||
Start message for row 6, sent from the board to darkwing:
|
||||
"Read docs/plans/QUEUE.md, then the plan page section "Piece 5: darkwing on
|
||||
@@ -95,3 +97,9 @@ Gate F or when blocked."
|
||||
- 2026-09-13 — coordinator: rows 19–20 done (caaef941, live reload 00:03 UTC, Carmen enrolled); Carmen's first message pending as the operator check. No other row changed.
|
||||
- 2026-09-14 — coordinator: row 21 (read-only tools) briefed on Jason's "let's move to tools"; Carmen's test deferred by Jason; waiting on D1–D3 in the brief. No other row changed.
|
||||
- 2026-09-14 — coordinator: row 21 rulings in (brief section 7), built and approved by rev-code-02 (26276); suite 48/48, 116 node tests; committed locally, live check next. No other row changed.
|
||||
- 2026-09-16 — coordinator: row 23 added and briefed (Discord writes and web, Jason: "A + web"); Discord profile Q16 line replaced by Jason's word and Sage restarted. No other row changed.
|
||||
- 2026-09-16 — coordinator: row 23 part 1 (write_file, edit_file confined to roots marked write: true; extension renamed tools.mjs) built and pinned for rev-code-02 round 1; Discord Sage's stale pi session archived and the service restarted so old Q16 refusals stop repeating.
|
||||
- 2026-09-16 — coordinator: row 24 (git verbs for the Discord Sage) briefed at Jason's word; row 23 writes enabled live in the private binding ahead of the review verdict, web tools built and under test.
|
||||
- 2026-09-16 — coordinator: row 23 part 2 (web_fetch, web_search via SearXNG, src/web.mjs) built; engine test busy/settled race fixed in the test; suite 52/52, node 128; round 2 pinned on #1509 comment 26358 for rev-code-02. Row 24 still waits on D5–D7.
|
||||
- 2026-09-16 — coordinator: row 23 part 3 live (SearXNG container mosaic-searxng on 127.0.0.1:8888, binding web key, restart); Jason's first web turn worked end to end but exposed a live defect: a second message during a turn was sent as a pi follow-up and lost the first answer. Engine now holds it until pi settles. Suite 52/52, node 129; round 3 pinned as #1509 comment 26361; service restarted with the fix. Row 24 rulings D5–D7 recorded.
|
||||
- 2026-09-17 — coordinator: shared-signals-05 briefed the new id registry and file lock protocol (jetrich/shared-signals 8f0d946); folded into the row 24 brief section 6 (validate before commit, reserve_id tool, per-write clone lock, explicit-path staging). No row changed.
|
||||
|
||||
Reference in New Issue
Block a user