allye-pi 2.10.0 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/docs/install-omp.md +2 -0
- package/package.json +1 -1
- package/packages/allye-pi/src/index.ts +89 -7
- package/skills/bridge/references/delegation.md +12 -1
- package/skills/bridge-architect/SKILL.md +3 -0
- package/skills/bridge-armorer/SKILL.md +3 -0
- package/skills/bridge-copilot/SKILL.md +5 -0
- package/skills/bridge-dispatcher/SKILL.md +3 -0
- package/skills/bridge-medic/SKILL.md +4 -0
- package/skills/bridge-navigator/SKILL.md +3 -1
- package/skills/bridge-optimizer/SKILL.md +3 -0
- package/skills/bridge-pilot/SKILL.md +2 -2
- package/skills/bridge-recon/SKILL.md +3 -0
- package/skills/bridge-shield/SKILL.md +4 -0
- package/skills/bridge-strategist/SKILL.md +3 -0
- package/skills/bridge-watcher/SKILL.md +5 -0
package/README.md
CHANGED
|
@@ -75,7 +75,7 @@ Pair this install with your Allye account and every new, cleared or compacted se
|
|
|
75
75
|
|
|
76
76
|
#### Live session reporting (Claude Code only, optional)
|
|
77
77
|
|
|
78
|
-
When paired, hooks send Allye the state of your sessions (started, working, waiting, idle, ended), the tool names in use (within about 2 seconds of the call), subagent ids and types with their outcome, the spec and task keys the session is bound to and, on by default,
|
|
78
|
+
When paired, hooks send Allye the state of your sessions (started, working, waiting, idle, ended), the tool names in use (within about 2 seconds of the call), subagent ids and types with their outcome, the spec and task keys the session is bound to and, on by default, three short texts the agent wrote, each at most 140 characters: the description of a subagent dispatch, an activity phrase from a Bash or Agent call or the current todo, and the `summary:` line of a crew report, plus small numbers and keywords from the report (attempt, next step, gate, checks, finding counts). Paths, URLs, emails, IP addresses, secrets and backticked code are stripped on your machine on a best-effort basis, with no guarantee; `/allye:hooks live activity off` turns the three texts off (so does Detailed Live in the Allye app). A small background watcher (one per session, no network use while Claude Code runs) ends the run on Allye when Claude Code is closed without a normal exit. Through the Allye MCP only `task_start` and `task_submit` bind a session to a spec or task. The subagent type, tool names, the three texts and `allye:<action>` / spec / task keys DO leave your machine; prompts, commands, tool inputs and outputs, file paths, notification messages, assistant messages other than that one `summary:` line, transcripts, the working directory, branch names and credentials never do. Update the plugin only after the Allye API that accepts the new fields is live. Control it with `/allye:hooks live off|on|status`; events, fields, the watcher and local files are in [docs/live-reporting.md](docs/live-reporting.md).
|
|
79
79
|
|
|
80
80
|
### Codex, OpenCode
|
|
81
81
|
|
|
@@ -93,7 +93,7 @@ pi install npm:allye-pi@<version> # Pi
|
|
|
93
93
|
omp plugin install allye-pi@<version> # OMP
|
|
94
94
|
```
|
|
95
95
|
|
|
96
|
-
Use a pinned `<version>` (the guides resolve it for you). Then add the `allye` MCP server as described in [install-pi.md](docs/install-pi.md) or [install-omp.md](docs/install-omp.md).
|
|
96
|
+
Use a pinned `<version>` (the guides resolve it for you). Then add the `allye` MCP server as described in [install-pi.md](docs/install-pi.md) or [install-omp.md](docs/install-omp.md). In OMP, `allye-pi` shows one notice at session start with the exact command `/mcp add allye --scope user --url https://mcp.allye.app/mcp --transport http` when no `allye` server is found in OMP's own `mcp.json` files; it never writes configuration.
|
|
97
97
|
|
|
98
98
|
## Your organization's skills
|
|
99
99
|
|
package/docs/install-omp.md
CHANGED
|
@@ -48,6 +48,8 @@ OMP has a native MCP client (no `pi-mcp-adapter`). Add the server once, at user
|
|
|
48
48
|
/mcp add allye --scope user --url https://mcp.allye.app/mcp --transport http
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
+
If the `allye` server is not found in OMP's own `mcp.json` files (user and project), the `allye-pi` extension shows one notice with this command when a session starts. It only reads those files, never writes them, and servers defined in other tools' configs are not checked.
|
|
52
|
+
|
|
51
53
|
OMP also loads servers from a project `.mcp.json`. Do not add tokens or OAuth client metadata: OMP discovers the OAuth endpoints and opens the browser on first use.
|
|
52
54
|
|
|
53
55
|
Because OMP's MCP client is not the in-process `pi-mcp-adapter` bridge (as in OMP today), the extension does not resolve the project. It injects only the git remote and any unverified `.allye/project.json` claim; the bootstrap tells the agent to call `projects.project_resolve` itself. The team follows the project, so no team selection is needed.
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { basename, dirname, join, resolve, sep } from "node:path";
|
|
2
3
|
import { execFile } from "node:child_process";
|
|
3
|
-
import { closeSync, constants, fstatSync, lstatSync, openSync, readFileSync, readSync } from "node:fs";
|
|
4
|
+
import { closeSync, constants, fstatSync, lstatSync, openSync, readFileSync, readSync, realpathSync } from "node:fs";
|
|
4
5
|
import { fileURLToPath } from "node:url";
|
|
5
6
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
6
7
|
|
|
@@ -14,6 +15,8 @@ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
|
14
15
|
* `.allye/project.json` claim against the git remote. It loads no startup or
|
|
15
16
|
* per-prompt memory context.
|
|
16
17
|
* The team follows the project: nothing is gated on team selection.
|
|
18
|
+
* - In OMP, when no `allye` MCP server is configured, shows one notice with the
|
|
19
|
+
* `/mcp add` command. It is informational only and never writes configuration.
|
|
17
20
|
*/
|
|
18
21
|
|
|
19
22
|
const MCP_SERVER = "allye";
|
|
@@ -21,6 +24,7 @@ const LINK_FILE = ".allye/project.json";
|
|
|
21
24
|
const PROJECT_KEY = /^[A-Z][A-Z0-9]{1,9}$/;
|
|
22
25
|
const APP_NAME = /^[A-Za-z0-9._-]{1,120}$/;
|
|
23
26
|
const MAX_LINK_BYTES = 4096;
|
|
27
|
+
const MAX_MCP_CONFIG_BYTES = 256 * 1024;
|
|
24
28
|
const MAX_CANDIDATES = 10;
|
|
25
29
|
const MAX_REPO_CHARS = 4_000;
|
|
26
30
|
|
|
@@ -139,15 +143,15 @@ async function readRemote(cwd: string): Promise<string | null> {
|
|
|
139
143
|
}
|
|
140
144
|
}
|
|
141
145
|
|
|
142
|
-
/** Reads at most
|
|
143
|
-
function readSmallRegularFile(path: string): string {
|
|
146
|
+
/** Reads at most `maxBytes` from a regular file, refusing symlinks and FIFOs even if swapped in after lstat. */
|
|
147
|
+
function readSmallRegularFile(path: string, maxBytes: number = MAX_LINK_BYTES): string {
|
|
144
148
|
const fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
145
149
|
try {
|
|
146
150
|
const stat = fstatSync(fd);
|
|
147
|
-
if (!stat.isFile() || stat.size >
|
|
148
|
-
const buffer = Buffer.alloc(
|
|
151
|
+
if (!stat.isFile() || stat.size > maxBytes) throw new Error("not a small regular file");
|
|
152
|
+
const buffer = Buffer.alloc(maxBytes + 1);
|
|
149
153
|
const length = readSync(fd, buffer, 0, buffer.length, 0);
|
|
150
|
-
if (length >
|
|
154
|
+
if (length > maxBytes) throw new Error("file too large");
|
|
151
155
|
return buffer.subarray(0, length).toString("utf8");
|
|
152
156
|
} finally {
|
|
153
157
|
closeSync(fd);
|
|
@@ -295,6 +299,73 @@ async function buildRepoContext(cwd: string, online: boolean): Promise<string> {
|
|
|
295
299
|
}
|
|
296
300
|
}
|
|
297
301
|
|
|
302
|
+
export const OMP_MCP_ADD_COMMAND = "/mcp add allye --scope user --url https://mcp.allye.app/mcp --transport http";
|
|
303
|
+
export const OMP_MCP_NOTICE = `The Allye MCP server was not found in OMP's own mcp.json files. If it is not configured, add it once with: ${OMP_MCP_ADD_COMMAND}`;
|
|
304
|
+
|
|
305
|
+
/** OMP reads MCP servers from <agentDir>/{mcp,.mcp}.json (user) and <cwd>/.omp/{mcp,.mcp}.json plus <cwd>/{mcp,.mcp}.json (project). */
|
|
306
|
+
export function ompAgentDir(env: NodeJS.ProcessEnv = process.env, home: string = homedir()): string {
|
|
307
|
+
return env.PI_CODING_AGENT_DIR && env.PI_CODING_AGENT_DIR.startsWith("/") ? env.PI_CODING_AGENT_DIR : join(home, ".omp", "agent");
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
export function ompMcpConfigPaths(cwd: string, env: NodeJS.ProcessEnv = process.env, home: string = homedir()): string[] {
|
|
311
|
+
const agentDir = ompAgentDir(env, home);
|
|
312
|
+
return [
|
|
313
|
+
join(agentDir, "mcp.json"),
|
|
314
|
+
join(agentDir, ".mcp.json"),
|
|
315
|
+
join(cwd, ".omp", "mcp.json"),
|
|
316
|
+
join(cwd, ".omp", ".mcp.json"),
|
|
317
|
+
join(cwd, ".mcp.json"),
|
|
318
|
+
join(cwd, "mcp.json"),
|
|
319
|
+
];
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/** True when running inside OMP (oh-my-pi): the executable is `omp` or the agent dir is OMP's `.omp/agent`. */
|
|
323
|
+
export function isOmp(env: NodeJS.ProcessEnv = process.env, argv: string[] = process.argv, execPath: string = process.execPath): boolean {
|
|
324
|
+
const names = [argv[1], execPath].map((value) => basename(value ?? "").replace(/\.(exe|js|mjs)$/, ""));
|
|
325
|
+
if (names.includes("omp")) return true;
|
|
326
|
+
const dir = env.PI_CODING_AGENT_DIR ?? "";
|
|
327
|
+
return /(^|\/)\.omp\/agent\/?$/.test(dir);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* True when any readable config file defines the `allye` server. `readConfig` returns the file text or null
|
|
332
|
+
* when absent; unreadable or invalid files count as "not defined here". Never throws, never writes.
|
|
333
|
+
*/
|
|
334
|
+
export { readConfigFile as readMcpConfigFile };
|
|
335
|
+
|
|
336
|
+
export function allyeMcpConfigured(paths: string[], readConfig: (path: string) => string | null): boolean {
|
|
337
|
+
for (const path of paths) {
|
|
338
|
+
try {
|
|
339
|
+
const text = readConfig(path);
|
|
340
|
+
if (text === null) continue;
|
|
341
|
+
const servers = (JSON.parse(text) as { mcpServers?: unknown } | null)?.mcpServers;
|
|
342
|
+
if (!servers || typeof servers !== "object" || !Object.prototype.hasOwnProperty.call(servers, MCP_SERVER)) continue;
|
|
343
|
+
const entry = (servers as Record<string, unknown>)[MCP_SERVER];
|
|
344
|
+
if (entry && typeof entry === "object" && (entry as { enabled?: unknown }).enabled === false) continue;
|
|
345
|
+
return true;
|
|
346
|
+
} catch {
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Config paths are cwd-controlled: symlinks, non-regular and oversized files read as absent, and so does a file
|
|
355
|
+
* whose real path (a symlinked parent directory) leaves the real path of `base`.
|
|
356
|
+
*/
|
|
357
|
+
function readConfigFile(path: string, base: string): string | null {
|
|
358
|
+
try {
|
|
359
|
+
const realBase = realpathSync(base);
|
|
360
|
+
const real = realpathSync(path);
|
|
361
|
+
if (real !== realBase && !real.startsWith(realBase.endsWith(sep) ? realBase : realBase + sep)) return null;
|
|
362
|
+
if (!lstatSync(path).isFile()) return null;
|
|
363
|
+
return readSmallRegularFile(path, MAX_MCP_CONFIG_BYTES);
|
|
364
|
+
} catch {
|
|
365
|
+
return null;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
298
369
|
export function buildSystemSections(bootstrap: string, repo: string, nativeBootstrap = true): string[] {
|
|
299
370
|
const sections: string[] = [];
|
|
300
371
|
if (bootstrap) sections.push(`<allye-bootstrap>\n${bootstrap.trim()}\n</allye-bootstrap>`);
|
|
@@ -306,11 +377,22 @@ export default function allyePiExtension(pi: ExtensionAPI): void {
|
|
|
306
377
|
const nativeBootstrap = process.env.ALLYE_PI_NATIVE_BOOTSTRAP !== "0";
|
|
307
378
|
let bootstrap = "";
|
|
308
379
|
let repo = "";
|
|
380
|
+
let mcpNoticeShown = false;
|
|
309
381
|
|
|
310
382
|
pi.on("resources_discover", () => ({ skillPaths: [skillsPath()] }));
|
|
311
383
|
|
|
312
384
|
pi.on("session_start", async (_event, ctx) => {
|
|
313
385
|
bootstrap = loadBootstrap();
|
|
386
|
+
if (!mcpNoticeShown && isOmp()) {
|
|
387
|
+
mcpNoticeShown = true;
|
|
388
|
+
try {
|
|
389
|
+
const cwd = ctx.cwd ?? process.cwd();
|
|
390
|
+
const agentDir = ompAgentDir();
|
|
391
|
+
if (!allyeMcpConfigured(ompMcpConfigPaths(cwd), (path) => readConfigFile(path, path.startsWith(agentDir + sep) ? agentDir : cwd))) ctx.ui?.notify?.(OMP_MCP_NOTICE, "warning");
|
|
392
|
+
} catch {
|
|
393
|
+
// The notice is best effort; never block the session.
|
|
394
|
+
}
|
|
395
|
+
}
|
|
314
396
|
if (nativeBootstrap) repo = await loadRepoContext(ctx.cwd ?? process.cwd(), mcpBridgeAvailable());
|
|
315
397
|
});
|
|
316
398
|
|
|
@@ -96,7 +96,7 @@ role: <agent>
|
|
|
96
96
|
task: <key | global | draft>
|
|
97
97
|
status: <see the status table below>
|
|
98
98
|
commit: <HEAD sha the work/review is based on | null>
|
|
99
|
-
summary: <one
|
|
99
|
+
summary: <one line, see Report lines>
|
|
100
100
|
filesRead: [<paths>]
|
|
101
101
|
filesChanged: [<paths>]
|
|
102
102
|
evidence:
|
|
@@ -114,6 +114,17 @@ openQuestions: [<real blockers only>]
|
|
|
114
114
|
next: <recommended action>
|
|
115
115
|
```
|
|
116
116
|
|
|
117
|
+
**Report lines.** The Live reporter reads these lines from the last message of a report, so write each exactly as below: at column 0 (not indented, not in a list, not bold), with the exact lowercase key, once per report. A line that is missing, repeated or malformed is simply not transmitted; nothing is read from prose.
|
|
118
|
+
|
|
119
|
+
- `summary: <one line>` — one line of at most 140 characters. Rule: summary is transmitted to Allye: generic phase and outcome only; no names, data, secrets, file or prompt content.
|
|
120
|
+
- `attempt: <0|1|2>` — Pilot, Navigator and Copilot.
|
|
121
|
+
- `next: <reviewers|pilot_correction|mothership|watcher|done>` — the reporter lowercases the value and maps `-` to `_`; other values are not transmitted.
|
|
122
|
+
- `gate: SHIELD_CLEAR|WATCHER_APPROVED|null` — Shield writes only `SHIELD_CLEAR`, Watcher only `WATCHER_APPROVED`.
|
|
123
|
+
- `checks: ok=<n> run=<n>` — Copilot: ok = reruns whose `match` is true, run = reruns executed; Watcher: ok = satisfied ACs, run = total ACs.
|
|
124
|
+
- `severity_counts: critical=<n> high=<n> medium=<n> low=<n> info=<n>` — Medic, Shield, Copilot and Watcher; all five keys once, in that order.
|
|
125
|
+
|
|
126
|
+
Each `<n>` is an integer 0-99 without sign, decimal point or leading zero.
|
|
127
|
+
|
|
117
128
|
Statuses. The base set is `passed | blocked | failed | advisory`; each role uses only the values listed for it:
|
|
118
129
|
|
|
119
130
|
| Role | Statuses | Meaning of the role-specific values |
|
|
@@ -66,6 +66,7 @@ Your rights are the Architect row of `../bridge/references/delegation.md` → Al
|
|
|
66
66
|
role: architect
|
|
67
67
|
mode: options|author|auto|publish
|
|
68
68
|
status: ready|needs-input|blocked
|
|
69
|
+
summary: <one line>
|
|
69
70
|
options: # options mode
|
|
70
71
|
- decision: <frontier decision>
|
|
71
72
|
A: { summary: <minimal>, tradeoffs: <text> }
|
|
@@ -93,6 +94,8 @@ filesRead: [<paths>]
|
|
|
93
94
|
filesChanged: []
|
|
94
95
|
```
|
|
95
96
|
|
|
97
|
+
Report lines (`summary:` and the chip lines) follow `../bridge/references/delegation.md` → Common output.
|
|
98
|
+
|
|
96
99
|
`ready` means both self-checks, the anchor lint and `specs.spec_validate` passed (or was skipped by the recorded unknown- or unsupported-action fallback, or deferred because the MCP or project is unavailable; any other `spec_validate` error does not count as passed) and the challenge round ended with no open CRITICAL/HIGH outside an open `[Q-NN]`. Anything else is `needs-input` (questions, Recon or challenge pending) or `blocked` (with the smallest question that would unblock it).
|
|
97
100
|
|
|
98
101
|
## Limits
|
|
@@ -69,6 +69,7 @@ No verifiable official command → `blocked`, explain what is missing and why; n
|
|
|
69
69
|
```yaml
|
|
70
70
|
role: armorer
|
|
71
71
|
status: ready|blocked
|
|
72
|
+
summary: <one line>
|
|
72
73
|
mode: <bridge mode checked>
|
|
73
74
|
cache: hit|miss|refreshed
|
|
74
75
|
harness:
|
|
@@ -105,6 +106,8 @@ filesChanged: []
|
|
|
105
106
|
next: mothership-route|human-approval
|
|
106
107
|
```
|
|
107
108
|
|
|
109
|
+
Report lines (`summary:` and the chip lines) follow `../bridge/references/delegation.md` → Common output.
|
|
110
|
+
|
|
108
111
|
`filesChanged` stays empty unless an approved installation changed files; the cache file is written by the Mothership.
|
|
109
112
|
|
|
110
113
|
## Limits
|
|
@@ -50,6 +50,7 @@ task: <key>
|
|
|
50
50
|
attempt: 0|1|2
|
|
51
51
|
status: passed|blocked
|
|
52
52
|
commit: <HEAD sha>
|
|
53
|
+
summary: <one line>
|
|
53
54
|
tree: clean|+dirty [<in-scope paths>]
|
|
54
55
|
reruns:
|
|
55
56
|
- command: <exact declared command>
|
|
@@ -65,6 +66,8 @@ scope:
|
|
|
65
66
|
forbiddenTouched: [<paths>]
|
|
66
67
|
undeclaredCommands: [<command from the Pilot's report>]
|
|
67
68
|
mcpWrites: []
|
|
69
|
+
checks: ok=<n> run=<n> # ok: reruns with match true; run: reruns executed
|
|
70
|
+
severity_counts: critical=<n> high=<n> medium=<n> low=<n> info=<n>
|
|
68
71
|
findings:
|
|
69
72
|
- severity: HIGH|MEDIUM|LOW|INFO
|
|
70
73
|
location: <path | command>
|
|
@@ -75,6 +78,8 @@ filesChanged: []
|
|
|
75
78
|
next: reviewers|pilot-correction|mothership
|
|
76
79
|
```
|
|
77
80
|
|
|
81
|
+
Report lines (`summary:` and the chip lines) follow `../bridge/references/delegation.md` → Common output.
|
|
82
|
+
|
|
78
83
|
`passed` requires: every accepted command rerun with exit 0 (or the declared expected code) as `proof: local`, except plan-declared `ciOnly` commands recorded as `proof: ci-only` (pending CI, not passed), no out-of-scope or forbidden path, no undeclared command, and the verdict tied to the exact `HEAD` + tree state above. Any later change to the slice invalidates it.
|
|
79
84
|
|
|
80
85
|
## Limits
|
|
@@ -99,6 +99,7 @@ Your rights are the Dispatcher row of `../bridge/references/delegation.md` → A
|
|
|
99
99
|
role: dispatcher
|
|
100
100
|
mode: spec|publish|guide
|
|
101
101
|
status: ready|needs-input|escalate|blocked
|
|
102
|
+
summary: <one line>
|
|
102
103
|
questions: [{ id: 1, question: <text>, recommendation: <answer and why> }] # ≤3
|
|
103
104
|
spec:
|
|
104
105
|
app: <app name>
|
|
@@ -119,6 +120,8 @@ filesRead: [<paths>]
|
|
|
119
120
|
filesChanged: [<docs/code-guide.md and approved git docs in guide mode, else empty>]
|
|
120
121
|
```
|
|
121
122
|
|
|
123
|
+
Report lines (`summary:` and the chip lines) follow `../bridge/references/delegation.md` → Common output.
|
|
124
|
+
|
|
122
125
|
## Limits
|
|
123
126
|
|
|
124
127
|
Never create multi-app decompositions, branches, commits, PRs or product code, or an epic the confirmed list does not include; never make an Allye write outside `publish` mode or beyond the confirmed list, create, rename or overwrite an Allye docs page, call any other API, read credentials, make a product or architecture decision for the user, or edit any file except, in `guide` mode, `docs/code-guide.md` and, only after the user's OK through the Mothership, README.md, AGENTS.md, CLAUDE.md and docs/ARCHITECTURE.md. You have no crew file.
|
|
@@ -48,6 +48,7 @@ mode: slice|challenge|diagnose
|
|
|
48
48
|
task: <key | global | draft>
|
|
49
49
|
status: passed|blocked|advisory
|
|
50
50
|
commit: <HEAD sha reviewed | null>
|
|
51
|
+
summary: <one line>
|
|
51
52
|
criteriaCoverage:
|
|
52
53
|
- anchor: AC-01
|
|
53
54
|
tests: [<path:test name>]
|
|
@@ -72,9 +73,12 @@ diagnosis: { cause: <statement|null>, evidence: [<proofs>], regressionTest: <tes
|
|
|
72
73
|
openQuestions: [<real blockers only>]
|
|
73
74
|
filesRead: [<paths>]
|
|
74
75
|
filesChanged: []
|
|
76
|
+
severity_counts: critical=<n> high=<n> medium=<n> low=<n> info=<n>
|
|
75
77
|
next: shield|pilot-correction|mothership
|
|
76
78
|
```
|
|
77
79
|
|
|
80
|
+
Report lines (`summary:` and the chip lines) follow `../bridge/references/delegation.md` → Common output.
|
|
81
|
+
|
|
78
82
|
`passed` (slice/global) requires zero `blocking` regressions and every in-scope criterion `covered` or `ci-pending` (listed in `ciPending`, pending CI and never counted as proven locally). In `challenge`, open CRITICAL/HIGH means `blocked` for the challenge round; it never issues an implementation gate.
|
|
79
83
|
|
|
80
84
|
## Limits
|
|
@@ -68,7 +68,7 @@ phase: stage|publish
|
|
|
68
68
|
attempt: 0|1|2
|
|
69
69
|
status: passed|blocked|failed
|
|
70
70
|
commit: <base HEAD sha the work started from>
|
|
71
|
-
summary: <
|
|
71
|
+
summary: <one line>
|
|
72
72
|
filesRead: [<paths>]
|
|
73
73
|
filesChanged: [<paths>]
|
|
74
74
|
validation:
|
|
@@ -86,6 +86,8 @@ personalReads: [{ page: <short_id>, space: <space>, role: navigator }]
|
|
|
86
86
|
next: copilot|mothership
|
|
87
87
|
```
|
|
88
88
|
|
|
89
|
+
Report lines (`summary:` and the chip lines) follow `../bridge/references/delegation.md` → Common output.
|
|
90
|
+
|
|
89
91
|
`passed` is never a gate: Copilot, Medic, Shield and Watcher still decide, and the Mothership logs every `kb` write as `external-action` and reconciles it against your packet's `mcp`.
|
|
90
92
|
|
|
91
93
|
## Limits
|
|
@@ -47,6 +47,7 @@ mode: challenge|slice|optimize
|
|
|
47
47
|
task: <key | global | draft>
|
|
48
48
|
status: passed|advisory|blocked
|
|
49
49
|
commit: <HEAD sha reviewed | null>
|
|
50
|
+
summary: <one line>
|
|
50
51
|
proposals:
|
|
51
52
|
- id: OPT-01
|
|
52
53
|
classification: REMOVE_NOW|SIMPLIFY_NOW|KEEP|LATER
|
|
@@ -61,6 +62,8 @@ filesChanged: []
|
|
|
61
62
|
next: mothership|human-decision
|
|
62
63
|
```
|
|
63
64
|
|
|
65
|
+
Report lines (`summary:` and the chip lines) follow `../bridge/references/delegation.md` → Common output.
|
|
66
|
+
|
|
64
67
|
`blocked` only when complexity objectively violates the spec or its scope (e.g. a non-goal implemented); the Mothership reclassifies such a finding and decides the gate. In `challenge`, an open CRITICAL/HIGH scope finding blocks the challenge round until resolved or turned into an open `[Q-NN]`.
|
|
65
68
|
|
|
66
69
|
## Limits
|
|
@@ -45,7 +45,7 @@ task: <key>
|
|
|
45
45
|
attempt: 0|1|2
|
|
46
46
|
status: passed|blocked|failed
|
|
47
47
|
commit: <base HEAD sha the work started from>
|
|
48
|
-
summary: <
|
|
48
|
+
summary: <one line>
|
|
49
49
|
filesRead: [<paths>]
|
|
50
50
|
filesChanged: [<paths>]
|
|
51
51
|
tddCycles:
|
|
@@ -65,7 +65,7 @@ openQuestions: [<real blockers only>]
|
|
|
65
65
|
next: copilot
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
-
Without TDD (mechanical change), `tddCycles` is empty and `validation` shows the proof that fits. `passed` is never a gate: Copilot, Medic and Shield still decide.
|
|
68
|
+
Without TDD (mechanical change), `tddCycles` is empty and `validation` shows the proof that fits. `passed` is never a gate: Copilot, Medic and Shield still decide. Report lines (`summary:` and the chip lines) follow `../bridge/references/delegation.md` → Common output.
|
|
69
69
|
|
|
70
70
|
## Limits
|
|
71
71
|
|
|
@@ -49,6 +49,7 @@ When the packet gives you another app's repo path (same project, cloned locally)
|
|
|
49
49
|
```yaml
|
|
50
50
|
role: recon
|
|
51
51
|
status: passed|blocked
|
|
52
|
+
summary: <one line>
|
|
52
53
|
mode: launch|survey|repair|optimize|interview
|
|
53
54
|
question: <the target you investigated>
|
|
54
55
|
observations:
|
|
@@ -77,6 +78,8 @@ openQuestions: [<real blockers only>]
|
|
|
77
78
|
filesChanged: []
|
|
78
79
|
```
|
|
79
80
|
|
|
81
|
+
Report lines (`summary:` and the chip lines) follow `../bridge/references/delegation.md` → Common output.
|
|
82
|
+
|
|
80
83
|
`likelyCause` stays `null` unless the evidence supports it; `confidence: high` requires a reproduction or a direct code proof.
|
|
81
84
|
|
|
82
85
|
## Limits
|
|
@@ -57,6 +57,7 @@ role: shield
|
|
|
57
57
|
mode: slice|final|challenge
|
|
58
58
|
task: <key | global | draft>
|
|
59
59
|
status: passed|blocked
|
|
60
|
+
summary: <one line>
|
|
60
61
|
reviewedAt: <HEAD sha + clean|+dirty | null for challenge>
|
|
61
62
|
findings:
|
|
62
63
|
- id: SHD-01
|
|
@@ -72,10 +73,13 @@ ciPending: [<anchors pending CI, never proven locally>]
|
|
|
72
73
|
mcpWrites: []
|
|
73
74
|
filesRead: [<paths>]
|
|
74
75
|
filesChanged: []
|
|
76
|
+
severity_counts: critical=<n> high=<n> medium=<n> low=<n> info=<n>
|
|
75
77
|
gate: SHIELD_CLEAR|null
|
|
76
78
|
next: watcher|pilot-correction|mothership
|
|
77
79
|
```
|
|
78
80
|
|
|
81
|
+
Report lines (`summary:` and the chip lines) follow `../bridge/references/delegation.md` → Common output.
|
|
82
|
+
|
|
79
83
|
`SHIELD_CLEAR` only in `final`, with no open CRITICAL/HIGH, no scope violation, and an explicit disposition for every other finding. `accepted-by-human` is set only when the Mothership passes a recorded human decision. Any later change to the diff invalidates the gate.
|
|
80
84
|
|
|
81
85
|
## Limits
|
|
@@ -57,6 +57,7 @@ For each section, ask: could two competent implementers read this and build diff
|
|
|
57
57
|
role: strategist
|
|
58
58
|
mode: plan|challenge
|
|
59
59
|
status: passed|blocked
|
|
60
|
+
summary: <one line>
|
|
60
61
|
spec: <SPEC-KEY | draft>
|
|
61
62
|
criteriaTrace: # plan
|
|
62
63
|
- anchor: AC-01
|
|
@@ -92,6 +93,8 @@ filesRead: [<paths>]
|
|
|
92
93
|
filesChanged: []
|
|
93
94
|
```
|
|
94
95
|
|
|
96
|
+
Report lines (`summary:` and the chip lines) follow `../bridge/references/delegation.md` → Common output.
|
|
97
|
+
|
|
95
98
|
`passed` in `plan` requires an acyclic DAG, every AC traced (by server tasks or `proposedTasks`), stable keys/titles, no overlapping writers in a frontier, and every command either `resolved` to an inspected script or CI target (with `ciOnly: true` and its reason when it cannot run locally) or listed as `unresolved` for the user's decision. `passed` in `challenge` requires no open CRITICAL/HIGH; it is input to the challenge round, never an implementation gate.
|
|
96
99
|
|
|
97
100
|
## Limits
|
|
@@ -48,6 +48,7 @@ role: watcher
|
|
|
48
48
|
mode: final|scope
|
|
49
49
|
task: global
|
|
50
50
|
status: approved|blocked
|
|
51
|
+
summary: <one line>
|
|
51
52
|
reviewedAt: <HEAD sha + clean|+dirty>
|
|
52
53
|
traceability:
|
|
53
54
|
- anchor: AC-01
|
|
@@ -71,11 +72,15 @@ findings:
|
|
|
71
72
|
filesRead: [<paths>]
|
|
72
73
|
filesChanged: []
|
|
73
74
|
ciPending: [<anchors whose verdict is ci-pending>]
|
|
75
|
+
checks: ok=<n> run=<n> # ok: satisfied ACs; run: total ACs
|
|
76
|
+
severity_counts: critical=<n> high=<n> medium=<n> low=<n> info=<n>
|
|
74
77
|
gate: WATCHER_APPROVED|null
|
|
75
78
|
docsGate: { mode: warn|block, since: <DOCS_GATE_SINCE>, specCreated: <date>, findings: [<target or rule — gap>], blocking: true|false }
|
|
76
79
|
next: mothership-check|pilot-correction
|
|
77
80
|
```
|
|
78
81
|
|
|
82
|
+
Report lines (`summary:` and the chip lines) follow `../bridge/references/delegation.md` → Common output.
|
|
83
|
+
|
|
79
84
|
In `scope` mode, `approved` means `unexpected` is empty; it issues no gate. `WATCHER_APPROVED` requires every in-scope criterion `satisfied` or `ci-pending` (listed in `ciPending`), `unexpected` empty, no open finding, current evidence, and `shieldClearAt` equal to `reviewedAt`. Any other gap (`partial`, `missing`, a skipped suite not declared `ciOnly`, missing or stale evidence) blocks it. A non-empty `ciPending` means the code is approved but those anchors still wait for CI; it never counts them as proven. Any later change to the diff invalidates it.
|
|
80
85
|
|
|
81
86
|
## Docs gate
|