@mmerterden/multi-agent-pipeline 20.30.0 → 20.34.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/CHANGELOG.md +123 -0
- package/README.md +47 -1
- package/README.tr.md +61 -1
- package/docs/adr/0018-cross-repo-links-not-a-global-graph.md +43 -0
- package/docs/adr/README.md +2 -1
- package/docs/facts.json +6 -5
- package/docs/features.md +1 -1
- package/install/_dev-only-files.mjs +1 -0
- package/install/_unattended-profile.mjs +61 -0
- package/install/catalog-history.json +1 -1
- package/install/claude.mjs +16 -2
- package/install/index.mjs +10 -1
- package/install/templates/claude-hooks.json +23 -1
- package/manifest.json +198 -134
- package/package.json +4 -1
- package/pipeline/agents/code-reviewer.md +9 -0
- package/pipeline/agents/explorer.md +4 -0
- package/pipeline/agents/plan-critic.md +4 -2
- package/pipeline/commands/multi-agent/SKILL.md +17 -136
- package/pipeline/commands/multi-agent/analysis/SKILL.md +4 -4
- package/pipeline/commands/multi-agent/channels/SKILL.md +15 -297
- package/pipeline/commands/multi-agent/graph/SKILL.md +5 -2
- package/pipeline/commands/multi-agent/language/SKILL.md +3 -3
- package/pipeline/commands/multi-agent/office-on/SKILL.md +8 -7
- package/pipeline/commands/multi-agent/office-status/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/prune-logs/SKILL.md +4 -1
- package/pipeline/commands/multi-agent/resume/SKILL.md +8 -22
- package/pipeline/commands/multi-agent/review/SKILL.md +11 -134
- package/pipeline/commands/multi-agent/scenario-audit/SKILL.md +4 -2
- package/pipeline/commands/multi-agent/setup/SKILL.md +19 -224
- package/pipeline/commands/multi-agent/sync/SKILL.md +12 -0
- package/pipeline/commands/multi-agent/test-gen/SKILL.md +29 -3
- package/pipeline/contract/CHANGELOG.md +46 -0
- package/pipeline/contract/README.md +27 -10
- package/pipeline/contract/fixtures/error-invalid-request.json +1 -1
- package/pipeline/contract/fixtures/error-unauthorized.json +1 -1
- package/pipeline/contract/fixtures/error-unsigned.json +1 -1
- package/pipeline/contract/fixtures/launch-plan.json +1 -1
- package/pipeline/contract/fixtures/runs-awaiting-question.json +6 -1
- package/pipeline/contract/fixtures/runs-empty.json +1 -1
- package/pipeline/contract/fixtures/runs-failed.json +6 -1
- package/pipeline/contract/fixtures/runs-old-schema.json +6 -1
- package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +5 -1
- package/pipeline/contract/fixtures/runs-pr-opened.json +6 -1
- package/pipeline/contract/fixtures/runs-running.json +6 -1
- package/pipeline/contract/manifest.json +153 -19
- package/pipeline/contract/types/index.d.ts +304 -6
- package/pipeline/lib/bg-launch.mjs +106 -0
- package/pipeline/lib/code-digest.mjs +49 -0
- package/pipeline/lib/credential-resolve.mjs +42 -2
- package/pipeline/multi-agent-refs/channels/generator.md +146 -0
- package/pipeline/multi-agent-refs/channels/menu.md +55 -0
- package/pipeline/multi-agent-refs/channels/multi-repo.md +6 -0
- package/pipeline/multi-agent-refs/channels/preview.md +25 -0
- package/pipeline/multi-agent-refs/channels/reference.md +98 -0
- package/pipeline/multi-agent-refs/features/autopilot-circuit-breaker.md +1 -1
- package/pipeline/multi-agent-refs/features/code-graph.md +27 -0
- package/pipeline/multi-agent-refs/features/office-threat-model.md +24 -6
- package/pipeline/multi-agent-refs/features/plan-critic.md +5 -2
- package/pipeline/multi-agent-refs/features/review-delta.md +4 -1
- package/pipeline/multi-agent-refs/features/scope-check.md +10 -1
- package/pipeline/multi-agent-refs/features/unattended-security.md +1 -1
- package/pipeline/multi-agent-refs/help/en.md +2 -2
- package/pipeline/multi-agent-refs/help/tr.md +2 -2
- package/pipeline/multi-agent-refs/knowledge.md +9 -0
- package/pipeline/multi-agent-refs/orchestrator/dispatcher.md +163 -0
- package/pipeline/multi-agent-refs/phases/modes.md +7 -7
- package/pipeline/multi-agent-refs/phases/phase-1-plan.md +4 -4
- package/pipeline/multi-agent-refs/phases/phase-2-dev.md +9 -8
- package/pipeline/multi-agent-refs/phases/phase-3-review.md +12 -7
- package/pipeline/multi-agent-refs/phases/phase-4-commit.md +7 -3
- package/pipeline/multi-agent-refs/phases/phase-5-report.md +19 -10
- package/pipeline/multi-agent-refs/picker-contract.md +1 -1
- package/pipeline/multi-agent-refs/resume/details.md +35 -0
- package/pipeline/multi-agent-refs/review/inputs.md +87 -0
- package/pipeline/multi-agent-refs/review/module-guides.md +25 -0
- package/pipeline/multi-agent-refs/review/valven.md +42 -0
- package/pipeline/multi-agent-refs/review-standalone-tracker.md +37 -0
- package/pipeline/multi-agent-refs/setup/accounts.md +27 -0
- package/pipeline/multi-agent-refs/setup/app-store-connect.md +5 -0
- package/pipeline/multi-agent-refs/setup/firebase.md +5 -0
- package/pipeline/multi-agent-refs/setup/google-play.md +4 -0
- package/pipeline/multi-agent-refs/setup/hooks-and-plugins.md +21 -0
- package/pipeline/multi-agent-refs/setup/language.md +46 -0
- package/pipeline/multi-agent-refs/setup/multi-repo-group.md +51 -0
- package/pipeline/multi-agent-refs/setup/summaries.md +63 -0
- package/pipeline/multi-agent-refs/setup/token-save-flow.md +51 -0
- package/pipeline/multi-agent-refs/tracker-contract.md +8 -3
- package/pipeline/office/NOTICE.md +4 -1
- package/pipeline/office/assets/ARCHIVE_BOXES.png +0 -0
- package/pipeline/office/assets/COFFEE_MACHINE.png +0 -0
- package/pipeline/office/assets/COUNTER_SINK.png +0 -0
- package/pipeline/office/assets/DEVICE_STAND.png +0 -0
- package/pipeline/office/assets/FILING_CABINET.png +0 -0
- package/pipeline/office/assets/FRIDGE.png +0 -0
- package/pipeline/office/assets/MAILBOX.png +0 -0
- package/pipeline/office/assets/MOP_BUCKET.png +0 -0
- package/pipeline/office/assets/PRINTER.png +0 -0
- package/pipeline/office/assets/RECEPTION_DESK.png +0 -0
- package/pipeline/office/assets/SERVER_RACK.png +0 -0
- package/pipeline/office/assets/SERVER_RACK_2.png +0 -0
- package/pipeline/office/assets/TOILET_STALL.png +0 -0
- package/pipeline/office/assets/VENDING.png +0 -0
- package/pipeline/office/assets/WASHBASIN.png +0 -0
- package/pipeline/office/assets/WATER_COOLER.png +0 -0
- package/pipeline/office/index.html +3936 -819
- package/pipeline/office/toolkit.json +3 -0
- package/pipeline/rules/response-shape.md +6 -7
- package/pipeline/schemas/activity.schema.json +188 -4
- package/pipeline/schemas/agent-state.schema.json +511 -115
- package/pipeline/schemas/contract-error.schema.json +12 -1
- package/pipeline/schemas/job-change.schema.json +72 -0
- package/pipeline/schemas/job-request.schema.json +38 -0
- package/pipeline/schemas/launch.json +4 -4
- package/pipeline/schemas/office-credentials.schema.json +71 -0
- package/pipeline/schemas/office-jobs.json +253 -0
- package/pipeline/schemas/office-jobs.schema.json +62 -0
- package/pipeline/schemas/office-memory.schema.json +105 -0
- package/pipeline/schemas/office-settings-request.schema.json +30 -0
- package/pipeline/schemas/office-settings.schema.json +67 -0
- package/pipeline/schemas/phases.json +14 -6
- package/pipeline/schemas/phases.schema.json +86 -19
- package/pipeline/schemas/plan-critique.schema.json +9 -2
- package/pipeline/schemas/planning-output.schema.json +25 -2
- package/pipeline/schemas/prefs.schema.json +24 -1
- package/pipeline/schemas/prs.schema.json +5 -0
- package/pipeline/schemas/prune-logs-request.schema.json +26 -0
- package/pipeline/schemas/prune-logs.schema.json +52 -0
- package/pipeline/schemas/repo-change.schema.json +54 -0
- package/pipeline/schemas/repo-request.schema.json +29 -0
- package/pipeline/schemas/repos.schema.json +49 -1
- package/pipeline/schemas/reviewer-output.schema.json +20 -2
- package/pipeline/schemas/runs-index.schema.json +257 -46
- package/pipeline/schemas/system-status.schema.json +111 -0
- package/pipeline/schemas/token-budget.json +4 -4
- package/pipeline/schemas/tools.schema.json +5 -0
- package/pipeline/schemas/triage-output.schema.json +20 -2
- package/pipeline/schemas/unattended-profile.json +7 -2
- package/pipeline/scripts/_active-run.mjs +2 -1
- package/pipeline/scripts/_graph-analysis.mjs +270 -0
- package/pipeline/scripts/_memory-policy.mjs +165 -0
- package/pipeline/scripts/_secret-scan.mjs +105 -0
- package/pipeline/scripts/_spawn-async.mjs +9 -5
- package/pipeline/scripts/_unified-diff.mjs +2 -2
- package/pipeline/scripts/activity-snapshot.mjs +219 -23
- package/pipeline/scripts/autopilot-runner.mjs +7 -5
- package/pipeline/scripts/capture-flush.sh +12 -2
- package/pipeline/scripts/check-read-size.sh +9 -0
- package/pipeline/scripts/code-graph-rules/android.json +8 -3
- package/pipeline/scripts/contract-server.mjs +575 -28
- package/pipeline/scripts/debt-ledger.mjs +323 -0
- package/pipeline/scripts/file-context.mjs +261 -0
- package/pipeline/scripts/file-context.sh +20 -0
- package/pipeline/scripts/gen-mode-dispatch.mjs +3 -1
- package/pipeline/scripts/graph-links.mjs +230 -0
- package/pipeline/scripts/graph-query.mjs +133 -1
- package/pipeline/scripts/graph-report.mjs +65 -0
- package/pipeline/scripts/job-launch.mjs +477 -0
- package/pipeline/scripts/launch-request.mjs +94 -9
- package/pipeline/scripts/learn-from-transcripts.mjs +12 -48
- package/pipeline/scripts/learnings-ledger.mjs +143 -24
- package/pipeline/scripts/office-build.mjs +148 -11
- package/pipeline/scripts/office-control.mjs +34 -7
- package/pipeline/scripts/office-credentials.mjs +106 -0
- package/pipeline/scripts/office-memory.mjs +200 -0
- package/pipeline/scripts/office-prune.mjs +125 -0
- package/pipeline/scripts/office-settings.mjs +145 -0
- package/pipeline/scripts/phase-tracker.sh +12 -5
- package/pipeline/scripts/plan-critique-gate.mjs +11 -2
- package/pipeline/scripts/prune-logs.sh +53 -2
- package/pipeline/scripts/rework-rulings.mjs +106 -0
- package/pipeline/scripts/runs-index.mjs +62 -2
- package/pipeline/scripts/scope-check-gate.mjs +149 -2
- package/pipeline/scripts/system-status.mjs +196 -0
- package/pipeline/scripts/task-mirror.mjs +150 -0
- package/pipeline/scripts/task-mirror.sh +20 -0
- package/pipeline/scripts/toolkit-tools.mjs +33 -7
- package/pipeline/scripts/transcript-index.mjs +4 -1
- package/pipeline/scripts/triage-memory.mjs +64 -37
- package/pipeline/scripts/validate-planning.mjs +68 -4
- package/pipeline/scripts/validate-reviewer.mjs +20 -0
- package/pipeline/scripts/validate-triage.mjs +107 -2
- package/pipeline/scripts/work-items.mjs +191 -22
- package/pipeline/skills/.skill-manifest.json +9 -9
- package/pipeline/skills/.skills-index.json +1 -1
- package/pipeline/skills/shared/README.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-graph/SKILL.md +5 -2
- package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +4 -4
- package/pipeline/skills/shared/core/multi-agent-office-on/SKILL.md +3 -4
- package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +4 -1
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +21 -0
- package/pipeline/skills/shared/core/multi-agent-scenario-audit/SKILL.md +4 -2
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +4 -4
- package/pipeline/skills/shared/core/multi-agent-test-gen/SKILL.md +26 -3
- package/pipeline/skills/skills-index.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -16,6 +16,129 @@ Internal file-layout changes that don't affect the slash-command surface are sti
|
|
|
16
16
|
|
|
17
17
|
## [Unreleased]
|
|
18
18
|
|
|
19
|
+
## [20.34.0] - 2026-10-26
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
23
|
+
- Plans carry `reviewFocus[]` (at most five inputs the spec implies but no task's tests exercise, each owned by a task whose tests add it) and `globalConstraints[]` (project-wide values every task brief quotes). `validate-planning.mjs` checks both and, with `--spec`, warns when a plan runs more than four times the length of its spec. Planning schema 1.1.0.
|
|
24
|
+
- The plan critic has two more lenses: `unstated-input`, an input the spec implies (empty, boundary, expired, concurrent) that no task's tests exercise, and `underspecified`, a decision a task leaves to its implementer that the analysis or the user should make.
|
|
25
|
+
- `rework-rulings.mjs`: at the rework cap every accepted finding still open gets a recorded ruling. Blocking and security findings (a `SEC-*` rule, a security criteria source, or the security auditor's `security` object) escalate to the user; the rest are parked as follow-ups and the run continues to Phase 4 instead of stopping.
|
|
26
|
+
- Phase 4 Step 0b lists deferred and parked findings before the commit and asks once whether to ship with them as follow-ups.
|
|
27
|
+
- Code graph: `graph-query.mjs --path <from> <to>` finds the shortest path between two symbols or files; an ambiguous name is refused with candidate ids and an unknown one gets its nearest names. External modules end a path but are never walked through.
|
|
28
|
+
- `GRAPH_REPORT.md` gains import cycles, clusters of files with a cohesion score (label propagation over imports and references) and questions worth asking before a change; `graph-report.mjs --diff <older graph>` lists what changed between two builds. All deterministic (`_graph-analysis.mjs`).
|
|
29
|
+
- `graph-links.mjs`: which files of one repository import another, by matching each graph's unresolved imports against what the others export (package name, Python packages, Swift targets, Go module, Kotlin types). A Kotlin link holds only files whose import names the exporting file's package, and a repository name counts only when the stack names no export. Graphs stay separate (ADR-0018).
|
|
30
|
+
- Kotlin graphs index a capitalised `fun` as its own `composable` kind and make it a reference target, so a change to a Compose UI function reaches its callers; an extension function is named after the function, not its receiver.
|
|
31
|
+
- `debt-ledger.mjs`: one list per repository of the limits accepted on purpose (`shortcut: <limit>, <when to replace>` markers a diff adds in a comment outside any string, deferred findings, parked rulings), fed by `capture-flush.sh`, secret-scanned, closable with `resolve`.
|
|
32
|
+
- `file-context.sh`, a PostToolUse hook on Read: once per file per session it hands the model what the repo's memory says about the file just read (ledger facts whose scope covers it and that feedback has not suppressed, its latest review findings, its open known limits) as untrusted context, after the secret scan. On inside a pipeline run, everywhere with `prefs.global.fileContext.enabled: true`, never with `false`.
|
|
33
|
+
- `scope-check-gate.mjs --patch` (or `--repo <dir> --patch-range <a>...<b>`, which reads the diff itself) lists hunks that only change layout (`formatOnly[]`): whitespace outside string literals and comments, never a space that keeps two operators apart, a line break after `return` or before a leading operator in Kotlin and Swift, a leading indent in Python, YAML or a Makefile, or the space around brackets and colons outside C-family languages and Python. A pure addition or deletion is never layout-only. Reported to reviewers and never fatal; the code reviewer gains a fit lens (follow the surrounding code, leave untouched lines alone) and reads `shortcut:` markers as known limits.
|
|
34
|
+
- `pipeline/eval/ab/write-lean.json` measures a candidate write-time rule for the GREEN step against none. It is not shipped: its run scored below the baseline.
|
|
35
|
+
- Ledger entries earn or lose weight: `learnings-ledger.mjs feedback --id <L:id> --outcome useful|dead_end|corrected` (Phase 5 records it for injected entries). A corrected entry, or one judged a dead end at least twice and more often than useful, leaves `brief` and `profile`; one useful at least twice ranks by a strength that fades with age. A new entry that repeats an existing one in other words (TF-IDF cosine 0.9 or more, same numbers and negations) is not added (`_memory-policy.mjs`).
|
|
36
|
+
- When `check-read-size.sh` turns a whole-file read away it also prints what the repo's memory says about that file (`file-context.mjs --lines`), so the delegated read starts from what is already known.
|
|
37
|
+
- `knowledge.md` documents progressive recall over a large ledger or triage corpus through the toolkit's existing full-text index (`context_index`, `context_search`, `context_get`).
|
|
38
|
+
- `npm run audit:refs` (`ref-filler-audit.mjs`): filler phrases and sentences copied verbatim across the instruction docs, with the tokens a rewrite would win back. Advisory; it rewrites nothing.
|
|
39
|
+
- The explorer returns its JSON with nothing around it, in short phrases, keeping negations, numbers and paths exactly as found.
|
|
40
|
+
- `prefs.global.memory.excludeProjects`: repos whose ledger, triage corpus and debt list are never written.
|
|
41
|
+
- Reviewers return `cannotVerify[]` for requirements that live in code the diff does not touch; triage settles each as verified (citing the file:line read), a finding (citing the file:line of the accepted or deferred finding) or out of scope, and `validate-triage.mjs --reviewers` or `--reviewers-dir` fails one left unsettled or settled without that evidence. Reviewer output 1.6.0, triage output 3.6.0.
|
|
42
|
+
- `smoke-skill-size.sh`: no `pipeline/commands/**/SKILL.md` may reach 20,000 bytes, and a file between 18,000 and 19,999 bytes is reported as a warning. After context compaction Claude Code re-attaches each invoked skill truncated at about 20k characters, so anything past that point would silently stop applying mid-run. Runs through `run-smokes.mjs` and the CI lite workflow.
|
|
43
|
+
|
|
44
|
+
### Changed
|
|
45
|
+
|
|
46
|
+
- The five command skills over that limit now keep their step skeleton, stop conditions and hard rules, with explicit "Read <ref> before Step N" pointers to the long reference sections, moved without changing their meaning: `channels` (33,925 to 17,749 bytes; `multi-agent-refs/channels/menu.md`, `generator.md`, `preview.md`, `reference.md`, plus the Step 1 target resolution in `multi-repo.md`), `setup` (26,000 to 17,452; `setup/language.md`, `multi-repo-group.md`, `summaries.md`, `accounts.md`, `hooks-and-plugins.md`, and sections appended to `token-save-flow.md`, `app-store-connect.md`, `firebase.md`, `google-play.md`), the `/multi-agent` dispatcher (24,130 to 17,548; `orchestrator/dispatcher.md`), `review` (24,033 to 17,838; `review/inputs.md`, `module-guides.md`, `valven.md`) and `resume` (20,102 to 17,586; `resume/details.md`). `setup` and `channels` leave the token-budget grace list, now under the hard cap.
|
|
47
|
+
- Token ceilings: phase-3 17200 to 17260, phase-4 6600 to 6650, phase-5 5700 to 5710, total 63550 to 63710, after the review-settled contracts above (triage settles `cannotVerify`, the PR body carries deferred, parked and marked limits, Phase 5 records ledger outcomes). Existing prose in phases 1 to 5 was compressed first and absorbed every earlier addition of this release.
|
|
48
|
+
- The reply-shape rule keeps negations, numbers, units and paths when it shortens a list.
|
|
49
|
+
|
|
50
|
+
### Fixed
|
|
51
|
+
|
|
52
|
+
- Office: the autopilot window could open empty with "busy" when the panel's own status poll was still running, because `GET /v1/autopilot` refused a second caller. It, `GET /v1/prs` and the maturity read now answer every concurrent caller from the one run in flight; at most two maturity reads for different issues run at once. A window that reloads after a request now redraws only if it is still the open one, so a late answer for Skills no longer replaces the autopilot window.
|
|
53
|
+
- `eval-ab-judge.mjs` showed the judge `blocker` as the string "true|false", so judges answered with a string and the judgement was dropped; the example is a boolean now and a quoted "true"/"false" is read as one. `MULTI_AGENT_EVAL_USER_SETTINGS=1` lets a live eval log in on a host that keeps its CLI login in user settings.
|
|
54
|
+
|
|
55
|
+
### Security
|
|
56
|
+
|
|
57
|
+
- The learnings ledger (`add`, `from-triage`) and the triage corpus (`ingest`) run every row through the secret scan before writing it, through one shared helper (`scripts/_secret-scan.mjs`) that the transcript miner uses too. A refused row is counted in `droppedBySecretScan`; a missing scanner refuses the row instead of writing it unchecked. `<private>...</private>` spans are removed before anything is stored. Control bytes are removed from the scanned copy, so a NUL cannot make the scanner treat the text as binary and skip it. The triage corpus scans every stored field, task id, title, stack and reviewer included.
|
|
58
|
+
- A token hard-wrapped by a space or a line break is still refused: a run that starts with a known token prefix is scanned a second time with its whitespace removed.
|
|
59
|
+
- Every memory store refuses a repository slug that could leave the memory folder (a path separator, NUL, `.` or `..`); spaces and non-ASCII letters stay valid, and slugs compare in Unicode NFC, so `excludeProjects` matches either normal form. The transcript miner honours `memory.excludeProjects` for the ledger and the `CLAUDE.local.md` block alike.
|
|
60
|
+
- `file-context.mjs --lines`, used when a whole-file read is turned away, prints inside the same untrusted-data block as the hook and stays silent when `fileContext.enabled` is false.
|
|
61
|
+
|
|
62
|
+
## [20.33.0] - 2026-10-25
|
|
63
|
+
|
|
64
|
+
### Added
|
|
65
|
+
|
|
66
|
+
- Office: pipelines run step by step. Agents wait at the open office and walk over to take their seat in a run's room. The table sign counts phases from 1 over the run's own phases, fills the current phase as its tasks finish and names the task in progress; the run window shows each phase's checklist and a seat shows its own tasks and recent MCP calls. A finished run stays two minutes.
|
|
67
|
+
- `task-mirror.sh`, a PostToolUse hook on `TaskCreate` / `TaskUpdate`: the native task list of the session driving a run lands in that run's tracker under the phase in progress, so the office and the terminal show the same list. Phase tiles are skipped, nothing is written outside a run bound to the session, and the hook never prints.
|
|
68
|
+
- The analysis mode has its own phase names in `schemas/phases.json` (Intake, Evidence, Synthesis, Review, Publish, Report); `/multi-agent:test-gen` and a standalone `/multi-agent:review` register tracker runs with their own steps, on Claude Code and Copilot CLI alike.
|
|
69
|
+
- Office rooms per repository are typed: Development rooms (`/multi-agent`) and Analysis rooms (`/multi-agent:analysis`), each floor keeping a free Analysis room; a run that touches more repositories opens an annex desk on theirs. Labels go through one layout pass and never overlap; a thought cloud over a working agent says what it is doing and opens its detail.
|
|
70
|
+
- Office reception has two new-run desks (development and analysis) that list Jira and GitHub issues and take free text.
|
|
71
|
+
- Office mail room: pull requests on every GitHub account `gh` is logged in to, each asked with its own token, and on the configured Bitbucket Server.
|
|
72
|
+
- Office server room: the key cabinet (`GET /v1/credentials`, names and probe verdicts from `credential-inventory.sh`, never a value, local-only) and the system panel (`GET /v1/system`: CPU, memory, disk and the pipeline's own processes, numbers only). The library holds per-repository memory (`GET /v1/memory`: code graph age, learnings, findings and session notes, redacted). The restroom previews and prunes old run logs through `prune-logs.sh` (`POST /v1/prune-logs`, two steps, 7, 30 or 90 days, local-only).
|
|
73
|
+
- Office orientation room: a trainer next to reception opens a guide built from the floor that is drawn, listing every room with the windows it opens, how both pipelines run, what is a job, a window or terminal-only, the security model and the signs. Each visit points at it in the feed; the page keeps nothing in browser storage.
|
|
74
|
+
- Five read-only office jobs: doctor, route status, scan, scenario audit and analysis review (19 jobs in all). Commands that stay in the terminal say why instead of offering a copy button.
|
|
75
|
+
- Office tables seat a run's whole crew from the start, one seat per role each phase uses (planner and plan critic, developer and dev critic, three reviewers, committer, reporter; an analysis run its own): whoever's phase runs works, later ones wait for their turn, finished ones stay seated.
|
|
76
|
+
- The table sign names where the work came from (the Jira key, the GitHub issue as `repo#N`, both when an issue got a Jira, or free text), what a waiting run waits for (a local test, the report channels, an answer here, or a question in the terminal) and, once finished, the pull request it opened. `runs-index` carries `source`, `prNumber`, `mode`, `channels` and the local-only `channelUrls` (runs surface 1.3.0). The client contract is 1.6.0: the six new routes, and the activity and pull-request surfaces at 1.1.0. A run with no tracker still lists every phase of its mode.
|
|
77
|
+
- A question a session asks in its own terminal counts as waiting for you: the table glows, the HUD counts it, the feed says so and the tab title shows the number; the drawer says to answer it in the terminal. The HUD reads agents working, runs and sessions.
|
|
78
|
+
- Office settings screen in the manager's office (`GET/POST /v1/settings`, local-only, two steps, one change at a time): output language, the fable rung and model routing, each through the script its terminal command runs (`office-settings.mjs`). Route on keeps the saved strategy and scope; rules, free providers and prompt language stay in the terminal.
|
|
79
|
+
- Phase 5 records each report channel's outcome in `state.channelResults`; the run window lists where the report went, with the addresses (https only) from the run record, which drops them from a redacted answer.
|
|
80
|
+
- The memory shelf offers a code graph build or refresh for each repository, through the graph job.
|
|
81
|
+
- Office characters come in twelve looks: six sheets and a recoloured second set, so every role at a run's table looks different. The team window shows every character with its portrait, the office staff and the agent pool apart, and the chat drawer shows the character actually at the seat.
|
|
82
|
+
- README and README.tr gain an office section with screenshots; README.tr gains the hooks-per-host table README has.
|
|
83
|
+
- Office rooms carry more of a real office: pictures, a clock and hanging plants on free wall, and a plant in each free corner, never behind a tall piece, under a room's sign or in anyone's way.
|
|
84
|
+
- The autopilot window is one switch that says the state and flips it, the three numbers that matter, and the repository selection; stop buttons appear only while it runs, and with no repository it says how one is added.
|
|
85
|
+
|
|
86
|
+
### Changed
|
|
87
|
+
|
|
88
|
+
- Office roles on the floor and in the feed are translated, and phase events count from 1 like the table sign.
|
|
89
|
+
- `/multi-agent:office-on` describes the panel as it is; the help catalog says the server runs until `office-off`.
|
|
90
|
+
- `prune-logs.sh` spares a run that can still be resumed (an `agent-state.json` status that is not finished, abandoned or cancelled) unless `--task` names it; `--only-from=FILE` limits a prune to a confirmed list. The office prunes only the folders its preview listed, passing them through `--only-from`, and refuses with `changed` when the set moved.
|
|
91
|
+
- `phase-tracker.sh task <N> <id> deleted` takes a mirrored task off the list, as a native `TaskUpdate` with status `deleted` does. A task id used again in a later phase updates that phase's task.
|
|
92
|
+
- Text cut to fit a field (`transcript-index` excerpts) counts its ` ...` ending toward the limit.
|
|
93
|
+
- An MCP call a turn left without a result is closed as failed, so no desk stands at the server rack forever. A task created between two phases is mirrored under the phase about to start.
|
|
94
|
+
- The key cabinet shows every verdict `credential-inventory.sh --probe` gives (malformed, no credential, probe error, server error, tier ready, needs a grant) and calls one it does not know unknown instead of not checked.
|
|
95
|
+
- The Bitbucket pull request list authenticates the way the credential inventory does: Basic with a stored `bitbucket_user`, else the token as a bearer. On a `gh` without `auth token --user`, the active account answers alone.
|
|
96
|
+
- The system panel counts only a node, npx or npm process as the toolkit server, and on macOS reports used memory from `vm_stat` (reclaimable pages count as free).
|
|
97
|
+
- A memory store line that is not a JSON object is skipped, a shelf that cannot be read is left out instead of failing the answer, and a graph dated in the future reads as zero days old.
|
|
98
|
+
- The room sign names only commands that exist; an autopilot job reads `/multi-agent autopilot` as its run does. Prunes run one at a time. A language change the preferences file could not take, or whose command descriptions were not switched, is reported as failed.
|
|
99
|
+
- The office translates numbered roles in the run window and chat drawer, the HUD counts sessions apart from solo jobs, the job form names the scenario audit's CSV field, and a run's head and crew stay at the table until it leaves.
|
|
100
|
+
- A run that just finished keeps only the session that ran it, so a session that starts the next run within two minutes sits at the new table.
|
|
101
|
+
- Office wall-station labels sit inside their room instead of above the top wall, and `smoke-office-runtime.sh` checks that no two labels overlap at any zoom step. A floor station's label sits above its tallest piece, hotbar labels fit under their icons, and room signs never cover a picture or board; the runtime smoke checks all three.
|
|
102
|
+
- `schemas/phases.schema.json` allows a mode's own phase `names`.
|
|
103
|
+
|
|
104
|
+
### Security
|
|
105
|
+
|
|
106
|
+
- `GET /v1/system` measures with child processes off the event loop; requests that arrive while one measures share its answer, and the log folder size is reused for a minute. `GET /v1/memory` reads its stores asynchronously, parses only their last megabyte, and skips a store that is a FIFO, a symlink or anything but a regular file.
|
|
107
|
+
- Turning routing on from the office names, in its confirmation, the saved free provider chain it brings back and whether that chain allows training.
|
|
108
|
+
- `/multi-agent:scenario-audit` writes its verdicts in a folder of the run's own instead of a fixed name under `/tmp`.
|
|
109
|
+
- The Bitbucket token is read from the credential store with a deadline and sent only over https (a loopback host excepted); redirects are not followed. A redacted pull request list carries no URL or login.
|
|
110
|
+
- `resolveToken` gives the credential store a deadline. A GitHub Enterprise Server account's token reaches `gh` as `GH_ENTERPRISE_TOKEN` as well.
|
|
111
|
+
- Office threat model rows T19 to T24 cover the new routes, the PR listing, the task mirror hook, the settings screen and report links.
|
|
112
|
+
|
|
113
|
+
## [20.32.0] - 2026-10-25
|
|
114
|
+
|
|
115
|
+
### Added
|
|
116
|
+
|
|
117
|
+
- Office: a repository can be added from any window that picks one. Checkouts earlier runs worked in are suggested, a path can be typed, and a registered entry whose folder is gone can be taken off the list; each is a two-step write (`POST /v1/repos`, `DELETE /v1/repos/{id}`), and only a git checkout is accepted. `GET /v1/repos?all=1` (`launch-request.mjs repos --all`) lists the suggested and the missing entries by id, never by path to a page.
|
|
118
|
+
- Office keeps itself current: the open page shows a reload banner when a newer page is installed and reloads onto it through a fresh one-time code (`GET /office/version`, `POST /office/reload`); `office-on` replaces a running server whose code changed on disk. A server that has stopped is said so on the page.
|
|
119
|
+
- The office ships the toolkit version the release was checked against (`office/toolkit.json`, written by `office-build.mjs` from `docs/facts.json` and held by `--check`), so the Tools window starts an exact version with no manual step and every pipeline update moves it forward. `MA_TOOLKIT_VERSION` and `prefs.global.office.toolkitVersion` still override it. The Tools window shows the version; nothing writes the preferences file.
|
|
120
|
+
- Office: hand a job to someone. Clicking a person or a station opens the jobs that role does (`schemas/office-jobs.json`: 14 jobs, each parameter typed by kind, no free text); the confirmation names the exact prompt, the repository and what the job writes outside this machine, and the second step starts `claude --bg` with the unattended profile and no shell (`GET/POST /v1/jobs`, two steps). A team job meets in its repository's room and is refused while another run is live there (`room-busy`); a solo job sits at a desk under its role. Every start is recorded under `logs/multi-agent/office/jobs/` (0600). The autopilot runner and the office start sessions through one launcher, `pipeline/lib/bg-launch.mjs`.
|
|
121
|
+
- Office is a company building: a hall with the lobby, the open office and the kitchen on top, then the manager's office, library, server room, test lab, analysis room, archive, mail room and restroom, with each repository's meeting rooms below. Thirteen staff work in their rooms; the hotbar moves the camera to a room, and each room's window holds its commands (the cleanup in the restroom previews `/v1/gc` before it runs). Copy buttons are gone: the New run flow, PR review and the command cards start real jobs.
|
|
122
|
+
- Office furniture drawn for this project: 16 sprites kept as pixel grids in `pipeline/office-art` and rendered into PNGs by `office-build.mjs` with a dependency-free encoder; `--check` holds the PNGs to their sources.
|
|
123
|
+
- `smoke-office-ui.sh`: the signed-in panel driven by Playwright (adding a repository, the refusal of a folder that is not a checkout, command cards, the reload banner, a stopped server).
|
|
124
|
+
|
|
125
|
+
### Security
|
|
126
|
+
|
|
127
|
+
- The unattended profile denies reading `~/.claude/logs/multi-agent/contract-server/` (a `Read` deny, a sandbox `denyRead`, and in `MCP_TOOLKIT_INDEX_DENY` together with the office state directory), where the local server keeps its bearer token, so a session the office or the autopilot starts cannot pick it up. Every install adds the deny rules and index-deny directories a newer release ships to an existing `multi-agent-unattended.settings.json` without changing what it allows (`tightenUnattendedProfile`), so the autopilot's profile check keeps passing after an update.
|
|
128
|
+
- `POST /v1/jobs` starts nothing unless agent-guard.sh is registered for every tool (`guard-missing`), re-checks at the confirmation that the repository is still allowed, and keeps claude's own error output off the page.
|
|
129
|
+
|
|
130
|
+
### Changed
|
|
131
|
+
|
|
132
|
+
- Office: the panel's server runs until `/multi-agent:office-off`; it no longer stops after an idle time or after 8 hours. `contract-server.mjs` takes `--idle-minutes 0` and `--max-hours 0` for that, and keeps its 15 minute and 8 hour defaults when started on its own. The open page checks in once a minute, also in a background tab, and says so when the server has stopped.
|
|
133
|
+
- Office: command cards keep their button on the title row; long names are cut with the full name on hover.
|
|
134
|
+
- `/multi-agent:sync` checks the office instead of copying it: the committed page matches its sources, the installed copies match the page, and the recorded toolkit version is reported (Step 3e).
|
|
135
|
+
|
|
136
|
+
## [20.31.0] - 2026-10-25
|
|
137
|
+
|
|
138
|
+
### Changed
|
|
139
|
+
|
|
140
|
+
- Office: every run meets in its own walled room inside its repository's room. The orchestrator sits at the head of a long table with a computer, the agents face each other along it, and the table grows with the team from two to six chairs a side. Agent labels sit above the near row and below the far one; on a narrow floor the chairs are packed and labels show on hover. Free meeting rooms finish the row, a hall on the left leads in, and the floor reaches the bottom of the stage. The corridor label of a run over several repositories now sits beside the room name.
|
|
141
|
+
|
|
19
142
|
## [20.30.0] - 2026-10-25
|
|
20
143
|
|
|
21
144
|
### Added
|
package/README.md
CHANGED
|
@@ -297,7 +297,7 @@ the pipeline merges.
|
|
|
297
297
|
- **Operations around a run.** A second launchd agent keeps the Mac awake while the mode is on (`caffeinate -s -i`, plus `-d` if you answer yes to the display question at `autopilot-on`), and each run holds a sleep lock until its tick ends. Every credential a configured repo needs is probed before the schedule is offered and again on every tick, so a locked keychain refuses with the key and the fix. A circuit breaker stops launching after consecutive attempts that produced nothing, `costCeilingUsd` caps spend over a rolling 24 hours, `maxParallelAgents` caps sessions working at once, and once a day the runner writes a cleanup report and, when enabled, a digest. [Autopilot operations](./pipeline/multi-agent-refs/features/autopilot-operations.md)
|
|
298
298
|
- **A fail-closed guard.** Under the variable, the Bash guard judges a command only when it reduces to simple commands joined by `;`, `&&`, `||` and plain pipes, and refuses anything else unparsed. On what it can parse: no push, PR, issue or tracker write, no Keychain read, no fetch outside the network allowlist, no package install or manifest edit, no write into a protected path. Ticket, page and PR text reaches the model inside untrusted-data delimiters. The permission profile (`install --unattended`) is a second line; the boundary is a separate non-admin macOS user and GitHub rulesets on the default and release branches, which the operator applies. [Unattended security](./pipeline/multi-agent-refs/features/unattended-security.md)
|
|
299
299
|
- **Claims are checked, not trusted.** With the quality gates active, a run's claims about the repository are checked before it commits: a localization key or endpoint the change references exists, open analysis questions are answered or park the run, a triage citation quotes the line it cites, a "pre-existing" finding points at a line the diff did not touch, the plan's steps are covered, and a test pass shows a positive executed count read with the stack's own markers (8 stacks: `ios`, `android`, `web`, `backend-node`, `python`, `go`, `rust`, `jvm`) along with a new test that fails without the change. Every verdict goes to a gate ledger, and the commit hook refuses a commit whose mandatory gates did not pass for HEAD. [Unattended gates](./pipeline/multi-agent-refs/features/unattended-gates.md), [stack adapters](./pipeline/multi-agent-refs/features/stack-adapters.md)
|
|
300
|
-
- **Spec, plan and review discipline.** `/multi-agent:analysis` writes a project constitution (security, accessibility, architecture and licensing rules, each tied to a source), and a spec-consistency gate checks by id that every requirement has a task and a test and that nothing waives a binding rule. Phase 1 ends with one plan-critic round under
|
|
300
|
+
- **Spec, plan and review discipline.** `/multi-agent:analysis` writes a project constitution (security, accessibility, architecture and licensing rules, each tied to a source), and a spec-consistency gate checks by id that every requirement has a task and a test and that nothing waives a binding rule. Phase 1 ends with one plan-critic round under six lenses (scope, feasibility, security, a cheaper alternative, an unstated input, a decision left to the implementer), answered once and judged by a script. In review, a `blocking` finding stops the run only when two independent reviewers carry it or a failing test shows it; otherwise it is lowered to `important`, never dropped. [Constitution](./pipeline/multi-agent-refs/features/constitution.md), [plan critic](./pipeline/multi-agent-refs/features/plan-critic.md), [review decision](./pipeline/multi-agent-refs/features/review-decision.md)
|
|
301
301
|
- **A client contract.** Commands and run questions are declared as data. `/multi-agent:serve` starts a localhost HTTP server over the same JSON the CLI prints, and `pipeline/contract/` ships the manifest, TypeScript types and fixtures a client builds against. Four phone routes read redacted runs, answer a parked question with one of its offered options, and, only when switched on, queue a launch; every request carries an Ed25519 signature from an enrolled device. The phone app is a separate project. [Client kit](./pipeline/contract/README.md), [phone API](./pipeline/multi-agent-refs/features/phone-api.md)
|
|
302
302
|
|
|
303
303
|
**Attended use is unchanged.** Every behaviour above keys on
|
|
@@ -353,6 +353,50 @@ Continuous mode therefore needs the `claude` binary on `PATH` everywhere. The
|
|
|
353
353
|
queue and the repo selection live in `~/.claude/autopilot/` on every host, on
|
|
354
354
|
purpose - two CLIs on one machine must read one queue, not two.
|
|
355
355
|
|
|
356
|
+
## The office
|
|
357
|
+
|
|
358
|
+
A local web page that shows the pipeline as a pixel office and lets you drive
|
|
359
|
+
it. `/multi-agent:office-on` starts the contract server on 127.0.0.1 and opens
|
|
360
|
+
the page with a one-time code; the server runs until `/multi-agent:office-off`.
|
|
361
|
+
|
|
362
|
+

|
|
363
|
+
|
|
364
|
+
- **Runs come alive.** Agents wait at their desks in the open office and walk
|
|
365
|
+
to a run's room when the run calls their role. Each repository has its own
|
|
366
|
+
floor of Development rooms (`/multi-agent`) and Analysis rooms
|
|
367
|
+
(`/multi-agent:analysis`); a run that touches more repositories opens an
|
|
368
|
+
annex desk on theirs.
|
|
369
|
+
- **The native task widget, on the table.** The table sign shows the phase
|
|
370
|
+
(`Phase 3/6 Dev`), a bar that fills as that phase's tasks finish and the
|
|
371
|
+
task in progress. A PostToolUse hook copies `TaskCreate` / `TaskUpdate` into
|
|
372
|
+
the run's tracker, so the office and the terminal show the same list. A
|
|
373
|
+
thought cloud over a working agent says what it is doing.
|
|
374
|
+
- **The rest of the ecosystem has a room.** Reception starts a run from a Jira
|
|
375
|
+
or GitHub issue or free text. The mail room lists pull requests on every
|
|
376
|
+
GitHub account `gh` is logged in to and on Bitbucket Server. The server room
|
|
377
|
+
holds the toolkit MCP tools, the services, the key cabinet (names and probe
|
|
378
|
+
verdicts, never a value) and the machine's CPU, memory and disk. The library
|
|
379
|
+
holds stacks, commands and what the pipeline learned per repository. The
|
|
380
|
+
restroom clears worktrees, abandoned runs and old run logs after a preview.
|
|
381
|
+
Accounting shows tokens and cost, the manager's office holds autopilot,
|
|
382
|
+
routines and the settings (output language, the fable rung, model routing),
|
|
383
|
+
and the orientation room explains the building.
|
|
384
|
+
- **People take jobs.** Click one, pick a job, confirm. Writes that change the
|
|
385
|
+
machine are local-only and take two requests. Work that is interactive or
|
|
386
|
+
changes the installation stays in the terminal, and the commands window says
|
|
387
|
+
why for each command.
|
|
388
|
+
|
|
389
|
+

|
|
390
|
+
|
|
391
|
+
| Command | What it does |
|
|
392
|
+
| ---------------------------- | --------------------------------------------------------------- |
|
|
393
|
+
| `/multi-agent:office-on` | Start or reuse the server and open the page |
|
|
394
|
+
| `/multi-agent:office-status` | Whether it runs, its URL (never the token) and its last actions |
|
|
395
|
+
| `/multi-agent:office-off` | Stop the server; it runs until you do |
|
|
396
|
+
|
|
397
|
+
Security model: [office threat model](pipeline/multi-agent-refs/features/office-threat-model.md).
|
|
398
|
+
Phone access is not part of this installation.
|
|
399
|
+
|
|
356
400
|
## Which model answers
|
|
357
401
|
|
|
358
402
|
The ladder is `fable -> opus -> sonnet -> haiku`, and a run walks it on failure.
|
|
@@ -458,6 +502,8 @@ The **secret scan** runs as a `PreToolUse` hook on Claude Code (hard-blocks a co
|
|
|
458
502
|
| `agent-guard.sh` (attribution, force-push, skipped git hooks, argv secrets, closure confirmations, read-only repos, unattended policy) | PreToolUse `Bash`, file edits, fetch and toolkit tools | none | none |
|
|
459
503
|
| `run-scope-guard.sh` (Figma phase rule, worktree boundary warning) | PreToolUse Figma tools, file edits | none: the phase records its own MCP calls | none |
|
|
460
504
|
| `run-stop-guard.sh` (no silent stop mid-run) | Stop | none: halts stay the phase's own write | none |
|
|
505
|
+
| `task-mirror.sh` (native task list into the run tracker, so the office shows it) | PostToolUse `TaskCreate`/`TaskUpdate` | none: the phase calls `phase-tracker.sh task` itself | none: the phase calls `phase-tracker.sh task` itself |
|
|
506
|
+
| `file-context.sh` (what the repo's memory says about a file, after it is read) | PostToolUse `Read` | none | none |
|
|
461
507
|
| `edit-syntax-gate.sh` | PostToolUse file edits | PostToolUse `apply_patch` | none: Copilot discards postToolUse output |
|
|
462
508
|
| `check-read-size.sh`, capture hooks | registered | none | none |
|
|
463
509
|
|
package/README.tr.md
CHANGED
|
@@ -297,7 +297,7 @@ pipeline'daki hiçbir şey merge etmez.
|
|
|
297
297
|
- **Koşunun etrafındaki operasyonlar.** Mod açıkken ikinci bir launchd ajanı Mac'i uyanık tutar (`caffeinate -s -i`; `autopilot-on`'daki ekran sorusuna evet dersen `-d` de eklenir), her koşu da tick'i bitene kadar bir uyku kilidi tutar. Yapılandırılmış bir reponun ihtiyaç duyduğu her credential zamanlama önerilmeden önce ve her tick'te yeniden yoklanır; kilitlenmiş bir keychain, anahtarın adı ve çözümüyle reddedilir. Üst üste hiçbir şey üretmeyen denemelerden sonra bir devre kesici yeni başlatmayı durdurur, `costCeilingUsd` harcamayı 24 saatlik yuvarlanan pencerede sınırlar, `maxParallelAgents` aynı anda çalışan oturum sayısını sınırlar, koşucu günde bir kez bir temizlik raporu ve açıksa bir özet (digest) yazar. [Autopilot operasyonları](./pipeline/multi-agent-refs/features/autopilot-operations.md)
|
|
298
298
|
- **Kapalı başarısız olan (fail-closed) bir guard.** Değişken açıkken Bash guard bir komutu yalnızca `;`, `&&`, `||` ve düz pipe'larla birleşen basit komutlara indirgeyebildiğinde değerlendirir, gerisini ayrıştırmadan reddeder. Ayrıştırabildiklerinde: push, PR, issue ya da tracker yazımı yok, Keychain okuması yok, ağ izin listesi dışına istek yok, paket kurulumu ya da manifest düzenlemesi yok, korunan bir yola yazma yok. Ticket, sayfa ve PR metni modele güvenilmeyen-veri sınırlayıcıları içinde ulaşır. İzin profili (`install --unattended`) ikinci hattır; sınırın kendisi ayrı, admin olmayan bir macOS kullanıcısı ve varsayılan ile release branch'lerindeki GitHub ruleset'leridir, bunları operatör uygular. [Gözetimsiz güvenlik](./pipeline/multi-agent-refs/features/unattended-security.md)
|
|
299
299
|
- **İddialar güvenilmez, kontrol edilir.** Kalite kapıları açıkken koşunun repo hakkındaki iddiaları commit'ten önce kontrol edilir: değişikliğin referans verdiği lokalizasyon anahtarı ya da endpoint gerçekten var, açık analiz soruları cevaplanmış ya da koşuyu park ediyor, bir triyaj alıntısı andığı satırı birebir alıntılıyor, "önceden vardı" denen bulgu diff'in dokunmadığı bir satırı gösteriyor, planın adımları karşılanmış, ve bir test başarısı stack'in kendi işaretleriyle okunan pozitif bir çalıştırılmış test sayısı gösteriyor (8 stack: `ios`, `android`, `web`, `backend-node`, `python`, `go`, `rust`, `jvm`), yanında da değişiklik olmadan kırmızıya dönen yeni bir test. Her karar bir gate ledger'a yazılır ve commit hook'u, zorunlu kapıları HEAD için geçmemiş bir commit'i reddeder. [Gözetimsiz kapılar](./pipeline/multi-agent-refs/features/unattended-gates.md), [stack adaptörleri](./pipeline/multi-agent-refs/features/stack-adapters.md)
|
|
300
|
-
- **Spec, plan ve review disiplini.** `/multi-agent:analysis` bir proje anayasası yazar (güvenlik, erişilebilirlik, mimari ve lisans kuralları, her biri bir kaynağa bağlı); spec-consistency kapısı id üzerinden her gereksinimin bir görevi ve bir testi olduğunu, hiçbir şeyin bağlayıcı bir kuralı askıya almadığını kontrol eder. Faz 1
|
|
300
|
+
- **Spec, plan ve review disiplini.** `/multi-agent:analysis` bir proje anayasası yazar (güvenlik, erişilebilirlik, mimari ve lisans kuralları, her biri bir kaynağa bağlı); spec-consistency kapısı id üzerinden her gereksinimin bir görevi ve bir testi olduğunu, hiçbir şeyin bağlayıcı bir kuralı askıya almadığını kontrol eder. Faz 1 altı mercekle (kapsam, uygulanabilirlik, güvenlik, daha ucuz bir alternatif, spec'in ima ettiği ama test edilmeyen girdi, uygulayıcıya bırakılmış karar) tek bir plan-critic turuyla biter; itirazlar bir kez cevaplanır ve bir script karar verir. Review'da `blocking` bir bulgu koşuyu ancak iki bağımsız reviewer aynı bulguyu taşıdığında ya da başarısız bir test onu gösterdiğinde durdurur; aksi halde `important`'a düşürülür, asla silinmez. [Anayasa](./pipeline/multi-agent-refs/features/constitution.md), [plan critic](./pipeline/multi-agent-refs/features/plan-critic.md), [review kararı](./pipeline/multi-agent-refs/features/review-decision.md)
|
|
301
301
|
- **Bir istemci sözleşmesi.** Komutlar ve koşu soruları veri olarak beyan edilir. `/multi-agent:serve`, CLI'ın bastığı aynı JSON üzerinde localhost'ta bir HTTP sunucusu başlatır; `pipeline/contract/` bir istemcinin üzerine kurulacağı manifest'i, TypeScript tiplerini ve fixture'ları taşır. Dört telefon route'u redakte edilmiş koşuları okur, park etmiş bir soruyu sunulan seçeneklerden biriyle cevaplar ve yalnızca açıldığında bir başlatmayı kuyruğa alır; her istek kayıtlı bir cihazın Ed25519 imzasını taşır. Telefon uygulaması ayrı bir proje. [İstemci kiti](./pipeline/contract/README.md), [telefon API'si](./pipeline/multi-agent-refs/features/phone-api.md)
|
|
302
302
|
|
|
303
303
|
**Elle kullanım değişmedi.** Yukarıdaki her davranış `MULTI_AGENT_UNATTENDED=1`
|
|
@@ -352,6 +352,51 @@ Dolayısıyla sürekli mod her hostta `claude` binary'sinin `PATH`'te olmasını
|
|
|
352
352
|
istiyor. Kuyruk ve repo seçimi her hostta `~/.claude/autopilot/` altında durur;
|
|
353
353
|
bu bilinçli - bir makinedeki iki CLI tek kuyruk okumalı, iki değil.
|
|
354
354
|
|
|
355
|
+
## Ofis
|
|
356
|
+
|
|
357
|
+
Pipeline'ı piksel bir ofis olarak gösteren ve oradan yönetmeni sağlayan yerel
|
|
358
|
+
bir web sayfası. `/multi-agent:office-on` sözleşme sunucusunu 127.0.0.1'de
|
|
359
|
+
başlatır ve sayfayı tek kullanımlık bir kodla açar; sunucu
|
|
360
|
+
`/multi-agent:office-off` ile durdurulana kadar çalışır.
|
|
361
|
+
|
|
362
|
+

|
|
363
|
+
|
|
364
|
+
- **Koşular canlanır.** Ajanlar açık ofiste masalarında bekler. Bir koşu
|
|
365
|
+
rollerini çağırınca koşunun odasına yürürler. Her reponun kendi katı var:
|
|
366
|
+
Geliştirme odaları (`/multi-agent`) ve Analiz odaları
|
|
367
|
+
(`/multi-agent:analysis`). Birden fazla repoya dokunan koşu, diğer repoların
|
|
368
|
+
katında şube masası açar.
|
|
369
|
+
- **Terminaldeki görev listesi masada.** Masa tabelası fazı (`Faz 3/6 Dev`),
|
|
370
|
+
fazın görevleri bittikçe dolan çubuğu ve sürmekte olan görevi gösterir. Bir
|
|
371
|
+
PostToolUse hook'u `TaskCreate` / `TaskUpdate` çağrılarını koşunun
|
|
372
|
+
takipçisine yazar; ofis ile terminal aynı listeyi gösterir. Çalışan ajanın
|
|
373
|
+
üstündeki bulut ne yaptığını söyler.
|
|
374
|
+
- **Ekosistemin geri kalanının da odası var.** Resepsiyon, Jira ya da GitHub
|
|
375
|
+
issue'sundan veya serbest metinden koşu başlatır. Posta odası, `gh`'nin
|
|
376
|
+
oturum açtığı tüm GitHub hesaplarındaki ve Bitbucket Server'daki PR'ları
|
|
377
|
+
listeler. Sunucu odasında toolkit MCP araçları, servisler, anahtar dolabı
|
|
378
|
+
(ad ve canlı kontrol sonucu, asla değer) ve makinenin CPU, bellek ve disk durumu
|
|
379
|
+
var. Kütüphane stack'leri, komutları ve pipeline'ın repo başına öğrendiklerini
|
|
380
|
+
tutar. Tuvalet, önizleme gösterdikten sonra worktree'leri, yarım kalan
|
|
381
|
+
koşuları ve eski koşu loglarını temizler. Muhasebe token ve maliyeti
|
|
382
|
+
gösterir. Yönetici odasında otopilot, rutinler ve ayarlar (çıktı dili,
|
|
383
|
+
Fable basamağı, model yönlendirmesi) var. Oryantasyon odası binayı anlatır.
|
|
384
|
+
- **Kişiler iş alır.** Birine tıkla, iş seç, onayla. Makineyi değiştiren
|
|
385
|
+
yazmalar yalnızca yereldir ve iki istek ister. Etkileşimli ya da kurulumu
|
|
386
|
+
değiştiren işler terminalde kalır; komutlar penceresi her komut için sebebini
|
|
387
|
+
yazar.
|
|
388
|
+
|
|
389
|
+

|
|
390
|
+
|
|
391
|
+
| Komut | Ne yapar |
|
|
392
|
+
| ---------------------------- | -------------------------------------------------------- |
|
|
393
|
+
| `/multi-agent:office-on` | Sunucuyu başlatır ya da var olanı kullanır, sayfayı açar |
|
|
394
|
+
| `/multi-agent:office-status` | Çalışıyor mu, adresi (token asla) ve son işlemleri |
|
|
395
|
+
| `/multi-agent:office-off` | Sunucuyu durdurur; sen durdurana kadar çalışır |
|
|
396
|
+
|
|
397
|
+
Güvenlik modeli: [ofis tehdit modeli](pipeline/multi-agent-refs/features/office-threat-model.md).
|
|
398
|
+
Telefondan erişim bu kurulumun parçası değil.
|
|
399
|
+
|
|
355
400
|
## Hangi model cevaplıyor
|
|
356
401
|
|
|
357
402
|
Merdiven `fable -> opus -> sonnet -> haiku`; koşu başarısızlıkta merdiveni iner.
|
|
@@ -450,6 +495,21 @@ triage notu bunu belirtir.
|
|
|
450
495
|
|
|
451
496
|
**Secret scan**, Claude Code'da bir `PreToolUse` hook'u olarak (bulgu halinde commit'i sert-engeller) ve diğer yerlerde bir pre-push kontrolü olarak çalışır.
|
|
452
497
|
|
|
498
|
+
**Host başına hook'lar.** Zorlayan hook'lar Claude Code'a ait; `install` bunları kaydeder, `/multi-agent:doctor` (`hook-reachability`) ayarlarında hangisinin eksik olduğunu söyler.
|
|
499
|
+
|
|
500
|
+
| Hook | Claude Code | Codex CLI | Copilot CLI |
|
|
501
|
+
| --- | --- | --- | --- |
|
|
502
|
+
| `pre-commit-check.sh` (secret taraması, sahipli yollar, attended build/test kanıtı, unattended defteri) | PreToolUse `Bash` | yok: pre-push kontrolü | yok: pre-push kontrolü |
|
|
503
|
+
| `agent-guard.sh` (atıf, force-push, atlanan git hook'ları, argv'de secret, kapanış onayları, salt okunur repolar, unattended politikası) | PreToolUse `Bash`, dosya düzenlemeleri, fetch ve toolkit araçları | yok | yok |
|
|
504
|
+
| `run-scope-guard.sh` (Figma faz kuralı, worktree sınırı uyarısı) | PreToolUse Figma araçları, dosya düzenlemeleri | yok: faz kendi MCP çağrılarını kaydeder | yok |
|
|
505
|
+
| `run-stop-guard.sh` (koşu ortasında sessizce durmaz) | Stop | yok: duraklama fazın kendi yazımı olarak kalır | yok |
|
|
506
|
+
| `task-mirror.sh` (terminaldeki görev listesini koşunun takipçisine yazar, ofis de onu gösterir) | PostToolUse `TaskCreate`/`TaskUpdate` | yok: faz `phase-tracker.sh task`'ı kendisi çağırır | yok: faz `phase-tracker.sh task`'ı kendisi çağırır |
|
|
507
|
+
| `file-context.sh` (okunan dosya hakkında repo hafızasının söylediklerini verir) | PostToolUse `Read` | yok | yok |
|
|
508
|
+
| `edit-syntax-gate.sh` | PostToolUse dosya düzenlemeleri | PostToolUse `apply_patch` | yok: Copilot postToolUse çıktısını atar |
|
|
509
|
+
| `check-read-size.sh`, capture hook'ları | kayıtlı | yok | yok |
|
|
510
|
+
|
|
511
|
+
Bir host'ta eşdeğer hook yoksa kural yine faz dokümanlarında durur; orada zorlama değil, bir istektir.
|
|
512
|
+
|
|
453
513
|
## Pipeline koşusu dışında
|
|
454
514
|
|
|
455
515
|
Pipeline'ı kurmak yalnız onu çalıştırdığında işe yaramıyor. Sıradan bir oturum açtığında aynı üç şey elinin altında; her sohbette yüklenen `rules/outside-the-pipeline.md` bunları duyuruyor:
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# 18. Cross-repository links, not a global graph
|
|
2
|
+
|
|
3
|
+
**Status:** Accepted · 2026-10-26 · extends [ADR-0010](./0010-own-code-graph.md)
|
|
4
|
+
|
|
5
|
+
## Context
|
|
6
|
+
|
|
7
|
+
A run can touch a main repository and the libraries it depends on (the
|
|
8
|
+
dev-context picker adds submodules and extra repositories). Each has its own
|
|
9
|
+
code graph under `~/.claude/knowledge/<project>/`, and a change in a library is
|
|
10
|
+
only half understood until the files that import it in the main repository are
|
|
11
|
+
known.
|
|
12
|
+
|
|
13
|
+
`Graphify-Labs/graphify` (Apache-2.0) answers this with one global graph
|
|
14
|
+
across repositories, linking calls and types between them. That merges every
|
|
15
|
+
repository into one store that must be rebuilt as a whole, carries names from
|
|
16
|
+
unrelated repositories into each other's queries, and makes a per-project
|
|
17
|
+
graph no longer the single answer for its project.
|
|
18
|
+
|
|
19
|
+
## Decision
|
|
20
|
+
|
|
21
|
+
Graphs stay separate. `graph-links.mjs build --projects <a,b,...>` joins them
|
|
22
|
+
by one fact each graph already has: an import of a name the repository does
|
|
23
|
+
not declare (a `module:` node). Each such name is matched against what the
|
|
24
|
+
other repositories export (package name, Python packages, Swift targets, the
|
|
25
|
+
Go module path, Kotlin top-level types) and every match is one row in
|
|
26
|
+
`~/.claude/knowledge/_links.json`: importing repository, files, imported name,
|
|
27
|
+
exporting repository. `graph-links.mjs affected --project <b>` lists the files
|
|
28
|
+
elsewhere that import b. The link file is rebuilt in a second, so it has no
|
|
29
|
+
incremental state.
|
|
30
|
+
|
|
31
|
+
## Consequences
|
|
32
|
+
|
|
33
|
+
- A per-project graph keeps meaning what it meant; nothing is merged into it.
|
|
34
|
+
- Links are as good as the import patterns: a dynamic import or a name built
|
|
35
|
+
at run time is not linked, the same limit the per-project graph states.
|
|
36
|
+
- A Kotlin import keeps only its class name in the graph, so a link is kept
|
|
37
|
+
only for the importing files whose `import <package>.<Name>` names the
|
|
38
|
+
package the exporting file declares. That check reads both repositories
|
|
39
|
+
from disk; a repository that moved since its graph was built links nothing.
|
|
40
|
+
- The repository directory name counts as an export only when the stack
|
|
41
|
+
names none, so a library called `core` does not catch every `core.*` import.
|
|
42
|
+
- The link file holds file paths of every listed repository; it is written
|
|
43
|
+
0600 beside the graphs and never leaves the machine.
|
package/docs/adr/README.md
CHANGED
|
@@ -25,8 +25,9 @@ Format: lightly adapted from [Michael Nygard's ADR template](https://cognitect.c
|
|
|
25
25
|
| [0013](./0013-lsp-code-intelligence.md) | A language server for the answers regex cannot give | Accepted |
|
|
26
26
|
| [0014](./0014-six-phase-consolidation.md) | Six phases, because two of the eight were doing the same work twice | Accepted (amended by 0015: the depth answer is removed) |
|
|
27
27
|
| [0015](./0015-one-pipeline-no-depth-answer.md) | One pipeline: the depth question is removed | Accepted (extended by 0016: the workspace and resume names go too) |
|
|
28
|
-
| [0016](./0016-the-run-shape-is-asked-not-typed.md)
|
|
28
|
+
| [0016](./0016-the-run-shape-is-asked-not-typed.md) | The shape of a run is asked, not typed into its name | Accepted |
|
|
29
29
|
| [0017](./0017-change-impact-from-the-graph.md) | Change impact from the graph: spans, a transitive walk, freshness | Accepted |
|
|
30
|
+
| [0018](./0018-cross-repo-links-not-a-global-graph.md) | Cross-repository links, not a global graph | Accepted |
|
|
30
31
|
|
|
31
32
|
## Writing a New ADR
|
|
32
33
|
|
package/docs/facts.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$comment": "Generated by pipeline/scripts/gen-facts.mjs. Do not hand-edit: the site reads this, and a number edited here instead of at its source is the drift this file removes.",
|
|
3
|
-
"generatedAt": "2026-10-
|
|
4
|
-
"version": "20.
|
|
3
|
+
"generatedAt": "2026-10-26",
|
|
4
|
+
"version": "20.34.0",
|
|
5
5
|
"phaseSchema": 2,
|
|
6
6
|
"phases": [
|
|
7
7
|
{
|
|
@@ -33,14 +33,14 @@
|
|
|
33
33
|
"modes": {
|
|
34
34
|
"full": [0, 1, 2, 3, 4, 5],
|
|
35
35
|
"autopilot": [0, 1, 2, 3, 4, 5],
|
|
36
|
-
"analysis": [0, 1, 3, 4, 5]
|
|
36
|
+
"analysis": [0, 1, 2, 3, 4, 5]
|
|
37
37
|
},
|
|
38
38
|
"commandCount": 69,
|
|
39
39
|
"skillCount": 165,
|
|
40
40
|
"skillCountAll": 237,
|
|
41
41
|
"agentCount": 11,
|
|
42
42
|
"hosts": ["Claude Code", "Codex CLI", "Copilot CLI"],
|
|
43
|
-
"toolCount":
|
|
43
|
+
"toolCount": 213,
|
|
44
44
|
"toolCategories": {
|
|
45
45
|
"ios": 42,
|
|
46
46
|
"web": 38,
|
|
@@ -51,6 +51,7 @@
|
|
|
51
51
|
"design": 7,
|
|
52
52
|
"repo": 6,
|
|
53
53
|
"voice": 6,
|
|
54
|
+
"graph": 5,
|
|
54
55
|
"ui": 5,
|
|
55
56
|
"context": 4,
|
|
56
57
|
"pass": 4,
|
|
@@ -64,5 +65,5 @@
|
|
|
64
65
|
"test": 1
|
|
65
66
|
},
|
|
66
67
|
"pluginSkillCount": 261,
|
|
67
|
-
"toolkitVersion": "3.
|
|
68
|
+
"toolkitVersion": "3.27.0"
|
|
68
69
|
}
|
package/docs/features.md
CHANGED
|
@@ -340,7 +340,7 @@ Stack adapters cover 8 stacks: `ios`, `android`, `web`, `backend-node`, `python`
|
|
|
340
340
|
|
|
341
341
|
### Plan Critic
|
|
342
342
|
|
|
343
|
-
With the gates active, Phase 1 ends with one adversarial critic (`agents/plan-critic.md`) under
|
|
343
|
+
With the gates active, Phase 1 ends with one adversarial critic (`agents/plan-critic.md`) under six lenses: scope, feasibility, security, a cheaper alternative, an input the spec implies that no test exercises, and a decision left to the implementer. Each objection carries evidence anchors; the planner answers each once, accepting and revising or rebutting with evidence, and `plan-critique-gate.mjs` judges with no model call. An objection citing a binding constitution rule blocks unless its reply resolves it with an anchor that holds; the rest is advisory and appears in the plan render and the PR summary. One round, because further rounds move agents toward each other rather than toward the right answer. The critic follows the fable switch. Detail: [`plan-critic.md`](../pipeline/multi-agent-refs/features/plan-critic.md).
|
|
344
344
|
|
|
345
345
|
### Review Decision Rule
|
|
346
346
|
|
|
@@ -69,6 +69,7 @@ const DEV_ONLY_TOOLING = Object.freeze([
|
|
|
69
69
|
"check-rewrite-overlap.mjs", // compares a rewrite against a source only a maintainer has
|
|
70
70
|
"gen-catalog-history.mjs", // reads the repo's git history; an install has none
|
|
71
71
|
"gen-ref-toc.mjs", // regenerates the repo's own reference tree; an install has no pipeline/
|
|
72
|
+
"ref-filler-audit.mjs", // audits the repo's own instruction docs; an install has no pipeline/
|
|
72
73
|
"validate-schemas.mjs", // validates the repo's own schema files, needs ajv
|
|
73
74
|
"permission-baseline.mjs", // reads the repo's own command, skill and agent tree; an install has none
|
|
74
75
|
"sync-parity-check.sh",
|
|
@@ -316,6 +316,67 @@ export function buildUnattendedProfile(current = {}, opts = {}) {
|
|
|
316
316
|
return next;
|
|
317
317
|
}
|
|
318
318
|
|
|
319
|
+
/**
|
|
320
|
+
* Bring an existing profile up to the shipped deny rules without touching
|
|
321
|
+
* anything else: only permissions.deny and the sandbox's denyRead and
|
|
322
|
+
* denyWrite grow, so a release that adds a deny reaches every installed
|
|
323
|
+
* profile on the next install, and nothing it allows changes. No profile file,
|
|
324
|
+
* or one that does not parse, is left alone.
|
|
325
|
+
*
|
|
326
|
+
* @param {{home:string, dryRun?:boolean}} opts
|
|
327
|
+
* @returns {{path:string, added:string[], written:boolean}}
|
|
328
|
+
*/
|
|
329
|
+
export function tightenUnattendedProfile({ home, dryRun = false }) {
|
|
330
|
+
const path = unattendedSettingsPath(home);
|
|
331
|
+
if (!existsSync(path)) return { path, added: [], written: false };
|
|
332
|
+
let current;
|
|
333
|
+
try {
|
|
334
|
+
current = JSON.parse(readFileSync(path, "utf-8"));
|
|
335
|
+
} catch {
|
|
336
|
+
return { path, added: [], written: false };
|
|
337
|
+
}
|
|
338
|
+
if (!current || typeof current !== "object" || Array.isArray(current))
|
|
339
|
+
return { path, added: [], written: false };
|
|
340
|
+
const added = [];
|
|
341
|
+
const perms = { ...(current.permissions || {}) };
|
|
342
|
+
const deny = Array.isArray(perms.deny) ? [...perms.deny] : [];
|
|
343
|
+
for (const [rule] of PROFILE.deny) {
|
|
344
|
+
if (hasRule(deny, rule)) continue;
|
|
345
|
+
deny.push(rule);
|
|
346
|
+
added.push(`deny:${rule}`);
|
|
347
|
+
}
|
|
348
|
+
const next = { ...current, permissions: { ...perms, deny } };
|
|
349
|
+
// Directories the toolkit's index refuses: a list, so it only grows too.
|
|
350
|
+
for (const [key, value] of PROFILE.env) {
|
|
351
|
+
if (key !== "MCP_TOOLKIT_INDEX_DENY") continue;
|
|
352
|
+
const env = current.env && typeof current.env === "object" ? current.env : {};
|
|
353
|
+
const have = String(env[key] ?? "")
|
|
354
|
+
.split(",")
|
|
355
|
+
.map((x) => x.trim())
|
|
356
|
+
.filter(Boolean);
|
|
357
|
+
const missing = value.split(",").filter((x) => !have.includes(x));
|
|
358
|
+
if (!missing.length) continue;
|
|
359
|
+
next.env = { ...env, [key]: [...have, ...missing].join(",") };
|
|
360
|
+
added.push(...missing.map((x) => `env.${key}:${x}`));
|
|
361
|
+
}
|
|
362
|
+
const sb = current.sandbox;
|
|
363
|
+
if (sb && typeof sb === "object" && !Array.isArray(sb)) {
|
|
364
|
+
const fs = sb.filesystem && typeof sb.filesystem === "object" ? sb.filesystem : {};
|
|
365
|
+
const nextFs = { ...fs };
|
|
366
|
+
for (const key of ["denyRead", "denyWrite"]) {
|
|
367
|
+
const have = Array.isArray(fs[key]) ? fs[key].map(String) : [];
|
|
368
|
+
const missing = PROFILE.sandbox.filesystem[key].filter((p) => !have.includes(p));
|
|
369
|
+
if (!missing.length) continue;
|
|
370
|
+
nextFs[key] = [...have, ...missing];
|
|
371
|
+
added.push(...missing.map((p) => `sandbox.${key}:${p}`));
|
|
372
|
+
}
|
|
373
|
+
next.sandbox = { ...sb, filesystem: nextFs };
|
|
374
|
+
}
|
|
375
|
+
if (!added.length || dryRun) return { path, added, written: false };
|
|
376
|
+
writeFileSync(path, `${JSON.stringify(next, null, 2)}\n`, { mode: 0o600 });
|
|
377
|
+
return { path, added, written: true };
|
|
378
|
+
}
|
|
379
|
+
|
|
319
380
|
/**
|
|
320
381
|
* Write the profile into its own settings file. Idempotent: running it twice
|
|
321
382
|
* changes nothing the second time.
|