@mmerterden/multi-agent-pipeline 20.33.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.
Files changed (95) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +2 -1
  3. package/README.tr.md +2 -1
  4. package/docs/adr/0018-cross-repo-links-not-a-global-graph.md +43 -0
  5. package/docs/adr/README.md +2 -1
  6. package/docs/facts.json +5 -4
  7. package/docs/features.md +1 -1
  8. package/install/_dev-only-files.mjs +1 -0
  9. package/install/catalog-history.json +1 -1
  10. package/install/claude.mjs +9 -2
  11. package/install/templates/claude-hooks.json +12 -1
  12. package/manifest.json +98 -75
  13. package/package.json +3 -1
  14. package/pipeline/agents/code-reviewer.md +9 -0
  15. package/pipeline/agents/explorer.md +4 -0
  16. package/pipeline/agents/plan-critic.md +4 -2
  17. package/pipeline/commands/multi-agent/SKILL.md +17 -136
  18. package/pipeline/commands/multi-agent/channels/SKILL.md +15 -297
  19. package/pipeline/commands/multi-agent/graph/SKILL.md +5 -2
  20. package/pipeline/commands/multi-agent/language/SKILL.md +3 -3
  21. package/pipeline/commands/multi-agent/resume/SKILL.md +8 -22
  22. package/pipeline/commands/multi-agent/review/SKILL.md +7 -131
  23. package/pipeline/commands/multi-agent/setup/SKILL.md +19 -224
  24. package/pipeline/contract/README.md +5 -2
  25. package/pipeline/multi-agent-refs/channels/generator.md +146 -0
  26. package/pipeline/multi-agent-refs/channels/menu.md +55 -0
  27. package/pipeline/multi-agent-refs/channels/multi-repo.md +6 -0
  28. package/pipeline/multi-agent-refs/channels/preview.md +25 -0
  29. package/pipeline/multi-agent-refs/channels/reference.md +98 -0
  30. package/pipeline/multi-agent-refs/features/autopilot-circuit-breaker.md +1 -1
  31. package/pipeline/multi-agent-refs/features/code-graph.md +27 -0
  32. package/pipeline/multi-agent-refs/features/office-threat-model.md +1 -1
  33. package/pipeline/multi-agent-refs/features/plan-critic.md +5 -2
  34. package/pipeline/multi-agent-refs/features/review-delta.md +4 -1
  35. package/pipeline/multi-agent-refs/features/scope-check.md +10 -1
  36. package/pipeline/multi-agent-refs/knowledge.md +9 -0
  37. package/pipeline/multi-agent-refs/orchestrator/dispatcher.md +163 -0
  38. package/pipeline/multi-agent-refs/phases/phase-1-plan.md +4 -4
  39. package/pipeline/multi-agent-refs/phases/phase-2-dev.md +9 -8
  40. package/pipeline/multi-agent-refs/phases/phase-3-review.md +12 -7
  41. package/pipeline/multi-agent-refs/phases/phase-4-commit.md +7 -3
  42. package/pipeline/multi-agent-refs/phases/phase-5-report.md +6 -3
  43. package/pipeline/multi-agent-refs/picker-contract.md +1 -1
  44. package/pipeline/multi-agent-refs/resume/details.md +35 -0
  45. package/pipeline/multi-agent-refs/review/inputs.md +87 -0
  46. package/pipeline/multi-agent-refs/review/module-guides.md +25 -0
  47. package/pipeline/multi-agent-refs/review/valven.md +42 -0
  48. package/pipeline/multi-agent-refs/setup/accounts.md +27 -0
  49. package/pipeline/multi-agent-refs/setup/app-store-connect.md +5 -0
  50. package/pipeline/multi-agent-refs/setup/firebase.md +5 -0
  51. package/pipeline/multi-agent-refs/setup/google-play.md +4 -0
  52. package/pipeline/multi-agent-refs/setup/hooks-and-plugins.md +21 -0
  53. package/pipeline/multi-agent-refs/setup/language.md +46 -0
  54. package/pipeline/multi-agent-refs/setup/multi-repo-group.md +51 -0
  55. package/pipeline/multi-agent-refs/setup/summaries.md +63 -0
  56. package/pipeline/multi-agent-refs/setup/token-save-flow.md +51 -0
  57. package/pipeline/office/index.html +12 -7
  58. package/pipeline/office/toolkit.json +1 -1
  59. package/pipeline/rules/response-shape.md +6 -7
  60. package/pipeline/schemas/agent-state.schema.json +18 -0
  61. package/pipeline/schemas/phases.json +4 -4
  62. package/pipeline/schemas/plan-critique.schema.json +9 -2
  63. package/pipeline/schemas/planning-output.schema.json +25 -2
  64. package/pipeline/schemas/prefs.schema.json +24 -1
  65. package/pipeline/schemas/reviewer-output.schema.json +20 -2
  66. package/pipeline/schemas/token-budget.json +4 -4
  67. package/pipeline/schemas/triage-output.schema.json +20 -2
  68. package/pipeline/scripts/_graph-analysis.mjs +270 -0
  69. package/pipeline/scripts/_memory-policy.mjs +165 -0
  70. package/pipeline/scripts/_secret-scan.mjs +105 -0
  71. package/pipeline/scripts/_unified-diff.mjs +2 -2
  72. package/pipeline/scripts/capture-flush.sh +12 -2
  73. package/pipeline/scripts/check-read-size.sh +9 -0
  74. package/pipeline/scripts/code-graph-rules/android.json +8 -3
  75. package/pipeline/scripts/contract-server.mjs +36 -15
  76. package/pipeline/scripts/debt-ledger.mjs +323 -0
  77. package/pipeline/scripts/file-context.mjs +261 -0
  78. package/pipeline/scripts/file-context.sh +20 -0
  79. package/pipeline/scripts/graph-links.mjs +230 -0
  80. package/pipeline/scripts/graph-query.mjs +133 -1
  81. package/pipeline/scripts/graph-report.mjs +65 -0
  82. package/pipeline/scripts/learn-from-transcripts.mjs +12 -48
  83. package/pipeline/scripts/learnings-ledger.mjs +143 -24
  84. package/pipeline/scripts/plan-critique-gate.mjs +11 -2
  85. package/pipeline/scripts/rework-rulings.mjs +106 -0
  86. package/pipeline/scripts/scope-check-gate.mjs +149 -2
  87. package/pipeline/scripts/triage-memory.mjs +64 -37
  88. package/pipeline/scripts/validate-planning.mjs +68 -4
  89. package/pipeline/scripts/validate-reviewer.mjs +20 -0
  90. package/pipeline/scripts/validate-triage.mjs +107 -2
  91. package/pipeline/skills/.skill-manifest.json +5 -5
  92. package/pipeline/skills/shared/core/multi-agent-graph/SKILL.md +5 -2
  93. package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +4 -4
  94. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +2 -0
  95. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +4 -4
package/CHANGELOG.md CHANGED
@@ -16,6 +16,49 @@ 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
+
19
62
  ## [20.33.0] - 2026-10-25
20
63
 
21
64
  ### 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 four lenses (scope, feasibility, security, a cheaper alternative), 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)
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
@@ -503,6 +503,7 @@ The **secret scan** runs as a `PreToolUse` hook on Claude Code (hard-blocks a co
503
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 |
504
504
  | `run-stop-guard.sh` (no silent stop mid-run) | Stop | none: halts stay the phase's own write | none |
505
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 |
506
507
  | `edit-syntax-gate.sh` | PostToolUse file edits | PostToolUse `apply_patch` | none: Copilot discards postToolUse output |
507
508
  | `check-read-size.sh`, capture hooks | registered | none | none |
508
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 dört mercekle (kapsam, uygulanabilirlik, güvenlik, daha ucuz bir alternatif) 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)
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`
@@ -504,6 +504,7 @@ triage notu bunu belirtir.
504
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
505
  | `run-stop-guard.sh` (koşu ortasında sessizce durmaz) | Stop | yok: duraklama fazın kendi yazımı olarak kalır | yok |
506
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 |
507
508
  | `edit-syntax-gate.sh` | PostToolUse dosya düzenlemeleri | PostToolUse `apply_patch` | yok: Copilot postToolUse çıktısını atar |
508
509
  | `check-read-size.sh`, capture hook'ları | kayıtlı | yok | yok |
509
510
 
@@ -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.
@@ -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) | The shape of a run is asked, not typed into its name | Accepted |
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-25",
4
- "version": "20.33.0",
3
+ "generatedAt": "2026-10-26",
4
+ "version": "20.34.0",
5
5
  "phaseSchema": 2,
6
6
  "phases": [
7
7
  {
@@ -40,7 +40,7 @@
40
40
  "skillCountAll": 237,
41
41
  "agentCount": 11,
42
42
  "hosts": ["Claude Code", "Codex CLI", "Copilot CLI"],
43
- "toolCount": 208,
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.26.0"
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 four lenses: scope, feasibility, security and a cheaper alternative. 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).
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",