@outerlayer/cli 0.33.0-next.20261023030517 → 0.33.0-next.20261023122246

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 (104) hide show
  1. package/README.md +15 -4
  2. package/dist/{agent-setup-APFM4MZ4.js → agent-setup-YHEW3WXB.js} +10 -10
  3. package/dist/{artifact-link-cmd-IHHMU4EA.js → artifact-link-cmd-7FYKWA7J.js} +2 -2
  4. package/dist/{build-disk-55M4ZMDX.js → build-disk-ECTLWTPC.js} +4 -4
  5. package/dist/build-info.json +1 -1
  6. package/dist/{builder-DQZCPB7J.js → builder-LUPHKUFM.js} +3 -3
  7. package/dist/{check-AEMFDR55.js → check-YCFZ3H35.js} +29 -29
  8. package/dist/{chunk-X62C7V4B.js → chunk-2JLM4GUF.js} +12 -12
  9. package/dist/{chunk-M24H6JQW.js → chunk-44V5SD4G.js} +1 -1
  10. package/dist/{chunk-C66Q2CLW.js → chunk-5M2J7B5N.js} +2 -2
  11. package/dist/{chunk-PNIFQX73.js → chunk-6CXNWKWD.js} +1 -1
  12. package/dist/{chunk-UAJYWZ2F.js → chunk-6SPD266O.js} +3 -3
  13. package/dist/{chunk-4NKHOCTF.js → chunk-7IFYI7XF.js} +3 -3
  14. package/dist/{chunk-HUBRTT2C.js → chunk-7UPMYRPS.js} +4 -4
  15. package/dist/{chunk-X37GC7DM.js → chunk-7V5GUEDU.js} +1 -1
  16. package/dist/{chunk-2WZ66FXA.js → chunk-AKZRGFGT.js} +3 -3
  17. package/dist/{chunk-T4S2DVOA.js → chunk-D3EDZPJR.js} +5 -5
  18. package/dist/{chunk-35DSTT37.js → chunk-DKFUXYGD.js} +4 -4
  19. package/dist/{chunk-7HZH5D7H.js → chunk-EHOFFTVX.js} +2 -2
  20. package/dist/{chunk-6ANIBEQ6.js → chunk-EJL6CWSP.js} +6 -6
  21. package/dist/{chunk-UHFU3CBN.js → chunk-EXZACZ2P.js} +1 -1
  22. package/dist/{chunk-V7Q5OKN7.js → chunk-F2D5BSXS.js} +27 -2
  23. package/dist/{chunk-C7WGCI77.js → chunk-FT7MUQGO.js} +2 -2
  24. package/dist/{chunk-M3RYZRMH.js → chunk-GO2DUPQS.js} +3 -3
  25. package/dist/{chunk-CCOU4NXE.js → chunk-HLZMAJJD.js} +2 -2
  26. package/dist/{chunk-GFTWZSOW.js → chunk-IUPY54BZ.js} +10 -10
  27. package/dist/{chunk-T4TT76GG.js → chunk-JEVKOZBB.js} +1 -1
  28. package/dist/{chunk-XMPE5TT4.js → chunk-KUE4V2SK.js} +2 -2
  29. package/dist/{chunk-DHUHQPRQ.js → chunk-L6MDOEHN.js} +7 -7
  30. package/dist/{chunk-PJI5D2XT.js → chunk-LYGI3T66.js} +2 -2
  31. package/dist/{chunk-E4F7YE7P.js → chunk-MPC2UAW2.js} +1 -1
  32. package/dist/{chunk-QQXNS4G2.js → chunk-NIY2UBT6.js} +1 -1
  33. package/dist/{chunk-QKEOAQ2W.js → chunk-OGMXVPCS.js} +1 -1
  34. package/dist/{chunk-A5FFANL7.js → chunk-QKNFU5GA.js} +5 -5
  35. package/dist/{chunk-AXIK6F52.js → chunk-RAMTJ2XP.js} +15 -15
  36. package/dist/{chunk-VJGQEASF.js → chunk-S5CNYXUA.js} +4 -4
  37. package/dist/{chunk-B6WW6AKO.js → chunk-SQQD5MST.js} +4 -4
  38. package/dist/{chunk-MZYOUIY5.js → chunk-TRP3KPGK.js} +1 -1
  39. package/dist/{chunk-JB4R5IFJ.js → chunk-UK4RGH46.js} +2 -2
  40. package/dist/{chunk-PILHDNHX.js → chunk-V673DFOL.js} +4 -4
  41. package/dist/{chunk-ONUACB5C.js → chunk-VWQCYOBS.js} +2 -2
  42. package/dist/{chunk-LHKWWEQZ.js → chunk-X4JEBMYN.js} +1 -1
  43. package/dist/{chunk-Z4GLZTDF.js → chunk-XCRET2GZ.js} +2 -2
  44. package/dist/{chunk-67KCGRKA.js → chunk-Y6KIGWFO.js} +48 -17
  45. package/dist/{chunk-5FSVA3CO.js → chunk-YXMGHGHR.js} +5 -5
  46. package/dist/{chunk-6ZLI652Y.js → chunk-ZF24JN7R.js} +1 -1
  47. package/dist/chunk-ZUVERBFB.js +81 -0
  48. package/dist/{claude-launcher-B55NWRH5.js → claude-launcher-YRPW4SWA.js} +5 -5
  49. package/dist/{cli-5YT5EL2R.js → cli-WFLOFK42.js} +108 -105
  50. package/dist/{command-DYLRDCGC.js → command-SQ4466SL.js} +19 -19
  51. package/dist/{config-RRY7DIJG.js → config-MVA7YTFW.js} +5 -5
  52. package/dist/{connect-cmd-7C6W2SEP.js → connect-cmd-KWXV2CGC.js} +8 -8
  53. package/dist/{container-start-F7PBMTAL.js → container-start-C4XCYPUA.js} +50 -27
  54. package/dist/{context-cleanup-EKTPKJJT.js → context-cleanup-A2FGVVPH.js} +3 -3
  55. package/dist/{context-show-cmd-I5JC7EFH.js → context-show-cmd-6F4UF4ND.js} +9 -9
  56. package/dist/{control-plane-launch-NOKM6CBH.js → control-plane-launch-7SOH6IMA.js} +6 -6
  57. package/dist/{dist-LLYL5UCV.js → dist-IG2DKUJJ.js} +2 -2
  58. package/dist/{docker-W7WWFZ3Q.js → docker-YKYQJHL2.js} +3 -3
  59. package/dist/{doctor-LYOFFCQS.js → doctor-4YZOP343.js} +20 -20
  60. package/dist/{emit-artifact-cmd-RO34UG7A.js → emit-artifact-cmd-6QTTWBVN.js} +13 -13
  61. package/dist/{emit-cmd-GY7Z26DY.js → emit-cmd-3FG7FEGO.js} +6 -6
  62. package/dist/{emit-criteria-cmd-Y36QCPAM.js → emit-criteria-cmd-22VVCL2W.js} +10 -10
  63. package/dist/{emit-demo-cmd-YMWVF5U4.js → emit-demo-cmd-IQRS7BP2.js} +168 -46
  64. package/dist/{emit-finding-cmd-MH3ZWUNV.js → emit-finding-cmd-TXDPJFVT.js} +10 -10
  65. package/dist/{emit-result-cmd-ZARZZZ3Y.js → emit-result-cmd-QHJDUC7J.js} +12 -12
  66. package/dist/{emit-step-cmd-A6HQJDBY.js → emit-step-cmd-TQCOLXAA.js} +10 -10
  67. package/dist/{findings-cmd-OLLBWJXJ.js → findings-cmd-EURKADAY.js} +10 -10
  68. package/dist/{fleet-readiness-VB5QSFSY.js → fleet-readiness-GXDSFTLP.js} +8 -8
  69. package/dist/{governing-source-ZX7VXTOA.js → governing-source-IRRP7G5G.js} +13 -13
  70. package/dist/{hook-fast-4RYMBFPO.js → hook-fast-3IYSWDL4.js} +1 -1
  71. package/dist/index.js +4 -4
  72. package/dist/{init-BQCGL7UD.js → init-63X6ECKF.js} +19 -19
  73. package/dist/{init-NCCMB2UE.js → init-T64C4MID.js} +19 -19
  74. package/dist/{init-cmd-OW2L5HTI.js → init-cmd-7CGCDLBZ.js} +18 -18
  75. package/dist/{init-update-7LUMOECE.js → init-update-LFKSC6Y4.js} +17 -17
  76. package/dist/{install-5BQ3TFBT.js → install-47Z7VNWP.js} +6 -6
  77. package/dist/{layout-RGVPCX7Y.js → layout-44S4OYLK.js} +4 -4
  78. package/dist/{login-browser-BC2Z5QKG.js → login-browser-BJZYKWHF.js} +2 -2
  79. package/dist/{loop-BU634Y6A.js → loop-KRGNTFZ2.js} +29 -29
  80. package/dist/{machine-RI4KHRYP.js → machine-VBITNWTR.js} +19 -19
  81. package/dist/{machine-skills-CS5HAQHF.js → machine-skills-GOKW3U5N.js} +4 -4
  82. package/dist/{runner-env-QSLLOFNF.js → runner-env-ILP6BAC2.js} +7 -7
  83. package/dist/{runner-identity-DQAXW4DL.js → runner-identity-MF3AYBR6.js} +3 -3
  84. package/dist/{runner-key-UWL475RU.js → runner-key-5SGBLTDJ.js} +19 -19
  85. package/dist/{session-sender-OGDUJ2KK.js → session-sender-2DYAJIMM.js} +13 -13
  86. package/dist/{spec-cmd-WB4UOFPG.js → spec-cmd-E6SINBX6.js} +11 -11
  87. package/dist/{starter-pack-XHATFTO3.js → starter-pack-FWTXE6XB.js} +5 -5
  88. package/dist/{status-GFZFND6L.js → status-YVJQWWDP.js} +24 -24
  89. package/dist/{sync-cmd-GPZD2C45.js → sync-cmd-NGX2PGIW.js} +12 -12
  90. package/dist/{watch-5I3GURXY.js → watch-ZIWZVU3Z.js} +12 -12
  91. package/dist/{work-claim-cmd-J52UVCAF.js → work-claim-cmd-GBU2ACRF.js} +16 -16
  92. package/dist/{work-cmd-PQZ5RYDB.js → work-cmd-OO6K6ELP.js} +10 -10
  93. package/dist/{work-comment-cmd-WI6B3IOS.js → work-comment-cmd-SY7NY2CR.js} +10 -10
  94. package/dist/{work-demo-cmd-3NDGSQKJ.js → work-demo-cmd-Y7EU335L.js} +10 -10
  95. package/dist/{work-logs-cmd-QCYZ5X5A.js → work-logs-cmd-PWOFLTGD.js} +10 -10
  96. package/dist/{work-open-pr-cmd-BRDF3ZKL.js → work-open-pr-cmd-AJUTKYWN.js} +11 -11
  97. package/dist/{work-pr-cmd-WY2TBAKW.js → work-pr-cmd-DH43AH3V.js} +10 -10
  98. package/dist/{work-proofs-cmd-R25HT6WP.js → work-proofs-cmd-6W6DDAP6.js} +10 -10
  99. package/dist/{work-stop-cmd-C52JPZ4E.js → work-stop-cmd-WZHBEKE4.js} +10 -10
  100. package/package.json +1 -1
  101. package/skill-pack/maintained/outerlayer-build/references/agent-briefs.md +8 -5
  102. package/skill-pack/maintained/outerlayer-build/references/evidence.md +3 -1
  103. package/skill-pack/maintained/outerlayer-evidence/SKILL.md +17 -16
  104. package/dist/chunk-RLAKWXDK.js +0 -36
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { itemLabel, runWorkPr, WorkPrCommandError } from './chunk-C66Q2CLW.js';
4
- import { resolveCredentials } from './chunk-5FSVA3CO.js';
3
+ import { itemLabel, runWorkPr, WorkPrCommandError } from './chunk-5M2J7B5N.js';
4
+ import { resolveCredentials } from './chunk-YXMGHGHR.js';
5
5
  import './chunk-IP7BIBXJ.js';
6
- import './chunk-CCOU4NXE.js';
7
- import './chunk-VJGQEASF.js';
8
- import './chunk-E4F7YE7P.js';
9
- import './chunk-QQXNS4G2.js';
10
- import './chunk-PJI5D2XT.js';
11
- import './chunk-X37GC7DM.js';
6
+ import './chunk-HLZMAJJD.js';
7
+ import './chunk-S5CNYXUA.js';
8
+ import './chunk-MPC2UAW2.js';
9
+ import './chunk-NIY2UBT6.js';
10
+ import './chunk-LYGI3T66.js';
11
+ import './chunk-7V5GUEDU.js';
12
12
  import './chunk-G2JWZDFA.js';
13
13
  import { C } from './chunk-ANPNT6PM.js';
14
14
  import { defaultFetch } from './chunk-6RKD7YZ6.js';
@@ -17,15 +17,15 @@ import './chunk-SOI6K5DY.js';
17
17
  import './chunk-PA6CK6WQ.js';
18
18
  import './chunk-BALIE3BA.js';
19
19
  import './chunk-BJ3KTMDH.js';
20
- import './chunk-M24H6JQW.js';
20
+ import './chunk-44V5SD4G.js';
21
21
  import './chunk-5BHIBJDA.js';
22
22
  import './chunk-CDDED64E.js';
23
23
  import './chunk-RA3O54FC.js';
24
24
  import { parseWorkItemEnv } from './chunk-T2Q7ISPE.js';
25
25
  import './chunk-WZBHBH3J.js';
26
26
  import './chunk-CRB3POP4.js';
27
- import './chunk-PNIFQX73.js';
28
- import './chunk-V7Q5OKN7.js';
27
+ import './chunk-6CXNWKWD.js';
28
+ import './chunk-F2D5BSXS.js';
29
29
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
30
30
  import './chunk-HACGUL52.js';
31
31
  import './chunk-MESOOLF4.js';
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { WorkPrCommandError, itemLabel, runWorkPr } from './chunk-C66Q2CLW.js';
3
+ export { WorkPrCommandError, itemLabel, runWorkPr } from './chunk-5M2J7B5N.js';
4
4
  import './chunk-IP7BIBXJ.js';
5
- import './chunk-CCOU4NXE.js';
6
- import './chunk-VJGQEASF.js';
7
- import './chunk-E4F7YE7P.js';
8
- import './chunk-QQXNS4G2.js';
9
- import './chunk-PJI5D2XT.js';
10
- import './chunk-X37GC7DM.js';
5
+ import './chunk-HLZMAJJD.js';
6
+ import './chunk-S5CNYXUA.js';
7
+ import './chunk-MPC2UAW2.js';
8
+ import './chunk-NIY2UBT6.js';
9
+ import './chunk-LYGI3T66.js';
10
+ import './chunk-7V5GUEDU.js';
11
11
  import './chunk-G2JWZDFA.js';
12
12
  import './chunk-ANPNT6PM.js';
13
13
  import './chunk-6RKD7YZ6.js';
@@ -16,15 +16,15 @@ import './chunk-SOI6K5DY.js';
16
16
  import './chunk-PA6CK6WQ.js';
17
17
  import './chunk-BALIE3BA.js';
18
18
  import './chunk-BJ3KTMDH.js';
19
- import './chunk-M24H6JQW.js';
19
+ import './chunk-44V5SD4G.js';
20
20
  import './chunk-5BHIBJDA.js';
21
21
  import './chunk-CDDED64E.js';
22
22
  import './chunk-RA3O54FC.js';
23
23
  import './chunk-T2Q7ISPE.js';
24
24
  import './chunk-WZBHBH3J.js';
25
25
  import './chunk-CRB3POP4.js';
26
- import './chunk-PNIFQX73.js';
27
- import './chunk-V7Q5OKN7.js';
26
+ import './chunk-6CXNWKWD.js';
27
+ import './chunk-F2D5BSXS.js';
28
28
  import './chunk-VNVZDWO3.js';
29
29
  import './chunk-HACGUL52.js';
30
30
  import './chunk-MESOOLF4.js';
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { WorkCommandError, resolveCredentials, getJson } from './chunk-5FSVA3CO.js';
3
+ import { WorkCommandError, resolveCredentials, getJson } from './chunk-YXMGHGHR.js';
4
4
  import './chunk-IP7BIBXJ.js';
5
- import './chunk-CCOU4NXE.js';
6
- import './chunk-VJGQEASF.js';
7
- import { sanitizeTerminal } from './chunk-E4F7YE7P.js';
8
- import { resolveRepoIdentity } from './chunk-QQXNS4G2.js';
9
- import './chunk-PJI5D2XT.js';
10
- import './chunk-X37GC7DM.js';
5
+ import './chunk-HLZMAJJD.js';
6
+ import './chunk-S5CNYXUA.js';
7
+ import { sanitizeTerminal } from './chunk-MPC2UAW2.js';
8
+ import { resolveRepoIdentity } from './chunk-NIY2UBT6.js';
9
+ import './chunk-LYGI3T66.js';
10
+ import './chunk-7V5GUEDU.js';
11
11
  import './chunk-G2JWZDFA.js';
12
12
  import { C } from './chunk-ANPNT6PM.js';
13
13
  import { defaultFetch } from './chunk-6RKD7YZ6.js';
@@ -16,15 +16,15 @@ import './chunk-SOI6K5DY.js';
16
16
  import './chunk-PA6CK6WQ.js';
17
17
  import './chunk-BALIE3BA.js';
18
18
  import './chunk-BJ3KTMDH.js';
19
- import './chunk-M24H6JQW.js';
19
+ import './chunk-44V5SD4G.js';
20
20
  import './chunk-5BHIBJDA.js';
21
21
  import './chunk-CDDED64E.js';
22
22
  import './chunk-RA3O54FC.js';
23
23
  import { parseWorkItemEnv } from './chunk-T2Q7ISPE.js';
24
24
  import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
25
25
  import './chunk-CRB3POP4.js';
26
- import './chunk-PNIFQX73.js';
27
- import './chunk-V7Q5OKN7.js';
26
+ import './chunk-6CXNWKWD.js';
27
+ import './chunk-F2D5BSXS.js';
28
28
  import './chunk-VNVZDWO3.js';
29
29
  import './chunk-HACGUL52.js';
30
30
  import './chunk-MESOOLF4.js';
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { resolveCredentials, postJson, WorkCommandError } from './chunk-5FSVA3CO.js';
3
+ import { resolveCredentials, postJson, WorkCommandError } from './chunk-YXMGHGHR.js';
4
4
  import './chunk-IP7BIBXJ.js';
5
- import './chunk-CCOU4NXE.js';
6
- import './chunk-VJGQEASF.js';
7
- import './chunk-E4F7YE7P.js';
8
- import './chunk-QQXNS4G2.js';
9
- import './chunk-PJI5D2XT.js';
10
- import './chunk-X37GC7DM.js';
5
+ import './chunk-HLZMAJJD.js';
6
+ import './chunk-S5CNYXUA.js';
7
+ import './chunk-MPC2UAW2.js';
8
+ import './chunk-NIY2UBT6.js';
9
+ import './chunk-LYGI3T66.js';
10
+ import './chunk-7V5GUEDU.js';
11
11
  import './chunk-G2JWZDFA.js';
12
12
  import './chunk-ANPNT6PM.js';
13
13
  import { defaultFetch } from './chunk-6RKD7YZ6.js';
@@ -16,14 +16,14 @@ import './chunk-SOI6K5DY.js';
16
16
  import './chunk-PA6CK6WQ.js';
17
17
  import './chunk-BALIE3BA.js';
18
18
  import './chunk-BJ3KTMDH.js';
19
- import './chunk-M24H6JQW.js';
19
+ import './chunk-44V5SD4G.js';
20
20
  import './chunk-5BHIBJDA.js';
21
21
  import './chunk-CDDED64E.js';
22
22
  import './chunk-RA3O54FC.js';
23
23
  import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
24
24
  import './chunk-CRB3POP4.js';
25
- import './chunk-PNIFQX73.js';
26
- import './chunk-V7Q5OKN7.js';
25
+ import './chunk-6CXNWKWD.js';
26
+ import './chunk-F2D5BSXS.js';
27
27
  import './chunk-VNVZDWO3.js';
28
28
  import './chunk-HACGUL52.js';
29
29
  import './chunk-MESOOLF4.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@outerlayer/cli",
3
- "version": "0.33.0-next.20261023030517",
3
+ "version": "0.33.0-next.20261023122246",
4
4
  "description": "OuterLayer CLI — commands: init, claude, connect, doctor, login, logout, sync, daemon (alias: watch), emit, findings, work, spec, runner, hooks, mcp, 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.",
@@ -253,19 +253,22 @@ application's own paths. When a state cannot be reached that way, the criterion
253
253
  is not evidenced, and `evidence.md` says why. Before emitting, look at each
254
254
  capture: it shows the application's navigation and real rows.
255
255
 
256
- Write the demo, when a criterion needs one, as a Playwright test that is part
257
- of the change. Put it where the repository keeps its Playwright tests, in the
256
+ Write the demo, when a criterion needs a video or a screenshot, as a Playwright
257
+ test that is part of the change. Put it where the repository keeps its Playwright tests, in the
258
258
  folder the instructions name, else in `e2e/demo/`. Name it `*.demo.spec.ts`.
259
259
  Commit it in the pull request. The demo record names this test, so an amend
260
260
  can run it again at a new head. If the repository's CI cannot start the app,
261
261
  mark the file so that CI skips it, as `apps/e2e` does.
262
262
 
263
- For each other capture, put the capture in a script under
264
- `build-reports/evidence/` and run the script. A later fix can invalidate what
263
+ Record each criterion that declares `proof: screenshot` as a chapter of the same
264
+ demo, with a `demo.screenshot()` call where the result shows. The frame then
265
+ comes from the committed test, so an amend records it again at the new head. Put
266
+ a capture in a script under `build-reports/evidence/` and run the script only
267
+ when no demo test can reach its state. A later fix can invalidate what
265
268
  you captured, and regenerating it must be one command. The scripts go when the
266
269
  run's report directory goes. The emitted artifacts outlive the run.
267
270
 
268
- Record the criteria that declare `proof: video` as one demo, as the
271
+ Record the criteria that declare `proof: video` or `proof: screenshot` as one demo, as the
269
272
  outerlayer-evidence skill's "Record a demo" says. Write one Playwright test with
270
273
  `@outerlayer/playwright` and one chapter for each of those criteria, in the
271
274
  criteria's order. Run it, then run `outerlayer emit demo <manifest> --item
@@ -15,7 +15,9 @@ the issue, the pull request number, the criteria that declare a proof form, the
15
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
- id. One that declares `proof: video` needs a video: its chapter of the
18
+ id. The evidence agent records it as a chapter of the item's demo, with a
19
+ `demo.screenshot()` call. It emits a screenshot with `emit artifact` only for a
20
+ state no demo test can reach. One that declares `proof: video` needs a video: its chapter of the
19
21
  item's one demo. A screenshot never satisfies `proof: video`. A criterion with no proof form is proven by its
20
22
  test, and needs no artifact.
21
23
 
@@ -16,10 +16,8 @@ spec asks for — a reviewer should see the change working, not a gallery.
16
16
 
17
17
  ## When to capture
18
18
 
19
- Capture AFTER the state exists: run the app, the test, or the
20
- flow first, and shoot the working result. A screenshot of code is not
21
- evidence; a screenshot of the rendered page is. If the state takes setup
22
- (seed data, a logged-in user), finish the setup, verify by eye, then capture.
19
+ Capture AFTER the state exists: run the app, test, or
20
+ flow first, and shoot the working result. A screenshot of code is not evidence. Finish setup (seed data, a login) and check by eye first.
23
21
 
24
22
  ## Per-kind mechanics
25
23
 
@@ -82,9 +80,9 @@ the recorded list does not hold gets no row.
82
80
 
83
81
  Record every video proof as a chapter of the item's one demo. A demo has
84
82
  one chapter for each criterion that declares a video, in the criteria's
85
- order. Each chapter is that criterion's video proof, with a spoken line that
86
- says what happens and a list of the checks that ran. Emit a video with
87
- `emit artifact` only when Playwright cannot drive the flow.
83
+ order. Each chapter is that criterion's video proof, with a spoken line and the
84
+ checks that ran. Emit a video with `emit artifact` only when Playwright cannot
85
+ drive the flow.
88
86
 
89
87
  Write a Playwright test with `@outerlayer/playwright`, one `demo.chapter`
90
88
  for each criterion:
@@ -99,13 +97,17 @@ for each criterion:
99
97
  });
100
98
  });
101
99
 
102
- Commit the test, so an amend can run it again.
100
+ Commit the test: an amend runs it again.
101
+
102
+ Record each `proof: screenshot` criterion as a chapter too. Call `await
103
+ demo.screenshot()` inside it, right after the `expect` that shows the result.
104
+ Options: `{ fullPage: true }`, `{ masks: true }`. `emit demo` stores the frame
105
+ when every check passed, or says why not.
103
106
 
104
107
  Install it with `npm install --save-dev @outerlayer/playwright`. Use the
105
108
  recorded criterion id as the first argument, or `null` for an opening scene.
106
- Keep each narration line short enough to say in the chapter's time. Put the
107
- `expect` calls that prove the criterion inside the chapter, because each one
108
- is recorded as a check.
109
+ Keep each narration line short. Put the `expect` calls that prove the
110
+ criterion inside the chapter: each is recorded as a check.
109
111
 
110
112
  Run the test. It writes `demo/manifest.json` and `demo/video.webm` in the
111
113
  test's output folder. Then emit the demo:
@@ -117,11 +119,10 @@ Each chapter is its own video proof with a time range in that video. A
117
119
  chapter whose checks all passed is bound to its criterion. A chapter with
118
120
  a failed check is stored unbound, and the command exits 1: fix the app and
119
121
  record again. The command needs `ffmpeg` and `espeak-ng` on PATH. Pass
120
- `--no-narration` to store a demo with no audio when you cannot install
121
- `espeak-ng`. It refuses before it uploads anything when a chapter is out of
122
- order, a criterion id is not recorded, a line is too long for its chapter,
123
- or a chapter's clip is over 8 MiB. A video over 8 MiB falls back to one clip
124
- for each chapter. In a runner build everything it needs is installed.
122
+ `--no-narration` when you cannot install `espeak-ng`. It refuses before it
123
+ uploads anything when a chapter is out of order, a criterion id is not
124
+ recorded, a line is too long, or a chapter's clip is over 8 MiB. A video over 8 MiB falls back to one clip
125
+ for each chapter. A runner build has everything installed.
125
126
 
126
127
  ## The noise rule
127
128
 
@@ -1,36 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createRequire } from 'node:module';
3
- import { checkFit, RUNNER_RESERVE_BYTES } from './chunk-7HZH5D7H.js';
4
- import { readFileSync } from 'fs';
5
-
6
- createRequire(import.meta.url);
7
- var GIB = 1024 ** 3;
8
- var DEFAULT_GIB = 8;
9
- var MINIMUM_GIB = 4;
10
- var BUILD_MEMORY_VARIABLE = "OUTERLAYER_BUILD_MEMORY";
11
- function memoryIsSet(configPath) {
12
- try {
13
- const raw = JSON.parse(readFileSync(configPath, "utf8"));
14
- return raw.runner.build.memory !== void 0;
15
- } catch {
16
- return false;
17
- }
18
- }
19
- function gib(bytes) {
20
- return `${Number((bytes / GIB).toFixed(1))} GiB`;
21
- }
22
- function fitImageBuildMemory(config, totalMemoryBytes) {
23
- if (memoryIsSet(config.configPath)) return { config };
24
- const current = config.build?.memory ?? `${DEFAULT_GIB}g`;
25
- if (checkFit({ concurrency: config.concurrency, buildMemory: current, usableBytes: totalMemoryBytes }).fits) return { config };
26
- const available = Math.max(0, totalMemoryBytes - RUNNER_RESERVE_BYTES);
27
- const perBuild = Math.floor(available / config.concurrency / GIB);
28
- if (perBuild < MINIMUM_GIB) return { config };
29
- const memory = `${perBuild}g`;
30
- return {
31
- config: { ...config, build: { ...config.build, memory } },
32
- note: `builds get ${memory} of memory to fit this machine's ${gib(totalMemoryBytes)}; set ${BUILD_MEMORY_VARIABLE} to choose another value`
33
- };
34
- }
35
-
36
- export { BUILD_MEMORY_VARIABLE, fitImageBuildMemory };