Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
{
"name": "doperpowers",
"description": "Emerges by humans, Converges by Agent",
"version": "7.176.0",
"version": "7.177.0",
"source": "./",
"author": {
"name": "SSFSKIM",
Expand Down
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "doperpowers",
"description": "Emerges by humans, Converges by Agents",
"version": "7.176.0",
"version": "7.177.0",
"author": {
"name": "SSFSKIM",
"email": "supremekim17@gmail.com"
Expand Down
2 changes: 1 addition & 1 deletion .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "doperpowers",
"version": "7.176.0",
"version": "7.177.0",
"description": "One software-development methodology for coding agents, sized by the work: brainstorm, design, spec, TDD, review, ship — one spec that carries its plan of work as milestones: one milestone runs in order from the spec, several run a fresh subagent per milestone reviewed at each dependency frontier, and the same method runs unattended on the board loop.",
"author": {
"name": "SSFSKIM",
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md

Large diffs are not rendered by default.

83 changes: 74 additions & 9 deletions docs/doperpowers/plans/2026-10-15-arkho-desk-c2-bridge.md

Large diffs are not rendered by default.

30 changes: 20 additions & 10 deletions hooks/mods/bridge.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,16 @@ export { AGENTS_REFRESH_MS } from './bridge-agents'
* moved to the background, and before the turn ends appends Esc's marker and
* a note saying so;
* `model` rewrites the main loop's requests;
* `compact` runs between turns; `deliver` gives a log event as the human's
* words, once per key: into the running turn as a row, as a steer, else as a
* prompt of its own. A message to the session wakes it, though the engine
* refuses a plugin's prompt after an Esc: such a delivery is answered not-ok,
* so sminos sends it as an inbox frame, and a delivered row a stopped turn
* left unread wakes the session through its inbox (the child's `inbox`
* event). A row an Esc rewound past is given again. What must outlive a
* module reload (the model chosen, the keys delivered) the child keeps on
* disk: its hello hands it back.
* `compact` runs between turns; `deliver` gives the owner's log event as the
* human's words, once per key: into the running turn as a row, as a steer,
* else as a prompt of its own (a peer's goes to the session's inbox, and the
* bridge refuses one written by a session). A message to the session wakes
* it, though the engine refuses a plugin's prompt after an Esc: such a
* delivery is answered not-ok, so sminos sends it as an inbox frame, and a
* delivered row a stopped turn left unread wakes the session through its
* inbox (the child's `inbox` event). A row an Esc rewound past is given
* again. What must outlive a module reload (the model chosen, the keys
* delivered) the child keeps on disk: its hello hands it back.
*
* Code that takes `$` stays in this file: the hooks, the session start, the
* child and the session it serves, control, and the wait for a decision. The
Expand Down Expand Up @@ -611,6 +612,9 @@ async function runCompaction($: EngineInterface, request: { id: string; instruct
}
}

/** A session's writer, `<machine>/<session id>`: its events are a peer's words. */
const SESSION_WRITER = /\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/

/**
* Why the engine drops a plugin's prompt when the human stopped the session
* (2.1.300 `zBt`, `k_e`): Esc, or the stop-agents chord, empties the queue of
Expand All @@ -622,7 +626,10 @@ const STOPPED_DROPS = new Set(['the prompt was removed from the queue before it
export const STOPPED_ERROR = 'the session was stopped, so its prompt was refused'

/**
* A log event for this session, as the human's words. While the main turn
* The owner's log event for this session, as the human's words (sminos sends
* only the owner's here; one a session wrote is refused whoever sends it, so
* its sender falls back to the session's inbox, where the engine delivers it
* as a peer's). While the main turn
* runs it goes in as a user row, read at the loop's next request (its next
* tool round), as a steer does; idle, it is submitted as a prompt, a turn of
* its own. Either way `entered` names its row once it is kept, and `refused`
Expand Down Expand Up @@ -654,6 +661,9 @@ async function deliver($: EngineInterface, key: unknown, text: unknown): Promise
) {
return { ok: false, error: 'deliver needs key {project?, writer, seq} and text' }
}
if (SESSION_WRITER.test(writer)) {
return { ok: false, error: "a session's event is a peer's, not the human's words: it goes to the session's inbox" }
}
const delivery: DeliveryKey = { ...(project !== undefined && { project: project as string }), writer, seq: seq as number }
const mark = project === undefined ? writer : `${project}/${writer}`
const before = state.delivered.get(mark)
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "doperpowers",
"version": "7.176.0",
"version": "7.177.0",
"description": "Doperpowers skills and runtime bootstrap for coding agents",
"type": "module",
"keywords": [
Expand Down
7 changes: 7 additions & 0 deletions skills/sminos/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,13 @@ project a name resolves across every project known here. `--group`,
`--parent`, `--team`, and `retire --cascade` are gone: the project is the
group and there is no tree.

A message a session sends (`say`, `send`) reaches a live member through
its inbox socket, as a message from another Claude session — never as
that member's human's words, so it approves nothing for them; a member
running with `bypassPermissions` holds it for its human's approval. Only
the human's own messages (sminos run outside any session, or the desk)
reach a session with the bridge mod as the human's words.

`send` is the direct message to one member, recorded like a tagged `say`:
a live member reads it from its inbox socket, a stopped seat is resumed
with it, and a seat-less session that is not live is refused (resuming
Expand Down
Loading
Loading