@outerlayer/cli 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +11 -11
  3. package/dist/{agent-setup-CN2HUBEJ.js → agent-setup-T624CWPD.js} +8 -7
  4. package/dist/artifact-link-cmd-2F47LT7F.js +24 -0
  5. package/dist/build-info.json +1 -1
  6. package/dist/{check-2JSSXCKJ.js → check-5XE7XMC4.js} +22 -19
  7. package/dist/{chunk-HFKKFTXU.js → chunk-2MNPHL23.js} +19 -11
  8. package/dist/{chunk-YDSMROTB.js → chunk-3NSNIIBE.js} +8 -4
  9. package/dist/{chunk-FOJGZYFC.js → chunk-42ZI52JW.js} +1 -1
  10. package/dist/{chunk-NPQWKGUA.js → chunk-6Y5RUTHO.js} +1 -1
  11. package/dist/{chunk-PQUM37BK.js → chunk-BWQ66M6N.js} +1 -1
  12. package/dist/chunk-C5Y5ZJJZ.js +88 -0
  13. package/dist/{chunk-ASOSIKA4.js → chunk-G5NPRL2K.js} +27 -6
  14. package/dist/{chunk-QLTYTPYU.js → chunk-HGECYFEI.js} +64 -7
  15. package/dist/{chunk-SXWS25JC.js → chunk-KG5ECZGJ.js} +6 -6
  16. package/dist/{chunk-F7GBYX2P.js → chunk-LWSJQJC6.js} +18 -4
  17. package/dist/{chunk-UUDDPNRJ.js → chunk-MAK5LYRF.js} +33 -10
  18. package/dist/{chunk-MTF3PHVZ.js → chunk-NBGDBTO2.js} +3 -3
  19. package/dist/{chunk-KFRM23WD.js → chunk-NNRTPG7X.js} +2 -2
  20. package/dist/{chunk-MSASO5O4.js → chunk-NWQTTSBB.js} +1 -1
  21. package/dist/{chunk-2M63GG56.js → chunk-OHVJA253.js} +1 -1
  22. package/dist/{chunk-Z3NOIFDR.js → chunk-ONKJUM6R.js} +1 -1
  23. package/dist/{chunk-T5VPP6H7.js → chunk-OZGHL5Y5.js} +1 -1
  24. package/dist/{chunk-ZA5CHAFY.js → chunk-POJMEEJJ.js} +21 -4
  25. package/dist/{chunk-JR6ERP3M.js → chunk-S3NYLI2P.js} +3 -3
  26. package/dist/{chunk-HXLMZOKU.js → chunk-VQYBXPI7.js} +4 -4
  27. package/dist/{chunk-LCEXHCHD.js → chunk-WTE3MQML.js} +1 -1
  28. package/dist/{chunk-NXUH742G.js → chunk-WVUIRTWA.js} +10 -8
  29. package/dist/{chunk-JJEGKEFV.js → chunk-YU3VKZ5F.js} +1 -1
  30. package/dist/{chunk-3NLOVYJQ.js → chunk-YZ5F4PIS.js} +134 -38
  31. package/dist/{cli-RGGXQTWI.js → cli-A76AXELQ.js} +90 -79
  32. package/dist/{command-ETUAEXP2.js → command-R2QCVX55.js} +10 -9
  33. package/dist/{connect-cmd-JUAW6MU4.js → connect-cmd-JBKAQNSF.js} +1 -1
  34. package/dist/{context-adopt-PJUMW2EZ.js → context-adopt-NFHCLVUB.js} +5 -4
  35. package/dist/{context-materialize-FDHYKNDT.js → context-materialize-IV2TUUFO.js} +5 -4
  36. package/dist/{doctor-CORFPYY6.js → doctor-4TAIARIG.js} +15 -13
  37. package/dist/{emit-artifact-cmd-FOGNJXVR.js → emit-artifact-cmd-MPZVR56N.js} +4 -4
  38. package/dist/{emit-cmd-ZEYWLC2C.js → emit-cmd-IJ3GVRFD.js} +4 -3
  39. package/dist/{emit-criteria-cmd-HBP6XS5C.js → emit-criteria-cmd-EFGYI23V.js} +2 -2
  40. package/dist/{emit-finding-cmd-DLI4MKMN.js → emit-finding-cmd-5GF3V4LR.js} +160 -47
  41. package/dist/{emit-result-cmd-MUSL7GQA.js → emit-result-cmd-I4OADKMD.js} +4 -4
  42. package/dist/hidden-prompt-UXBFMQC5.js +68 -0
  43. package/dist/{hook-fast-WYQD6D7T.js → hook-fast-R4FVSZ2H.js} +1 -1
  44. package/dist/{import-capture-cmd-6QVCOIHK.js → import-capture-cmd-EQ35EARA.js} +3 -3
  45. package/dist/{import-ruler-cmd-KLRGRBCP.js → import-ruler-cmd-BGAZXCQM.js} +1 -1
  46. package/dist/index.js +3 -3
  47. package/dist/{init-OPB7HHXO.js → init-6XPDRDTC.js} +12 -11
  48. package/dist/{init-MIC37V6J.js → init-PWU5YVL7.js} +54 -29
  49. package/dist/{init-cmd-JR3RKNFB.js → init-cmd-XAVO7HYZ.js} +11 -10
  50. package/dist/{init-update-O5YYFGF4.js → init-update-CVCWD6VS.js} +10 -9
  51. package/dist/{loop-QNSM5GXS.js → loop-FK3LPMMZ.js} +19 -18
  52. package/dist/{machine-IT6GG7FF.js → machine-SQXEBAM2.js} +10 -9
  53. package/dist/{runner-env-XTC53CHN.js → runner-env-EN7YE7QX.js} +1 -1
  54. package/dist/runner-key-6SLBI7PP.js +174 -0
  55. package/dist/{session-sender-4M247XSV.js → session-sender-FO3LCREV.js} +3 -3
  56. package/dist/{starter-pack-IB4UUIX3.js → starter-pack-KF66HGZR.js} +3 -3
  57. package/dist/{status-7ZX57OFJ.js → status-7VNQN5PW.js} +13 -12
  58. package/dist/{sync-cmd-UWD5JOFU.js → sync-cmd-GVPPFZ3G.js} +2 -2
  59. package/dist/{watch-DBNB7R6X.js → watch-23HSAEI6.js} +2 -2
  60. package/dist/{work-claim-cmd-A6IS6CQ7.js → work-claim-cmd-LKL3GHFQ.js} +5 -5
  61. package/dist/{work-cmd-EQSW5DTD.js → work-cmd-Z2WXLZPH.js} +3 -3
  62. package/dist/{work-comment-cmd-7VLKI7FN.js → work-comment-cmd-AWHP56M2.js} +3 -3
  63. package/dist/{work-open-pr-cmd-JEVD4HMQ.js → work-open-pr-cmd-IOM4AVQQ.js} +4 -4
  64. package/dist/{work-pr-cmd-L77K32WK.js → work-pr-cmd-HNEUIEN7.js} +3 -3
  65. package/package.json +1 -1
  66. package/skill-pack/maintained/{amend → outerlayer-amend}/SKILL.md +4 -2
  67. package/skill-pack/maintained/{outerlayer → outerlayer-cli}/SKILL.md +5 -3
  68. package/skill-pack/maintained/{emitting-evidence → outerlayer-evidence}/SKILL.md +5 -3
  69. package/skill-pack/maintained/{reporting-findings → outerlayer-findings}/SKILL.md +26 -30
  70. package/skill-pack/shipped.json +20 -4
  71. package/skill-pack/template/build/SKILL.md +7 -1
  72. package/skill-pack/template/build/references/agent-briefs.md +7 -1
  73. package/skill-pack/template/build/references/evidence.md +1 -1
  74. package/skill-pack/template/build/references/release.md +14 -12
  75. package/skill-pack/template/build/references/review-briefs.md +6 -0
  76. package/skill-pack/template/build/scripts/criterion-citations.mjs +8 -3
  77. package/skill-pack/template/build/scripts/record-criteria.mjs +8 -2
  78. package/skill-pack/template/spec/SKILL.md +2 -0
  79. package/skill-pack/template/writing-specs/SKILL.md +1 -1
  80. package/skill-pack/validators/acceptance-criteria.yaml +6 -5
  81. package/skill-pack/validators/code-review.yaml +6 -5
  82. package/dist/runner-key-7SSNMUBQ.js +0 -154
  83. /package/skill-pack/maintained/{outerlayer → outerlayer-cli}/references/open-pull-request.md +0 -0
  84. /package/skill-pack/maintained/{emitting-evidence → outerlayer-evidence}/references/agents-snippet.md +0 -0
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { LEASE_SECONDS, ALREADY_RELEASED, RENEW_INTERVAL_SECONDS } from './chunk-ASOSIKA4.js';
3
+ import { LEASE_SECONDS, ALREADY_RELEASED, RENEW_INTERVAL_SECONDS } from './chunk-G5NPRL2K.js';
4
4
  import './chunk-RMWLBUCJ.js';
5
+ import './chunk-NNRTPG7X.js';
5
6
  import './chunk-HYZRY4KZ.js';
6
- import './chunk-KFRM23WD.js';
7
- import './chunk-MSASO5O4.js';
7
+ import './chunk-NWQTTSBB.js';
8
8
  import './chunk-HHJDN6AU.js';
9
9
  import { formatBytes } from './chunk-YYYRBYWG.js';
10
10
  import './chunk-TBT347UY.js';
11
- import { formatDuration, formatClock, relativeToRunner } from './chunk-UUDDPNRJ.js';
11
+ import { formatDuration, formatClock, relativeToRunner } from './chunk-MAK5LYRF.js';
12
12
  import './chunk-KMDLFI4P.js';
13
13
  import './chunk-QKFB4K7X.js';
14
14
  import './chunk-RSNSZ2LJ.js';
15
- import './chunk-JR6ERP3M.js';
16
- import './chunk-NPQWKGUA.js';
15
+ import './chunk-S3NYLI2P.js';
16
+ import './chunk-6Y5RUTHO.js';
17
17
  import './chunk-IP7BIBXJ.js';
18
18
  import './chunk-22RMZBGW.js';
19
19
  import './chunk-UXYLWVTQ.js';
@@ -27,7 +27,7 @@ import './chunk-4Q7OMKAT.js';
27
27
  import './chunk-CX22S5BA.js';
28
28
  import './chunk-F7CU5ABH.js';
29
29
  import './chunk-BKO6JEZI.js';
30
- import './chunk-YDSMROTB.js';
30
+ import './chunk-3NSNIIBE.js';
31
31
  import './chunk-WUYTWNMA.js';
32
32
  import './chunk-JXYVA45C.js';
33
33
  import './chunk-4KSQKQXE.js';
@@ -36,20 +36,21 @@ import './chunk-YRYMNBGQ.js';
36
36
  import './chunk-GQD22KKN.js';
37
37
  import './chunk-WZBHBH3J.js';
38
38
  import './chunk-5QRP3MVS.js';
39
- import './chunk-3NLOVYJQ.js';
40
- import './chunk-LCEXHCHD.js';
39
+ import './chunk-YZ5F4PIS.js';
40
+ import './chunk-WTE3MQML.js';
41
+ import './chunk-C5Y5ZJJZ.js';
41
42
  import './chunk-ZJSNLVCE.js';
42
43
  import './chunk-YO4PSLVB.js';
43
44
  import './chunk-BYT5O5RV.js';
44
- import './chunk-ZA5CHAFY.js';
45
- import './chunk-2M63GG56.js';
45
+ import './chunk-POJMEEJJ.js';
46
+ import './chunk-OHVJA253.js';
46
47
  import './chunk-PLMTLGYH.js';
47
48
  import './chunk-J5M7BSJQ.js';
48
49
  import './chunk-EABW6AJQ.js';
49
50
  import './chunk-RA3O54FC.js';
50
51
  import './chunk-V7NIVOFD.js';
51
52
  import { runnerDir, jobsDir } from './chunk-ZM2IMMYN.js';
52
- import './chunk-PQUM37BK.js';
53
+ import './chunk-BWQ66M6N.js';
53
54
  import './chunk-XCCLFVXM.js';
54
55
  import './chunk-BJ3KTMDH.js';
55
56
  import './chunk-VNVZDWO3.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { CHUNK_PART_TARGET_BYTES, RETRYABLE_STATUSES, SyncConfigError, SyncTransportError, detectCi, isLoopbackUrl, resolveTier, runSync } from './chunk-MSASO5O4.js';
3
+ export { CHUNK_PART_TARGET_BYTES, RETRYABLE_STATUSES, SyncConfigError, SyncTransportError, detectCi, isLoopbackUrl, resolveTier, runSync } from './chunk-NWQTTSBB.js';
4
4
  import './chunk-HHJDN6AU.js';
5
5
  import './chunk-TBT347UY.js';
6
6
  import './chunk-IP7BIBXJ.js';
@@ -19,7 +19,7 @@ import './chunk-J5M7BSJQ.js';
19
19
  export { cloudConfigPath, readCloudConfig, writeCloudConfig } from './chunk-EABW6AJQ.js';
20
20
  import './chunk-V7NIVOFD.js';
21
21
  import './chunk-ZM2IMMYN.js';
22
- import './chunk-PQUM37BK.js';
22
+ import './chunk-BWQ66M6N.js';
23
23
  import './chunk-XCCLFVXM.js';
24
24
  import './chunk-BJ3KTMDH.js';
25
25
  import './chunk-VNVZDWO3.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { LiveUploader } from './chunk-MSASO5O4.js';
3
+ import { LiveUploader } from './chunk-NWQTTSBB.js';
4
4
  import './chunk-HHJDN6AU.js';
5
5
  import './chunk-TBT347UY.js';
6
6
  import './chunk-IP7BIBXJ.js';
@@ -19,7 +19,7 @@ import './chunk-J5M7BSJQ.js';
19
19
  import './chunk-EABW6AJQ.js';
20
20
  import './chunk-V7NIVOFD.js';
21
21
  import './chunk-ZM2IMMYN.js';
22
- import './chunk-PQUM37BK.js';
22
+ import './chunk-BWQ66M6N.js';
23
23
  import './chunk-XCCLFVXM.js';
24
24
  import './chunk-BJ3KTMDH.js';
25
25
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { RUNNER_PROTOCOL } from './chunk-ADJRGVZC.js';
4
- import { resolveCredentials, WorkCommandError, parsePositiveInt, postJson, environmentFacts, resolveRepository, findLiveItem } from './chunk-JR6ERP3M.js';
5
- export { WorkCommandError } from './chunk-JR6ERP3M.js';
6
- import './chunk-NPQWKGUA.js';
4
+ import { resolveCredentials, WorkCommandError, parsePositiveInt, postJson, environmentFacts, resolveRepository, findLiveItem } from './chunk-S3NYLI2P.js';
5
+ export { WorkCommandError } from './chunk-S3NYLI2P.js';
6
+ import './chunk-6Y5RUTHO.js';
7
7
  import './chunk-IP7BIBXJ.js';
8
8
  import { defaultRunnerConfigPath } from './chunk-22RMZBGW.js';
9
9
  import './chunk-UXYLWVTQ.js';
10
10
  import './chunk-7RQ73DLO.js';
11
11
  import './chunk-4Q7OMKAT.js';
12
- import './chunk-YDSMROTB.js';
12
+ import './chunk-3NSNIIBE.js';
13
13
  import './chunk-WUYTWNMA.js';
14
14
  import './chunk-JXYVA45C.js';
15
15
  import './chunk-4KSQKQXE.js';
@@ -118,7 +118,7 @@ async function runWorkRelease(opts) {
118
118
  { sessionId, ended: true },
119
119
  fetchImpl
120
120
  );
121
- const { markWorkLeaseRenewed } = await import('./hook-fast-WYQD6D7T.js');
121
+ const { markWorkLeaseRenewed } = await import('./hook-fast-R4FVSZ2H.js');
122
122
  markWorkLeaseRenewed(sessionId, opts.home ?? homeFromEnv(env));
123
123
  const output2 = opts.json ? JSON.stringify(data2) : `released session ${sessionId}'s lease on #${itemId}, if it held one`;
124
124
  if (!opts.quiet) process.stdout.write(output2 + "\n");
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { WorkCommandError, environmentFacts, findLiveItem, getJson, parsePositiveInt, postJson, resolveCredentials, resolveRepository, runWorkBuild, runWorkLinkSession, runWorkList, runWorkRemove, runWorkStatus } from './chunk-JR6ERP3M.js';
4
- import './chunk-NPQWKGUA.js';
3
+ export { WorkCommandError, environmentFacts, findLiveItem, getJson, parsePositiveInt, postJson, resolveCredentials, resolveRepository, runWorkBuild, runWorkLinkSession, runWorkList, runWorkRemove, runWorkStatus } from './chunk-S3NYLI2P.js';
4
+ import './chunk-6Y5RUTHO.js';
5
5
  import './chunk-IP7BIBXJ.js';
6
- import './chunk-YDSMROTB.js';
6
+ import './chunk-3NSNIIBE.js';
7
7
  import './chunk-WUYTWNMA.js';
8
8
  import './chunk-JXYVA45C.js';
9
9
  import './chunk-4KSQKQXE.js';
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { resolveCredentials, postJson, getJson } from './chunk-JR6ERP3M.js';
4
- import './chunk-NPQWKGUA.js';
3
+ import { resolveCredentials, postJson, getJson } from './chunk-S3NYLI2P.js';
4
+ import './chunk-6Y5RUTHO.js';
5
5
  import { detectActiveSession } from './chunk-IP7BIBXJ.js';
6
- import './chunk-YDSMROTB.js';
6
+ import './chunk-3NSNIIBE.js';
7
7
  import { sanitizeTerminal } from './chunk-WUYTWNMA.js';
8
8
  import { resolveRepoIdentity } from './chunk-JXYVA45C.js';
9
9
  import './chunk-4KSQKQXE.js';
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { itemLabel, runWorkPr, WorkPrCommandError } from './chunk-JJEGKEFV.js';
4
- import { resolveCredentials } from './chunk-JR6ERP3M.js';
5
- import './chunk-NPQWKGUA.js';
3
+ import { itemLabel, runWorkPr, WorkPrCommandError } from './chunk-YU3VKZ5F.js';
4
+ import { resolveCredentials } from './chunk-S3NYLI2P.js';
5
+ import './chunk-6Y5RUTHO.js';
6
6
  import './chunk-IP7BIBXJ.js';
7
- import './chunk-YDSMROTB.js';
7
+ import './chunk-3NSNIIBE.js';
8
8
  import './chunk-WUYTWNMA.js';
9
9
  import './chunk-JXYVA45C.js';
10
10
  import './chunk-4KSQKQXE.js';
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { WorkPrCommandError, itemLabel, runWorkPr } from './chunk-JJEGKEFV.js';
4
- import './chunk-NPQWKGUA.js';
3
+ export { WorkPrCommandError, itemLabel, runWorkPr } from './chunk-YU3VKZ5F.js';
4
+ import './chunk-6Y5RUTHO.js';
5
5
  import './chunk-IP7BIBXJ.js';
6
- import './chunk-YDSMROTB.js';
6
+ import './chunk-3NSNIIBE.js';
7
7
  import './chunk-WUYTWNMA.js';
8
8
  import './chunk-JXYVA45C.js';
9
9
  import './chunk-4KSQKQXE.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@outerlayer/cli",
3
- "version": "0.15.0",
3
+ "version": "0.17.0",
4
4
  "description": "OuterLayer CLI — commands: init, connect, doctor, login, logout, sync, daemon (alias: watch), emit, work, runner, hooks, mcp, import, context. Capture and sync coding-agent sessions, and record proof of factory work.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Magu Studios, Inc.",
@@ -1,13 +1,15 @@
1
1
  ---
2
- name: amend
2
+ name: outerlayer-amend
3
3
  description: >
4
4
  Answer the review threads waiting on an agent on an open pull request: read each
5
5
  thread a person handed to an agent, fix what it says on the pull request's branch,
6
6
  reply on the thread with a replacement artifact or a sentence, and push. Use when a
7
7
  work item has threads waiting on an agent, or when asked to "answer the review" or
8
- "fix what the reviewer failed". Invoke with /amend.
8
+ "fix what the reviewer failed". Invoke with /outerlayer-amend.
9
9
  ---
10
10
 
11
+ Run the CLI as `outerlayer`. If that command is not on PATH, run `npx -y @outerlayer/cli` with the same arguments. Every `outerlayer ...` command below follows this rule.
12
+
11
13
  Answer every thread waiting on an agent on one work item's pull request, then
12
14
  stop. A work item has one general thread and one thread per acceptance
13
15
  criterion. A person's fail on the general thread leaves it waiting on an agent.
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: outerlayer
2
+ name: outerlayer-cli
3
3
  description: >
4
4
  Explain what OuterLayer is and how work flows through it: work items, the
5
5
  OUTERLAYER_WORK variable, the factory, and building an issue or specifying one.
@@ -9,6 +9,8 @@ description: >
9
9
  review.
10
10
  ---
11
11
 
12
+ Run the CLI as `outerlayer`. If that command is not on PATH, run `npx -y @outerlayer/cli` with the same arguments. Every `outerlayer ...` command below follows this rule.
13
+
12
14
  OuterLayer is a software factory. An issue goes in. A reviewed and verified
13
15
  pull request comes out, with the evidence that backs it. An agent builds it in
14
16
  this repository, on the machine it already runs on.
@@ -34,9 +36,9 @@ from the output of `outerlayer work build`.
34
36
  instead. With `--local`, the person builds it on their own machine with
35
37
  `OUTERLAYER_WORK=<number> claude "/build"`.
36
38
  4. `outerlayer emit artifact <file> --caption "<what it shows>"` attaches a
37
- screenshot, recording, report or log as evidence. The `emitting-evidence`
39
+ screenshot, recording, report or log as evidence. The `outerlayer-evidence`
38
40
  skill says what to capture.
39
- 5. `/amend` answers the review threads a person handed to an agent.
41
+ 5. `/outerlayer-amend` answers the review threads a person handed to an agent.
40
42
 
41
43
  ## Several repositories
42
44
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: emitting-evidence
2
+ name: outerlayer-evidence
3
3
  description: >
4
4
  Emit artifacts — screenshots, recordings, reports, logs — as proof that a
5
5
  change works, bound to the pull request via `outerlayer emit artifact`.
@@ -8,6 +8,8 @@ description: >
8
8
  works", and in CI steps that produce verifiable output.
9
9
  ---
10
10
 
11
+ Run the CLI as `outerlayer`. If that command is not on PATH, run `npx -y @outerlayer/cli` with the same arguments. Every `outerlayer ...` command below follows this rule.
12
+
11
13
  An artifact is an exhibit: evidence *of* a specific change, anchored to the
12
14
  pull request and rendered in its evidence comment. Emit the few exhibits the
13
15
  spec asks for — a reviewer should see the change working, not a gallery.
@@ -98,7 +100,7 @@ Emit the review report, an HTML file, as a report artifact with no `--for`:
98
100
 
99
101
  outerlayer emit artifact review.html --caption "Review of the change and what it found"
100
102
 
101
- Then run `outerlayer sync`, and copy the report's deep link from the pull request's evidence comment. Never build the link by hand, and never link a pull request comment. Record the review's verdict on the `code-review` check that `outerlayer init` writes, with that link as its proof:
103
+ Then run `outerlayer sync`. It prints a line for the report that ends with its link (`outerlayer sync --json` lists them under `uploadedArtifacts`). Take the link from that line. If `sync` printed no line for the report, another sync already uploaded it: run `outerlayer sync --link <the artifact id>`, with the id `emit artifact` printed. Never build the link by hand, and never link a pull request comment. Record the review's verdict on the `code-review` check that `outerlayer init` writes, with that link as its proof:
102
104
 
103
105
  outerlayer emit code-review --item "$OUTERLAYER_WORK" --result pass --link <the report's deep link>
104
106
 
@@ -108,7 +110,7 @@ Use `--result fail` when the review left a finding unfixed. Record it once. Outs
108
110
 
109
111
  Bind the judge's report on each criterion, an HTML file, with `--for acceptance-criteria`. The item page links it at the top of its Criteria tab for the reviewer. Emit it only when the item has recorded criteria.
110
112
 
111
- Then run `outerlayer sync`, copy the report's deep link from the evidence comment the same way, and record the judge's verdict on the `acceptance-criteria` check that `outerlayer init` writes:
113
+ Then run `outerlayer sync`, take the report's deep link from the line it prints the same way, and record the judge's verdict on the `acceptance-criteria` check that `outerlayer init` writes:
112
114
 
113
115
  outerlayer emit acceptance-criteria --item "$OUTERLAYER_WORK" --result pass --link <the report's deep link>
114
116
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: reporting-findings
2
+ name: outerlayer-findings
3
3
  description: >
4
4
  Records factory problems: anything in a repository's instructions, tests, tooling or
5
5
  local setup that cost an agent time and was not caused by its own change. Use when
@@ -12,6 +12,8 @@ description: >
12
12
  `outerlayer emit finding` command.
13
13
  ---
14
14
 
15
+ Run the CLI as `outerlayer`. If that command is not on PATH, run `npx -y @outerlayer/cli` with the same arguments. Every `outerlayer ...` command below follows this rule.
16
+
15
17
  ## What this is for
16
18
 
17
19
  A finding is a problem in the factory, not in the change: an instruction
@@ -88,17 +90,24 @@ server join a finding to a known problem without asking you.
88
90
 
89
91
  ## Time lost
90
92
 
91
- When you run `outerlayer emit finding` without `--started-at`, it prints your
92
- recent session events, each with an id and a time:
93
+ Every finding records the time it cost, read from two events of your session
94
+ or its subagents. Never estimate minutes yourself.
95
+
96
+ - Start: `--started-at <id>`, else the first tool output that shows your
97
+ `--error` text. Copy `--error` exactly as the output printed it.
98
+ - End: `--ended-at <id>`, else the newest event. Record as soon as you are
99
+ past the problem, and the default is right.
100
+
101
+ With no start found, nothing is stored and the recent events are listed:
93
102
 
94
103
  ```
95
- e118 14:02:11 agent: Bash: yarn test
104
+ e118 14:02:11 agent: Bash: yarn test
105
+ a5c9fb78:e42 14:09:30 user: result: FAIL src/app.test.ts
96
106
  ```
97
107
 
98
- Run it again with `--started-at <id>` for the event where you first hit the
99
- problem and `--ended-at <id>` for the event where you got past it. The time is
100
- read from those two events. Never estimate minutes yourself. A finding with no
101
- events still counts toward how often the problem occurs.
108
+ Run it again with `--started-at`. A prefixed id is a subagent's event.
109
+ `--find <text>` lists older events containing the text. `--untimed` is only
110
+ for a problem that cost no time here. Never pipe the command through `tail`.
102
111
 
103
112
  ## Linking a finding to a problem
104
113
 
@@ -129,33 +138,28 @@ outerlayer emit finding --id <short-id> --category <category> \
129
138
  --title "<one sentence>" --file <path> [--line <n>] --where "<what you were doing>" \
130
139
  [--cause "<cause>"] [--detail "<text>"] [--suggestion "<text>"] \
131
140
  [--command "<cmd>"] [--error "<first error line>"] [--test "<name>"] [--symbol "<function>"] \
132
- [--started-at <event id> --ended-at <event id>] \
141
+ [--started-at <event id>] [--ended-at <event id>] \
133
142
  [--problem <id> --link-reason "<why>" | --new]
134
143
  ```
135
144
 
136
145
  Inside a recorded session the work item is found automatically. Outside one,
137
146
  add `--item <number>`.
138
147
 
139
- Examples, one per category:
148
+ Examples. The ones with no `--error` name their start:
140
149
 
141
150
  ```bash
142
- outerlayer emit finding --id worktree-hooks --category context \
143
- --title "No document says a fresh worktree has no git hooks until yarn prepare runs" \
144
- --file AGENTS.md --rule-path AGENTS.md --rule-relation missing \
145
- --where "first push from a new worktree"
146
-
147
151
  outerlayer emit finding --id stale-path --category context \
148
152
  --title "The build skill names a directory that no longer exists" \
149
153
  --file .outerlayer/skills/build/SKILL.md --line 42 \
150
154
  --rule-path .outerlayer/skills/build/SKILL.md --rule-line 42 --rule-relation broken \
151
155
  --rule-quote "Read the plan from reports/plan.md" \
152
- --where "implementation stage"
156
+ --where "implementation stage" --started-at e118
153
157
 
154
158
  outerlayer emit finding --id flaky-refresh --category flaky-test \
155
159
  --title "refresh.test.ts fails once, then passes on rerun" \
156
160
  --file apps/tenant-dashboard/src/lib/system/pr-session-comment/__tests__/refresh.test.ts \
157
161
  --test "refreshes the comment after a push" \
158
- --where "vitest run <file> failed, then passed with no change"
162
+ --where "vitest run <file> failed, then passed with no change" --started-at e204
159
163
 
160
164
  outerlayer emit finding --id gate-skip --category tooling \
161
165
  --title "The pre-push gate prints green when a step was skipped" \
@@ -164,19 +168,10 @@ outerlayer emit finding --id gate-skip --category tooling \
164
168
  --cause "the skip path returns before the summary is computed" \
165
169
  --where "expected a failure, got exit 0"
166
170
 
167
- outerlayer emit finding --id shared-db --category environment \
168
- --title "A peer session reset the shared Supabase project mid-run" \
169
- --file apps/tenant-dashboard/supabase/config.toml \
170
- --where "needed a stable database, found it re-seeded"
171
-
172
171
  outerlayer emit finding --id null-read --category defect \
173
172
  --title "readItem throws on an item with no claim" \
174
173
  --file src/lib/work/read.ts --line 88 --symbol readItem \
175
- --where "reproduce: call readItem on a fresh item"
176
-
177
- outerlayer emit finding --id slow-hook --category other \
178
- --title "The session-start hook adds about ten seconds on every launch" \
179
- --file .husky/post-checkout --where "timed with time(1)"
174
+ --where "reproduce: call readItem on a fresh item" --started-at a5c9fb78:e42
180
175
  ```
181
176
 
182
177
  To record several at once, write a JSON batch and run
@@ -207,9 +202,10 @@ To record several at once, write a JSON batch and run
207
202
  }
208
203
  ```
209
204
 
210
- `startedAt` and `endedAt` are event ids from `emit finding`'s list, given
211
- together or not at all. `problems` with `linkReason`, and `new: true`, are
212
- for a finding that needs a choice; give neither and the server decides by key
205
+ `startedAt` and `endedAt` are event ids, defaulting as in `emit finding`. A
206
+ finding with no start found stops the batch; `"untimed": true` is the
207
+ exception. `problems` with `linkReason`, and `new: true`, are for a finding
208
+ that needs a choice; give neither and the server decides by key
213
209
  or lists candidates. `emit findings` stores the findings that match a key,
214
210
  lists the ones that need a choice, and exits with code 3.
215
211
 
@@ -6,15 +6,20 @@
6
6
  "78c95632b51600df0cb2e206d843e75789ccba2f80fd8dfab36d16239062b008"
7
7
  ],
8
8
  ".outerlayer/skills/build/SKILL.md": [
9
+ "0fe8ee00567a1e8942de27597b0a64588fd4b75abd8fb5cd4998785b3e6c7f2b",
9
10
  "5cf9bd75fb1f984f6e6b470d1f1581dc06168abf062448e6f43711fed8f6632a",
10
11
  "6177ea457be0d238659640e6d29807708d60d68533ae3ff93af10fb513139ced",
11
12
  "77cab8b446fb1aa865710f7cb8356c5334301a942f58f9243766bf1acf1377ad",
12
13
  "93953397c31d47a6f1c06edb8ae2190e1d8a3fca20c616deb33991311cee39a8",
13
14
  "a6743050c5c387e962ad4264526d9a3c10edf36823e4b6829f200bf79a4e45e7",
14
15
  "b0aa9b6962675f772b67a4390c15b6b0100390983d958c656a826a066399f3d0",
16
+ "b95986e95ea3b1ef4202f7f0c00bfcd35865d4fda033b3d6947a5bb9d33cd24c",
17
+ "e9d086f6b989e3a17f14d6dcaacabd438bed861076f9a620fce61accc8fce4fb",
15
18
  "f4e1661c6f87d7ff6d23c6182530fa0a9cb87c4dc3f31e48f2be11f32ebb2c00"
16
19
  ],
17
20
  ".outerlayer/skills/build/references/agent-briefs.md": [
21
+ "09bfa482e1d7f8ceabd29a6e23e74641f3ff6e655126362d27a05df422c584ed",
22
+ "20eece295abc7ccecd289ce6d408dd3c4c038e2cbfdb3acdba069bd0ccb86496",
18
23
  "3c875a4f287f574eea954c6daa52b17529cdeba8ec4007d78084d911350d1218",
19
24
  "7c2a651e7c827d8e3fb9df889d3776b552eb02d315db5ace27d2baad78aab6a5"
20
25
  ],
@@ -22,19 +27,24 @@
22
27
  "62db8f6d77f31ca25a9071c05429e0f639f9b2bdd7f7cb04cb14a1b0db509537"
23
28
  ],
24
29
  ".outerlayer/skills/build/references/evidence.md": [
30
+ "557d62885555606d64e86cc9fb16a5e2ee0f2257e6fe2aeec5a294292d57cecf",
25
31
  "ceff5488bae31198ed4738ae1a230c0119f973ced439dac360eba6e24e1604f4",
26
32
  "f27502610358e436e7ffb61d4fd281289e162f6de6b2c11396f17b2fa63802c9"
27
33
  ],
28
34
  ".outerlayer/skills/build/references/release.md": [
29
35
  "0b0af40c82473cf192f697537ed5a84801a14e79bb11790d72226d7f7f49cca0",
30
36
  "1113259bdf7d8c28edcbdb9b4c83c2f2bd4c5eaf817cf30bf428478ff91694e9",
37
+ "1d0e000433676a39c7ac4fbf3e92b1fe4235b10240c09f87ec0003f3c8d7956e",
31
38
  "1f4fe97ca8f11d6681db5734f3103af5ea175a9472ff1d38b10cb463f4956a6a",
32
39
  "4687f56bcec766f1926d58a208418f800a1727c073b5e6047b40e3aaac2bd6c9",
40
+ "4cfc10bc9d380e67b0ec5c243eb5f2c63f03ee3348d7956a45467620acc656fc",
33
41
  "81a764eb317fcb4672bedd35e7b9aa68d1c0b73f82fc2dfa03e5a78758db8f14",
34
42
  "985e02b98105b00c356014e003b2d60e9c458c3dcbeef7378274ccb84af031fc"
35
43
  ],
36
44
  ".outerlayer/skills/build/references/review-briefs.md": [
37
- "2c8b436795b583a61aa6f98f48611db554f0dd52b27a9ab748a7db5f96526aec"
45
+ "2c8b436795b583a61aa6f98f48611db554f0dd52b27a9ab748a7db5f96526aec",
46
+ "8f04427895a01c1b86f1ee2caab983163201c75fafe4c0feba02e8f665089aac",
47
+ "a9af0ddd115496480702743e628be3206426c40563f03aa4bb1714176ff70146"
38
48
  ],
39
49
  ".outerlayer/skills/build/references/review-loop.md": [
40
50
  "155ab732ccf4c25f000853e98a27a3d2f3a022c75979601bb71d86f07983216d",
@@ -43,19 +53,23 @@
43
53
  "9d4d2e5e0307ea8c38cf885cd67d06a939b7fc2bed65f5080ca9610178949d74"
44
54
  ],
45
55
  ".outerlayer/skills/build/scripts/criterion-citations.mjs": [
46
- "0902118ec216182f9d0ba0f6c7966306ad6891d8e846022123d3f86aaf175fce"
56
+ "0902118ec216182f9d0ba0f6c7966306ad6891d8e846022123d3f86aaf175fce",
57
+ "aa9446b29c7c8fa4d312b8ec54b2a2a154f52708691a7eaf61e3a1b67ae6a9ef"
47
58
  ],
48
59
  ".outerlayer/skills/build/scripts/record-criteria.mjs": [
49
60
  "36f19e730bc220fa21622b3bb0a306999f038b8220a0a07a1efe21ec0f748729",
50
61
  "596e9a78e62cbea040a3bf428cd54bf59687e9e89001fad719304f88d03ca2ea",
51
- "64de9445087b247b0781a4e6e025ef97b1259ce1c91819bf541decc26b8f8400"
62
+ "64de9445087b247b0781a4e6e025ef97b1259ce1c91819bf541decc26b8f8400",
63
+ "f3d6ed58118209d8b169d00b4283d48f25d3cac5121d2e29364274dd36ed113a"
52
64
  ],
53
65
  ".outerlayer/skills/spec/SKILL.md": [
54
66
  "71e81fabf353ad6117c54e061868538bf00066b78c2528f5a8364445d1def02e",
67
+ "82f75a53c591f94615dc27c099e94fcf95e2a09b95aceb38b9022d5f7f054cb0",
55
68
  "9039ae30d4e836b5c5cfba4a14344e46fd13694ae9e4d88e750abce34dfcd9e6"
56
69
  ],
57
70
  ".outerlayer/skills/writing-specs/SKILL.md": [
58
71
  "a956aac4249118a058c4327c5751472883588720950d4a96f80c7e91f454bef9",
72
+ "dbadb39cba5dae936e7c4b97cb852c59072e4a60e44caec01b128a045c1be090",
59
73
  "eb8aa95f5e76a46ae9bf340989fb40e470fd750ded791ba80b5f8c5c325513e5"
60
74
  ],
61
75
  ".outerlayer/skills/writing-specs/references/agents-snippet.md": [
@@ -65,10 +79,12 @@
65
79
  "b00f5970b568159ca0bfbc75c3834938749ad5e2e73a80769d88bbe3c8c26737"
66
80
  ],
67
81
  ".outerlayer/validators/acceptance-criteria.yaml": [
68
- "3b2054aa1d4bd9f7441e88eec1a3bdf61b61ad00efa79736e26a5dd601d43910"
82
+ "3b2054aa1d4bd9f7441e88eec1a3bdf61b61ad00efa79736e26a5dd601d43910",
83
+ "d9bef4bf0962015c662f1bc16d86807414dfc6e095f99aa3727bc4613676ab2a"
69
84
  ],
70
85
  ".outerlayer/validators/code-review.yaml": [
71
86
  "05041976e4d84d6256ed88995ea4fd1566abc6d3a9574863065cf855dcafcf70",
87
+ "40653bc6b170f28be1df410d9d8e270987184a2d04cbec588ae07f50afa59ba3",
72
88
  "fbdf0baca0064b09e47f5984afc322d582accd142c3377c06622bc6567b0e98c"
73
89
  ]
74
90
  }
@@ -8,6 +8,8 @@ description: >
8
8
  disable-model-invocation: true
9
9
  ---
10
10
 
11
+ Run the CLI as `outerlayer`. If that command is not on PATH, run `npx -y @outerlayer/cli` with the same arguments. Every `outerlayer ...` command below follows this rule.
12
+
11
13
  Build one issue into an evidenced pull request. `/spec` writes and gets
12
14
  approval for the issue. This skill builds it. It never writes the spec.
13
15
 
@@ -82,7 +84,7 @@ These bind the orchestrator in every phase. Rule 5 also binds every spawned agen
82
84
  report bodies. Delete both at the end of phase 6.
83
85
  Once a pull request exists, read `outerlayer work threads --item
84
86
  "$OUTERLAYER_WORK" --json`. Each thread with `waitingOn` of `agent` holds a
85
- person's comment. Answer each before the run ends, as the `amend` skill does.
87
+ person's comment. Answer each before the run ends, as the `outerlayer-amend` skill does.
86
88
  5. **A session never records a pass or fail on an artifact.** It emits
87
89
  artifacts. A person decides pass or fail. A build records two results,
88
90
  both verdicts of its own agents: its review's, on the `code-review`
@@ -106,6 +108,10 @@ These bind the orchestrator in every phase. Rule 5 also binds every spawned agen
106
108
  state file. Past three quarters, say where the count stands in the status
107
109
  line. A run that would exceed the budget stops and lists what is left
108
110
  unverified. The review phase also holds a limit on agents in flight.
111
+ 10. **Factory problems are findings.** Every agent records the problems it
112
+ hit outside the change with the `outerlayer-findings` skill, as its brief
113
+ says. The orchestrator records only the ones it hit itself. The final
114
+ report lists every finding by id.
109
115
 
110
116
  ## Phases
111
117
 
@@ -61,6 +61,12 @@ report with the command, and leave that step undone.
61
61
 
62
62
  A session never records a pass or fail on an artifact.
63
63
 
64
+ A problem in the repository's instructions, tests, tooling or setup that
65
+ cost you time, and that the change did not cause, is a finding. Record it with
66
+ the `outerlayer-findings` skill as soon as you are past it, under an id that
67
+ starts with your stage, such as `implement-tooling-1`. End your report with a
68
+ "Factory problems" section that lists each id and title.
69
+
64
70
  Write your full report to the path this brief names. Then return at most ten
65
71
  lines. Anything you leave out of the file is lost to the next stage.
66
72
 
@@ -218,7 +224,7 @@ ten lines naming the CI conclusion, the mergeability and every failed check.
218
224
 
219
225
  ## Evidence brief
220
226
 
221
- The shared rules apply, and the emitting-evidence skill governs the emit
227
+ The shared rules apply, and the outerlayer-evidence skill governs the emit
222
228
  mechanics. Your inputs are the issue, the pull request number, the criteria
223
229
  that declare a proof form, and the instructions-file pointer.
224
230
 
@@ -12,7 +12,7 @@ earlier phase from the state file.
12
12
  The orchestrator does not run the app, drive a browser or emit an artifact
13
13
  itself. Spawn one evidence agent in a fresh context on the Evidence brief, with
14
14
  the issue, the pull request number, the criteria that declare a proof form, the
15
- instructions-file pointer and the emitting-evidence skill.
15
+ instructions-file pointer and the outerlayer-evidence skill.
16
16
 
17
17
  A criterion that declares `proof: screenshot` needs a screenshot bound to its
18
18
  id. One that declares `proof: video` needs a video. A screenshot never
@@ -23,7 +23,7 @@ no telemetry, round tables or reviewer roles. Those go in the final report.
23
23
 
24
24
  How to open it, and how to link it to the work item, depends on whether this is
25
25
  a runner build or a local session. Read
26
- `.outerlayer/skills/outerlayer/references/open-pull-request.md` and follow the
26
+ `.outerlayer/skills/outerlayer-cli/references/open-pull-request.md` and follow the
27
27
  steps for where this build runs.
28
28
 
29
29
  Run the reader pass on the title and body before opening, and after any later
@@ -48,16 +48,18 @@ request before going on.
48
48
 
49
49
  ## Record the code review
50
50
 
51
- Once the pull request is linked, run `outerlayer sync`. Copy the review
52
- report's deep link from the pull request's evidence comment. Never build the
53
- link by hand, and never link a pull request comment. Then record the review's
54
- verdict on the `code-review` check, once:
51
+ Once the pull request is linked, run `outerlayer sync`. It prints a line for
52
+ the review report that ends with its link. Take the link from that line. If
53
+ `sync` printed no line for the report, another sync already uploaded it: run
54
+ `outerlayer sync --link <the artifact id>`, with the id `emit artifact`
55
+ printed. Never build the link by hand, and never link a pull request comment.
56
+ Then record the review's verdict on the `code-review` check, once:
55
57
 
56
58
  outerlayer emit code-review --item "$OUTERLAYER_WORK" --result pass --link <the report's deep link>
57
59
 
58
60
  Record `--result fail` when the review ended with a blocking finding unfixed.
59
- When the link has not appeared after a sync, stop and name it as a blocker in
60
- the final report. Never record the result with another link.
61
+ When neither command gives a link, stop and name it as a blocker in the final
62
+ report. Never record the result with another link.
61
63
 
62
64
  ## Judge the criteria
63
65
 
@@ -83,11 +85,11 @@ that is missing in the evidence phase.
83
85
 
84
86
  ## Record the criteria verdict
85
87
 
86
- Once the judge's report is synced, copy its deep link from the pull request's
87
- evidence comment. The link can take up to a minute to appear after the sync.
88
- If it is not there yet, wait a minute and read the comment again. Never build
89
- the link by hand, and never link a pull request comment. Then record the
90
- judge's verdict on the `acceptance-criteria` check, once:
88
+ Once the judge's report is synced, take its deep link from the line `sync`
89
+ printed for it. If `sync` printed no line for the report, run
90
+ `outerlayer sync --link <the artifact id>`, with the id `emit artifact`
91
+ printed. Never build the link by hand, and never link a pull request comment.
92
+ Then record the judge's verdict on the `acceptance-criteria` check, once:
91
93
 
92
94
  outerlayer emit acceptance-criteria --item "$OUTERLAYER_WORK" --result pass --link <the judge report's deep link>
93
95
 
@@ -38,6 +38,12 @@ git.
38
38
  Never ask the user a question. If you need a ruling, state your assumption in
39
39
  your report and continue.
40
40
 
41
+ A problem in the repository's instructions, tests, tooling or setup that
42
+ cost you time, and that the change did not cause, is a finding. Record it with
43
+ the `outerlayer-findings` skill as soon as you are past it, under an id that
44
+ starts with your stage, such as `implement-tooling-1`. End your report with a
45
+ "Factory problems" section that lists each id and title.
46
+
41
47
  You are a cold adversarial reviewer. You know nothing about how this change
42
48
  was built, and that is deliberate. Judge only the branch diff, the issue (its
43
49
  criteria, when it has them, are the definition of done), and the