@mmerterden/multi-agent-pipeline 20.37.0 → 20.37.1
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/docs/facts.json +2 -2
- package/docs/features.md +1 -1
- package/docs/recovery-guide.md +1 -1
- package/install/catalog-history.json +1 -1
- package/manifest.json +40 -35
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/manual-test/SKILL.md +12 -7
- package/pipeline/multi-agent-refs/audit-guide.md +20 -0
- package/pipeline/multi-agent-refs/features/commit-multi-repo.md +63 -0
- package/pipeline/multi-agent-refs/features/dev-multi-repo.md +51 -0
- package/pipeline/multi-agent-refs/features/test-gap.md +40 -0
- package/pipeline/multi-agent-refs/features/worktree-finalize.md +1 -1
- package/pipeline/multi-agent-refs/orchestrator/phase-3-user-test.md +12 -9
- package/pipeline/multi-agent-refs/phases/phase-1-plan.md +4 -4
- package/pipeline/multi-agent-refs/phases/phase-2-dev.md +8 -47
- package/pipeline/multi-agent-refs/phases/phase-3-review.md +21 -65
- package/pipeline/multi-agent-refs/phases/phase-4-commit.md +9 -59
- package/pipeline/multi-agent-refs/phases/phase-5-report.md +0 -31
- package/pipeline/multi-agent-refs/rules.md +1 -1
- package/pipeline/office/index.html +6 -3
- package/pipeline/office/toolkit.json +1 -1
- package/pipeline/rules/figma-pipeline.md +6 -3
- package/pipeline/schemas/prefs.schema.json +1 -1
- package/pipeline/scripts/_memory-policy.mjs +27 -5
- package/pipeline/scripts/checkpoint-fold.sh +59 -0
- package/pipeline/scripts/gate-ledger.mjs +1 -1
- package/pipeline/scripts/office-control.mjs +41 -15
- package/pipeline/scripts/offload-ref.sh +1 -1
- package/pipeline/scripts/rework-rulings.mjs +5 -3
- package/pipeline/scripts/scope-check-gate.mjs +15 -2
- package/pipeline/scripts/user-test-handoff.sh +203 -0
- package/pipeline/scripts/validate-planning.mjs +5 -3
- package/pipeline/scripts/validate-triage.mjs +2 -1
- package/pipeline/scripts/write-state.mjs +13 -4
- package/pipeline/skills/.skill-manifest.json +2 -2
- package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +12 -7
package/manifest.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "20.37.
|
|
4
|
-
"commit": "
|
|
5
|
-
"generatedAt": "2026-10-
|
|
3
|
+
"version": "20.37.1",
|
|
4
|
+
"commit": "d2e043c7a71fcaa0eb0088ee5b90911dc0203741",
|
|
5
|
+
"generatedAt": "2026-10-31T21:24:18.969Z",
|
|
6
6
|
"algorithm": "sha256",
|
|
7
|
-
"fileCount":
|
|
7
|
+
"fileCount": 1711,
|
|
8
8
|
"files": {
|
|
9
|
-
"CHANGELOG.md": "
|
|
9
|
+
"CHANGELOG.md": "657461e1677e4938d9cc4ea656a22ebd761c9fe7119693b8826eb415f02908c7",
|
|
10
10
|
"LICENSE": "8d8c51aaf1e1538b180c69965fa038db71be86798cc3e26a143bebfefe16a43e",
|
|
11
11
|
"README.md": "1fcdb02a967cf565148fe15996db7111c2ae3cf47bedd156fa7c7b18480c7318",
|
|
12
12
|
"README.tr.md": "078d20b24d887be0e027579323d342f8ec561597cae2b37b8e23c90e60a41b3b",
|
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
"docs/best-practices.md": "f8b75b0d38b5896a6a852bb30a1edddeb24dab8b5b7b1d9313290e1241c72024",
|
|
36
36
|
"docs/ecosystem.md": "c5fb0962faf8cc06d4b99e8e7c13e6da6475983bcb53336770c2b4b725926d78",
|
|
37
37
|
"docs/engineering.md": "550528cd47c7d2c921729c68d0782a00ac8e77a4bdfec479f6749f9c3235d188",
|
|
38
|
-
"docs/facts.json": "
|
|
39
|
-
"docs/features.md": "
|
|
38
|
+
"docs/facts.json": "286e4c873a2715937d2432f8c0005d596ff05f0c5c41412b5259f21010462c72",
|
|
39
|
+
"docs/features.md": "1153bcd245fa26a5ffa93a9022ba2b3f05234cc35019ff11cff20bc7c7077e15",
|
|
40
40
|
"docs/performance.md": "bbf2f3922c25dcba0c1a9e69ef420e3871a729af5b35009a49b48a5d3c5cd151",
|
|
41
|
-
"docs/recovery-guide.md": "
|
|
41
|
+
"docs/recovery-guide.md": "23595353417fb990c225e35978ff6a764002bd6bcd81859ebae4e01e8a7824f8",
|
|
42
42
|
"docs/server-readiness.md": "ea21eee6a08c6fc0f2d1da8058acd5a50c556cea486d3acfe48fc0b23f4581fc",
|
|
43
43
|
"index.js": "d5f2975c8e8bd73ad91c85eaf338b3600c39cb1b87a454fcc93d20de7af7eff5",
|
|
44
44
|
"install.js": "b2d71a926a62c96c994c76735f40dff068c429b5a368005fb62e60972da41c2a",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"install/_unattended-profile.mjs": "80125806da173f3b596e049f1a358e37fedf79d682e0277ae1faec2fee9ef499",
|
|
55
55
|
"install/_usage-lifecycle.mjs": "4b010c4e75d6f8e13b58d80a93cc9407f42ccde781c9ed12dcb8e7faf05e526c",
|
|
56
56
|
"install/_xcode-skills.mjs": "1a7e20f1e6743324b941c5d3ecac9f94c65fff1534ffd9c63b39cbea4f8d101a",
|
|
57
|
-
"install/catalog-history.json": "
|
|
57
|
+
"install/catalog-history.json": "11d19487981533ceeb927751e03ab4f2bc4d1f41c68514b7233f586c0628deb3",
|
|
58
58
|
"install/claude.mjs": "c85300268d02cf7c27a88d53188e6a3646b4f09bdb476556eada5b68eeac2b5e",
|
|
59
59
|
"install/codex.mjs": "06f13970c28d446945be1a2a20ef6afcea8d5e43740c4a00a1d044d8a4285114",
|
|
60
60
|
"install/copilot.mjs": "335ad19e9e216dbcad3024b8931ed6e0b84baba3c5b3a4b37e15c7dd19a1edb5",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"install/templates/multi-agent-autopilot-awake.plist.template": "ddd25c76c56fcbb38a89de8e35637372d70ace993d6bc487a88ca9cfb702fe1f",
|
|
67
67
|
"install/templates/multi-agent-autopilot.plist.template": "122c8a61cd927edd99375d6e3da40f1d42bcceed5b6641785c8b28bb930bc77e",
|
|
68
68
|
"install/unattended-profile-legacy.json": "f52e86b998956f09ad306b1735a6c10b58580d7082d8a55665a4c6bb15c3aa1f",
|
|
69
|
-
"package.json": "
|
|
69
|
+
"package.json": "43b6d5e85b2712ca995be3abf1dcee60c8140b8967d9260e1d8e1b529378bbb0",
|
|
70
70
|
"pipeline/agents/android-architect.md": "11fb74543cb0ebcf9525ca6654fe95d53da7229e0bf4a1149b31fd9005abc453",
|
|
71
71
|
"pipeline/agents/backend-architect.md": "b02a606c301e4714131aed70ae6d16eeb77fbc819a001e2752cff2488d4246de",
|
|
72
72
|
"pipeline/agents/bulk-reader.md": "5619d5fb3dee26da7b4c5b1f55d22584c9404e350c221d13bc25a70d88f75f8c",
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
"pipeline/commands/multi-agent/kill/SKILL.md": "bcc6919f95547ac6bcdb302bf6607a65c215b0f58fac387ad03f888e9d4c55ef",
|
|
111
111
|
"pipeline/commands/multi-agent/language/SKILL.md": "2a688cf7e8924c01d8157ce5603f4a70b4ede126e3474900f66a2319889f751b",
|
|
112
112
|
"pipeline/commands/multi-agent/log/SKILL.md": "033bafcf4c9b8d117a892f50a3039fd11d753b4db070ed14c50e8388613482fa",
|
|
113
|
-
"pipeline/commands/multi-agent/manual-test/SKILL.md": "
|
|
113
|
+
"pipeline/commands/multi-agent/manual-test/SKILL.md": "acef044ffe5951894b215c27056871c4ddef985921630fbf1e8d6538b21031f4",
|
|
114
114
|
"pipeline/commands/multi-agent/model/SKILL.md": "98cf3a439f79566504086ef2a1b95d5d6a6368b56edeb8c7868a56b06a6ce441",
|
|
115
115
|
"pipeline/commands/multi-agent/office-off/SKILL.md": "0a23c1db500c84b75e93813ff51e67a22bc61e367d6970cd5e5e47a69ff6450c",
|
|
116
116
|
"pipeline/commands/multi-agent/office-on/SKILL.md": "066b5859492ddd52b1fb8de3abcb3a7f745786fd8245b1a5930c2c8f10ed67b2",
|
|
@@ -280,7 +280,7 @@
|
|
|
280
280
|
"pipeline/multi-agent-refs/analysis/review.md": "b8ca0c9370368dcd463bf81396e3f4c3c1ea8fb07ae6917935c2330086393d65",
|
|
281
281
|
"pipeline/multi-agent-refs/analysis/synthesis.md": "c2e9d80de6a37571fa45997d205bbbf2b4dc2828c82800c9167dfa511f8b024a",
|
|
282
282
|
"pipeline/multi-agent-refs/android-guide.md": "826ad836028ef1f0bd32110999e78b438dbf0808304367a58a2b45cdeb659bb5",
|
|
283
|
-
"pipeline/multi-agent-refs/audit-guide.md": "
|
|
283
|
+
"pipeline/multi-agent-refs/audit-guide.md": "8f36f0c93223b783a327c4db311d8b47e1b7333b5a33a4e1f0e9e646facb86f0",
|
|
284
284
|
"pipeline/multi-agent-refs/autopilot-on/details.md": "c38ddcdf18136d98c7bae5ce44e87ea015b99e7b2d9e262b8e49afff2c241f69",
|
|
285
285
|
"pipeline/multi-agent-refs/backend-guide.md": "b8809b06f7feea6a13f9b433a2b9828e39c81ef3ab59edd23c61cf183d80f7b0",
|
|
286
286
|
"pipeline/multi-agent-refs/channels/board.md": "895edfd4a26f7f5fbe13f0eb5865d30975ed86ee3dbd4bd3bd12340f48001fcb",
|
|
@@ -322,10 +322,12 @@
|
|
|
322
322
|
"pipeline/multi-agent-refs/features/base-branch-evidence.md": "7b875d61cf11ecc9119b440037be0e849931b0c00f4c102640590f7e59e1646b",
|
|
323
323
|
"pipeline/multi-agent-refs/features/code-graph.md": "cb9f2f34aed3fc5d4ae8dedfad403fe202038917fe182be20ae6e652397d0777",
|
|
324
324
|
"pipeline/multi-agent-refs/features/code-intelligence.md": "f115b9e983d8617e64208326a3c858b59b6c5e960caaf35f97ac13b16bfc4c59",
|
|
325
|
+
"pipeline/multi-agent-refs/features/commit-multi-repo.md": "0452e52f8ec57e07fe2a2a1e0775852e63d7ec4ea75d61dc679121c73c52df47",
|
|
325
326
|
"pipeline/multi-agent-refs/features/constitution.md": "2144d1b35ac42a6d64edc292440c9dacdf70c86d190874566e1db9a02244bd77",
|
|
326
327
|
"pipeline/multi-agent-refs/features/cost-analysis.md": "382eacef66efa8aa3ec4a2b01e235c5673b26333bbc8974df5a09694f1e5d7f3",
|
|
327
328
|
"pipeline/multi-agent-refs/features/design-conformance.md": "a88ca595827cafa0c87c2facfcf9190dac69485e0596e5c198c6fc1613880452",
|
|
328
329
|
"pipeline/multi-agent-refs/features/dev-critic.md": "08e01edef04b5ac216f8f43332126966d33da7b95625e47a8a6cd8ac105b263f",
|
|
330
|
+
"pipeline/multi-agent-refs/features/dev-multi-repo.md": "9abfc0407cb72d06497cf3425097c1abaebfe19afeccf29528060160e01119f1",
|
|
329
331
|
"pipeline/multi-agent-refs/features/doctor.md": "475de4941be738fb2036873f6126040373f4604b307743d92318d3d35fe43128",
|
|
330
332
|
"pipeline/multi-agent-refs/features/exploratory-testing.md": "ac534fdb9e056b1a3782f9b9e38f0b8823f85e03cb85924513079179e318c45d",
|
|
331
333
|
"pipeline/multi-agent-refs/features/external-context-injection.md": "be9a0e904efd52535fa18a254567c9d0c3fc2ed12fcbc7a116f7879048303df6",
|
|
@@ -361,6 +363,7 @@
|
|
|
361
363
|
"pipeline/multi-agent-refs/features/stack-adapters.md": "71e23385da872ceed35263f4838f154800aa2da55bb6688ccca74726b70a3ef5",
|
|
362
364
|
"pipeline/multi-agent-refs/features/stack-skill-routing.md": "1989f7f64be6c5ee0a42d8e9962aead7cd7472d795915ab953d89d9382f317e6",
|
|
363
365
|
"pipeline/multi-agent-refs/features/test-classification.md": "29f2e6e07e84d004318ccfa54c7354e51801b34ffab92c499c125c9dccc98fd8",
|
|
366
|
+
"pipeline/multi-agent-refs/features/test-gap.md": "a5c2da90840c74b56e859809919cf9f8282d6a2605a5989ff2bc46167090eb8c",
|
|
364
367
|
"pipeline/multi-agent-refs/features/unattended-gates.md": "46b516cac81a4eacf5d58bc3b1613e2266c26f1559be8dac060d1dc6b7d7ca01",
|
|
365
368
|
"pipeline/multi-agent-refs/features/unattended-security.md": "fdd3756249c0f545f2eb4a2f95a0a4d086824fea5670718207ab4ef4e0adfc66",
|
|
366
369
|
"pipeline/multi-agent-refs/features/url-enrichment.md": "14c6fcadd31cecf85011d936021a2103d87d37f618a0aab07c693be63aeae210",
|
|
@@ -369,7 +372,7 @@
|
|
|
369
372
|
"pipeline/multi-agent-refs/features/verify-by-test.md": "7ad889b3d84f5594b2950fb8385b27089280777275c31f89cd82f0de55b62a92",
|
|
370
373
|
"pipeline/multi-agent-refs/features/verify.md": "1a6db5e7239eac01e51100353013abd16bf785a7fce88b40139fca27f4166be4",
|
|
371
374
|
"pipeline/multi-agent-refs/features/visual-evidence.md": "b7154dfe41f5069ad74883c73d04a4f7e5431c7e654151ab041b2981cd4ab134",
|
|
372
|
-
"pipeline/multi-agent-refs/features/worktree-finalize.md": "
|
|
375
|
+
"pipeline/multi-agent-refs/features/worktree-finalize.md": "7895176353aa499c14e677618ec970cd1ee48214440e2101e486703fa1ca9ccf",
|
|
373
376
|
"pipeline/multi-agent-refs/garbage-collect/phases.md": "f5a2847546266ac0beadd2b1f430917f423b6dd186b713718e1d9aff85d91b80",
|
|
374
377
|
"pipeline/multi-agent-refs/generate-issue.md": "3e5182b9d6848e852ee3c7f397687f45c05e0861360cb77185c0a27d503a685c",
|
|
375
378
|
"pipeline/multi-agent-refs/help/en.md": "1cf543d53ff3ba3284d27e397ace3613f0c9a347716bb1ca6e7045e23c3044b2",
|
|
@@ -385,7 +388,7 @@
|
|
|
385
388
|
"pipeline/multi-agent-refs/orchestrator/dispatcher.md": "eb01ec6b0fbc0c6c2e62f6cfad9d03120433a0b7af35b085c80793f920d7683c",
|
|
386
389
|
"pipeline/multi-agent-refs/orchestrator/operations.md": "7e6e969e3d62eafaf489e0383748529b7798e28a1f7f62f0a71dcd507800752f",
|
|
387
390
|
"pipeline/multi-agent-refs/orchestrator/phase-0-projects.md": "eb8ff77eadd0daf83c9673a5b396d7869642b5fc3a39d67e5fc3250401e9abad",
|
|
388
|
-
"pipeline/multi-agent-refs/orchestrator/phase-3-user-test.md": "
|
|
391
|
+
"pipeline/multi-agent-refs/orchestrator/phase-3-user-test.md": "7e5a59cb431a49bcce4718dcefd673e5be4fd7020891ef815025de56ccae113a",
|
|
389
392
|
"pipeline/multi-agent-refs/orchestrator/phase-4-5-projects.md": "879eced14fa3d24a03ff3e648ec428acfeb470e02987a01079d8681d9ceec8af",
|
|
390
393
|
"pipeline/multi-agent-refs/orchestrator/skill-loading.md": "6827d45f067d3db66fe7a6043308164aaf8a3da7620d018d7ed6459e4356f476",
|
|
391
394
|
"pipeline/multi-agent-refs/outside-the-pipeline.md": "f62960921b2fbebd54914cec7503bfb5e3c3024f30fb3e0ead7e08e36a8139aa",
|
|
@@ -395,11 +398,11 @@
|
|
|
395
398
|
"pipeline/multi-agent-refs/phases/modes.md": "5333543f6cee71c696fc84b4c1fb276d0430b121e7f0132c0ac69b59b61e372a",
|
|
396
399
|
"pipeline/multi-agent-refs/phases/operations.md": "aa84c6af264f038100e0942c4a2b3db545d122d5a27a4211f061e6537f717ad1",
|
|
397
400
|
"pipeline/multi-agent-refs/phases/phase-0-init.md": "9dbb8be5e32870b36a6a1662e8d813a1b37ed4080ca22e3276a217bfaf6a0c49",
|
|
398
|
-
"pipeline/multi-agent-refs/phases/phase-1-plan.md": "
|
|
399
|
-
"pipeline/multi-agent-refs/phases/phase-2-dev.md": "
|
|
400
|
-
"pipeline/multi-agent-refs/phases/phase-3-review.md": "
|
|
401
|
-
"pipeline/multi-agent-refs/phases/phase-4-commit.md": "
|
|
402
|
-
"pipeline/multi-agent-refs/phases/phase-5-report.md": "
|
|
401
|
+
"pipeline/multi-agent-refs/phases/phase-1-plan.md": "221c3ad2c2da991f42ffdf253a7b94eaf9f6763a07ba52e00df59c920243f598",
|
|
402
|
+
"pipeline/multi-agent-refs/phases/phase-2-dev.md": "7af891917df38c0aef5cbed60ed1e09a39ab98961676d61edfaa5587fbafa3b5",
|
|
403
|
+
"pipeline/multi-agent-refs/phases/phase-3-review.md": "5262e7f2b8196542c2abeb4565a075e732a281dcf751cb7cf0a5bbdf9f193b3a",
|
|
404
|
+
"pipeline/multi-agent-refs/phases/phase-4-commit.md": "1363592fd75ee4a7f7ed0f6ee63e5551bad9621772a0a2dd9a7e0b405ef763a2",
|
|
405
|
+
"pipeline/multi-agent-refs/phases/phase-5-report.md": "26468cf24dd8c8fe78f8d4c5006b53e1fff0f3fbf2bda9c1944cd84ced634846",
|
|
403
406
|
"pipeline/multi-agent-refs/picker-contract.md": "4e351a3e79173287db76212ef73b71126e3f8a91ddfee64f251c349dea2a374c",
|
|
404
407
|
"pipeline/multi-agent-refs/platform-parity.md": "1fa6189ad94ecd3e8a9f15980f19174dc86468050a6de3afff7aa30de60aa689",
|
|
405
408
|
"pipeline/multi-agent-refs/progress-contract.md": "d1dc3c117aeb880cd44b3439062e9fe7d5e2042ba00c49fd495f70a6bdc1addc",
|
|
@@ -418,7 +421,7 @@
|
|
|
418
421
|
"pipeline/multi-agent-refs/review/module-guides.md": "bd324cc781cb7b62442e2d0315b4d8c642b20dfc0d10e8b3463b9ebade8aac7b",
|
|
419
422
|
"pipeline/multi-agent-refs/review/panel.md": "253f36373d95b00a57d71cefa7a2cd4d43b009b824357d92726bb4fb68d3066f",
|
|
420
423
|
"pipeline/multi-agent-refs/review/valven.md": "d36d716357b7f879666d469501f1d39f8cf2f67e24a6b0483be11b2029fb9bb9",
|
|
421
|
-
"pipeline/multi-agent-refs/rules.md": "
|
|
424
|
+
"pipeline/multi-agent-refs/rules.md": "57b4911bb20a32a5c02b358b9b70755fbb7b6d443c2f1b3f92609c1b03ba7aeb",
|
|
422
425
|
"pipeline/multi-agent-refs/setup/accounts.md": "256d154dcdae59291d7103d8c1b416e2727cf320e4b9de1ab36b9a060b176043",
|
|
423
426
|
"pipeline/multi-agent-refs/setup/app-store-connect.md": "d6073eabb0dbabbd4c6f7ffc2191c32db985af2ad768504225211006aa9d188c",
|
|
424
427
|
"pipeline/multi-agent-refs/setup/discovery.md": "ebf6365102b336beba9904f0d01a6fadc0e734b2988919860ea9313908116a19",
|
|
@@ -545,14 +548,14 @@
|
|
|
545
548
|
"pipeline/office/assets/floor_7.png": "aa44b7de3ced5e0bb2ef3fbd8bd27e9993a83bf8b901c37da2a97c162d7e6dad",
|
|
546
549
|
"pipeline/office/assets/floor_8.png": "653e4534e66844d72ea78fef499c5052ed337f7c10ada4d818d21255ad27bdfe",
|
|
547
550
|
"pipeline/office/assets/wall_0.png": "f2afc6dacc44986a388695a720839ed00da03e9b308d6c727f5292740a62adfa",
|
|
548
|
-
"pipeline/office/index.html": "
|
|
549
|
-
"pipeline/office/toolkit.json": "
|
|
551
|
+
"pipeline/office/index.html": "296d3bc390b40ea64096a3c587399c020df36ce65fec085ec74ef4afaae5a0e9",
|
|
552
|
+
"pipeline/office/toolkit.json": "2d8ed2a4da2d01fea7e17ea25ee57d3664db21384b7745a18287b1181c9fea3e",
|
|
550
553
|
"pipeline/preferences-template.json": "f28da92a62bebd7fc8a8b71a72dfe3dabaa83ce88fcde796e377fb326c49486f",
|
|
551
554
|
"pipeline/rules/app-store-guidelines.md": "9fc2ac5073a2d6be9fe6f056170bf215ecd14ad4d335062ad046bc3c406e6b59",
|
|
552
555
|
"pipeline/rules/code-review.md": "b18eec5cec31710fe76cdae6f03b53e7403d4f0406274691ab38a4771505a1c5",
|
|
553
556
|
"pipeline/rules/code-style.md": "cd7d8fa872d1d640d143a573a0bdeeb7a9095f62a4d69741a11b4f0cee9d5a48",
|
|
554
557
|
"pipeline/rules/debugging.md": "6ca90aacf1f4bad59000da84a7a8e368eda69af0752ca9ec8e4916408502257a",
|
|
555
|
-
"pipeline/rules/figma-pipeline.md": "
|
|
558
|
+
"pipeline/rules/figma-pipeline.md": "ff7028abb150147188946644e897616ea2867720538379cb4599b2cfc924e809",
|
|
556
559
|
"pipeline/rules/git-conventions.md": "200408fb59e19898096aca998381974f23929760c661741dd76813de902386eb",
|
|
557
560
|
"pipeline/rules/kotlin-android.md": "2344356125cbdd49f703144f3eb573d40fd1ce2d4b5ef404d44da13c052c9236",
|
|
558
561
|
"pipeline/rules/outside-the-pipeline.md": "f5ae881783bb288d803938665489a1135ef7d18e59cd52d85a290c1237450d4a",
|
|
@@ -634,7 +637,7 @@
|
|
|
634
637
|
"pipeline/schemas/planning-output.schema.json": "58c2e460cd77ab88a683bbd8beafc18426fce4b295990fddfe83bbe6ac8aded7",
|
|
635
638
|
"pipeline/schemas/pr-reach.schema.json": "70a52870bcb021156198bd3c48688ed234689fbeaad56c96646b9a3049328b29",
|
|
636
639
|
"pipeline/schemas/pr-request.schema.json": "ae75c4856349d62834802b1189af516bb6fb3d36646831b7ff2fa61d938afcd0",
|
|
637
|
-
"pipeline/schemas/prefs.schema.json": "
|
|
640
|
+
"pipeline/schemas/prefs.schema.json": "1be58b825ba79188b0c45289dc1e5239c28b8ef94f46a9fa518f2e8b2fbcbaff",
|
|
638
641
|
"pipeline/schemas/prs.schema.json": "79c4d2d8a40f5ce4452b31a0b0f66ab4d3e0e95aaf6aa591c41629e1176be43f",
|
|
639
642
|
"pipeline/schemas/prune-logs-request.schema.json": "7732e8f77667b956b3b983d21955006067942946cb6f9dbf088e6207d9b15807",
|
|
640
643
|
"pipeline/schemas/prune-logs.schema.json": "a8c9555bede51b7b7947d79e5d796875a22d4aae2a7576c8f1ec2e7b92bdca47",
|
|
@@ -705,7 +708,7 @@
|
|
|
705
708
|
"pipeline/scripts/_handle-patterns.mjs": "c05934a1eed9d97b3d1f8681916aac53092c6573dba83d798bbec9fc56d0909e",
|
|
706
709
|
"pipeline/scripts/_http-post.mjs": "12cd785bbeebd5a914fc913277a1ab34e3944ce9267317d7454b09bf4a287588",
|
|
707
710
|
"pipeline/scripts/_jsonl.mjs": "9de314d31f5016373c2cb5fcc2707c9d409b8c14da44b349c96c90c54ffa2d37",
|
|
708
|
-
"pipeline/scripts/_memory-policy.mjs": "
|
|
711
|
+
"pipeline/scripts/_memory-policy.mjs": "4e3cff41dac73ebef79a8b2e1df3f55d259adeeead11ed81a615f96a3bfaef34",
|
|
709
712
|
"pipeline/scripts/_notices.mjs": "1f78037b0849ab3cf8a85ca353ed1610c2895250ac21a1d50ac1fb9732be4300",
|
|
710
713
|
"pipeline/scripts/_office-smoke-lib.sh": "70fab7857eab1d9c1d58e9c4f93ba630ae2f84ee657f55c5c74166f22adfa0b2",
|
|
711
714
|
"pipeline/scripts/_path-match.mjs": "880b27d90351441b4f3c05e1a87ace62cd1caab3ec7a286663efb2176cb69a69",
|
|
@@ -764,6 +767,7 @@
|
|
|
764
767
|
"pipeline/scripts/check-derived-drift.mjs": "6716f1354b5b17d0314e5bbe18d987c5143ffeadd0825ff35d7414b3d7a516ad",
|
|
765
768
|
"pipeline/scripts/check-read-size.py": "fa094f7fcc3ea830411a55f4acda12ffe5a2323c8fd105033ef238e13bc04c99",
|
|
766
769
|
"pipeline/scripts/check-read-size.sh": "e596810d72eb1c7e9970501d31e406fc568055e20a88a8a0d81a2a3669c2b04d",
|
|
770
|
+
"pipeline/scripts/checkpoint-fold.sh": "a60512eedf1980ff7508c9a29eeb4ee54d82b8aeb728468bae7f7e5d2211f04f",
|
|
767
771
|
"pipeline/scripts/classify-plan-safety.mjs": "d25f21da21dd4ee1ea507fb0df89301715071121b1bd96aca9ef140a4eee896b",
|
|
768
772
|
"pipeline/scripts/code-graph-rules/android.json": "d7f797eb58fc7ebc00862e8fc2362fe61720f5263f1122ab271c7673090824fc",
|
|
769
773
|
"pipeline/scripts/code-graph-rules/go.json": "7d794157675c0d4c71d7ba3d6e538de0e20de6711c652d55844eac11b10e0bdf",
|
|
@@ -797,7 +801,7 @@
|
|
|
797
801
|
"pipeline/scripts/find-polluter.mjs": "38a5797acb63f2c9c66c7c29801066f6e8ba1fa9ded680433814a8a86e0cd5ef",
|
|
798
802
|
"pipeline/scripts/finding-fingerprint.mjs": "fa12ab10701db5d2bfff014e41d1cd4c0b2b772aee5fc69205de14b2761b0c83",
|
|
799
803
|
"pipeline/scripts/firebase-app-discovery.sh": "dbbc5710cf12b086a50c3f24a4cf67df431d1eb1a121b98d4dc67023f8633c67",
|
|
800
|
-
"pipeline/scripts/gate-ledger.mjs": "
|
|
804
|
+
"pipeline/scripts/gate-ledger.mjs": "117431279b90def067bf638ca26920e09cdf6feee104d4f5f902d187a6d726ee",
|
|
801
805
|
"pipeline/scripts/gc-abandoned.sh": "d11dc1a8144fc639b57d668d4801d9bb088c700f6e93fdc78d60f8e6018ec99e",
|
|
802
806
|
"pipeline/scripts/gc-plan.mjs": "f1d212805ef5396f0ae789d997894017a60917b7c55bad5271e29c76cde898af",
|
|
803
807
|
"pipeline/scripts/gc-refs.sh": "04e91087885bac10ee692cc24914342a459bcfc5533574894e40e43587cec325",
|
|
@@ -842,7 +846,7 @@
|
|
|
842
846
|
"pipeline/scripts/note-session.sh": "1466d93f401c66074705635117a052a3f811ca22f928defa1ec2e4c804c19fc1",
|
|
843
847
|
"pipeline/scripts/observations.mjs": "edef08a8ab8f967030da0575d83f501eb6256460c0b72c2ba377c629b3ee0674",
|
|
844
848
|
"pipeline/scripts/office-build.mjs": "2c0a9cd8fd56da53ce80326cd953f52fe73111d47624b5ad03416b6b7edf9a62",
|
|
845
|
-
"pipeline/scripts/office-control.mjs": "
|
|
849
|
+
"pipeline/scripts/office-control.mjs": "7b85093c4c2940a5562e49ac99b9d66f5ac559f97e147418b411733c62c97ca1",
|
|
846
850
|
"pipeline/scripts/office-credentials.mjs": "4db4a3d9fc0ffb670ab2df8ad55f13cdb6cf4f34dc123f6bf87785381a9ff38b",
|
|
847
851
|
"pipeline/scripts/office-ledger.mjs": "e14d20d43765d7e218c8c06166b4654cd1d214cd1cc97adee6418f46c422bc42",
|
|
848
852
|
"pipeline/scripts/office-memory.mjs": "d690ee1879d12bad5aea0eb66d5f829c81705c024d4417ae8dd99ad440c9499f",
|
|
@@ -850,7 +854,7 @@
|
|
|
850
854
|
"pipeline/scripts/office-prune.mjs": "f779009bd0daf16359eb03d075aa1fa70202b45473e51f0ead52b21d8bb16fb1",
|
|
851
855
|
"pipeline/scripts/office-remote-client.mjs": "67532b6a8ca5e1393633d600e7974b77b2d10b18a292136d5d9aaf38a8d65704",
|
|
852
856
|
"pipeline/scripts/office-settings.mjs": "a85c747ce58697009ca4d1c03adc803778d73e34d254ac22a0ec866dc8069d50",
|
|
853
|
-
"pipeline/scripts/offload-ref.sh": "
|
|
857
|
+
"pipeline/scripts/offload-ref.sh": "998cdaaee64685949c4c33953e51c8f7ed27d6cf71c45bcb4d85ff17bccd3220",
|
|
854
858
|
"pipeline/scripts/open-questions-gate.mjs": "8cff43cd552d01466bec540d9565c6225ce101c6716cc8f68f7edc6fc07beb4d",
|
|
855
859
|
"pipeline/scripts/output-quality-check.sh": "cbf7db0d613328c8ed1b799f6f21f1e29528c2069d078887e54a50ce8c936dc7",
|
|
856
860
|
"pipeline/scripts/owned-path-gate.mjs": "86b17e7a723d30056fac89026790e33cab891a549ffbda50b9e90d9a7675bf11",
|
|
@@ -890,7 +894,7 @@
|
|
|
890
894
|
"pipeline/scripts/review-scope.mjs": "60be90f1dce0a87071695bbedf17eb4e8600b1c742b97aef8cbea41802315b93",
|
|
891
895
|
"pipeline/scripts/rework-base.mjs": "cc1c1a5c5380be5c4f0349c5ef8923f5e387d8170a561485bdf1a78d1e1cf803",
|
|
892
896
|
"pipeline/scripts/rework-escalation.mjs": "4a0d86e4acc05dc14ab4396ce0b113c32619b8e917c983f71842bc45e5b96574",
|
|
893
|
-
"pipeline/scripts/rework-rulings.mjs": "
|
|
897
|
+
"pipeline/scripts/rework-rulings.mjs": "aead2e1a5a6317fd60d624385ed6e74b19805f2ea727225c79b7593b1525101a",
|
|
894
898
|
"pipeline/scripts/routine-registry.mjs": "c5fbea1c87b0331f522fdabf31bafdf19c36f095575c1d3a68a7571bec13af6d",
|
|
895
899
|
"pipeline/scripts/run-aggregator.mjs": "e58ecdf900aa30ea1625939d72e6d4e26d13ae4e6bb2ee1fd68d99718def27c8",
|
|
896
900
|
"pipeline/scripts/run-commit-check.mjs": "b825f0db76f390ba50caafecf144a49a10f366cd459b125058b43524be42e75c",
|
|
@@ -908,7 +912,7 @@
|
|
|
908
912
|
"pipeline/scripts/scan-agent-config.sh": "dd3eaa2481c05784a09c8243762da6f7b91323d63fb635a667bb59516fc2086f",
|
|
909
913
|
"pipeline/scripts/scan-skills.sh": "85765b7ec15af13ade5c9ccedd88329c19b11a627e8df6dccd4839e95361dfb7",
|
|
910
914
|
"pipeline/scripts/scenario-audit.mjs": "5b6952aca2df1fe5455cb12ef4408bb942fc36b914f4a494c246c0f602d7f0da",
|
|
911
|
-
"pipeline/scripts/scope-check-gate.mjs": "
|
|
915
|
+
"pipeline/scripts/scope-check-gate.mjs": "a72367d6caeecea296ce08475771fbb9c589709fd60ad8dceae757a0a7b9c301",
|
|
912
916
|
"pipeline/scripts/search-logs.sh": "af0ce9b75edd359cc93dd678d35b15eb9bb0f14a4b044d8e4d639f8cdb82c76f",
|
|
913
917
|
"pipeline/scripts/service-read.mjs": "4615df4fbb3f21597ac2866b10f8a49f3dd530e1aff044e68105b51c23030aa3",
|
|
914
918
|
"pipeline/scripts/sign-skills.sh": "779355dcf8ce383959e9a3c6093f46660a0875e83a805b7a67983acc8551cb59",
|
|
@@ -951,16 +955,17 @@
|
|
|
951
955
|
"pipeline/scripts/usage-register-beacon.mjs": "ac6a1bf68b309a521ec43fffbfe7e3559a6a84471b4daacbc4e7c9d429fd70b5",
|
|
952
956
|
"pipeline/scripts/usage-register.mjs": "5bbd0ebae5d00ab575bf0972ce0141f36bd9e024959f4cb3c8b57cc78dcc8edf",
|
|
953
957
|
"pipeline/scripts/usage-report.mjs": "56336445ad6fa315fab8eac8d52382a35db7a6ee270e5bbd5ea141e9d07ca3d5",
|
|
958
|
+
"pipeline/scripts/user-test-handoff.sh": "b123296e5fc999d635f3fa5e93fba9730f2950c2290d09d869828f3d4e55c606",
|
|
954
959
|
"pipeline/scripts/validate-analysis-doc.mjs": "3300212d6d7387f4f2f63e2712dad7dacc53d8c133d575a286d3d4bf06bca431",
|
|
955
960
|
"pipeline/scripts/validate-analysis.mjs": "d2dc9ccf45f6ca2702908761939edd830d18b3b273016a4b449f26fe285d5ea1",
|
|
956
961
|
"pipeline/scripts/validate-code-graph.mjs": "3244d074e882a6a1789de362b4b122c396a05ac044f5102dfe85e92e7aca6cc4",
|
|
957
962
|
"pipeline/scripts/validate-complaint-doc.mjs": "a6ffcab3bbe917c59edc035922393c106454ecea41693c19d3e458adc47d548e",
|
|
958
963
|
"pipeline/scripts/validate-diff-risk.mjs": "cf53943f71a717fddaacf7426dea9d5eb4e0ec7bdb27bdfb91915176df9fee99",
|
|
959
|
-
"pipeline/scripts/validate-planning.mjs": "
|
|
964
|
+
"pipeline/scripts/validate-planning.mjs": "341297af99ba0833d80195f3fbade0ba514b9a9f3d3cf609a02433653f28d223",
|
|
960
965
|
"pipeline/scripts/validate-reviewer.mjs": "df573968984d2416074e781722bfa2896d2e407ca59cce98052c23aa7640f798",
|
|
961
966
|
"pipeline/scripts/validate-state.mjs": "d1c6a6caaf43df8357c41d12f40ebd940465d6d2a5e2ec374c776061700898b2",
|
|
962
967
|
"pipeline/scripts/validate-test-gap.mjs": "14fa89867e49497adb2b88a3290e78d0f263afa74a5b83b062115fc5a22204f7",
|
|
963
|
-
"pipeline/scripts/validate-triage.mjs": "
|
|
968
|
+
"pipeline/scripts/validate-triage.mjs": "f69d5e65382dc26e710afb6f056667e1f09cc1ecb3306275586d288f2c623fa5",
|
|
964
969
|
"pipeline/scripts/valven-gate.mjs": "1bd10b59fe2e282759942c1a3961facabc4c0c36b1e603aadc9f8ef00b27b513",
|
|
965
970
|
"pipeline/scripts/valven-port.mjs": "e3bfb596e3472c515a041c9408e7369f87919504882869331525d28829bcf388",
|
|
966
971
|
"pipeline/scripts/valven-split.mjs": "2119fce1c109b9388aab3e39b3ba645a61f38182aa7bf64a557930284946a104",
|
|
@@ -973,9 +978,9 @@
|
|
|
973
978
|
"pipeline/scripts/worktree-prepare-all.mjs": "e3094099bcf31084a0a48e3b443d6ff66e7090eadee215a8597545dc98135835",
|
|
974
979
|
"pipeline/scripts/worktree-prepare.sh": "7341a756358a10dbd24d1ec9708b78a273f660435cf1051dc322b1983991b0fe",
|
|
975
980
|
"pipeline/scripts/worktrees.mjs": "90dfd09b70fffe9b56c331a4ae2692cc248f4898f4ee6aee4239ef0b20888a90",
|
|
976
|
-
"pipeline/scripts/write-state.mjs": "
|
|
981
|
+
"pipeline/scripts/write-state.mjs": "a55d4f770dbb86e43ee171ab905128d0826386618a3cd299490aecbf962b53c2",
|
|
977
982
|
"pipeline/scripts/write-store-config.mjs": "b994a061f6febb2ca3d396074d8b51d2c1c1f991d3072d321703380da3639a56",
|
|
978
|
-
"pipeline/skills/.skill-manifest.json": "
|
|
983
|
+
"pipeline/skills/.skill-manifest.json": "35551b69ac8f9638cd9e943fff9c5fdc95b43a6daf1d748c2c5526f085d223b2",
|
|
979
984
|
"pipeline/skills/.skills-index.json": "f3f87cbb1751f4e57b3da7b2e5ffe4ad8924e0e9e1795b05ed376b6bf4bef00c",
|
|
980
985
|
"pipeline/skills/shared/README.md": "cdf53045db5c82c93c508b084dc3582615343e1a0408889cb3cfe26f5458ac78",
|
|
981
986
|
"pipeline/skills/shared/core/apple-archive-compliance/SKILL.md": "5b0d698495b8ab99e30b93526c0cc4ae54df1b00584e55e38e73e7b46d697cba",
|
|
@@ -1014,7 +1019,7 @@
|
|
|
1014
1019
|
"pipeline/skills/shared/core/multi-agent-kill/SKILL.md": "2be5a2ff4a734c164be6de5d183a3648547205b10d5d809a7a04e04eb5743431",
|
|
1015
1020
|
"pipeline/skills/shared/core/multi-agent-language/SKILL.md": "0d3b7df6702356073c11c9ec76e69b39a0d9ecc45b1cf3e3270a639324b3633f",
|
|
1016
1021
|
"pipeline/skills/shared/core/multi-agent-log/SKILL.md": "094c703e6e6229a31868b3506fff651a91465de15456763ac87264becac99dbd",
|
|
1017
|
-
"pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md": "
|
|
1022
|
+
"pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md": "8ea107eebf8160ec30306a18c619f10b3a4cf9ddbd741d37c52f09a534e2c687",
|
|
1018
1023
|
"pipeline/skills/shared/core/multi-agent-model/SKILL.md": "57ba710657d74176b0f19d4a97d3183df1f7b0c056eb1eef2792308914be836c",
|
|
1019
1024
|
"pipeline/skills/shared/core/multi-agent-office-off/SKILL.md": "316c7f1cd910e76096301330cac7e02f1a2b28e66cda88e9f8bb966a14553e9e",
|
|
1020
1025
|
"pipeline/skills/shared/core/multi-agent-office-on/SKILL.md": "b46a2f79beeee65ae7ad6cbfc58b4631c5146a7761e91a99b8a056d6f49c690d",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "20.37.
|
|
3
|
+
"version": "20.37.1",
|
|
4
4
|
"description": "6-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",
|
|
@@ -21,12 +21,13 @@ Lets you switch to the task branch for manual testing in Xcode before the PR is
|
|
|
21
21
|
2. **Check state** - the task must have completed Phase 2 (Dev) or later
|
|
22
22
|
- Phase < 3 → "No code yet, run `resume #N` first"
|
|
23
23
|
|
|
24
|
-
3. **
|
|
24
|
+
3. **Hand the branch over**. Make the WIP commit yourself (Standard path item 3 of Phase 4 Step 2 folds it back), then let the script hold the run artefacts and the main repo's current branch, remove the worktree and check the branch out. `{worktree-path}` and `{jiraId}` come from the task's state (`worktreePath`, `jiraId`):
|
|
25
25
|
```bash
|
|
26
|
-
|
|
27
|
-
git worktree
|
|
28
|
-
|
|
26
|
+
git -C "{worktree-path}" add -A
|
|
27
|
+
git -C "{worktree-path}" diff --cached --quiet || git -C "{worktree-path}" commit -m "WIP: {jiraId} - changes for user test"
|
|
28
|
+
bash $HOME/.claude/scripts/user-test-handoff.sh checkout --task "{jiraId}" --worktree "{worktree-path}" --root "{project-root}" --branch "{branch-name}"
|
|
29
29
|
```
|
|
30
|
+
A refused commit stops here with nothing moved. Script exits: 3 the main repo has uncommitted changes; 5 the worktree or a submodule holds uncommitted, unpushed or stashed work (a submodule with no remote needs one added); both move nothing. 6 a handoff is already held, or git refused part way: run `restore` below (if it answers 7, nothing had moved). 1 the worktree is not on the branch.
|
|
30
31
|
|
|
31
32
|
Then mark the tracker as waiting (this CONTINUES the task's existing `tracker-state.json`; never `init` here - see `$HOME/.claude/multi-agent-refs/tracker-contract.md` "Continuation runs"). On Claude Code in a fresh session, first rebuild the TaskList from state per the same contract:
|
|
32
33
|
```bash
|
|
@@ -49,12 +50,16 @@ Lets you switch to the task branch for manual testing in Xcode before the PR is
|
|
|
49
50
|
❌ "fix: ..." → recreate the worktree and apply the fix
|
|
50
51
|
```
|
|
51
52
|
|
|
52
|
-
5. **Wait for the user's reply
|
|
53
|
+
5. **Wait for the user's reply**, then hand the branch back before acting on it:
|
|
54
|
+
```bash
|
|
55
|
+
bash $HOME/.claude/scripts/user-test-handoff.sh restore --task "{jiraId}" --worktree "{worktree-path}" --root "{project-root}" --branch "{branch-name}"
|
|
56
|
+
```
|
|
57
|
+
Exit 3: the user edited files on the branch in the main repo. Ask them to `git stash`, run `restore` again, then `git -C "{worktree-path}" stash pop`; a commit made there instead would stop Phase 4 from folding the checkpoints. Exit 6: the main repo could not leave the branch (an untracked file in the way) or the worktree could not be re-added; the message names the cause, the hold is kept, and `restore` runs again once it is cleared. Exit 7: nothing was held, so the worktree was never removed.
|
|
53
58
|
|
|
54
59
|
6. **Branch on the answer**:
|
|
55
60
|
- **OK** → first write `$WORKTREE/.pipeline/manual-test.json` (one entry per acceptance criterion from the analysis doc test plan, the plan tasks, or the user's own words):
|
|
56
61
|
```json
|
|
57
62
|
{"criteria":[{"spec":"<quote>","source":"analysis 15.2 | plan task 3 | user","observed":"<what was seen>","verdict":"pass|fail|not-tested","reason":"<required when not-tested>","screenshot":"<path or null>"}],"verdict":"passed|failed"}
|
|
58
63
|
```
|
|
59
|
-
then run `node $HOME/.claude/scripts/evidence-gate.mjs --claim manual --status passed --evidence "$WORKTREE/.pipeline/manual-test.json"`, adding `--require-screenshot` when `state.visualEvidence.required` is true (a passing criterion then has to name a screenshot that is actually on disk). Exit 1 means the "ok" is not accepted: name the criterion that is missing evidence and wait for the next reply. Exit 0 → `phase-tracker.sh update 3 completed` + `phase-tracker.sh meta 3 Result "local test passed (user)"`,
|
|
60
|
-
- **Fix needed** → `phase-tracker.sh now 3 "applying fix: <summary>"`,
|
|
64
|
+
then run `node $HOME/.claude/scripts/evidence-gate.mjs --claim manual --status passed --evidence "$WORKTREE/.pipeline/manual-test.json"`, adding `--require-screenshot` when `state.visualEvidence.required` is true (a passing criterion then has to name a screenshot that is actually on disk). Exit 1 means the "ok" is not accepted: name the criterion that is missing evidence and wait for the next reply. Exit 0 → `phase-tracker.sh update 3 completed` + `phase-tracker.sh meta 3 Result "local test passed (user)"`, continue to Phase 4. Full contract: `$HOME/.claude/multi-agent-refs/phases/phase-3-review.md` step 5. The UI flow video rule in `$HOME/.claude/multi-agent-refs/audit-guide.md` "Phase 3 evidence flows" applies here too: invoked standalone, this command is the only phase that ran, so if `visualEvidence.required` is set and `visualEvidence.video.file` is empty, the recording has to happen here or nowhere.
|
|
65
|
+
- **Fix needed** → `phase-tracker.sh now 3 "applying fix: <summary>"`, apply the fix in the restored worktree
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
## Audit & Quality Tools Guide
|
|
2
2
|
|
|
3
3
|
<!-- toc -->
|
|
4
|
+
- [Audit & Quality Tools Guide](#audit-quality-tools-guide)
|
|
4
5
|
- [Trigger Model](#trigger-model)
|
|
5
6
|
- [iOS Accessibility Audit](#ios-accessibility-audit)
|
|
6
7
|
- [Android Accessibility Audit](#android-accessibility-audit)
|
|
@@ -10,6 +11,9 @@
|
|
|
10
11
|
- [Android APK Audit (Play Store Compliance)](#android-apk-audit-play-store-compliance)
|
|
11
12
|
- [Integration with Pipeline Phases](#integration-with-pipeline-phases)
|
|
12
13
|
- [Graceful Degradation](#graceful-degradation)
|
|
14
|
+
- [Phase 3 evidence flows](#phase-3-evidence-flows)
|
|
15
|
+
- [UI flow video, when Phase 2 produced none](#ui-flow-video-when-phase-2-produced-none)
|
|
16
|
+
- [Snapshot regression flow (optional)](#snapshot-regression-flow-optional)
|
|
13
17
|
<!-- /toc -->
|
|
14
18
|
|
|
15
19
|
Standalone audit commands - runs directly via Bash, **no MCP server dependency**. These are the same checks that multi-agent-toolkit-mcp provides as MCP tools, but embedded here as pipeline skills.
|
|
@@ -250,3 +254,19 @@ unzip -l "$APK" 2>/dev/null | grep "classes.*\.dex" | wc -l
|
|
|
250
254
|
- No Android SDK → skip Android audits, log "Android SDK not available"
|
|
251
255
|
- No booted simulator → skip accessibility audit, log "No running simulator"
|
|
252
256
|
- Audits are **enhancements**, never blockers for the pipeline flow
|
|
257
|
+
|
|
258
|
+
## Phase 3 evidence flows
|
|
259
|
+
|
|
260
|
+
Read from `phases/phase-3-review.md` "Automated Device Checks".
|
|
261
|
+
|
|
262
|
+
### UI flow video, when Phase 2 produced none
|
|
263
|
+
|
|
264
|
+
Phase 2 Step 3.55 is the primary host and runs in every mode. Phase 3 is the richer one where it exists: the device is up and a person is watching, so the flow is one somebody confirmed. It adds, never replaces.
|
|
265
|
+
|
|
266
|
+
Run only when `visualEvidence.required` and `visualEvidence.video.file` is empty: re-check the device with `$HOME/.claude/scripts/probe-evidence-capability.sh --only device`, then `$HOME/.claude/scripts/capture-evidence.sh video start` -> drive the flow (`run-ui-tests.sh run`, or the Phase 3 scenarios by hand) -> `video stop` -> `fit`. The cap is `visualEvidence.maxVideoSeconds`, read through `capture-evidence.sh limits` so one value serves both. Update `videoTier` and `videoTierReason` with what ran.
|
|
267
|
+
|
|
268
|
+
When the intake answer was `unit` there is no recording here either: overriding it in a phase the user may not be watching makes the question decorative.
|
|
269
|
+
|
|
270
|
+
### Snapshot regression flow (optional)
|
|
271
|
+
|
|
272
|
+
When the task changes a stable component, capture a screenshot before the change (baseline) and after (current), then call `ios_visual_diff({baseline, current, max_diff_pct: 1.0})`. Threshold can be relaxed for animated / non-deterministic regions - keep `max_diff_pct ≤ 1.0` for static layouts.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Phase 4 Commit - Multi-Repo Mode
|
|
2
|
+
|
|
3
|
+
> Loaded on demand from `phases/phase-4-commit.md`. Conditional on
|
|
4
|
+
> `state.projects[].length > 1`; a single-repo run never needs it. The
|
|
5
|
+
> Push-must-succeed policy stays in the phase doc because every run uses it.
|
|
6
|
+
|
|
7
|
+
Active when `state.projects[].length > 1`. The single-repo flow in the phase doc is preserved verbatim - multi-repo is an extension, not a replacement.
|
|
8
|
+
|
|
9
|
+
## Per-repo commit (shared message, per-repo scope)
|
|
10
|
+
|
|
11
|
+
For each repo in `state.projects[]` (sequentially, in dependency order from Phase 1):
|
|
12
|
+
|
|
13
|
+
1. `cd "$WT_PATH"` - switch into the repo's worktree.
|
|
14
|
+
2. Build the commit message using the **shared subject** + **per-repo scope** rule:
|
|
15
|
+
```
|
|
16
|
+
{type}({repo-scope}): {shared subject} [{tracker-id}]
|
|
17
|
+
|
|
18
|
+
Part of multi-repo change - see sibling PR(s) in repo `{other repo names}`.
|
|
19
|
+
```
|
|
20
|
+
`repo-scope` is the repo's short name (e.g. `common`, `uicomponents`). The subject and `[tracker-id]` are identical across all repos.
|
|
21
|
+
3. Fold this repo's checkpoint commits first: `bash $HOME/.claude/scripts/checkpoint-fold.sh --repo "$WT_PATH" --task "{tracker-id}" --base "$BASE_BRANCH"`. Then `git add` (specific files only - same rules as the single-repo staging step, item 4 of the Standard path in `phases/phase-4-commit.md` Step 2)
|
|
22
|
+
4. `git -C "$WT_PATH" commit -m "$MESSAGE"` (heredoc body) - using identity already pinned in Phase 0 Step 8.
|
|
23
|
+
5. Capture `state.projects[i].commit = {"sha": "<sha>"}`.
|
|
24
|
+
|
|
25
|
+
Push each repo through the Push-must-succeed policy in `phases/phase-4-commit.md`, then continue here.
|
|
26
|
+
|
|
27
|
+
## Per-repo PR with cross-links
|
|
28
|
+
|
|
29
|
+
After all repos are pushed, open PRs sequentially, one per `state.projects[]` entry, each through its remote's usual path (gh / Bitbucket REST) with the per-stack body template (Standard / UI Component / etc). Append to each body:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
## Sibling PRs (multi-repo task)
|
|
33
|
+
This PR is part of a multi-repo change. Sibling PRs (review together):
|
|
34
|
+
- <url of each PR opened before this one>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
After the last PR opens, `update_sibling_links`: go back to the first N-1 PRs and add the sibling URLs that were not yet known when they were created.
|
|
38
|
+
|
|
39
|
+
**Then finalize each repo's worktree**, serially and only now - `update_sibling_links` updates one PR per repo and the loop `cd`s per repo, so removing repo 1's worktree mid-loop breaks 2..N. Run `worktree-finalize.sh` once per repo with that repo's `--worktree` / `--project-root` / `--project`; each skips or removes independently.
|
|
40
|
+
|
|
41
|
+
`update_sibling_links` does an UPDATE call per PR (Bitbucket: the `channels/pr.md` PUT payload, current `version`; GitHub: `gh pr edit --body-file`). Idempotent.
|
|
42
|
+
|
|
43
|
+
## GitHub issue body - list all PRs
|
|
44
|
+
|
|
45
|
+
Step 10's "Issue body update" extends to multi-repo: instead of a single `### Pull Requests` line, write one row per repo:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
### Pull Requests
|
|
49
|
+
- **common:** {pr-1-url}
|
|
50
|
+
- **uicomponents:** {pr-2-url}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Match the existing template's table/list shape - do not introduce new markers (per existing single-repo rule).
|
|
54
|
+
|
|
55
|
+
## `recentGroups` update on success
|
|
56
|
+
|
|
57
|
+
After ALL repos in the task have `pushStatus ∈ {"pushed", "rebase-pushed"}`:
|
|
58
|
+
|
|
59
|
+
1. Find the matching `recentGroups[]` entry by **order-independent compare** of `repos` array (sort + JSON.stringify).
|
|
60
|
+
2. If found: `entry.count += 1`, `entry.lastUsed = ISO timestamp`, bump to front of array (LRU).
|
|
61
|
+
3. If not found: prepend a new entry `{ label: <auto-generated>, repos: [...], count: 1, lastUsed: ... }`. Cap the array at 10 (drop oldest).
|
|
62
|
+
|
|
63
|
+
A task ending with one or more `pushStatus === "skipped"` repos does NOT bump `recentGroups` count - only fully-successful multi-repo tasks earn LRU bumps.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Phase 2 Dev - Multi-Repo Mode
|
|
2
|
+
|
|
3
|
+
> Loaded on demand from `phases/phase-2-dev.md`. Conditional on
|
|
4
|
+
> `state.projects[].length > 1` (set by Phase 0 multi-select); a single-repo run
|
|
5
|
+
> never needs it. Token forwarding and the build-log offload stay in the phase
|
|
6
|
+
> doc because every run uses them.
|
|
7
|
+
|
|
8
|
+
Active when `state.projects[].length > 1`. The single-repo flow in the phase doc is preserved verbatim - this file adds the deltas.
|
|
9
|
+
|
|
10
|
+
**Todo tagging**: Phase 1 plan items in multi-repo mode carry a `repo` field naming the target project root. The dev agent uses this tag to dispatch each todo:
|
|
11
|
+
|
|
12
|
+
```json
|
|
13
|
+
{
|
|
14
|
+
"id": "T-3",
|
|
15
|
+
"title": "Add tokenResolver public API",
|
|
16
|
+
"repo": "common", // ← matches state.projects[i].name
|
|
17
|
+
"files": ["Sources/Common/TokenResolver.swift"],
|
|
18
|
+
"tdd": { "test": "...", "code": "..." }
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
If a todo has no `repo` tag in multi-repo mode → log warning + ask user, do not auto-pick.
|
|
23
|
+
|
|
24
|
+
**Per-todo worktree switch**: Before each todo's TDD cycle, resolve `WT_PATH = state.projects[ findIndex(name === todo.repo) ].worktreePath` and run **all** subsequent commands with `git -C "$WT_PATH"` and `cd "$WT_PATH"` for build/test. Identity (`user.name`/`user.email`) was already pinned per worktree by Phase 0 Step 8 - no re-config needed here.
|
|
25
|
+
|
|
26
|
+
**Status update (single ticket, multi-repo)**: The Jira/GitHub issue is shared across all repos in the group - call the status-update API exactly **once per todo** (not once per repo per todo). The post-mutation verify rule still applies.
|
|
27
|
+
|
|
28
|
+
**Build serialization**:
|
|
29
|
+
- Xcode worktrees still share `BUILD_LOCK = /tmp/claude-xcodebuild.lock` - multi-repo just means more callers contending for the same lock; the existing `mkdir`-based queue handles it correctly.
|
|
30
|
+
- Non-Xcode repos may build in parallel across worktrees - but ONLY when builds are independent. If repo B's build depends on repo A's freshly-published artifact (e.g. SPM local path dependency), serialize them in dependency order. Plan items declare dependencies via Phase 1's `dependsOn` field; multi-repo dispatch respects that order.
|
|
31
|
+
|
|
32
|
+
**Failure isolation**: A build/test failure in one repo's worktree must NOT silently leave the other repos in a half-built state. On failure:
|
|
33
|
+
1. Capture the failure into `state.projects[i].buildStatus = { ok: false, attempts: N, lastError: "..." }`
|
|
34
|
+
2. The ENTIRE Phase 2 retries within that repo's worktree (max 3, same as single-repo)
|
|
35
|
+
3. After 3 attempts, escalate; do NOT proceed to Phase 3 with any unbuilt repo
|
|
36
|
+
|
|
37
|
+
**Recording a pass (default-FAIL evidence gate):** before setting `buildStatus.ok = true`, the build output must be tee'd to a log and that log must substantiate the success - a zero exit code alone is not trusted. Run the evidence gate; on exit 1, do NOT record a pass:
|
|
38
|
+
```bash
|
|
39
|
+
<build-command> 2>&1 | tee "{worktreePath}/.build.log" \
|
|
40
|
+
| bash $HOME/.claude/scripts/offload-ref.sh --phase 2 --label build --root "$WORKTREE"
|
|
41
|
+
node $HOME/.claude/scripts/evidence-gate.mjs --claim build --status passed --evidence "$WORKTREE/.build.log"
|
|
42
|
+
```
|
|
43
|
+
Non-zero from the gate: the build pass is unverified, so treat it as a failure and keep `buildStatus.ok=false`.
|
|
44
|
+
This closes the gap where an agent records "built" without ever producing build output.
|
|
45
|
+
The offload pipe is explained in the phase doc ("Why the pipe").
|
|
46
|
+
|
|
47
|
+
**Telemetry**: Per-repo metrics in addition to per-task metrics:
|
|
48
|
+
```bash
|
|
49
|
+
$HOME/.claude/scripts/log-metric.sh "$TASK_ID" 2 build.completed repo=common duration_ms=$D status=ok
|
|
50
|
+
$HOME/.claude/scripts/log-metric.sh "$TASK_ID" 2 build.completed repo=uicomponents duration_ms=$D status=ok
|
|
51
|
+
```
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Phase 3 User Test - Test Gap Report detail
|
|
2
|
+
|
|
3
|
+
> Loaded on demand from `phases/phase-3-review.md` (User test, Step 0) when the
|
|
4
|
+
> gap scan produced a report. The phase doc keeps the call and the skip rules;
|
|
5
|
+
> this file carries the report shape, severities, gating and telemetry.
|
|
6
|
+
|
|
7
|
+
## What the report contains
|
|
8
|
+
|
|
9
|
+
Per `$HOME/.claude/schemas/test-gap.schema.json`:
|
|
10
|
+
|
|
11
|
+
| Field | Meaning |
|
|
12
|
+
|---|---|
|
|
13
|
+
| `gaps[].sourcePath` | source file with the unprotected symbol |
|
|
14
|
+
| `gaps[].symbol` | symbol name |
|
|
15
|
+
| `gaps[].kind` | rule id (e.g. `public_func`, `composable_fun`, `named_export`) |
|
|
16
|
+
| `gaps[].severity` | `blocking` / `important` / `suggestion` (see severity table below) |
|
|
17
|
+
| `gaps[].expectedTestPaths` | likely test paths the user should land at, in priority order |
|
|
18
|
+
| `gaps[].hint` | stack-specific testing reminder (e.g. swiftui-qa.md 3-layer) |
|
|
19
|
+
|
|
20
|
+
## Severity defaults
|
|
21
|
+
|
|
22
|
+
| Symbol kind | Severity |
|
|
23
|
+
|---|---|
|
|
24
|
+
| `composable_fun`, `view_struct`, `config_struct`, `interface`, `objc_export`, `public_proto` | important |
|
|
25
|
+
| Other public API additions (`public_func`, `open_fun`, `named_export`, `default_export`, ...) | suggestion |
|
|
26
|
+
|
|
27
|
+
## Gating (opt-in)
|
|
28
|
+
|
|
29
|
+
If `prefs.testGap.blockingThreshold` is set and `gapBySeverity.important + gapBySeverity.blocking` exceeds it, Phase 3 surfaces the report as a Phase 3 rework finding and loops back. **Default off** - gaps render as advisory under "Test Gap Report" only.
|
|
30
|
+
|
|
31
|
+
## Telemetry
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
LOG_METRIC_FORWARD_TO_TRACKER=0 $HOME/.claude/scripts/log-metric.sh "$TASK_ID" 3 test_gap.scanned \
|
|
35
|
+
stack=$SCAN_STACK \
|
|
36
|
+
sources=$(jq '.totals.sourcesScanned' <<< "$GAP_JSON") \
|
|
37
|
+
gaps=$(jq '.totals.gapCount' <<< "$GAP_JSON")
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
(No tracker forwarding - the scanner has no token cost.)
|
|
@@ -10,7 +10,7 @@ Removing it at PR-open is only safe because of the salvage, so the two are one s
|
|
|
10
10
|
|
|
11
11
|
## What it will not do
|
|
12
12
|
|
|
13
|
-
**No `git checkout` of the task branch.** `git worktree remove` leaves the branch as an ordinary local branch: the ref, its commits, and the ability to `git checkout <branch>` later all survive untouched. Checking it out here would move the user's HEAD out from under them and can collide with their own uncommitted work on another branch. Phase
|
|
13
|
+
**No `git checkout` of the task branch.** `git worktree remove` leaves the branch as an ordinary local branch: the ref, its commits, and the ability to `git checkout <branch>` later all survive untouched. Checking it out here would move the user's HEAD out from under them and can collide with their own uncommitted work on another branch. Phase 3's user test removes-then-checks-out on purpose, because it is handing the branch over for manual testing; this step is not.
|
|
14
14
|
|
|
15
15
|
**No `git branch -D`.** The branch is the deliverable.
|
|
16
16
|
|
|
@@ -13,12 +13,13 @@ is implicit. Pickers follow `$HOME/.claude/multi-agent-refs/picker-contract.md`.
|
|
|
13
13
|
- `{ label: "Skip", description: "Stay in the worktree and go to Phase 4" }`
|
|
14
14
|
- **Skip** → go to Phase 4
|
|
15
15
|
- **Test now** → continue:
|
|
16
|
-
2. **
|
|
16
|
+
2. **Hand the branch over** (automatic). Make the WIP commit yourself, so it passes the same hooks as any commit (Standard path item 3 of Phase 4 Step 2 folds it back with Phase 2's checkpoints). The script then holds the run artefacts and the project root's current branch, removes the worktree and checks the branch out. `{worktree-path}` and `{jiraId}` come from the state (`worktreePath`, `jiraId`):
|
|
17
17
|
```bash
|
|
18
|
-
|
|
19
|
-
git worktree
|
|
20
|
-
|
|
18
|
+
git -C "{worktree-path}" add -A
|
|
19
|
+
git -C "{worktree-path}" diff --cached --quiet || git -C "{worktree-path}" commit -m "WIP: {jiraId} - changes for user test"
|
|
20
|
+
bash $HOME/.claude/scripts/user-test-handoff.sh checkout --task "{jiraId}" --worktree "{worktree-path}" --root "{project-root}" --branch "{branch-name}"
|
|
21
21
|
```
|
|
22
|
+
A refused commit stops here with nothing moved. Script exits: 3 the project root has uncommitted changes; 5 the worktree or a submodule holds uncommitted, unpushed or stashed work (a submodule with no remote needs one added); both move nothing. 6 a handoff is already held, or git refused part way: run `restore` below (if it answers 7, nothing had moved). 1 the worktree is not on the branch.
|
|
22
23
|
3. **Give test instructions**:
|
|
23
24
|
```
|
|
24
25
|
🧪 Switched to branch: {branch-name}
|
|
@@ -31,10 +32,12 @@ is implicit. Pickers follow `$HOME/.claude/multi-agent-refs/picker-contract.md`.
|
|
|
31
32
|
✅ "tamam" → proceeds to Phase 4
|
|
32
33
|
❌ "fix: ..." → worktree is recreated, returns to Phase 2
|
|
33
34
|
```
|
|
34
|
-
4. **Pause and wait**: Wait for the user's response
|
|
35
|
-
|
|
36
|
-
-
|
|
37
|
-
|
|
35
|
+
4. **Pause and wait**: Wait for the user's response. Either answer starts by handing the branch back, which returns the project root to its branch, re-adds the worktree and returns the held artefacts:
|
|
36
|
+
```bash
|
|
37
|
+
bash $HOME/.claude/scripts/user-test-handoff.sh restore --task "{jiraId}" --worktree "{worktree-path}" --root "{project-root}" --branch "{branch-name}"
|
|
38
|
+
```
|
|
39
|
+
Exit 3: the user edited files on the branch in the project root. Ask them to `git stash`, run `restore` again, then `git -C "{worktree-path}" stash pop`; a commit made there instead would stop Phase 4 from folding the checkpoints. Exit 6: the project root could not leave the branch (an untracked file in the way) or the worktree could not be re-added; the message names the cause, the hold is kept, and `restore` runs again once it is cleared. Exit 7: nothing was held, so the worktree was never removed.
|
|
40
|
+
5. **If a fix is needed**: return to Phase 2 in the restored worktree.
|
|
38
41
|
6. Log: `🧪 Phase 3: Review (user test) - {result}`
|
|
39
42
|
|
|
40
|
-
> ⚠️
|
|
43
|
+
> ⚠️ Never remove the worktree by hand: `user-test-handoff.sh` is the only path, and it refuses whenever work would be lost.
|