@mmerterden/multi-agent-pipeline 16.17.1 → 16.18.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 +20 -0
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/review/SKILL.md +10 -9
- package/pipeline/multi-agent-refs/phases/phase-4-review.md +5 -5
- package/pipeline/multi-agent-refs/platform-parity.md +40 -28
- package/pipeline/schemas/prefs.schema.json +38 -22
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +6 -1
package/CHANGELOG.md
CHANGED
|
@@ -16,6 +16,26 @@ Internal file-layout changes that don't affect the slash-command surface are sti
|
|
|
16
16
|
|
|
17
17
|
## [Unreleased]
|
|
18
18
|
|
|
19
|
+
## [16.18.0] - 2026-09-01
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- **The counterpart repo is now found, not asked for.** The parity check shipped needing a human to name the other platform's repo - through the Phase 0 picker, and then through a `--with` flag and a prompt in `review`. That is a question with the same answer on every run of the same project, and a question asked every time is one people learn to dismiss.
|
|
24
|
+
|
|
25
|
+
It now resolves automatically and in both directions, so an Android run looks for the iOS repo exactly as an iOS run looks for the Android one: a remembered `prefs.projects[<slug>].counterpartRoots[]` first, verified before it is trusted (a path that is gone, or whose markers no longer resolve to the mirrored stack, is dropped and re-detected); then the primary checkout's **sibling directories**, one listing of its parent rather than a scan of `$HOME`, because a product's two checkouts sit next to each other; then anything the dev-context picker recorded. Exactly one match is used and written back, so the first run of a project learns the pairing and no later run asks. Several candidates are asked about only in interactive runs; `--with` remains as a one-off override and is remembered like any other answer.
|
|
26
|
+
|
|
27
|
+
**No counterpart, or an unattended run facing several: skipped silently.** No section, no placeholder, no prompt, and the run is otherwise unaffected - which is most projects, and all of autopilot. An unattended run must never block on a picker.
|
|
28
|
+
|
|
29
|
+
Stack still comes from marker files and never from the repo name. `smoke-platform-parity.sh` now asserts the automatic path itself: that prefs declares the learned field, that the contract reads it, that both directions are stated, that the empty case is a silent skip, and that an ambiguous match cannot block an unattended run.
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
|
|
33
|
+
- **The parity cross-check was unreachable from the command called `review`.** 16.17.1 fixed the dead trigger and then documented the remaining gap as a limit: `state.siblings[]` is written by the Phase 0 dev-context picker, so a standalone `/multi-agent:review <PR-URL>` had no siblings and skipped the step. That reads reasonably in a contract and is wrong in use - the standalone command is the one a person actually types when they want a review, and the feature existed only inside a full pipeline run.
|
|
34
|
+
|
|
35
|
+
`/multi-agent:review` now obtains a counterpart the same two ways a human would offer one, and never by guessing: `--with <path|owner/repo>` names it outright and works unattended, and an interactive run with no `--with` asks once using the sibling half of `_dev-context.md`, so "which repos are siblings of this one" keeps one definition instead of two. Autopilot and non-interactive runs without `--with` skip silently, because an unattended run must not block on a picker. Either way the answer is persisted to `state.siblings[]` with its `stack` resolved from marker files, so the parity step reads one field regardless of how the run started.
|
|
36
|
+
|
|
37
|
+
`smoke-platform-parity.sh` gained the checks for it: `--with` is declared in the argument-hint and not only in the body, and all three cases (named, interactive, unattended) are stated. The gap existed because the previous gate proved the documents agreed with each other, and agreeing documents can still describe a feature nobody can reach.
|
|
38
|
+
|
|
19
39
|
## [16.17.1] - 2026-08-31
|
|
20
40
|
|
|
21
41
|
### Fixed
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "16.
|
|
3
|
+
"version": "16.18.0",
|
|
4
4
|
"description": "8-phase AI development pipeline with full orchestration on Claude Code, Copilot CLI and Codex CLI. Analysis, planning, TDD, CLI-aware parallel review with consensus surfacing + Fable triage, default-FAIL evidence gates, secret + intent guards, per-phase cost ledger, persistent learnings memory, wiki generation, commit automation. Token-preserving uninstall.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Run parallel review on a branch's diff or a Pull Request: 3 models on Claude Code (Fable + Opus + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonnet). On PR input, posts per-finding inline comments and sets approve/needs-work review state. Use when a branch diff or a pull request needs reviewing before it merges."
|
|
3
3
|
description-tr: "Bir branch diff'i veya Pull Request üzerinde paralel review koşar: Claude Code'da 3 model (Fable + Opus + Sonnet), Copilot CLI'da 3 model (GPT + Opus + Sonnet). PR girdisinde bulgu başına inline yorum atar ve approve/needs-work durumunu işaretler."
|
|
4
|
-
argument-hint: "[#N | repo#N | PR-URL | branch] - optional: PR by number/URL, repo+number, or local branch. Supports GitHub and Bitbucket Server URLs. If omitted (interactive), open GitHub + Bitbucket PRs are listed for multi-select; autopilot falls back to the current branch."
|
|
4
|
+
argument-hint: "[#N | repo#N | PR-URL | branch] [--with <path|owner/repo>] - optional: PR by number/URL, repo+number, or local branch. Supports GitHub and Bitbucket Server URLs. If omitted (interactive), open GitHub + Bitbucket PRs are listed for multi-select; autopilot falls back to the current branch. --with names the counterpart app repo for the platform-parity cross-check."
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# multi-agent review - Review Only Mode
|
|
@@ -208,16 +208,17 @@ mobile platform and the diff touches a screen, a service, a request model or a
|
|
|
208
208
|
localization file, compare the change against that repo on four axes: endpoints
|
|
209
209
|
called, parameters sent, business rules around the call, localization keys used.
|
|
210
210
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
211
|
+
The counterpart is resolved automatically, in both directions (ios ↔ android):
|
|
212
|
+
a remembered `prefs.projects[<slug>].counterpartRoots[]` first, then the primary
|
|
213
|
+
checkout's sibling directories, then `state.siblings[]`. One match is used and
|
|
214
|
+
remembered, so the next review of the same project asks nothing. `--with
|
|
215
|
+
<path|owner/repo>` overrides all of it for a one-off and is remembered too.
|
|
215
216
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
217
|
+
Several candidates → interactive runs ask once; autopilot and non-interactive
|
|
218
|
+
runs skip silently, because an unattended run must not block on a picker. No
|
|
219
|
+
candidate → skip silently, run unaffected. Stack comes from marker files, and
|
|
220
|
+
you never guess a stack from the repo name.
|
|
219
221
|
|
|
220
|
-
No counterpart repo, or nothing comparable in the diff → skipped silently.
|
|
221
222
|
Contract: `$HOME/.claude/multi-agent-refs/platform-parity.md`.
|
|
222
223
|
|
|
223
224
|
### 5. Triage (Fable)
|
|
@@ -127,11 +127,11 @@ Cost ledger: `phase-4.repo_map_emitted bytes=N budget=B cache_hit=true|false` -
|
|
|
127
127
|
|
|
128
128
|
#### Step 1.8 - Platform parity cross-check (advisory, read-only)
|
|
129
129
|
|
|
130
|
-
Runs
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
130
|
+
Runs when a counterpart app repo resolves AND the diff touches a screen,
|
|
131
|
+
service, request model or localization file. Resolution is automatic and
|
|
132
|
+
mirrored (ios ↔ android); the order and the learned pref live in the contract.
|
|
133
|
+
No counterpart, or an unattended run facing several, skips silently - no
|
|
134
|
+
section, no placeholder, run unaffected.
|
|
135
135
|
|
|
136
136
|
Load `$HOME/.claude/multi-agent-refs/platform-parity.md` and follow it. The
|
|
137
137
|
counterpart repo is **read only**, and parity findings are **never blocking**.
|
|
@@ -15,36 +15,48 @@ it never blocks, never edits, and its silence is never evidence.
|
|
|
15
15
|
|
|
16
16
|
## When it runs
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
The counterpart is **resolved automatically**. Nothing is asked in the normal
|
|
19
|
+
case, because the answer is the same on every run of the same project and a
|
|
20
|
+
question asked every time is a question people learn to dismiss.
|
|
19
21
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
resolved from marker files in the checkout, never from the repo name.
|
|
25
|
-
2. The diff touches something with a counterpart worth checking: a screen, a
|
|
26
|
-
service/repository/use-case, a request model, or a localization file.
|
|
22
|
+
Resolution order, first hit wins. `<slug>` is the primary project's prefs key,
|
|
23
|
+
and `MIRROR` is `android` when the run's stack is `ios`, `ios` when it is
|
|
24
|
+
`android` - the check runs in both directions and neither platform is the
|
|
25
|
+
default one.
|
|
27
26
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
27
|
+
| # | Source | Notes |
|
|
28
|
+
|---|---|---|
|
|
29
|
+
| 1 | `--with <path\|owner/repo>` (`/multi-agent:review` only) | An explicit override for a one-off. Remembered like any other resolution. |
|
|
30
|
+
| 2 | `prefs.projects[<slug>].counterpartRoots[]` | What a previous run learned. Verified before use: the path must still exist and its markers must still resolve to `MIRROR`, otherwise the entry is dropped and detection continues at 3. A remembered answer that has gone stale is worse than none. |
|
|
31
|
+
| 3 | Sibling checkouts of the primary repo | List the primary checkout's **parent directory**, depth 1, keep the git repos, resolve each one's stack from its marker files. This matches how the repos are actually laid out - a product's iOS and Android checkouts sit next to each other - and it is one directory listing, not a scan of `$HOME`. |
|
|
32
|
+
| 4 | `state.siblings[]` | Anything the Phase 0 dev-context picker recorded, in case the counterpart is a submodule or a repo the user selected by hand. |
|
|
33
|
+
|
|
34
|
+
Then:
|
|
35
|
+
|
|
36
|
+
- **Exactly one candidate resolves to `MIRROR`** → use it, write it to
|
|
37
|
+
`counterpartRoots[]`, and say which repo was picked in the section header.
|
|
38
|
+
No question, this run or any later one.
|
|
39
|
+
- **More than one** → interactive runs ask once, and remember the answer;
|
|
40
|
+
**autopilot and non-interactive runs skip** and record why. An unattended run
|
|
41
|
+
must not block on a picker, and picking one of several by guessing is how a
|
|
42
|
+
cross-repo reader ends up at the wrong tree.
|
|
43
|
+
- **None** → skip silently. No section, no placeholder, no prompt, and the run
|
|
44
|
+
is otherwise unaffected. A project with no counterpart repo - most projects -
|
|
45
|
+
never sees this feature exist.
|
|
46
|
+
|
|
47
|
+
Stack comes from marker files (`.xcodeproj` / `Package.swift` → `ios`,
|
|
48
|
+
`build.gradle(.kts)` → `android`), the same table Phase 1 Step 2 owns.
|
|
49
|
+
Never guess a stack from the repo name: `my-app-android` is a naming
|
|
50
|
+
convention, not a marker, and a wrong stack sends a cross-repo reader at the
|
|
51
|
+
wrong tree.
|
|
52
|
+
|
|
53
|
+
The second condition is the diff: it has to touch something with a counterpart
|
|
54
|
+
worth checking - a screen, a service/repository/use-case, a request model, or a
|
|
55
|
+
localization file. Otherwise the step is skipped even when a counterpart exists.
|
|
56
|
+
|
|
57
|
+
Nothing is ever cloned. A counterpart that is not checked out locally is
|
|
58
|
+
skipped: cloning a repository in order to review a different one is a side
|
|
59
|
+
effect nobody asked for.
|
|
48
60
|
|
|
49
61
|
## Read-only, without exception
|
|
50
62
|
|
|
@@ -365,7 +365,7 @@
|
|
|
365
365
|
},
|
|
366
366
|
"multiRepoIntegrationHosts": {
|
|
367
367
|
"type": "array",
|
|
368
|
-
"description": "v5.6.0+. Learn-once registry of host projects that build together with a multi-repo combo (codegen producer
|
|
368
|
+
"description": "v5.6.0+. Learn-once registry of host projects that build together with a multi-repo combo (codegen producer → consumer + host integration project). Pipeline checks this registry in Phase 6 before commit; on match, auto-runs the host build. On miss for a ≥2-repo task, prompts the user once and persists the answer. See refs/multi-repo-integration-build.md for the full contract.",
|
|
369
369
|
"items": {
|
|
370
370
|
"type": "object",
|
|
371
371
|
"additionalProperties": false,
|
|
@@ -642,7 +642,9 @@
|
|
|
642
642
|
},
|
|
643
643
|
"versionIds": {
|
|
644
644
|
"type": "array",
|
|
645
|
-
"items": {
|
|
645
|
+
"items": {
|
|
646
|
+
"type": "string"
|
|
647
|
+
},
|
|
646
648
|
"default": [],
|
|
647
649
|
"description": "SSC project version ids, searched in order. Used when a ticket names an issue instance id but no SSC URL (fetch-fortify.sh --instance-id), and by alwaysCheck. Ids are strings because SSC returns them as strings in some deployments."
|
|
648
650
|
}
|
|
@@ -651,12 +653,12 @@
|
|
|
651
653
|
"reportChannels": {
|
|
652
654
|
"type": "object",
|
|
653
655
|
"additionalProperties": false,
|
|
654
|
-
"description": "v5.7+ - Phase 7 / /multi-agent:channels kanal
|
|
656
|
+
"description": "v5.7+ - Phase 7 / /multi-agent:channels kanal seçimi default'ları. Multi-select menüde tick'li gelecek kanallar. Her kanal bağımsız boolean. Autopilot Phase 7'de ALWAYS pauses (30-min timeout) - bu değerler sadece menünün önceden seçili halini belirler.",
|
|
655
657
|
"properties": {
|
|
656
658
|
"pr": {
|
|
657
659
|
"type": "boolean",
|
|
658
660
|
"default": true,
|
|
659
|
-
"description": "PR description update (replace/append). Default ON - en
|
|
661
|
+
"description": "PR description update (replace/append). Default ON - en yaygın kanal."
|
|
660
662
|
},
|
|
661
663
|
"jira": {
|
|
662
664
|
"type": "boolean",
|
|
@@ -666,12 +668,12 @@
|
|
|
666
668
|
"confluence": {
|
|
667
669
|
"type": "boolean",
|
|
668
670
|
"default": false,
|
|
669
|
-
"description": "Confluence page creation. Default OFF - bir kez parent page
|
|
671
|
+
"description": "Confluence page creation. Default OFF - bir kez parent page seçince LRU'dan öner."
|
|
670
672
|
},
|
|
671
673
|
"wiki": {
|
|
672
674
|
"type": "boolean",
|
|
673
675
|
"default": false,
|
|
674
|
-
"description": "Component wiki pages (Case A scope multi-select). Default OFF - taskType=component + figmaConfig.wiki.enabled gerekli, yoksa
|
|
676
|
+
"description": "Component wiki pages (Case A scope multi-select). Default OFF - taskType=component + figmaConfig.wiki.enabled gerekli, yoksa menüde greyed out."
|
|
675
677
|
}
|
|
676
678
|
},
|
|
677
679
|
"default": {
|
|
@@ -684,32 +686,32 @@
|
|
|
684
686
|
"reportContent": {
|
|
685
687
|
"type": "object",
|
|
686
688
|
"additionalProperties": false,
|
|
687
|
-
"description": "v5.7+ - Phase 7 / /multi-agent:channels
|
|
689
|
+
"description": "v5.7+ - Phase 7 / /multi-agent:channels içerik seçimi default'ları. Multi-select menüde tick'li gelecek content source'ları.",
|
|
688
690
|
"properties": {
|
|
689
691
|
"normalAnalysis": {
|
|
690
692
|
"type": "boolean",
|
|
691
693
|
"default": true,
|
|
692
|
-
"description": "Phase 1+2+4 pipeline log'undan impact summary + risks + architectural decisions (
|
|
694
|
+
"description": "Phase 1+2+4 pipeline log'undan impact summary + risks + architectural decisions (yüksek seviye). Greyed out post-hoc çağrıda pipeline log yoksa."
|
|
693
695
|
},
|
|
694
696
|
"technicalAnalysis": {
|
|
695
697
|
"type": "boolean",
|
|
696
698
|
"default": false,
|
|
697
|
-
"description": "Changes (
|
|
699
|
+
"description": "Changes (değişen dosyalar gruplanıp ne/neden), Architecture (structural decisions), Dependencies (yeni import/framework/paket). PR body'deki 'Technical Details' bölümünün özeti; user'ın kanal seçimi PR içermediği durumlarda (ör. sadece Jira/Confluence) teknik içerik aktarmak istiyorsa devreye girer. Source: Phase 2 planning + Phase 3 dev log + PR diff stat."
|
|
698
700
|
},
|
|
699
701
|
"testScenarios": {
|
|
700
702
|
"type": "boolean",
|
|
701
703
|
"default": true,
|
|
702
|
-
"description": "Precondition / steps / expected tablosu (4-8
|
|
704
|
+
"description": "Precondition / steps / expected tablosu (4-8 satır, user perspective). Pipeline log source."
|
|
703
705
|
},
|
|
704
706
|
"autoDiff": {
|
|
705
707
|
"type": "boolean",
|
|
706
708
|
"default": false,
|
|
707
|
-
"description": "PR diff'ten auto-generate
|
|
709
|
+
"description": "PR diff'ten auto-generate özet (eski enrich behavior - root cause / solution / changed files / test scenarios). PR linked değilse greyed out."
|
|
708
710
|
},
|
|
709
711
|
"manualNote": {
|
|
710
712
|
"type": "boolean",
|
|
711
713
|
"default": false,
|
|
712
|
-
"description": "Serbest metin paragraf (--message / --message-file). Her durumda
|
|
714
|
+
"description": "Serbest metin paragraf (--message / --message-file). Her durumda seçilebilir."
|
|
713
715
|
},
|
|
714
716
|
"costSummary": {
|
|
715
717
|
"type": "boolean",
|
|
@@ -719,7 +721,7 @@
|
|
|
719
721
|
"workSummary": {
|
|
720
722
|
"type": "boolean",
|
|
721
723
|
"default": false,
|
|
722
|
-
"description": "v7.1.0+ - Executive 'Work Done' summary block. Distills the whole pipeline run into a single-screen section: task + branch + base + PR number, scope delivered (
|
|
724
|
+
"description": "v7.1.0+ - Executive 'Work Done' summary block. Distills the whole pipeline run into a single-screen section: task + branch + base + PR number, scope delivered (✅/⏳ per Phase 2 task), changed files with +/- counts (capped at 20 rows), review outcome (accepted/deferred/rejected counts + approved flag), and a one-line phase tick strip (0 Init ✅ · 1 Analysis ✅ · ...). Source: `agent-state.json` + `phase-tracker.json` + `git diff --numstat` between `baseBranch`...HEAD. Consumed by `render-work-summary.sh`. Greyed out if no state file exists for the task. Opt-in - off by default so baseline PR body stays unchanged."
|
|
723
725
|
}
|
|
724
726
|
},
|
|
725
727
|
"default": {
|
|
@@ -737,7 +739,7 @@
|
|
|
737
739
|
"default": 1800,
|
|
738
740
|
"minimum": 60,
|
|
739
741
|
"maximum": 7200,
|
|
740
|
-
"description": "v5.7+ - Phase 7'de autopilot always-pause
|
|
742
|
+
"description": "v5.7+ - Phase 7'de autopilot always-pause menüsünde kullanıcı cevap vermezse session'ı sonlandırma süresi (saniye). Default 1800 (30 dk). Timeout'ta external delivery aborted, internal capture (agent-log, telemetry, knowledge) yine çalışır, session /multi-agent:resume ile devam ettirilebilir."
|
|
741
743
|
},
|
|
742
744
|
"wikiScope": {
|
|
743
745
|
"type": "array",
|
|
@@ -746,7 +748,7 @@
|
|
|
746
748
|
"enum": ["main", "ios", "screenshots", "index"]
|
|
747
749
|
},
|
|
748
750
|
"default": ["main", "ios", "screenshots", "index"],
|
|
749
|
-
"description": "v5.7+ - Wiki Case A scope multi-select default'u. Component wiki dispatch'inde hangi artifact'lar
|
|
751
|
+
"description": "v5.7+ - Wiki Case A scope multi-select default'u. Component wiki dispatch'inde hangi artifact'lar yazılacak: main (ana component sayfası), ios (iOS sub-page), screenshots (assets/ klasörü), index (_Sidebar.md + ComponentImplementationStatus.md). Legacy wikiDefault=true → [main,ios,screenshots,index] migration; wikiDefault=false → [] (empty array = Wiki adapter Case B menüsüne düşer)."
|
|
750
752
|
},
|
|
751
753
|
"autoJiraFromGithubIssue": {
|
|
752
754
|
"type": "string",
|
|
@@ -829,7 +831,7 @@
|
|
|
829
831
|
"reviewDisagreementRound": {
|
|
830
832
|
"type": "boolean",
|
|
831
833
|
"default": false,
|
|
832
|
-
"description": "v6.1.0+ - Phase 4 Step 2.5 rebuttal round. When reviewers disagree (mixed blocker/approved verdict), each reviewer is re-prompted with the others' opposing arguments for one additional round before triage. Lifts signal quality on ambiguous findings at ~1
|
|
834
|
+
"description": "v6.1.0+ - Phase 4 Step 2.5 rebuttal round. When reviewers disagree (mixed blocker/approved verdict), each reviewer is re-prompted with the others' opposing arguments for one additional round before triage. Lifts signal quality on ambiguous findings at ~1× Step 2 token cost. Off by default - flip for security-critical or release-branch reviews."
|
|
833
835
|
},
|
|
834
836
|
"analysisProfiles": {
|
|
835
837
|
"type": "array",
|
|
@@ -998,7 +1000,7 @@
|
|
|
998
1000
|
"minimum": 0,
|
|
999
1001
|
"maximum": 10,
|
|
1000
1002
|
"default": 6,
|
|
1001
|
-
"description": "Clarity threshold. Score
|
|
1003
|
+
"description": "Clarity threshold. Score ≥ threshold → proceed silently. Below → questions fire. 6 is the borderline 'the what is clear but the how is fuzzy' line."
|
|
1002
1004
|
},
|
|
1003
1005
|
"maxQuestions": {
|
|
1004
1006
|
"type": "integer",
|
|
@@ -1119,13 +1121,19 @@
|
|
|
1119
1121
|
"properties": {
|
|
1120
1122
|
"evidence": {
|
|
1121
1123
|
"type": "array",
|
|
1122
|
-
"items": {
|
|
1124
|
+
"items": {
|
|
1125
|
+
"type": "string",
|
|
1126
|
+
"enum": ["github", "registry"]
|
|
1127
|
+
},
|
|
1123
1128
|
"default": ["github", "registry"],
|
|
1124
1129
|
"description": "Citable sources. github reads issues, PRs and releases through the already-authenticated gh CLI; registry reads npm, PyPI, Maven Central and SPM over keyless HTTP."
|
|
1125
1130
|
},
|
|
1126
1131
|
"signals": {
|
|
1127
1132
|
"type": "array",
|
|
1128
|
-
"items": {
|
|
1133
|
+
"items": {
|
|
1134
|
+
"type": "string",
|
|
1135
|
+
"enum": ["stackoverflow", "hackernews"]
|
|
1136
|
+
},
|
|
1129
1137
|
"default": ["stackoverflow", "hackernews"],
|
|
1130
1138
|
"description": "Advisory sources reachable without a key. Hacker News search goes through hn.algolia.com because the official Firebase API has no search endpoint."
|
|
1131
1139
|
},
|
|
@@ -1160,7 +1168,7 @@
|
|
|
1160
1168
|
"minimum": 30,
|
|
1161
1169
|
"maximum": 86400,
|
|
1162
1170
|
"default": 300,
|
|
1163
|
-
"description": "Polling interval for --watch loop. Clamped to
|
|
1171
|
+
"description": "Polling interval for --watch loop. Clamped to ≥30s to stay polite with GitHub rate limits."
|
|
1164
1172
|
},
|
|
1165
1173
|
"labelFilter": {
|
|
1166
1174
|
"type": "string",
|
|
@@ -1236,7 +1244,7 @@
|
|
|
1236
1244
|
"devCritic": {
|
|
1237
1245
|
"type": "object",
|
|
1238
1246
|
"additionalProperties": false,
|
|
1239
|
-
"description": "v8.6+ - Phase 3.5 evaluator-optimizer. After the Dev generator's last edit and BEFORE Phase 4 reviewers, dispatch agents/dev-critic.md (Sonnet by default) to run deterministic gates (build/lint/test/secrets) + the platform checklist (rules/*.md). Max 2 critic iterations, then escalate. Catches gate failures and checklist violations that would otherwise burn 2-3 Phase 4 reviewer calls + Opus triage. Off by default - introduces 1
|
|
1247
|
+
"description": "v8.6+ - Phase 3.5 evaluator-optimizer. After the Dev generator's last edit and BEFORE Phase 4 reviewers, dispatch agents/dev-critic.md (Sonnet by default) to run deterministic gates (build/lint/test/secrets) + the platform checklist (rules/*.md). Max 2 critic iterations, then escalate. Catches gate failures and checklist violations that would otherwise burn 2-3 Phase 4 reviewer calls + Opus triage. Off by default - introduces 1× Sonnet call per Dev iteration; flip on for feature work, security-touching paths, or multi-file refactors. Source: Anthropic 'Building Effective Agents' (Dec 2024) evaluator-optimizer pattern.",
|
|
1240
1248
|
"properties": {
|
|
1241
1249
|
"enabled": {
|
|
1242
1250
|
"type": "boolean",
|
|
@@ -1451,7 +1459,7 @@
|
|
|
1451
1459
|
"autopilotSafetyGate": {
|
|
1452
1460
|
"type": "boolean",
|
|
1453
1461
|
"default": true,
|
|
1454
|
-
"description": "v7.0.0+ - Phase 2 autopilot safety classifier. Before autopilot mode consumes the user's approval skip, run `classify-plan-safety.mjs` over the approved plan. If the heuristic score
|
|
1462
|
+
"description": "v7.0.0+ - Phase 2 autopilot safety classifier. Before autopilot mode consumes the user's approval skip, run `classify-plan-safety.mjs` over the approved plan. If the heuristic score ≥ 50 (e.g. >15 files touched, or security-path touch, or delete-without-test, or schema migration) inject a ONE-TIME pause asking for explicit manual approval - even in autopilot. Default ON because the risk of skipping this gate is asymmetric: a pause on a high-blast-radius plan costs seconds; a silent auto-merge of a bad one costs hours of rollback. Flip to `false` only for tightly-scoped autopilot workflows (e.g. batch figma component iteration) where the task class is known-safe."
|
|
1455
1463
|
},
|
|
1456
1464
|
"dynamicSkillLoading": {
|
|
1457
1465
|
"type": "boolean",
|
|
@@ -1790,6 +1798,14 @@
|
|
|
1790
1798
|
"description": "Provider (team) public ID, required by altool when the account belongs to several providers. Resolve once with ios_testflight_validate({list_providers:true}); without it altool fails opaquely."
|
|
1791
1799
|
}
|
|
1792
1800
|
}
|
|
1801
|
+
},
|
|
1802
|
+
"counterpartRoots": {
|
|
1803
|
+
"type": "array",
|
|
1804
|
+
"items": {
|
|
1805
|
+
"type": "string"
|
|
1806
|
+
},
|
|
1807
|
+
"maxItems": 4,
|
|
1808
|
+
"description": "Absolute local paths of this project's counterpart app repo - the same product on the other mobile platform. Read by Phase 4's platform-parity cross-check. Learned, not configured: the first run that resolves a counterpart writes it here and every later run reuses it without asking. An entry whose path is gone, or whose marker files no longer resolve to the mirrored stack, is dropped and re-detected rather than trusted. Same shape as webRoots."
|
|
1793
1809
|
}
|
|
1794
1810
|
}
|
|
1795
1811
|
}
|
|
@@ -60,7 +60,12 @@ Skip Phase 0-3 and review a diff only. Input shapes: a PR (`#N`, `repo#N`, GitHu
|
|
|
60
60
|
the other mobile platform and the diff touches a screen, a service, a request model
|
|
61
61
|
or a localization file, compare the change against that repo on four axes: endpoints
|
|
62
62
|
called, parameters sent, business rules around the call, localization keys used.
|
|
63
|
-
|
|
63
|
+
The counterpart is resolved automatically and in both directions (ios ↔ android):
|
|
64
|
+
a remembered `prefs.projects[<slug>].counterpartRoots[]`, then the primary checkout's
|
|
65
|
+
sibling directories, then `state.siblings[]`. One match is used and remembered;
|
|
66
|
+
several are asked about interactively and skipped in autopilot; none skips silently.
|
|
67
|
+
`--with <path|owner/repo>` overrides for a one-off. Stack comes from marker files,
|
|
68
|
+
never from the repo name.
|
|
64
69
|
|
|
65
70
|
The counterpart is located through the code graph, capped at 8 files, and is **read
|
|
66
71
|
only** - never edited, staged, committed, pushed or built. Output is its own
|