@mmerterden/multi-agent-pipeline 20.20.0 → 20.21.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 +25 -0
- package/README.md +24 -13
- package/README.tr.md +21 -10
- package/docs/ecosystem.md +6 -5
- package/docs/facts.json +5 -4
- package/docs/features.md +1 -0
- package/install/catalog-history.json +1 -1
- package/manifest.json +42 -39
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/route-on/SKILL.md +32 -8
- package/pipeline/commands/multi-agent/route-status/SKILL.md +12 -2
- package/pipeline/commands/multi-agent/setup/SKILL.md +2 -1
- package/pipeline/lib/model-dispatch.sh +72 -24
- package/pipeline/lib/outbound-gate.mjs +2 -0
- package/pipeline/lib/route-state.sh +118 -10
- package/pipeline/lib/toolkit-llm.sh +30 -0
- package/pipeline/lib/unattended-profile-check.mjs +23 -2
- package/pipeline/multi-agent-refs/analysis/evidence.md +3 -1
- package/pipeline/multi-agent-refs/cross-cli-contract.md +8 -3
- package/pipeline/multi-agent-refs/features/doctor.md +11 -0
- package/pipeline/multi-agent-refs/features/free-models.md +111 -0
- package/pipeline/multi-agent-refs/features/model-fallback.md +21 -15
- package/pipeline/multi-agent-refs/features/unattended-security.md +4 -2
- package/pipeline/multi-agent-refs/setup/free-models.md +22 -0
- package/pipeline/preferences-template.json +1 -0
- package/pipeline/schemas/prefs.schema.json +10 -1
- package/pipeline/schemas/route-config.schema.json +33 -8
- package/pipeline/schemas/secret-patterns.json +14 -0
- package/pipeline/scripts/bulk-read.sh +98 -12
- package/pipeline/scripts/cost-table.json +9 -1
- package/pipeline/scripts/doctor.mjs +100 -0
- package/pipeline/scripts/pre-commit-check.sh +1 -1
- package/pipeline/scripts/unattended_policy.py +20 -0
- package/pipeline/skills/.skill-manifest.json +5 -5
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +2 -0
- package/pipeline/skills/shared/core/multi-agent-route-on/SKILL.md +31 -7
- package/pipeline/skills/shared/core/multi-agent-route-status/SKILL.md +12 -2
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -16,6 +16,31 @@ Internal file-layout changes that don't affect the slash-command surface are sti
|
|
|
16
16
|
|
|
17
17
|
## [Unreleased]
|
|
18
18
|
|
|
19
|
+
## [20.21.0] - 2026-10-12
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
23
|
+
- **Free models for simple work: `/multi-agent:route-on --free`.** Layer 2 of model routing. The new `free` rung sends a large-file read (`bulk-read.sh`) and simple text tasks at the new `delegate` call site (log and document summaries, field extraction, labels, translation and commit-body drafts) to the multi-agent-toolkit's verified free-model chain first. Every answer is checked against its source by the toolkit, and `bulk-read.sh` also checks cited lines against the file; when nothing passes, the Anthropic default answers as before. Decisions, plans, code, reviews and triage never leave Claude. A subagent stays on the Anthropic ladder: the router refuses `free` there. Contract: `multi-agent-refs/features/free-models.md`.
|
|
24
|
+
- `modelRouting.free` (`enabled`, `allowTraining`) and the `delegate` scope. By default only providers whose free tier does not train on prompts (Groq) and a local Ollama receive text; `--allow-training` widens it. `--no-free` turns only the free chain off, and `route-off` keeps it configured.
|
|
25
|
+
- `/multi-agent:route-status` reports the last seven days of free-model work from the toolkit's usage log: tasks answered free and verified, cache hits, tasks handed back to Claude, and the tokens kept off Claude with an estimated saving at haiku rates.
|
|
26
|
+
- `route-on --free` lists usable providers by key source and, with none, names the one step that fixes it. `/multi-agent:setup` Step 3e stores free-model keys under `llm-<id>` through the clipboard flow.
|
|
27
|
+
- `doctor` check `free-models`: WARN when the free chain is on and no provider is usable under the data policy, or when the toolkit CLI cannot run; `--probe` sends each configured provider one tiny request and WARNs when every usable one fails.
|
|
28
|
+
- `lib/toolkit-llm.sh` runs the toolkit's `multi-agent-toolkit-llm` CLI from `MULTI_AGENT_TOOLKIT_LLM`, `PATH` or `npx`.
|
|
29
|
+
- Analysis evidence gathering summarizes long Confluence, document, Jira and `generic-doc` texts through the free chain when it is on; `binding: true` standards are never delegated.
|
|
30
|
+
- The `task-fit` and `cost-ceiling` strategies change dispatch: `task-fit` tries the matched rule's cheapest rung first, `cost-ceiling` does so once `cost-budget-check.mjs` reports the run at the warn threshold of `budgetCeilingUsd`.
|
|
31
|
+
- Unattended runs: agent-guard allows `llm_delegate` only while `route-on --free` is on, and checks its `path` like a write target. The sandbox network list adds the free-model hosts the data policy allows once the free chain is on, and a sandboxed `bulk-read.sh` keeps the toolkit's quota and usage files under `~/.multi-agent-unattended/toolkit-index`.
|
|
32
|
+
- Groq (`gsk_`) and OpenRouter (`sk-or-v1-`) keys are blocked by both secret surfaces, the commit hook and the outbound gate.
|
|
33
|
+
- The cross-CLI contract lists the multi-agent-toolkit 3.21.0 minimum for `llm_delegate`, `llm_providers` and the CLI.
|
|
34
|
+
|
|
35
|
+
### Fixed
|
|
36
|
+
|
|
37
|
+
- `route-state.sh set-rules` validates each rule against the schema and the cost table (keys, phase range, taskKind, known rungs) and writes nothing when one fails, instead of storing any JSON array.
|
|
38
|
+
- `recordDecisions: false` is honoured by `model-dispatch.sh` and shown correctly by `route-status`; jq's `//` read `false` as missing, so every decision was logged.
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
|
|
42
|
+
- The ecosystem doc counts the toolkit from its 3.21.0 `tools/list`: 191 tools in 20 categories.
|
|
43
|
+
|
|
19
44
|
## [20.20.0] - 2026-10-12
|
|
20
45
|
|
|
21
46
|
### Added
|
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ Runs natively on Claude Code, Copilot CLI and Codex CLI. macOS only. Zero runtim
|
|
|
17
17
|
### Prerequisites
|
|
18
18
|
|
|
19
19
|
- **Node.js >= 20.11** - required; the pipeline's own tooling runs on it.
|
|
20
|
-
- **`jq`** - required for nine paths, optional for the rest.
|
|
20
|
+
- **`jq`** - required for nine paths, optional for the rest. 92 shell files call it. The nine that publish or decide - the autopilot queue, Jira comments, PR reviews, issue updates, the plan file, both Figma fetchers, log search and Jira auth - refuse with exit 3 rather than run, because a missing `jq` renders as empty DATA and the work carries on with it. Everywhere else it still degrades. The install prints a note when it is missing.
|
|
21
21
|
- **`gh`** - for GitHub issue and PR work. Its built-in `--jq` is independent of the `jq` binary.
|
|
22
22
|
|
|
23
23
|
## Quick Start
|
|
@@ -359,23 +359,34 @@ turn it on.
|
|
|
359
359
|
|
|
360
360
|
| Command | What it does |
|
|
361
361
|
| --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
362
|
-
| `/multi-agent:route-on` | Pick a strategy, a scope and the rules that say which rung a call lands on. Validated against `route-config.schema.json` before anything is written |
|
|
362
|
+
| `/multi-agent:route-on` | Pick a strategy, a scope and the rules that say which rung a call lands on; `--free` sends simple text work to verified free models first. Validated against `route-config.schema.json` before anything is written |
|
|
363
363
|
| `/multi-agent:route-off` | Disarm it. The rules are KEPT, so turning it back on does not re-ask for the same configuration |
|
|
364
364
|
| `/multi-agent:route-status` | Whether it is armed, which rule applies where, which rung the last dispatches took, and what this run has cost |
|
|
365
365
|
| `/multi-agent:model` | Turn the top rung on or off, and move the cost ledger's pricing with it in the same step |
|
|
366
366
|
|
|
367
367
|
**The scope cannot be the whole session.** `scope` accepts `subagent`,
|
|
368
|
-
`bulk-read` and `research`; there is no `host-session` value and that
|
|
369
|
-
gate, not a convention. Owning the host's base URL would send every
|
|
370
|
-
through a third layer, including work that has nothing to do with
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
the
|
|
368
|
+
`bulk-read`, `delegate` and `research`; there is no `host-session` value and that
|
|
369
|
+
is a schema gate, not a convention. Owning the host's base URL would send every
|
|
370
|
+
call you make through a third layer, including work that has nothing to do with
|
|
371
|
+
this pipeline.
|
|
372
|
+
|
|
373
|
+
**Free models for simple work: `route-on --free`.** Large-file reads, log and
|
|
374
|
+
document summaries, field extraction, labels and translation or commit-body
|
|
375
|
+
drafts go to the multi-agent-toolkit's free-model chain first (Groq, Mistral,
|
|
376
|
+
Gemini, OpenRouter free models, Z.AI GLM Flash, a local Ollama). Every answer is
|
|
377
|
+
verified against its source before it is used - no truncation or refusal, schema
|
|
378
|
+
and label checks, every identifier, number and file name present in the source -
|
|
379
|
+
and when none passes, Claude does the task as before. By default only providers
|
|
380
|
+
that do not train on prompts see the text; `--allow-training` widens that. One
|
|
381
|
+
free Groq key is enough; `route-status` reports what was answered free, what went
|
|
382
|
+
back to Claude and the tokens kept off Claude. Contract:
|
|
383
|
+
[`free-models.md`](pipeline/multi-agent-refs/features/free-models.md).
|
|
384
|
+
|
|
385
|
+
**The honest limit, which `route-status` prints rather than hides.** A subagent
|
|
386
|
+
is dispatched by the host, so Phase 1-3 personas stay inside the Anthropic ladder
|
|
387
|
+
whatever the rules say. The `free` rung answers only where the pipeline makes the
|
|
388
|
+
call itself, `bulk-read.sh` and the `delegate` call site, and decisions, plans,
|
|
389
|
+
code, reviews and triage never leave Claude.
|
|
379
390
|
|
|
380
391
|
**The top rung is a switch.** `/multi-agent:model` turns `fable` on or off
|
|
381
392
|
(`prefs.global.modelFallback.fableEnabled`, shipped off). The review commands,
|
package/README.tr.md
CHANGED
|
@@ -358,23 +358,34 @@ kadar kapalıdır.
|
|
|
358
358
|
|
|
359
359
|
| Komut | Ne yapar |
|
|
360
360
|
| --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
361
|
-
| `/multi-agent:route-on` | Strateji, kapsam ve hangi çağrının hangi basamağa düşeceğini söyleyen kuralları sorar. Hiçbir şey yazılmadan önce `route-config.schema.json`'a karşı doğrulanır |
|
|
361
|
+
| `/multi-agent:route-on` | Strateji, kapsam ve hangi çağrının hangi basamağa düşeceğini söyleyen kuralları sorar; `--free` basit metin işlerini önce doğrulanmış ücretsiz modellere gönderir. Hiçbir şey yazılmadan önce `route-config.schema.json`'a karşı doğrulanır |
|
|
362
362
|
| `/multi-agent:route-off` | Kapatır. Kurallar SAKLANIR, tekrar açıldığında aynı yapılandırma yeniden sorulmaz |
|
|
363
363
|
| `/multi-agent:route-status` | Açık mı, hangi kural nerede geçerli, son çağrılar hangi basamağa gitti, bu koşu ne tuttu |
|
|
364
364
|
| `/multi-agent:model` | Üst basamağı açıp kapatır ve maliyet defterinin fiyatlamasını aynı adımda onunla taşır |
|
|
365
365
|
|
|
366
|
-
**Kapsam oturumun tamamı olamaz.** `scope` yalnız `subagent`, `bulk-read
|
|
367
|
-
`research` kabul eder; `host-session` diye bir değer yoktur ve bu bir teamül
|
|
366
|
+
**Kapsam oturumun tamamı olamaz.** `scope` yalnız `subagent`, `bulk-read`,
|
|
367
|
+
`delegate` ve `research` kabul eder; `host-session` diye bir değer yoktur ve bu bir teamül
|
|
368
368
|
değil, şema kapısıdır. Host'un base URL'ini sahiplenmek, bu pipeline'la ilgisi
|
|
369
369
|
olmayan işler dahil yaptığın her çağrıyı üçüncü bir katmandan geçirirdi.
|
|
370
370
|
|
|
371
|
-
**
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
371
|
+
**Basit işler için ücretsiz modeller: `route-on --free`.** Büyük dosya okumaları,
|
|
372
|
+
log ve doküman özetleri, alan çıkarımı, etiketler ve çeviri ya da commit gövdesi
|
|
373
|
+
taslakları önce multi-agent-toolkit'in ücretsiz model zincirine gider (Groq,
|
|
374
|
+
Mistral, Gemini, OpenRouter ücretsiz modelleri, Z.AI GLM Flash, yerel Ollama).
|
|
375
|
+
Her cevap kullanılmadan önce kaynağına karşı doğrulanır - kesik ya da ret değil,
|
|
376
|
+
şema ve etiket kontrolü, her tanımlayıcı, sayı ve dosya adı kaynakta geçmeli -
|
|
377
|
+
ve hiçbiri geçmezse işi Claude eskisi gibi yapar. Varsayılan olarak metni yalnız
|
|
378
|
+
prompt'larla eğitim yapmayan sağlayıcılar görür; `--allow-training` bunu
|
|
379
|
+
genişletir. Tek bir ücretsiz Groq anahtarı yeter; `route-status` neyin ücretsiz
|
|
380
|
+
cevaplandığını, neyin Claude'a döndüğünü ve Claude'dan uzak tutulan token'ları
|
|
381
|
+
raporlar. Sözleşme:
|
|
382
|
+
[`free-models.md`](pipeline/multi-agent-refs/features/free-models.md).
|
|
383
|
+
|
|
384
|
+
**Dürüst sınır, ve `route-status` bunu gizlemek yerine yazar.** Subagent'ı host
|
|
385
|
+
dağıtır; bu yüzden Phase 1-3 personaları kurallar ne derse desin Anthropic
|
|
386
|
+
merdiveninde kalır. `free` basamağı yalnız pipeline'ın çağrıyı kendisi yaptığı
|
|
387
|
+
yerlerde cevap verir, `bulk-read.sh` ve `delegate` çağrı noktası; karar, plan,
|
|
388
|
+
kod, review ve triyaj asla Claude'dan çıkmaz.
|
|
378
389
|
|
|
379
390
|
**Üst basamak bir anahtar.** `/multi-agent:model` `fable`'ı açar ya da kapatır
|
|
380
391
|
(`prefs.global.modelFallback.fableEnabled`, kapalı gelir). Review komutları,
|
package/docs/ecosystem.md
CHANGED
|
@@ -7,7 +7,7 @@ separately, wired together at install time and at run time:
|
|
|
7
7
|
|---|---|---|
|
|
8
8
|
| **`multi-agent-pipeline`** (this repo) | Orchestration: the 6-phase flow, the 64 slash commands, quality gates, review/triage, cross-CLI parity | npm package (`@mmerterden/multi-agent-pipeline`), installs itself onto Claude Code / Copilot CLI / Codex CLI |
|
|
9
9
|
| **`multi-agent-plugins`** | Stack knowledge: per-platform component/lifecycle skills (iOS, Android, Frontend, Backend) + shared knowledge | Claude Code marketplace, 6 independently-versioned plugins |
|
|
10
|
-
| **`multi-agent-toolkit-mcp`** | The pipeline's hands on devices and browsers:
|
|
10
|
+
| **`multi-agent-toolkit-mcp`** | The pipeline's hands on devices and browsers: 191 MCP tools across 20 categories (simulator/emulator control, end-to-end locators and assertions, memory, crash diagnostics, accessibility audit, store compliance, web automation and scraping, Figma-vs-mock design audit, code intelligence, wallet passes, an agent-DSL batch runner, a full-text context index with text-to-image rendering, provider-backed research, verified hand-off of simple text tasks to free models, video key frames, offline security scoring, travel document fixtures, a voice channel, App Store Connect and Play Console APIs, virtual iPhones) | npm package, registered as a standard stdio MCP server on every host |
|
|
11
11
|
|
|
12
12
|
None of the three depends on the others at the code level. They compose through two
|
|
13
13
|
narrow contracts: the **Skill tool** (pipeline → plugin, at Phase 2) and the **MCP
|
|
@@ -234,14 +234,14 @@ Detail: [`unattended-security.md`](../pipeline/multi-agent-refs/features/unatten
|
|
|
234
234
|
|
|
235
235
|
### multi-agent-toolkit-mcp's tools, by category
|
|
236
236
|
|
|
237
|
-
|
|
238
|
-
at toolkit 3.
|
|
237
|
+
191 tools in 20 categories, counted from the server's own `tools/list` response
|
|
238
|
+
at toolkit 3.21.0 rather than from a README. Three families are defined in
|
|
239
239
|
modules the main file only spreads in, so a count taken from the source reads
|
|
240
240
|
low; the response is the only place the whole surface appears at once.
|
|
241
241
|
|
|
242
242
|
The families can be narrowed per host: `MCP_TOOLKIT_CAPS` serves only the named
|
|
243
|
-
ones, and unset serves all
|
|
244
|
-
sees 47 tools instead of
|
|
243
|
+
ones, and unset serves all 191. A frontend repo that sets `web,code,context`
|
|
244
|
+
sees 47 tools instead of 191, which matters because every registered server's
|
|
245
245
|
tool list is charged against the context window on every turn.
|
|
246
246
|
|
|
247
247
|
| Category | Tools | Primary pipeline consumers |
|
|
@@ -259,6 +259,7 @@ tool list is charged against the context window on every turn.
|
|
|
259
259
|
| Wallet Passes | 4 (`pass_build`, `pass_validate`, `pass_inspect`, `pass_certificates`) | pass-kit work outside the pipeline; no pipeline phase consumes them |
|
|
260
260
|
| Context Index | 4 (`context_index`, `context_search`, `context_get`, `context_render`) | any skill holding an offloaded payload too large to read; ranks passages instead of grepping lines. `context_render` pages long text into images and reports whether that is cheaper than the text |
|
|
261
261
|
| Research | 2 (`research_search`, `research_ask`) | closes the parity exemption that had web search outside the MCP channel; `signal-community` and `/multi-agent:refactor` band E (modes, recency and academic filters, follow-up threads, arXiv). Denied in unattended runs and autonomous research |
|
|
262
|
+
| Free Models | 2 (`llm_delegate`, `llm_providers`) | `route-on --free`: `bulk-read.sh` through the `multi-agent-toolkit-llm` CLI, the `delegate` call site in skills and analysis evidence gathering ([`free-models.md`](../pipeline/multi-agent-refs/features/free-models.md)). Allowed in unattended runs only while the free chain is on |
|
|
262
263
|
| Media | 1 (`media_frames`) | Phase 2 visual evidence: turns a screen recording into frames a reviewer and a model can both look at |
|
|
263
264
|
| Security | 2 (`security_cvss_score`, `security_dep_inventory`) | the Phase 3 Step 2.7 security audit (`security-auditor`) and `/multi-agent:security-review`; offline, no egress |
|
|
264
265
|
| Travel Document Fixtures | 2 (`document_mrz_build`, `document_generate`) | the `e2e-testing` skill's MRZ and document-scan recipes |
|
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-12",
|
|
4
|
+
"version": "20.21.0",
|
|
5
5
|
"phaseSchema": 2,
|
|
6
6
|
"phases": [
|
|
7
7
|
{
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"skillCountAll": 228,
|
|
41
41
|
"agentCount": 10,
|
|
42
42
|
"hosts": ["Claude Code", "Codex CLI", "Copilot CLI"],
|
|
43
|
-
"toolCount":
|
|
43
|
+
"toolCount": 191,
|
|
44
44
|
"toolCategories": {
|
|
45
45
|
"ios": 42,
|
|
46
46
|
"web": 35,
|
|
@@ -54,11 +54,12 @@
|
|
|
54
54
|
"pass": 4,
|
|
55
55
|
"agent": 2,
|
|
56
56
|
"document": 2,
|
|
57
|
+
"llm": 2,
|
|
57
58
|
"research": 2,
|
|
58
59
|
"security": 2,
|
|
59
60
|
"media": 1,
|
|
60
61
|
"ui": 1
|
|
61
62
|
},
|
|
62
63
|
"pluginSkillCount": 252,
|
|
63
|
-
"toolkitVersion": "3.
|
|
64
|
+
"toolkitVersion": "3.21.1"
|
|
64
65
|
}
|
package/docs/features.md
CHANGED
|
@@ -354,6 +354,7 @@ Commands (`commands.mjs --json`) and run questions (`launch-request.mjs question
|
|
|
354
354
|
|
|
355
355
|
- **Pre-Commit Secret Detection** (12 patterns): `PreToolUse` hook scans staged files for API keys/tokens, AWS access keys, private keys, `.env` files, service account JSON. Commit **blocked** if found.
|
|
356
356
|
- **Read-Size Gate** (opt-in, `prefs.global.bulkRead.mode`): a `PreToolUse` hook inspects `Read` and the shell commands that read a file whole. In `observe` it only logs what it would have caught - the baseline you measure before routing anything. In `enforce` a file over `minLines` (default 350) is blocked and delegated to a haiku-rung worker (`bulk-read.sh`), which returns a line-numbered summary so the follow-up is a bounded `Read(offset:limit:)` instead of the whole file; the full text is parked under `.multi-agent/refs/`. The development phase and any file the run has already touched are exempt, because Claude Code's `Edit` requires its own `Read` first.
|
|
357
|
+
- **Free models for simple work** (opt-in, `/multi-agent:route-on --free`): large-file reads, log and document summaries, field extraction, labels and translation or commit-body drafts go to the multi-agent-toolkit's free-model chain (`llm_delegate`) first. Every answer is verified against its source and discarded when it does not hold, Claude takes over whenever none passes, and decisions, plans, code and reviews never leave Claude. By default only providers that do not train on prompts receive text. `route-status` reports what was answered free and the tokens kept off Claude; `doctor --probe` checks each provider key. Contract: `multi-agent-refs/features/free-models.md`.
|
|
357
358
|
- **Capture Hooks** (`SessionEnd`, `PreCompact`, `SessionStart`): every durable write used to live in Phase 5, the phase a run is least likely to reach. `SessionEnd` flushes a run that never got there; `PreCompact` flushes before an auto-compaction summarizes a long phase mid-flight, which is the same loss one level down; `SessionStart` prints at most two lines about an unfinished run. None calls a model, none reads a payload, and all exit 0 on every path - a hook that fails a session over bookkeeping is worse than the bookkeeping.
|
|
358
359
|
- **Operational Reporting** (`prefs.global.usageLog`): coarse run metadata - task id and type, current phase, run status (in progress, completed, halted, parked), phase durations, whether a PR opened, token counts - sent at every phase transition and at completion, halt and park, and never prompts, code, diffs or absolute paths (task title and PR URL only when `includeTitle` / `includePrUrl` are set). Runs are reported under the GitHub account on the machine that can read the pipeline repository, found with no question asked through gh, the git credential helper or an SSH key (`usage-identity.mjs`, cached in `usageLog.login` / `loginMethod`, `--refresh` to re-check); with no such account nothing is sent. The per-machine token is REQUESTED from the endpoint by `usage-register.mjs` (setup, update, and the Phase 0 exit gate as a backstop), is write-only, and lives in the OS credential store; prefs hold only the entry name and the switch. `usageLog.optOut: true` blocks registration permanently and is checked before the network call. Registration proves the login with that account's gh or credential-helper token, or with an SSH signature over a server challenge. The server issues a token only to the repository owner or a collaborator, pins the login to it, and shows only those accounts' records on the panel. An unreachable endpoint leaves reporting off with one line and exit 0 - a run is never failed over bookkeeping.
|
|
359
360
|
- **Build Queue**: All `xcodebuild` calls acquire a lock. Each worktree uses own `-derivedDataPath`. Stale locks auto-clean after 15 min. Non-Xcode builds don't need the lock.
|