@mmerterden/multi-agent-pipeline 17.1.0 → 17.4.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 +194 -0
- package/README.md +7 -0
- package/README.tr.md +7 -0
- package/docs/token-budget-history.md +22 -0
- package/install/_dev-only-files.mjs +1 -0
- package/install/codex.mjs +18 -1
- package/install/copilot.mjs +17 -1
- package/package.json +1 -1
- package/pipeline/agents/code-reviewer.md +35 -1
- package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +9 -1
- package/pipeline/lib/autopilot-state.sh +34 -0
- package/pipeline/multi-agent-refs/_dev-context.md +10 -0
- package/pipeline/multi-agent-refs/analysis/locked.md +4 -4
- package/pipeline/multi-agent-refs/analysis/redesign.md +8 -0
- package/pipeline/multi-agent-refs/analysis/render.md +2 -1
- package/pipeline/multi-agent-refs/analysis/review.md +9 -0
- package/pipeline/multi-agent-refs/android-guide.md +14 -0
- package/pipeline/multi-agent-refs/audit-guide.md +12 -0
- package/pipeline/multi-agent-refs/backend-guide.md +10 -0
- package/pipeline/multi-agent-refs/channels/confluence.md +11 -0
- package/pipeline/multi-agent-refs/channels/issue-comment.md +12 -0
- package/pipeline/multi-agent-refs/channels/jira.md +10 -0
- package/pipeline/multi-agent-refs/channels/pr-review-actions.md +13 -0
- package/pipeline/multi-agent-refs/channels/pr.md +37 -0
- package/pipeline/multi-agent-refs/component-dispatch.md +11 -0
- package/pipeline/multi-agent-refs/component-generation.md +11 -0
- package/pipeline/multi-agent-refs/conventions-defaults.md +15 -0
- package/pipeline/multi-agent-refs/cross-cli-contract.md +65 -0
- package/pipeline/multi-agent-refs/features/analysis-jira.md +11 -0
- package/pipeline/multi-agent-refs/features/code-graph.md +40 -0
- package/pipeline/multi-agent-refs/features/design-conformance.md +24 -0
- package/pipeline/multi-agent-refs/features/doctor.md +10 -0
- package/pipeline/multi-agent-refs/features/external-context-injection.md +7 -0
- package/pipeline/multi-agent-refs/features/jira-context.md +9 -0
- package/pipeline/multi-agent-refs/features/model-fallback.md +10 -0
- package/pipeline/multi-agent-refs/features/review-file-set.md +132 -0
- package/pipeline/multi-agent-refs/features/skill-conformance.md +13 -0
- package/pipeline/multi-agent-refs/features/url-enrichment.md +9 -0
- package/pipeline/multi-agent-refs/features/visual-evidence.md +42 -0
- package/pipeline/multi-agent-refs/generate-issue.md +7 -0
- package/pipeline/multi-agent-refs/issue-jira-triad.md +9 -0
- package/pipeline/multi-agent-refs/knowledge.md +6 -0
- package/pipeline/multi-agent-refs/multi-repo-integration-build.md +13 -0
- package/pipeline/multi-agent-refs/phases/modes.md +7 -0
- package/pipeline/multi-agent-refs/phases/operations.md +9 -0
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +1 -1
- package/pipeline/multi-agent-refs/phases/phase-4-review.md +31 -23
- package/pipeline/multi-agent-refs/phases.md +11 -0
- package/pipeline/multi-agent-refs/picker-contract.md +12 -0
- package/pipeline/multi-agent-refs/platform-parity.md +10 -0
- package/pipeline/multi-agent-refs/progress-contract.md +10 -0
- package/pipeline/multi-agent-refs/setup/firebase.md +9 -0
- package/pipeline/multi-agent-refs/swiftui-guide.md +17 -0
- package/pipeline/multi-agent-refs/tracker-contract.md +12 -0
- package/pipeline/multi-agent-refs/web-guide.md +10 -0
- package/pipeline/multi-agent-refs/wiki-capture.md +11 -0
- package/pipeline/schemas/prefs.schema.json +4 -0
- package/pipeline/schemas/review-file-exclusions.json +137 -0
- package/pipeline/schemas/reviewer-output.schema.json +27 -1
- package/pipeline/schemas/token-budget.json +10 -19
- package/pipeline/scripts/autopilot-intake.mjs +5 -1
- package/pipeline/scripts/autopilot-runner.mjs +6 -1
- package/pipeline/scripts/autopilot-status.sh +3 -2
- package/pipeline/scripts/capture-evidence.sh +79 -11
- package/pipeline/scripts/diff-risk-score.mjs +1 -36
- package/pipeline/scripts/gen-ref-toc.mjs +279 -0
- package/pipeline/scripts/git-path.mjs +63 -0
- package/pipeline/scripts/glob-match.mjs +62 -0
- package/pipeline/scripts/graph-mermaid.mjs +251 -0
- package/pipeline/scripts/review-file-filter.mjs +180 -0
- package/pipeline/scripts/skill-conformance.mjs +1 -31
- package/pipeline/scripts/validate-analysis-doc.mjs +53 -0
- package/pipeline/scripts/validate-reviewer.mjs +90 -1
- package/pipeline/scripts/verify-citations.mjs +346 -0
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Step 1b - URL Enrichment (Phase 0)
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Step 1b.0 - Extract context links (always runs)](#step-1b0---extract-context-links-always-runs)
|
|
5
|
+
- [Step 1b.1 - Firebase Crashlytics deep fetch (runs when `type == "crashlytics"` present in `state.contextLinks[]`)](#step-1b1---firebase-crashlytics-deep-fetch-runs-when-type-crashlytics-present-in-statecontextlinks)
|
|
6
|
+
- [Step 1b.2 - Fortify SSC deep fetch (runs when `type == "fortify"` present in `state.contextLinks[]`)](#step-1b2---fortify-ssc-deep-fetch-runs-when-type-fortify-present-in-statecontextlinks)
|
|
7
|
+
- [Step 1b.3 - Graylog deep fetch (runs when `type == "graylog"` present in `state.contextLinks[]`)](#step-1b3---graylog-deep-fetch-runs-when-type-graylog-present-in-statecontextlinks)
|
|
8
|
+
- [Step 1b.3b - Document fetch (runs when `type == "document"` present)](#step-1b3b---document-fetch-runs-when-type-document-present)
|
|
9
|
+
- [Step 1b.4 - Other link types (catalogued only at Phase 0; fetched at Phase 1)](#step-1b4---other-link-types-catalogued-only-at-phase-0-fetched-at-phase-1)
|
|
10
|
+
<!-- /toc -->
|
|
11
|
+
|
|
3
12
|
> Loaded on demand from `phases/phase-0-init.md` Step 1b. It lives here rather
|
|
4
13
|
> than inline because it applies only to a task that carries URLs: a bare Jira
|
|
5
14
|
> ID, a GitHub issue number, or a free-text task never needs any of it, yet every
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Visual evidence - before/after screenshots and the UI flow video
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [1. When it is required](#1-when-it-is-required)
|
|
5
|
+
- [2. Before - the reporter's screenshot, or nothing](#2-before---the-reporters-screenshot-or-nothing)
|
|
6
|
+
- [3. After - Phase 3, not Phase 5](#3-after---phase-3-not-phase-5)
|
|
7
|
+
- [4. Video - the recording rides on a test run](#4-video---the-recording-rides-on-a-test-run)
|
|
8
|
+
- [5. Size, and what happens when it does not fit](#5-size-and-what-happens-when-it-does-not-fit)
|
|
9
|
+
- [5b. Where the artefacts live - the host](#5b-where-the-artefacts-live---the-host)
|
|
10
|
+
- [6. Rendering](#6-rendering)
|
|
11
|
+
- [7. Blocker](#7-blocker)
|
|
12
|
+
- [8. State](#8-state)
|
|
13
|
+
<!-- /toc -->
|
|
14
|
+
|
|
3
15
|
A UI fix that reads as three changed files in a diff is not reviewable. The
|
|
4
16
|
reviewer cannot see what was wrong, and the tester cannot see what to look for.
|
|
5
17
|
This contract makes the pipeline carry the picture: the state the reporter saw,
|
|
@@ -222,6 +234,36 @@ capture of a static screen.
|
|
|
222
234
|
`visualEvidence.enabled` turns the whole feature off - capture, upload, both
|
|
223
235
|
render sections and the Phase 6 blocker with it.
|
|
224
236
|
|
|
237
|
+
### 4.6 Web - the recorder IS the runner
|
|
238
|
+
|
|
239
|
+
Web is a real evidence platform: the schema has it in `visualEvidence.platform`,
|
|
240
|
+
the probe opens tier 1 and tier 2 for it, and `run-ui-tests.sh` has a web arm.
|
|
241
|
+
What it does NOT share with iOS and Android is the recording model, and forcing
|
|
242
|
+
it to would record the same run twice - Playwright and Cypress write the video
|
|
243
|
+
themselves.
|
|
244
|
+
|
|
245
|
+
| Step | iOS / Android | Web |
|
|
246
|
+
|---|---|---|
|
|
247
|
+
| `after` | screenshot the booted device | drive a browser at a URL |
|
|
248
|
+
| the URL | not needed, a simulator already shows something | `--url`, else `prefs.global.visualEvidence.webBaseUrl`, else a gap with that reason |
|
|
249
|
+
| `video start` | spawn a recorder, hold its pid | write a marker with the current time; spawn nothing |
|
|
250
|
+
| `video stop` | kill the recorder, pull the file | harvest the newest video under `test-results/` or `cypress/videos/` written AFTER the marker |
|
|
251
|
+
| container | mp4 already | webm re-encoded to h264, for the same reason the iOS arm re-encodes: that is what the Jira preview and the PR body play |
|
|
252
|
+
|
|
253
|
+
The marker is the part that matters and the part that is easy to leave out. Without
|
|
254
|
+
a timestamp to compare against, `stop` harvests whatever video is lying around -
|
|
255
|
+
and a video from yesterday's run attached as today's evidence is worse than no
|
|
256
|
+
video, because an artefact that is present does not get re-checked.
|
|
257
|
+
|
|
258
|
+
Two honest gaps, both exit 4 with a reason rather than a failure: no address to
|
|
259
|
+
point at, and a project whose runner config does not record video at all. Neither
|
|
260
|
+
is a phase failure; both are recorded and shown.
|
|
261
|
+
|
|
262
|
+
Every browser call goes through `npx --no-install`, never a bare `npx`. A bare one
|
|
263
|
+
DOWNLOADS the browser stack, which turns "this project has no browser tooling"
|
|
264
|
+
into a silent network fetch. `run-ui-tests.sh` carries the same rule for the same
|
|
265
|
+
reason, and it is the line that keeps the pipeline's own dependency list empty.
|
|
266
|
+
|
|
225
267
|
## 5. Size, and what happens when it does not fit
|
|
226
268
|
|
|
227
269
|
Jira's attachment ceiling is an instance setting, so it is a preference:
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Generate Issue - Shared Flow (generate)
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Hard rules (must not regress)](#hard-rules-must-not-regress)
|
|
5
|
+
- [Standard templates](#standard-templates)
|
|
6
|
+
- [Flow](#flow)
|
|
7
|
+
- [Error paths](#error-paths)
|
|
8
|
+
<!-- /toc -->
|
|
9
|
+
|
|
3
10
|
> **TLDR** - Shared 12-step flow for `/multi-agent:create-jira`. Asks the issue type (Task / Bug / Story), mines the target project's existing same-type issues to learn team conventions, detects the active sprint, drafts a standards-compliant issue from a fixed standard template with auto-sizing sections, asks the user about every genuinely unknown field, renders a full preview, and creates the Jira issue only after explicit approval. Creates exactly one Jira issue per run - no branches, no commits, no worktrees.
|
|
4
11
|
|
|
5
12
|
Consumed by `create-jira/SKILL.md`. This ref is never invoked directly.
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Issue → Jira → Wiki Triad
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [The triad at a glance](#the-triad-at-a-glance)
|
|
5
|
+
- [Phase 0 auto-create policy](#phase-0-auto-create-policy)
|
|
6
|
+
- [Phase 7 wiki → Jira comment](#phase-7-wiki-jira-comment)
|
|
7
|
+
- [Autopilot behaviour](#autopilot-behaviour)
|
|
8
|
+
- [Preferences involved](#preferences-involved)
|
|
9
|
+
- [Cross-CLI parity](#cross-cli-parity)
|
|
10
|
+
<!-- /toc -->
|
|
11
|
+
|
|
3
12
|
> **TLDR** - When a GitHub issue triggers the pipeline and has no Jira ID, the `autoJiraFromGithubIssue` policy decides whether to auto-create a Jira task (and patch the GitHub issue body with the new Jira link). Phase 7 then posts a humanizer'd wiki-content summary back as a Jira comment, closing the loop. Autopilot treats `ask` as `always`.
|
|
4
13
|
|
|
5
14
|
This doc is referenced from `$HOME/.claude/multi-agent-refs/phases/phase-0-init.md` Step 1 (GitHub issue input) and `$HOME/.claude/multi-agent-refs/phases/phase-7-report.md` Step 2 (component wiki). Keeps the phase docs tight and gives the triad contract a stable home.
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
## Project Knowledge Base
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Project Knowledge Base](#project-knowledge-base)
|
|
5
|
+
- [Retrieval order, and what each layer costs](#retrieval-order-and-what-each-layer-costs)
|
|
6
|
+
- [Skill Injection Strategy](#skill-injection-strategy)
|
|
7
|
+
<!-- /toc -->
|
|
8
|
+
|
|
3
9
|
An incrementally growing knowledge system for each project, enabling knowledge transfer across sessions.
|
|
4
10
|
|
|
5
11
|
### Directory Structure
|
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Multi-Repo Integration Build - Learn Once, Auto-Apply
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Why this exists](#why-this-exists)
|
|
5
|
+
- [When this rule fires](#when-this-rule-fires)
|
|
6
|
+
- [Learn-once prompt (first encounter of a combo)](#learn-once-prompt-first-encounter-of-a-combo)
|
|
7
|
+
- [Auto-run steps (when host is learned)](#auto-run-steps-when-host-is-learned)
|
|
8
|
+
- [Error evaluation contract](#error-evaluation-contract)
|
|
9
|
+
- [Autopilot behavior](#autopilot-behavior)
|
|
10
|
+
- [Phase 7 knowledge capture](#phase-7-knowledge-capture)
|
|
11
|
+
- [Generic rule (for copilot-instructions.md)](#generic-rule-for-copilot-instructionsmd)
|
|
12
|
+
- [Schema](#schema)
|
|
13
|
+
- [Smoke coverage](#smoke-coverage)
|
|
14
|
+
<!-- /toc -->
|
|
15
|
+
|
|
3
16
|
> **TLDR** - When a task touches ≥2 repos that have a producer→consumer dependency (e.g. shared codegen library + consuming UI library), the pipeline MUST build the **host project** that integrates them before commit/PR. Codegen mismatches (nested vs flat keys, missing entries, overwritten files) only surface when the full dependency chain builds together. Building repos in isolation gives false confidence.
|
|
4
17
|
>
|
|
5
18
|
> The pipeline **learns** the host per repo-combo once, persists to `prefs.global.multiRepoIntegrationHosts`, and auto-applies on subsequent runs.
|
|
@@ -8,6 +8,13 @@
|
|
|
8
8
|
|
|
9
9
|
## Autopilot Mode
|
|
10
10
|
|
|
11
|
+
<!-- toc -->
|
|
12
|
+
- [Autopilot Mode](#autopilot-mode)
|
|
13
|
+
- [Pipeline depth (Full / Short)](#pipeline-depth-full-short)
|
|
14
|
+
- [Analysis Mode (`/multi-agent:analysis`)](#analysis-mode-multi-agentanalysis)
|
|
15
|
+
- [Local Mode (`--local`)](#local-mode---local)
|
|
16
|
+
<!-- /toc -->
|
|
17
|
+
|
|
11
18
|
Autopilot mode skips interactive confirmations and runs the pipeline end-to-end autonomously.
|
|
12
19
|
|
|
13
20
|
**Activation**: Add `autopilot` flag to any pipeline command:
|
|
@@ -8,6 +8,15 @@
|
|
|
8
8
|
|
|
9
9
|
## Task ID System
|
|
10
10
|
|
|
11
|
+
<!-- toc -->
|
|
12
|
+
- [Task ID System](#task-id-system)
|
|
13
|
+
- [Kill Logic](#kill-logic)
|
|
14
|
+
- [Clear Logs](#clear-logs)
|
|
15
|
+
- [Purge (Full Reset)](#purge-full-reset)
|
|
16
|
+
- [Resume Logic](#resume-logic)
|
|
17
|
+
- [Phase Pipeline](#phase-pipeline)
|
|
18
|
+
<!-- /toc -->
|
|
19
|
+
|
|
11
20
|
Every task gets an auto-incremented short ID. Counter stored at `$HOME/.claude/logs/multi-agent/{project}/.counter` (persists across sessions).
|
|
12
21
|
|
|
13
22
|
```
|
|
@@ -606,7 +606,7 @@ if [ -n "$EVIDENCE_PLATFORM" ]; then
|
|
|
606
606
|
fi
|
|
607
607
|
```
|
|
608
608
|
|
|
609
|
-
Empty is an outcome, not a failure:
|
|
609
|
+
Empty is an outcome, not a failure: backend has no device, so the probe does not run and `evidenceCapability.skippedReason` says so. Web does: the browser the runner drives is the device (4.6). No `--changed` yet, by the same token.
|
|
610
610
|
|
|
611
611
|
One run, both forms: stdout is `EVIDENCE_*` (shell-quoted, so the eval is safe), and the same measurement lands as JSON.
|
|
612
612
|
|
|
@@ -240,8 +240,7 @@ $HOME/.claude/scripts/log-metric.sh "$TASK_ID" 4 review.criteria \
|
|
|
240
240
|
Output conforms to `$HOME/.claude/schemas/criteria-manifest.schema.json`. The four parts that matter downstream:
|
|
241
241
|
|
|
242
242
|
- **`selectedRules[]` is the denominator.** Rule IDs from every registry whose declared `scope` matches the diff, persisted BEFORE the reviewers run so the set cannot be renegotiated after one has seen the diff. That is what makes "applied completely" answerable rather than "looks fine": a reviewer finding nothing must still return a verdict per ID. Discovery is declared via `standards-registry:` frontmatter, so no stack-specific skill is named here.
|
|
243
|
-
- **`coverage.declaredGaps[]`
|
|
244
|
-
- **`ledger`.** `state.telemetry.skillCalls[]` corroborates only; `ledger.source` defaults to `derived` and coverage is never computed from self-report. A declared skill the resolver cannot bind is flagged.
|
|
243
|
+
- **`coverage.declaredGaps[]`, `droppedReasons`, `ledger`.** Every gap, dropped rule and unbindable declared skill is reported with a reason; coverage is never computed from self-report. Rationale: the contract above.
|
|
245
244
|
- **`findings[]`.** Reviewer-shaped, merging at Step 3.0 alongside test-integrity: expired / unexplained / unknown-ID exception markers, plus any registry whose delegated linter is not wired here (those rules are unverified, so reporting no violations reports that nothing was measured).
|
|
246
245
|
|
|
247
246
|
**Any non-zero exit halts** (1 = setup error incl. a bad `--skills-root`; 2 = no root resolved, unparseable registry, or a declared path escaping its skill dir): continuing would drop a rule set from the denominator, and since the reviewer validator skips the checklist when zero rules were selected, the run would report clean over criteria never loaded. A coverage gap halts only under `prefs.global.skillConformance.blockOnCoverageGap`. No opt-out for the stage or the exception-expiry check, on the same grounds as Step 1.76.
|
|
@@ -266,13 +265,25 @@ Visual-fidelity mismatches against the captured screenshot are BLOCKING findings
|
|
|
266
265
|
|
|
267
266
|
When `state.figmaAccess.tier === 3` (user-attached screenshot, no Code Connect snippet), the reviewer additionally sets `findings[i].severity = "blocking"` and `findings[i].tag = "review_blocking_tier3"` on every UI atom that lacks a confirmed canonical-component mapping. The triage step preserves these findings unless the user has explicitly cleared the open question.
|
|
268
267
|
|
|
268
|
+
#### Step 1.85 - Review file set (the denominator, required)
|
|
269
|
+
|
|
270
|
+
Decides what the reviewers read before the cap decides what fits: the cap truncates the largest files first, so a lockfile survives while real code is cut. Zero LLM. Full contract: `$HOME/.claude/multi-agent-refs/features/review-file-set.md`.
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
git -C "$WORKTREE" diff --name-only "$BASE_BRANCH"...HEAD \
|
|
274
|
+
| node $HOME/.claude/scripts/review-file-filter.mjs \
|
|
275
|
+
> "$WORKTREE/.pipeline/review-files.json"
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
`reviewed[]` is the denominator, fixed here for the same reason `selectedRules[]` is. `excluded[]` reaches the run report with its reason and the glob that matched. Exit 2 means the pattern list is unreadable and everything is reviewed: continue, logging `review.file_filter_failed`.
|
|
279
|
+
|
|
269
280
|
#### Step 1.9 - Context economy (cache prefix + diff cap)
|
|
270
281
|
|
|
271
282
|
Phase 4 sends the same diff to every reviewer and then to triage, so the diff is the dominant token cost. Two measures keep it bounded:
|
|
272
283
|
|
|
273
|
-
**Shared cache prefix.** Build the reviewer and triage prompts so the large invariant context - the full diff, the `${CRITERIA}` block from Step 1.78, the Phase 1 analysis summary, the Phase 2 plan - is a byte-identical leading block across all dispatches in this iteration. Only the per-reviewer focus + skill line varies, and it goes AFTER the shared block. `${CRITERIA}` goes in the prefix, identical for every reviewer: subsetting it per reviewer would invalidate the prefix for the whole panel and re-bill the largest block in the phase. Per-reviewer emphasis stays a one-line pointer in the suffix. When the host supports prompt caching, the 2nd/3rd reviewer and the triage call then read that prefix at the discounted cache-read rate instead of re-billing it as fresh input. Forward the host-reported cache-read count as `tokens_cached` per the Token telemetry contract so the saving lands in the cost ledger. The `<scope-self-check>` block and, from iteration 2, the `<previous-round-findings>` block (Step 2.1) close the shared block, after the plan and before the per-reviewer suffix.
|
|
284
|
+
**Shared cache prefix.** Build the reviewer and triage prompts so the large invariant context - the full diff, the `${CRITERIA}` block from Step 1.78, the `${REVIEW_FILES}` list from Step 1.85, the Phase 1 analysis summary, the Phase 2 plan - is a byte-identical leading block across all dispatches in this iteration. Only the per-reviewer focus + skill line varies, and it goes AFTER the shared block. `${CRITERIA}` goes in the prefix, identical for every reviewer: subsetting it per reviewer would invalidate the prefix for the whole panel and re-bill the largest block in the phase. Per-reviewer emphasis stays a one-line pointer in the suffix. When the host supports prompt caching, the 2nd/3rd reviewer and the triage call then read that prefix at the discounted cache-read rate instead of re-billing it as fresh input. Forward the host-reported cache-read count as `tokens_cached` per the Token telemetry contract so the saving lands in the cost ledger. The `<scope-self-check>` block and, from iteration 2, the `<previous-round-findings>` block (Step 2.1) close the shared block, after the plan and before the per-reviewer suffix.
|
|
274
285
|
|
|
275
|
-
**Single-repo diff cap.**
|
|
286
|
+
**Single-repo diff cap.** Applied to the Step 1.85 `reviewed[]` set only. If it exceeds the Phase 4 token allowance (`token-budget.json`), truncate the largest files and append a footer `[truncated - full diff in file://$WORKTREE/.review-diff.txt]`, writing the full diff to that path. Reviewers and triage receive the same capped view + the marker so they can flag "review the full diff manually." Log `review.diff_truncated bytes_dropped=<N>`. (Multi-repo already caps the combined diff at 80% of budget; this is the single-repo equivalent.)
|
|
276
287
|
|
|
277
288
|
#### Step 2 - Parallel AI Review (CLI-aware reviewer set)
|
|
278
289
|
|
|
@@ -291,9 +302,8 @@ Reviewer count per host: **Claude Code 3, Copilot CLI 3, Codex CLI 3** - **2**
|
|
|
291
302
|
|
|
292
303
|
#### Codex CLI - two constraints that fail silently
|
|
293
304
|
|
|
294
|
-
Both
|
|
295
|
-
|
|
296
|
-
(always loaded on that host, so it is not restated here):
|
|
305
|
+
Both measured against Codex 0.145, both produce a review that looks like it ran. Full
|
|
306
|
+
statement: the managed block in `~/.codex/AGENTS.md`, always loaded on that host.
|
|
297
307
|
|
|
298
308
|
1. **`fork_turns: "none"` on every `spawn_agent` that sets `model` or
|
|
299
309
|
`reasoning_effort`** - a full-history fork discards the override and collapses the
|
|
@@ -304,15 +314,10 @@ looks like it ran. The full statement lives in the managed block at `~/.codex/AG
|
|
|
304
314
|
Sub-agent delegation itself is authorized by that same managed block; without it Phase 4
|
|
305
315
|
degrades to a single in-thread review.
|
|
306
316
|
|
|
307
|
-
**Single-vendor caveat.**
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
`xhigh` on security and architecture, Reviewer 2 runs a different model family member
|
|
312
|
-
on edge cases, Reviewer 3 runs `medium` on quality; on Claude Code the three slots are
|
|
313
|
-
three different Claude tiers. Treat consensus among a single-vendor panel as weaker
|
|
314
|
-
evidence than the same consensus on Copilot CLI, and say so in the triage note when all
|
|
315
|
-
three agree on a borderline finding.
|
|
317
|
+
**Single-vendor caveat.** Claude Code and Codex both run a one-vendor panel, so their
|
|
318
|
+
consensus is weaker evidence than Copilot CLI's; say so in the triage note on a
|
|
319
|
+
borderline finding. Where the diversity budget goes instead:
|
|
320
|
+
`cross-cli-contract.md`, "Panel diversity per host".
|
|
316
321
|
|
|
317
322
|
Each reviewer inherits the `code-reviewer` agent's focus areas (Security, Architecture, Quality, Performance) and output contract. The orchestrator overrides only the model and the stack-specific skill per-reviewer - no prompt duplication.
|
|
318
323
|
|
|
@@ -331,7 +336,7 @@ Each reviewer inherits the `code-reviewer` agent's focus areas (Security, Archit
|
|
|
331
336
|
|
|
332
337
|
##### 2.1 Previous-round findings (iteration >= 2) and 2.2 scope self-check (every iteration)
|
|
333
338
|
|
|
334
|
-
|
|
339
|
+
From iteration 2, render the previous round's accepted blocking/important findings (`.pipeline/triage-round-$((ITERATION-1)).json`, max 40) into a `<previous-round-findings>` block at the end of the shared prefix. Every iteration also renders `.pipeline/scope-check.json` (Phase 3 Step 3.7) plus `scope-check-gate.mjs --advisory` output as `<scope-self-check>`: file reasons, unjustified files, and `notDone[]` (never re-raised as findings); a missing record logs `review.scope_check=missing`. Block text and recipes: `$HOME/.claude/multi-agent-refs/features/review-delta.md`.
|
|
335
340
|
|
|
336
341
|
#### Step 2.8 - Visual conformance gate (component / screen work only)
|
|
337
342
|
|
|
@@ -350,11 +355,7 @@ disk with `Code Connect: Not published` in Figma means the binding does not exis
|
|
|
350
355
|
anyone but the author. Assert the publish step ran; an unpublished binding is a
|
|
351
356
|
blocking finding.
|
|
352
357
|
|
|
353
|
-
Why this is a gate and not advice: `design-
|
|
354
|
-
with **no phase invoking it**, so the only thing standing between a build and visual
|
|
355
|
-
drift was the user opening the app and looking. On one run that produced 16pt padding
|
|
356
|
-
where the frame said `Spacing/12`, and a full sheet rebuild afterwards. A reviewer
|
|
357
|
-
reading a diff cannot see spacing; something has to compare against the design.
|
|
358
|
+
Why this is a gate and not advice: `design-conformance.md`, "Why this runs as a gate".
|
|
358
359
|
|
|
359
360
|
Skip only when the diff has no UI change. Record the outcome in
|
|
360
361
|
`consensus.visualConformance` so Phase 7 reports whether it ran.
|
|
@@ -374,10 +375,11 @@ Step 2 produces N reviewer-output objects (one per dispatched reviewer), each co
|
|
|
374
375
|
```json
|
|
375
376
|
{"findings":[{"severity":"blocking|important|suggestion","file":"...","line":N,"issue":"...","fix":"...","ruleId":"SEC-01","criteriaSource":"ios-coding-standard"}],
|
|
376
377
|
"conformance":[{"ruleId":"SEC-01","verdict":"conformant|violated|not-applicable","file":"...","line":N,"reason":"..."}],
|
|
378
|
+
"fileCoverage":[{"path":"src/App.swift","verdict":"reviewed|skipped","reason":"..."}],
|
|
377
379
|
"approved":true|false}
|
|
378
380
|
```
|
|
379
381
|
|
|
380
|
-
`ruleId` + `criteriaSource` appear on a finding that cites a rule from `${CRITERIA}`. `conformance` is required whenever Step 1.78 selected at least one rule,
|
|
382
|
+
`ruleId` + `criteriaSource` appear on a finding that cites a rule from `${CRITERIA}`. `conformance` is required whenever Step 1.78 selected at least one rule, and `fileCoverage` whenever Step 1.85 left at least one file in `reviewed[]`: one row per ID, one row per path, none outside either set.
|
|
381
383
|
|
|
382
384
|
**Required: validator gate (deterministic) - run immediately after each reviewer returns, before merging findings.** Persist each reviewer's output and validate the file - the validator's exit code decides, not the LLM turn:
|
|
383
385
|
|
|
@@ -386,9 +388,15 @@ REVIEWER_FILE="$WORKTREE/.pipeline/reviewer-$N.json"
|
|
|
386
388
|
printf '%s' "$REVIEWER_JSON" > "$REVIEWER_FILE"
|
|
387
389
|
node $HOME/.claude/scripts/validate-reviewer.mjs "$REVIEWER_FILE" \
|
|
388
390
|
--criteria "$WORKTREE/.pipeline/criteria-manifest.json" \
|
|
391
|
+
--coverage "$WORKTREE/.pipeline/review-files.json" \
|
|
392
|
+
&& node $HOME/.claude/scripts/verify-citations.mjs "$REVIEWER_FILE" --repo "$WORKTREE" --worktree \
|
|
389
393
|
&& node $HOME/.claude/scripts/finding-fingerprint.mjs annotate --in-place "$REVIEWER_FILE"
|
|
390
394
|
```
|
|
391
395
|
|
|
396
|
+
`verify-citations.mjs` resolves each finding's `file:line` against the checkout,
|
|
397
|
+
not a commit: a round's fix is uncommitted, and HEAD would call it invented.
|
|
398
|
+
Exit 1 takes the single rework below; exit 2 means not a repository.
|
|
399
|
+
|
|
392
400
|
Progress line: ` → checking validator validate-reviewer ({reviewer})`
|
|
393
401
|
|
|
394
402
|
`finding-fingerprint.mjs` stamps each finding with its cross-round id once the validator passes; an echoed one is kept, and anonymization leaves it intact.
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Multi-Agent Pipeline - Phase Reference
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Phase Files](#phase-files)
|
|
5
|
+
- [Pipeline Flow](#pipeline-flow)
|
|
6
|
+
- [Phase entry - pending steer (every phase, every mode)](#phase-entry---pending-steer-every-phase-every-mode)
|
|
7
|
+
- [Visual Phase Tracker](#visual-phase-tracker)
|
|
8
|
+
- [Preferences File](#preferences-file)
|
|
9
|
+
- [Host Configuration](#host-configuration)
|
|
10
|
+
- [Token Budget](#token-budget)
|
|
11
|
+
- [SubPhase Convention](#subphase-convention)
|
|
12
|
+
<!-- /toc -->
|
|
13
|
+
|
|
3
14
|
## Phase Files
|
|
4
15
|
|
|
5
16
|
| Phase | File |
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Picker Contract (cross-platform single-choice abstraction)
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [The abstract primitive](#the-abstract-primitive)
|
|
5
|
+
- [Step narration (breadcrumb)](#step-narration-breadcrumb)
|
|
6
|
+
- [Per-platform rendering (degradation ladder)](#per-platform-rendering-degradation-ladder)
|
|
7
|
+
- [Universal fallback: `pipeline/lib/ask-choice.sh`](#universal-fallback-pipelinelibask-choicesh)
|
|
8
|
+
- [Localized labels: what the caller owns](#localized-labels-what-the-caller-owns)
|
|
9
|
+
- [Order: project, then repo, then branch](#order-project-then-repo-then-branch)
|
|
10
|
+
- [A single candidate is still a question](#a-single-candidate-is-still-a-question)
|
|
11
|
+
- [Autopilot / non-interactive contract](#autopilot-non-interactive-contract)
|
|
12
|
+
- [Deterministic gates note](#deterministic-gates-note)
|
|
13
|
+
<!-- /toc -->
|
|
14
|
+
|
|
3
15
|
> Native `AskUserQuestion` is a Claude-Code primitive; Copilot CLI has no
|
|
4
16
|
> agent-invokable choice picker. This contract defines ONE abstract "ask the
|
|
5
17
|
> user to choose" primitive that each supported CLI renders to the best
|
|
@@ -4,6 +4,16 @@ description: "Internal - cross-platform parity cross-check for Phase 4 and /mu
|
|
|
4
4
|
|
|
5
5
|
# Platform parity - compare the change against the other platform's repo
|
|
6
6
|
|
|
7
|
+
<!-- toc -->
|
|
8
|
+
- [When it runs](#when-it-runs)
|
|
9
|
+
- [Read-only, without exception](#read-only-without-exception)
|
|
10
|
+
- [Locating the counterpart, deterministically](#locating-the-counterpart-deterministically)
|
|
11
|
+
- [What is compared](#what-is-compared)
|
|
12
|
+
- [What a finding may not claim](#what-a-finding-may-not-claim)
|
|
13
|
+
- [Output](#output)
|
|
14
|
+
- [Severity](#severity)
|
|
15
|
+
<!-- /toc -->
|
|
16
|
+
|
|
7
17
|
A feature that exists on iOS and Android is written twice, and the two copies
|
|
8
18
|
drift. The drift is invisible from inside one repo: the iOS diff is
|
|
9
19
|
self-consistent, the tests pass, and nobody notices that the Android screen
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Progress Line Contract
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Why](#why)
|
|
5
|
+
- [Line shape](#line-shape)
|
|
6
|
+
- [When to emit](#when-to-emit)
|
|
7
|
+
- [Verbosity](#verbosity)
|
|
8
|
+
- [Telemetry](#telemetry)
|
|
9
|
+
- [Phase adoption marker](#phase-adoption-marker)
|
|
10
|
+
- [Cross-CLI parity](#cross-cli-parity)
|
|
11
|
+
<!-- /toc -->
|
|
12
|
+
|
|
3
13
|
> **TLDR** - Every non-trivial pipeline action emits an inline "I'm doing X right now" line so the user always knows what's happening. Immediate flush, no batching. One line per action, standard shape. Autopilot prefers verbose. Low overhead. Mirrored in telemetry as `progress.step` events.
|
|
4
14
|
|
|
5
15
|
This contract is consumed by every phase (0-7) and every dispatched sub-skill (including the marketplace component toolkits when enabled). It is enforced by `smoke-progress-contract.sh` - any phase doc that drops the contract marker or diverges from the line shape fails CI.
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Firebase / Crashlytics Onboarding (setup Step 3c)
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [1. Why there are three ways in](#1-why-there-are-three-ways-in)
|
|
5
|
+
- [2. Tier 1 - the service account](#2-tier-1---the-service-account)
|
|
6
|
+
- [3. Tier 2 - interactive session plus MCP](#3-tier-2---interactive-session-plus-mcp)
|
|
7
|
+
- [4. appId discovery](#4-appid-discovery)
|
|
8
|
+
- [5. v1alpha, and what to do when it breaks](#5-v1alpha-and-what-to-do-when-it-breaks)
|
|
9
|
+
- [6. Skipping](#6-skipping)
|
|
10
|
+
<!-- /toc -->
|
|
11
|
+
|
|
3
12
|
Loaded on demand by `/multi-agent:setup` Step 3c (optional, any platform). The SKILL.md carries the step intro; this file is the full flow.
|
|
4
13
|
|
|
5
14
|
Runs inside Step 3 alongside the other missing credentials. A user who already
|
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
## SwiftUI Component Generation Guide (Generic)
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Component Architecture: Configuration / View / Modifiers](#component-architecture-configuration-view-modifiers)
|
|
5
|
+
- [Simple vs Complex Decision](#simple-vs-complex-decision)
|
|
6
|
+
- [Configuration Purity Rules](#configuration-purity-rules)
|
|
7
|
+
- [Fluent Modifier Pattern](#fluent-modifier-pattern)
|
|
8
|
+
- [Token Discipline](#token-discipline)
|
|
9
|
+
- [Variant-Driven Implementation](#variant-driven-implementation)
|
|
10
|
+
- [Nested Component Handling](#nested-component-handling)
|
|
11
|
+
- [Accessibility Requirements](#accessibility-requirements)
|
|
12
|
+
- [Preview Best Practices](#preview-best-practices)
|
|
13
|
+
- [3-Layer Test Strategy](#3-layer-test-strategy)
|
|
14
|
+
- [Build Verification](#build-verification)
|
|
15
|
+
- [Component Quality Checklist](#component-quality-checklist)
|
|
16
|
+
- [Compliance Rules (maps to multi-agent-toolkit MCP audit tools)](#compliance-rules-maps-to-multi-agent-toolkit-mcp-audit-tools)
|
|
17
|
+
- [Figma URL Given](#figma-url-given)
|
|
18
|
+
<!-- /toc -->
|
|
19
|
+
|
|
3
20
|
> **MUST: Figma MCP-first (BLOCKING).** If the task references any Figma frame (URL, node ID, or "from the design"), the Dev phase MUST call `mcp__claude_ai_Figma__get_design_context` for every frame BEFORE writing a single UI line. Use the `CodeConnectSnippet` component name verbatim - no sound-alike substitutions. Authentication failure is not a skip path. Full rule, trigger conditions, and gate failure modes: `$HOME/.claude/rules/figma-pipeline.md` "MUST: Figma MCP-first (BLOCKING)". Phase wiring: `$HOME/.claude/multi-agent-refs/phases/phase-3-dev.md` "MUST: Figma MCP-first (BLOCKING pre-step)".
|
|
4
21
|
|
|
5
22
|
When the task involves creating a SwiftUI component (any project), follow this architecture.
|
|
@@ -4,6 +4,18 @@ description: "Phase tracker mandatory contract - every mode depends on this. N
|
|
|
4
4
|
|
|
5
5
|
# Phase Tracker - Mandatory Contract
|
|
6
6
|
|
|
7
|
+
<!-- toc -->
|
|
8
|
+
- [Why two channels](#why-two-channels)
|
|
9
|
+
- [Visual channel - chosen by the agent based on the host CLI](#visual-channel---chosen-by-the-agent-based-on-the-host-cli)
|
|
10
|
+
- [Call pattern](#call-pattern)
|
|
11
|
+
- [The plan is part of the list](#the-plan-is-part-of-the-list)
|
|
12
|
+
- [Resume behaviour](#resume-behaviour)
|
|
13
|
+
- [Continuation runs (finish / manual-test)](#continuation-runs-finish-manual-test)
|
|
14
|
+
- [Anti-patterns](#anti-patterns)
|
|
15
|
+
- [Verification](#verification)
|
|
16
|
+
- [Cross-reference](#cross-reference)
|
|
17
|
+
<!-- /toc -->
|
|
18
|
+
|
|
7
19
|
> **TLDR** - At every phase boundary the agent does two things: (1) writes to the state file via `phase-tracker.sh` (identical on every CLI), (2) drives the visual channel for the CLI it's running in - `TaskCreate`/`TaskUpdate` in Claude Code, `phase-tracker.sh render` in every other CLI. The state file alone is not enough; the user must see the phases progress.
|
|
8
20
|
|
|
9
21
|
## Why two channels
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
## Web Development Guide
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Component Architecture](#component-architecture)
|
|
5
|
+
- [React Component Pattern](#react-component-pattern)
|
|
6
|
+
- [State Management](#state-management)
|
|
7
|
+
- [Token Discipline](#token-discipline)
|
|
8
|
+
- [Accessibility](#accessibility)
|
|
9
|
+
- [Testing](#testing)
|
|
10
|
+
- [Quality Checklist](#quality-checklist)
|
|
11
|
+
<!-- /toc -->
|
|
12
|
+
|
|
3
13
|
When the task involves web development (React, Next.js, Vue), follow these patterns.
|
|
4
14
|
|
|
5
15
|
### Component Architecture
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Component Wiki Capture (channels.md Wiki adapter)
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Applicability](#applicability)
|
|
5
|
+
- [Case A - preconditions met (scope multi-select)](#case-a---preconditions-met-scope-multi-select)
|
|
6
|
+
- [Case B - preconditions missing (actionable menu)](#case-b---preconditions-missing-actionable-menu)
|
|
7
|
+
- [Legacy prompt + preference flow (pre-v5.7, still supported for backward compat)](#legacy-prompt-preference-flow-pre-v57-still-supported-for-backward-compat)
|
|
8
|
+
- [Dispatch](#dispatch)
|
|
9
|
+
- [Skip conditions (explicit log lines)](#skip-conditions-explicit-log-lines)
|
|
10
|
+
- [Success log](#success-log)
|
|
11
|
+
- [Cross-CLI parity](#cross-cli-parity)
|
|
12
|
+
<!-- /toc -->
|
|
13
|
+
|
|
3
14
|
> **TLDR** - Component tasks can auto-generate wiki docs + Figma screenshots. The Wiki adapter is invoked from `/multi-agent:channels` (Phase 7 delegates, or user invokes post-hoc). Four layouts supported (`submodule`, `in-repo`, `github-wiki`, `separate-repo`) - adapter picked from `figmaConfig.wiki.mode`. Non-blocking: failures log a warning and channels continues to other adapters. The Wiki adapter supports scope multi-select (Case A) and a precondition-failure menu (Case B) - see below.
|
|
4
15
|
|
|
5
16
|
This doc is referenced from `commands/multi-agent/channels/SKILL.md` (Wiki adapter) and indirectly from `$HOME/.claude/multi-agent-refs/phases/phase-7-report.md` (which delegates all external delivery to channels). Keeping it separate keeps both files under their token budgets and gives the contract a stable location for Claude-side + Copilot-side implementations.
|
|
@@ -1871,6 +1871,10 @@
|
|
|
1871
1871
|
"default": 60,
|
|
1872
1872
|
"description": "Recording cap. A flow needing longer is a debugging session, not a review artefact. Android's `screenrecord` has its own ceiling of 180s that no setting can lift, so capture-evidence.sh clamps to it and says when it did: one preference honoured on one platform and silently halved on the other is worse than a stated limit."
|
|
1873
1873
|
},
|
|
1874
|
+
"webBaseUrl": {
|
|
1875
|
+
"type": "string",
|
|
1876
|
+
"description": "The address a web capture points the browser at. Web is the one evidence platform that needs one: a simulator is already showing something, a dev server has to be pointed at. Absent, `capture-evidence.sh after --platform web` reports a gap with that reason instead of guessing a port. Per-run override: `--url`."
|
|
1877
|
+
},
|
|
1874
1878
|
"githubHost": {
|
|
1875
1879
|
"type": "string",
|
|
1876
1880
|
"enum": ["branch", "off"],
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "Not a JSON Schema: the data the review file filter reads. Lives beside token-budget.json for the same reason - it is a budget-shaped decision the pipeline owns, versioned with the code that consumes it.",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"patterns": [
|
|
5
|
+
{
|
|
6
|
+
"glob": "**/*.generated.*",
|
|
7
|
+
"reason": "generated file - review the generator, not its output"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"glob": "**/Generated/**",
|
|
11
|
+
"reason": "generated tree - review the generator, not its output"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"glob": "**/generated/**",
|
|
15
|
+
"reason": "generated tree - review the generator, not its output"
|
|
16
|
+
},
|
|
17
|
+
{ "glob": "**/*.pb.go", "reason": "generated file - review the generator, not its output" },
|
|
18
|
+
{ "glob": "**/*_pb2.py", "reason": "generated file - review the generator, not its output" },
|
|
19
|
+
|
|
20
|
+
{
|
|
21
|
+
"glob": "**/package-lock.json",
|
|
22
|
+
"reason": "lockfile - resolved by the package manager, not written by hand"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"glob": "**/yarn.lock",
|
|
26
|
+
"reason": "lockfile - resolved by the package manager, not written by hand"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"glob": "**/pnpm-lock.yaml",
|
|
30
|
+
"reason": "lockfile - resolved by the package manager, not written by hand"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"glob": "**/Package.resolved",
|
|
34
|
+
"reason": "lockfile - resolved by the package manager, not written by hand"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"glob": "**/Podfile.lock",
|
|
38
|
+
"reason": "lockfile - resolved by the package manager, not written by hand"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"glob": "**/Gemfile.lock",
|
|
42
|
+
"reason": "lockfile - resolved by the package manager, not written by hand"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"glob": "**/poetry.lock",
|
|
46
|
+
"reason": "lockfile - resolved by the package manager, not written by hand"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"glob": "**/Cargo.lock",
|
|
50
|
+
"reason": "lockfile - resolved by the package manager, not written by hand"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"glob": "**/gradle.lockfile",
|
|
54
|
+
"reason": "lockfile - resolved by the package manager, not written by hand"
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
{
|
|
58
|
+
"glob": "**/__snapshots__/**",
|
|
59
|
+
"reason": "recorded snapshot - the assertion is the test that records it"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"glob": "**/*.snap",
|
|
63
|
+
"reason": "recorded snapshot - the assertion is the test that records it"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"glob": "**/__Snapshots__/**",
|
|
67
|
+
"reason": "recorded snapshot - the assertion is the test that records it"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"glob": "**/ReferenceImages/**",
|
|
71
|
+
"reason": "recorded snapshot - the assertion is the test that records it"
|
|
72
|
+
},
|
|
73
|
+
|
|
74
|
+
{
|
|
75
|
+
"glob": "vendor/**",
|
|
76
|
+
"reason": "vendored third-party source - not ours to change in this diff"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"glob": "**/node_modules/**",
|
|
80
|
+
"reason": "vendored third-party source - not ours to change in this diff"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"glob": "Pods/**",
|
|
84
|
+
"reason": "vendored third-party source - not ours to change in this diff"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"glob": "**/third_party/**",
|
|
88
|
+
"reason": "vendored third-party source - not ours to change in this diff"
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
{
|
|
92
|
+
"glob": "**/*.min.js",
|
|
93
|
+
"reason": "build output - unreadable by design, and the source is elsewhere in the diff"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"glob": "**/*.min.css",
|
|
97
|
+
"reason": "build output - unreadable by design, and the source is elsewhere in the diff"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"glob": "**/*.map",
|
|
101
|
+
"reason": "build output - unreadable by design, and the source is elsewhere in the diff"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"glob": "dist/**",
|
|
105
|
+
"reason": "build output - unreadable by design, and the source is elsewhere in the diff"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"glob": "build/**",
|
|
109
|
+
"reason": "build output - unreadable by design, and the source is elsewhere in the diff"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"glob": ".build/**",
|
|
113
|
+
"reason": "build output - unreadable by design, and the source is elsewhere in the diff"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"glob": "**/DerivedData/**",
|
|
117
|
+
"reason": "build output - unreadable by design, and the source is elsewhere in the diff"
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
{ "glob": "**/*.png", "reason": "binary asset - a text reviewer cannot read it" },
|
|
121
|
+
{ "glob": "**/*.jpg", "reason": "binary asset - a text reviewer cannot read it" },
|
|
122
|
+
{ "glob": "**/*.jpeg", "reason": "binary asset - a text reviewer cannot read it" },
|
|
123
|
+
{ "glob": "**/*.gif", "reason": "binary asset - a text reviewer cannot read it" },
|
|
124
|
+
{ "glob": "**/*.webp", "reason": "binary asset - a text reviewer cannot read it" },
|
|
125
|
+
{ "glob": "**/*.pdf", "reason": "binary asset - a text reviewer cannot read it" },
|
|
126
|
+
{ "glob": "**/*.zip", "reason": "binary asset - a text reviewer cannot read it" },
|
|
127
|
+
{ "glob": "**/*.ipa", "reason": "binary asset - a text reviewer cannot read it" },
|
|
128
|
+
{ "glob": "**/*.apk", "reason": "binary asset - a text reviewer cannot read it" },
|
|
129
|
+
{ "glob": "**/*.aab", "reason": "binary asset - a text reviewer cannot read it" },
|
|
130
|
+
{ "glob": "**/*.mp4", "reason": "binary asset - a text reviewer cannot read it" },
|
|
131
|
+
{ "glob": "**/*.mov", "reason": "binary asset - a text reviewer cannot read it" },
|
|
132
|
+
{ "glob": "**/*.ttf", "reason": "binary asset - a text reviewer cannot read it" },
|
|
133
|
+
{ "glob": "**/*.otf", "reason": "binary asset - a text reviewer cannot read it" },
|
|
134
|
+
{ "glob": "**/*.woff", "reason": "binary asset - a text reviewer cannot read it" },
|
|
135
|
+
{ "glob": "**/*.woff2", "reason": "binary asset - a text reviewer cannot read it" }
|
|
136
|
+
]
|
|
137
|
+
}
|