@outerlayer/cli 0.12.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +9 -4
- package/dist/agent-setup-CN2HUBEJ.js +26 -0
- package/dist/{build-LELVCWHV.js → build-BG2YENGK.js} +2 -2
- package/dist/build-info.json +1 -1
- package/dist/{builder-OF67QKDS.js → builder-2D3WSOOY.js} +4 -4
- package/dist/{check-RJOJU2WA.js → check-SRGR36KI.js} +37 -37
- package/dist/{chunk-XR3BJN33.js → chunk-22RMZBGW.js} +20 -1
- package/dist/{chunk-AHZQBGD2.js → chunk-2M63GG56.js} +1 -1
- package/dist/{chunk-SZOVKFWB.js → chunk-3NLOVYJQ.js} +4 -4
- package/dist/{chunk-USO2DKBD.js → chunk-4KSQKQXE.js} +8 -2
- package/dist/{chunk-QEESCZ26.js → chunk-4NPZVMJU.js} +2 -2
- package/dist/{chunk-DVT73QJO.js → chunk-4OGPT6I2.js} +14 -14
- package/dist/{chunk-ZQUCTFXC.js → chunk-FOJGZYFC.js} +11 -5
- package/dist/{chunk-G5XY6CVG.js → chunk-HFKKFTXU.js} +12 -16
- package/dist/{chunk-ANW7VHMH.js → chunk-HFKQIZXL.js} +95 -16
- package/dist/{chunk-325272HM.js → chunk-J5M7BSJQ.js} +11 -4
- package/dist/{chunk-NPXQXYVA.js → chunk-JJEGKEFV.js} +6 -8
- package/dist/{chunk-3ZPYPFNM.js → chunk-JXYVA45C.js} +1 -1
- package/dist/{chunk-IBB4D4KE.js → chunk-JYIEHQIF.js} +1 -1
- package/dist/{chunk-5TGQHOUX.js → chunk-KFRM23WD.js} +3 -3
- package/dist/{chunk-GGMRZPEA.js → chunk-KMDLFI4P.js} +1 -1
- package/dist/{chunk-G5IEVZGI.js → chunk-LCEXHCHD.js} +1 -1
- package/dist/{chunk-27Y7AX2O.js → chunk-MSASO5O4.js} +44 -8
- package/dist/chunk-MTF3PHVZ.js +161 -0
- package/dist/{chunk-G4RXNF2L.js → chunk-NHDVD7DU.js} +12 -12
- package/dist/{chunk-GATMPAMK.js → chunk-NPQWKGUA.js} +2 -2
- package/dist/{chunk-YEQL54G5.js → chunk-PQUM37BK.js} +1 -1
- package/dist/{chunk-GEBQXUFY.js → chunk-Q2UK3C4P.js} +24 -10
- package/dist/{chunk-SKHN72JO.js → chunk-RBKIH5ST.js} +13 -13
- package/dist/{chunk-2KLBKHT4.js → chunk-RLYZLUQ7.js} +1 -1
- package/dist/chunk-RMWLBUCJ.js +50 -0
- package/dist/{chunk-PDRYXERC.js → chunk-SMHOCDCI.js} +5 -5
- package/dist/{chunk-6FH2AHJY.js → chunk-SWHQ4LUM.js} +30 -17
- package/dist/{agent-setup-52LRZ6AY.js → chunk-SXWS25JC.js} +8 -21
- package/dist/{chunk-VK25O2ZM.js → chunk-T5VPP6H7.js} +1 -1
- package/dist/{chunk-JOXYKGUV.js → chunk-WUYTWNMA.js} +4 -2
- package/dist/{chunk-A56PYPDF.js → chunk-XCK2YAY5.js} +14 -4
- package/dist/{chunk-C7N4TDHW.js → chunk-YDSMROTB.js} +5 -5
- package/dist/{chunk-FO7KKPYG.js → chunk-ZA5CHAFY.js} +2 -2
- package/dist/{cli-JSSRGA6V.js → cli-UW2H3UUW.js} +138 -85
- package/dist/{command-3WYZ2ML5.js → command-5LD7G2QQ.js} +27 -27
- package/dist/{config-MKBX2ZQD.js → config-N3C6DFQA.js} +1 -1
- package/dist/{connect-cmd-A5NGODCJ.js → connect-cmd-JUAW6MU4.js} +5 -5
- package/dist/{context-adopt-BAHGXJZV.js → context-adopt-PJUMW2EZ.js} +6 -6
- package/dist/{context-materialize-45OVRRK2.js → context-materialize-FDHYKNDT.js} +6 -6
- package/dist/{dist-EQDW7MZW.js → dist-LKDWQWZ7.js} +2 -2
- package/dist/{docker-VGWEJWI7.js → docker-4J77Q2BF.js} +5 -5
- package/dist/{doctor-4FFXTQJ2.js → doctor-H7REBSLQ.js} +29 -29
- package/dist/{emit-artifact-cmd-QS7XNKBT.js → emit-artifact-cmd-FOGNJXVR.js} +18 -21
- package/dist/emit-cmd-ZEYWLC2C.js +11 -0
- package/dist/{emit-criteria-cmd-XN6AKA53.js → emit-criteria-cmd-HBP6XS5C.js} +8 -11
- package/dist/{emit-finding-cmd-SQJSEHYS.js → emit-finding-cmd-DLI4MKMN.js} +8 -11
- package/dist/{emit-result-cmd-56RHPHOA.js → emit-result-cmd-MUSL7GQA.js} +12 -15
- package/dist/{hook-fast-HLESEJAL.js → hook-fast-WYQD6D7T.js} +1 -1
- package/dist/{import-capture-cmd-NHMAFDM6.js → import-capture-cmd-6QVCOIHK.js} +10 -13
- package/dist/{import-ruler-cmd-UYB32YUT.js → import-ruler-cmd-KLRGRBCP.js} +7 -10
- package/dist/index.js +3 -3
- package/dist/{init-UZKD4RY7.js → init-NTXA3SN7.js} +28 -28
- package/dist/{init-6AY5T3P6.js → init-UBXK6MF7.js} +47 -37
- package/dist/{init-cmd-XGSX2BCC.js → init-cmd-NARDUPIG.js} +20 -13
- package/dist/init-update-O5YYFGF4.js +165 -0
- package/dist/{install-VXXI7UR6.js → install-HDBIPHTX.js} +2 -2
- package/dist/{login-browser-7XGSV7MA.js → login-browser-QZCS3WW6.js} +2 -1
- package/dist/{loop-4NMI2USY.js → loop-SW2M5VDD.js} +37 -37
- package/dist/{machine-4JX2D4TS.js → machine-U66FKVDP.js} +23 -23
- package/dist/mcp-install-cmd-FDTPQQS6.js +9 -0
- package/dist/{runner-env-WAXTJXZK.js → runner-env-XTC53CHN.js} +3 -3
- package/dist/runner-key-3JSMDRJA.js +154 -0
- package/dist/{session-sender-T7PN4YRC.js → session-sender-4M247XSV.js} +7 -7
- package/dist/starter-pack-IB4UUIX3.js +11 -0
- package/dist/{status-OXBIRWJ7.js → status-STZYPU3W.js} +30 -30
- package/dist/{sync-cmd-EVXNR47N.js → sync-cmd-UWD5JOFU.js} +6 -6
- package/dist/{watch-7NSFOAL5.js → watch-DBNB7R6X.js} +6 -6
- package/dist/{work-claim-cmd-KR7UR2AB.js → work-claim-cmd-LY4U6QHN.js} +13 -13
- package/dist/{work-cmd-JPM37MLF.js → work-cmd-RVRQ32EH.js} +7 -7
- package/dist/{work-comment-cmd-3DC6BC34.js → work-comment-cmd-FFUM4TJU.js} +10 -13
- package/dist/{work-open-pr-cmd-XZQRJBNZ.js → work-open-pr-cmd-HLDWP4T2.js} +10 -13
- package/dist/{work-pr-cmd-WHGZOP22.js → work-pr-cmd-L77K32WK.js} +7 -7
- package/package.json +1 -1
- package/skill-pack/maintained/emitting-evidence/SKILL.md +8 -2
- package/skill-pack/shipped.json +70 -0
- package/skill-pack/template/build/SKILL.md +66 -35
- package/skill-pack/template/build/references/agent-briefs.md +4 -2
- package/skill-pack/template/build/references/release.md +36 -8
- package/skill-pack/template/build/references/review-loop.md +6 -2
- package/skill-pack/template/build/scripts/record-criteria.mjs +109 -143
- package/skill-pack/template/spec/SKILL.md +33 -22
- package/skill-pack/template/writing-specs/SKILL.md +36 -3
- package/skill-pack/template/writing-specs/references/agents-snippet.md +57 -0
- package/skill-pack/template/writing-tests/SKILL.md +117 -0
- package/skill-pack/validators/acceptance-criteria.yaml +35 -0
- package/skill-pack/validators/code-review.yaml +4 -2
- package/dist/chunk-T6OIJQRT.js +0 -31
- package/dist/emit-cmd-LXEIDKLT.js +0 -10
- package/dist/mcp-install-cmd-XZARXNYT.js +0 -9
- package/dist/starter-pack-Z22VRFPF.js +0 -11
- package/dist/{chunk-3FMPZPJQ.js → chunk-R7PF5OOU.js} +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@outerlayer/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.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.",
|
|
@@ -104,9 +104,15 @@ Then run `outerlayer sync`, and copy the report's deep link from the pull reques
|
|
|
104
104
|
|
|
105
105
|
Use `--result fail` when the review left a finding unfixed. Record it once. Outside a build, pass the item's number to `--item`.
|
|
106
106
|
|
|
107
|
-
## The criteria report
|
|
107
|
+
## The criteria report and the `acceptance-criteria` check
|
|
108
108
|
|
|
109
|
-
Bind the judge's report on each criterion, an HTML file, with `--for acceptance-criteria`.
|
|
109
|
+
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
|
+
|
|
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:
|
|
112
|
+
|
|
113
|
+
outerlayer emit acceptance-criteria --item "$OUTERLAYER_WORK" --result pass --link <the report's deep link>
|
|
114
|
+
|
|
115
|
+
Use `--result pass` only when the judge found every criterion it judged satisfied, and `--result fail` when it found one unmet. When there is no criterion to judge, record nothing: the row reads "not proven", which is true. Skip the emit in a repository with no `.outerlayer/validators/acceptance-criteria.yaml`.
|
|
110
116
|
|
|
111
117
|
A session never records a pass or fail on an artifact. It emits the artifact, and a person or a check decides.
|
|
112
118
|
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"files": {
|
|
4
|
+
".outerlayer/policy.yaml": [
|
|
5
|
+
"1d874f1f521a79fc286ed5400c20022921e017f48e60e474015fedc29a1130a2",
|
|
6
|
+
"78c95632b51600df0cb2e206d843e75789ccba2f80fd8dfab36d16239062b008"
|
|
7
|
+
],
|
|
8
|
+
".outerlayer/skills/build/SKILL.md": [
|
|
9
|
+
"5cf9bd75fb1f984f6e6b470d1f1581dc06168abf062448e6f43711fed8f6632a",
|
|
10
|
+
"6177ea457be0d238659640e6d29807708d60d68533ae3ff93af10fb513139ced",
|
|
11
|
+
"77cab8b446fb1aa865710f7cb8356c5334301a942f58f9243766bf1acf1377ad",
|
|
12
|
+
"a6743050c5c387e962ad4264526d9a3c10edf36823e4b6829f200bf79a4e45e7",
|
|
13
|
+
"b0aa9b6962675f772b67a4390c15b6b0100390983d958c656a826a066399f3d0",
|
|
14
|
+
"f4e1661c6f87d7ff6d23c6182530fa0a9cb87c4dc3f31e48f2be11f32ebb2c00"
|
|
15
|
+
],
|
|
16
|
+
".outerlayer/skills/build/references/agent-briefs.md": [
|
|
17
|
+
"3c875a4f287f574eea954c6daa52b17529cdeba8ec4007d78084d911350d1218",
|
|
18
|
+
"7c2a651e7c827d8e3fb9df889d3776b552eb02d315db5ace27d2baad78aab6a5"
|
|
19
|
+
],
|
|
20
|
+
".outerlayer/skills/build/references/criteria-judge.md": [
|
|
21
|
+
"62db8f6d77f31ca25a9071c05429e0f639f9b2bdd7f7cb04cb14a1b0db509537"
|
|
22
|
+
],
|
|
23
|
+
".outerlayer/skills/build/references/evidence.md": [
|
|
24
|
+
"ceff5488bae31198ed4738ae1a230c0119f973ced439dac360eba6e24e1604f4",
|
|
25
|
+
"f27502610358e436e7ffb61d4fd281289e162f6de6b2c11396f17b2fa63802c9"
|
|
26
|
+
],
|
|
27
|
+
".outerlayer/skills/build/references/release.md": [
|
|
28
|
+
"0b0af40c82473cf192f697537ed5a84801a14e79bb11790d72226d7f7f49cca0",
|
|
29
|
+
"1113259bdf7d8c28edcbdb9b4c83c2f2bd4c5eaf817cf30bf428478ff91694e9",
|
|
30
|
+
"4687f56bcec766f1926d58a208418f800a1727c073b5e6047b40e3aaac2bd6c9",
|
|
31
|
+
"81a764eb317fcb4672bedd35e7b9aa68d1c0b73f82fc2dfa03e5a78758db8f14",
|
|
32
|
+
"985e02b98105b00c356014e003b2d60e9c458c3dcbeef7378274ccb84af031fc"
|
|
33
|
+
],
|
|
34
|
+
".outerlayer/skills/build/references/review-briefs.md": [
|
|
35
|
+
"2c8b436795b583a61aa6f98f48611db554f0dd52b27a9ab748a7db5f96526aec"
|
|
36
|
+
],
|
|
37
|
+
".outerlayer/skills/build/references/review-loop.md": [
|
|
38
|
+
"155ab732ccf4c25f000853e98a27a3d2f3a022c75979601bb71d86f07983216d",
|
|
39
|
+
"5f30b56d226b279ec5f65ad73b823e3aeeac0c14f2ee539fb79cf7ba7b2cac6d",
|
|
40
|
+
"6f93e2ae74d3c02a0d4c14a6b2c805f523d234a8c56789f40a7c7c59700ef277",
|
|
41
|
+
"9d4d2e5e0307ea8c38cf885cd67d06a939b7fc2bed65f5080ca9610178949d74"
|
|
42
|
+
],
|
|
43
|
+
".outerlayer/skills/build/scripts/record-criteria.mjs": [
|
|
44
|
+
"36f19e730bc220fa21622b3bb0a306999f038b8220a0a07a1efe21ec0f748729",
|
|
45
|
+
"596e9a78e62cbea040a3bf428cd54bf59687e9e89001fad719304f88d03ca2ea",
|
|
46
|
+
"64de9445087b247b0781a4e6e025ef97b1259ce1c91819bf541decc26b8f8400"
|
|
47
|
+
],
|
|
48
|
+
".outerlayer/skills/spec/SKILL.md": [
|
|
49
|
+
"71e81fabf353ad6117c54e061868538bf00066b78c2528f5a8364445d1def02e",
|
|
50
|
+
"9039ae30d4e836b5c5cfba4a14344e46fd13694ae9e4d88e750abce34dfcd9e6"
|
|
51
|
+
],
|
|
52
|
+
".outerlayer/skills/writing-specs/SKILL.md": [
|
|
53
|
+
"a956aac4249118a058c4327c5751472883588720950d4a96f80c7e91f454bef9",
|
|
54
|
+
"eb8aa95f5e76a46ae9bf340989fb40e470fd750ded791ba80b5f8c5c325513e5"
|
|
55
|
+
],
|
|
56
|
+
".outerlayer/skills/writing-specs/references/agents-snippet.md": [
|
|
57
|
+
"fc47325f27cfce406a14ad71009d3687d3720deb572d40936e29fd091ca6c71d"
|
|
58
|
+
],
|
|
59
|
+
".outerlayer/skills/writing-tests/SKILL.md": [
|
|
60
|
+
"b00f5970b568159ca0bfbc75c3834938749ad5e2e73a80769d88bbe3c8c26737"
|
|
61
|
+
],
|
|
62
|
+
".outerlayer/validators/acceptance-criteria.yaml": [
|
|
63
|
+
"3b2054aa1d4bd9f7441e88eec1a3bdf61b61ad00efa79736e26a5dd601d43910"
|
|
64
|
+
],
|
|
65
|
+
".outerlayer/validators/code-review.yaml": [
|
|
66
|
+
"05041976e4d84d6256ed88995ea4fd1566abc6d3a9574863065cf855dcafcf70",
|
|
67
|
+
"fbdf0baca0064b09e47f5984afc322d582accd142c3377c06622bc6567b0e98c"
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -84,8 +84,9 @@ These bind the orchestrator in every phase. Rule 5 also binds every spawned agen
|
|
|
84
84
|
"$OUTERLAYER_WORK" --json`. Each thread with `waitingOn` of `agent` holds a
|
|
85
85
|
person's comment. Answer each before the run ends, as the `amend` skill does.
|
|
86
86
|
5. **A session never records a pass or fail on an artifact.** It emits
|
|
87
|
-
artifacts. A person decides pass or fail.
|
|
88
|
-
|
|
87
|
+
artifacts. A person decides pass or fail. A build records two results,
|
|
88
|
+
both verdicts of its own agents: its review's, on the `code-review`
|
|
89
|
+
check, and its criteria judge's, on the `acceptance-criteria` check.
|
|
89
90
|
6. **Observed status only.** Every status claim in the final report (a gate
|
|
90
91
|
result, a CI conclusion, mergeability) quotes command output observed
|
|
91
92
|
after the last change it describes. No quoted output means unknown, never
|
|
@@ -125,48 +126,75 @@ Run them in order.
|
|
|
125
126
|
has not expired, stop and name it.
|
|
126
127
|
Phase 2 finds the issue's criteria. If it finds some, they are the
|
|
127
128
|
definition of done, and each declares a proof form or a test. If it finds
|
|
128
|
-
none, build from the issue's description
|
|
129
|
-
|
|
129
|
+
none, the build drafts them from the issue's description, and the drafted
|
|
130
|
+
criteria are the definition of done in the same way. An issue is never
|
|
131
|
+
sent back for lacking criteria.
|
|
130
132
|
Ask nothing from here until the final report. An agent that needs a ruling
|
|
131
133
|
states its assumption in its report and continues. The final report lists
|
|
132
134
|
every assumption.
|
|
133
135
|
2. **Read the criteria.** Record the issue's criteria on the item, so the
|
|
134
136
|
Criteria tab, the item's status and the judge hold the pull request to one
|
|
135
|
-
list.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
137
|
+
list. Read the whole issue and find its acceptance criteria in whatever
|
|
138
|
+
form they are written: under a heading of any wording, as a checklist or
|
|
139
|
+
numbered items, as "done when" prose, with ids or without. There is no
|
|
140
|
+
fixed shape. Keep each criterion's text exactly as the author wrote it.
|
|
141
|
+
Never reword one. A criterion you think is wrong becomes a note in the
|
|
142
|
+
final report, never an edit.
|
|
143
|
+
|
|
144
|
+
Write them, in the order the issue lists them, to a file:
|
|
145
|
+
|
|
146
|
+
{ "criteria": [ { "id": "<the id, if the issue gives one>", "text": "<verbatim>", "proof": null } ] }
|
|
147
|
+
|
|
148
|
+
Give `proof` an artifact kind (`video`, `screenshot`, `report`, `log`,
|
|
149
|
+
`test` or `file`) only when the issue states that proof explicitly, as in
|
|
150
|
+
`(proof: screenshot)`. Never infer a proof kind from the words. Then run:
|
|
151
|
+
|
|
152
|
+
node .outerlayer/skills/build/scripts/record-criteria.mjs --item "$OUTERLAYER_WORK" --criteria-file <file>
|
|
153
|
+
|
|
154
|
+
The script keeps the issue's ids only when every criterion carries one
|
|
155
|
+
that fits the id grammar. Otherwise, a partly numbered list included, it
|
|
156
|
+
numbers every criterion `AC-<item number>-NN` in order, and the state file
|
|
157
|
+
says why. The final report says the criteria were numbered and from what.
|
|
158
|
+
A file the script cannot use exits 2 with the reason. Fix the file and
|
|
159
|
+
run it again.
|
|
160
|
+
|
|
161
|
+
When the issue has no criteria anywhere, draft them from the issue's
|
|
162
|
+
description. Each is one observable behavior the description asks for, in
|
|
163
|
+
its words, adding no scope it does not state. Write them to the same kind
|
|
164
|
+
of file without ids, set `proof` only when the description asks for that
|
|
165
|
+
proof, and run the script with `--drafted` added. It numbers the draft
|
|
166
|
+
`AC-<item number>-NN` and records it with `drafted: true`, so the Criteria
|
|
167
|
+
tab says the build drafted the list.
|
|
168
|
+
|
|
169
|
+
The script writes the list to
|
|
151
170
|
`"$(git rev-parse --absolute-git-dir)/build-reports/criteria.json"` and runs
|
|
152
171
|
`outerlayer emit criteria` on it. The gateway decides whether a list may be
|
|
153
172
|
recorded. A 409 means the item already has a recorded list. That list
|
|
154
173
|
stands, and nothing is recorded. No command returns the item's list, so the
|
|
155
|
-
build cannot read it: it holds the work to
|
|
156
|
-
so in the final report. Any other
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
`count` and `
|
|
161
|
-
criteria goes under `issueReading`.
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
174
|
+
build cannot read it: it holds the work to its own reading of the criteria
|
|
175
|
+
and says so in the final report. Any other refusal is written to the state
|
|
176
|
+
file with its message, and the build continues. The script writes the
|
|
177
|
+
outcome under `criteria` in the state file: `source` (`issue`, `drafted`,
|
|
178
|
+
`item`, or `none` when even a draft holds no criterion), `recorded`,
|
|
179
|
+
`count`, `list` and `numbered`. On a 409, `list` is empty, and the build's
|
|
180
|
+
reading of the criteria goes under `issueReading`.
|
|
181
|
+
|
|
182
|
+
Drafted criteria are tiered, proven and judged like any others. A drafted
|
|
183
|
+
list stands like any recorded list. A later build's record
|
|
184
|
+
answers 409 until a person replaces the list with
|
|
185
|
+
`outerlayer emit criteria`, even after criteria are added to the issue. The
|
|
186
|
+
final report says the criteria were drafted and how to replace them.
|
|
187
|
+
|
|
188
|
+
Change nothing in the issue. The intake summary names how many criteria
|
|
189
|
+
were recorded, whether they kept the issue's ids or were numbered, and
|
|
190
|
+
whether they were drafted.
|
|
191
|
+
3. **Implement.** When `OUTERLAYER_BRANCH` is set, as it is in a host's
|
|
192
|
+
build, work on that branch, checking it out if it is not current, and
|
|
193
|
+
push only to it: the host refuses a push to any other branch. Otherwise
|
|
194
|
+
branch `feat/<slug>` from the default branch. Spawn the implementer with the Implementer brief from
|
|
168
195
|
[references/agent-briefs.md](references/agent-briefs.md), the issue, the
|
|
169
|
-
|
|
196
|
+
drafted criteria with their ids when the build drafted them, the branch
|
|
197
|
+
and the instructions-file pointer. The phase ends when the
|
|
170
198
|
repository's own pre-push checks and tests pass on the branch. Review
|
|
171
199
|
never opens on a red branch. A branch that cannot go green escalates.
|
|
172
200
|
4. **Review.** Read [references/review-loop.md](references/review-loop.md) on
|
|
@@ -185,12 +213,15 @@ Run them in order.
|
|
|
185
213
|
on entry and run it. A release agent rebases, gates and pushes. Open the
|
|
186
214
|
pull request as release.md says: a runner build with `outerlayer work open-pr`,
|
|
187
215
|
which links it, and a local session with `gh pr create` and then
|
|
188
|
-
`outerlayer work pr <number>`. When the
|
|
216
|
+
`outerlayer work pr <number>`. When the build recorded criteria, from the issue or drafted, a fresh agent judges them with
|
|
189
217
|
[references/criteria-judge.md](references/criteria-judge.md), and the
|
|
190
218
|
judge's HTML report is emitted:
|
|
191
219
|
|
|
192
220
|
outerlayer emit artifact <judge-report>.html --for acceptance-criteria --caption "Each criterion judged against its test"
|
|
193
221
|
|
|
222
|
+
Its verdict is recorded on the `acceptance-criteria` check, as release.md
|
|
223
|
+
says. When the state file holds no criteria, no judge runs and that
|
|
224
|
+
check gets no result, so it reads "not proven", never passed.
|
|
194
225
|
Watch CI until every check has concluded.
|
|
195
226
|
6. **Manual test and evidence.** Read [references/evidence.md](references/evidence.md)
|
|
196
227
|
when the pull request opens, and run it. Capture the proof each criterion
|
|
@@ -78,8 +78,10 @@ drives the real chain, from input through storage to read-back, with nothing
|
|
|
78
78
|
mocked at the store boundary, plus one test per criterion written from the
|
|
79
79
|
criterion's own words. Read every failure. Each test must fail because the
|
|
80
80
|
behavior is absent, not because of a typo or a missing import. Then implement
|
|
81
|
-
until green. When the
|
|
82
|
-
in the same
|
|
81
|
+
until green. When the build drafted the criteria from the issue's
|
|
82
|
+
description, they are requirements in the same way, and tests cite their
|
|
83
|
+
ids. When no criteria were recorded, write tests from the description in the
|
|
84
|
+
same order.
|
|
83
85
|
|
|
84
86
|
Version any new database migration with the current UTC time, never a round or
|
|
85
87
|
guessed one. Two open branches that guess the same time both pass their own
|
|
@@ -61,12 +61,12 @@ the final report. Never record the result with another link.
|
|
|
61
61
|
|
|
62
62
|
## Judge the criteria
|
|
63
63
|
|
|
64
|
-
When the
|
|
65
|
-
[criteria-judge.md](criteria-judge.md), with the worktree path,
|
|
66
|
-
the pull request number, the path of the build's state file,
|
|
67
|
-
path under `build-reports/`. Above forty
|
|
68
|
-
|
|
69
|
-
|
|
64
|
+
When the state file holds criteria, from the issue or drafted, spawn one
|
|
65
|
+
fresh agent on [criteria-judge.md](criteria-judge.md), with the worktree path,
|
|
66
|
+
the base ref, the pull request number, the path of the build's state file,
|
|
67
|
+
and a report path under `build-reports/`. Above forty criteria, spawn one
|
|
68
|
+
judge per group of about forty in the same wave, each with its own report
|
|
69
|
+
path, and merge their results by concatenation into one report.
|
|
70
70
|
|
|
71
71
|
The judge writes an HTML report with one verdict per criterion. Emit it:
|
|
72
72
|
|
|
@@ -76,8 +76,36 @@ Then run `outerlayer sync`. List every unsatisfied criterion in the final
|
|
|
76
76
|
report. A criterion that declares a proof form such as a screenshot or video is
|
|
77
77
|
proven only by an artifact bound to it on the pull request. The judge cannot
|
|
78
78
|
see that, so confirm each has an artifact of the declared kind, and emit any
|
|
79
|
-
that is missing in the evidence phase.
|
|
80
|
-
|
|
79
|
+
that is missing in the evidence phase.
|
|
80
|
+
|
|
81
|
+
## Record the criteria verdict
|
|
82
|
+
|
|
83
|
+
Once the judge's report is synced, copy its deep link from the pull request's
|
|
84
|
+
evidence comment. The link can take up to a minute to appear after the sync.
|
|
85
|
+
If it is not there yet, wait a minute and read the comment again. Never build
|
|
86
|
+
the link by hand, and never link a pull request comment. Then record the
|
|
87
|
+
judge's verdict on the `acceptance-criteria` check, once:
|
|
88
|
+
|
|
89
|
+
outerlayer emit acceptance-criteria --item "$OUTERLAYER_WORK" --result pass --link <the judge report's deep link>
|
|
90
|
+
|
|
91
|
+
The result is the judge's own last line. Record `--result pass` only when it
|
|
92
|
+
reads `result: pass`: every criterion the judge judged is satisfied. Record
|
|
93
|
+
`--result fail` when it reads `result: fail`, because a criterion is not
|
|
94
|
+
satisfied. A fail is recorded as fail, never withheld. With several judges,
|
|
95
|
+
record fail when any one of them failed. A criterion the judge marked
|
|
96
|
+
`not-judged` neither passes nor fails this check: its declared artifact
|
|
97
|
+
proves it on its own row. Drafted criteria are judged and recorded here like
|
|
98
|
+
the issue's own.
|
|
99
|
+
|
|
100
|
+
When the state file holds no criteria at all (`criteria.source` is `none`,
|
|
101
|
+
for example because drafting found nothing to draft), no judge runs, no
|
|
102
|
+
judge report is emitted, and nothing is recorded on this check. The row
|
|
103
|
+
then reads "not proven" once the build's claim ends. That is deliberate: no
|
|
104
|
+
criterion was judged, so the row must not read as passed, and a fail would
|
|
105
|
+
claim the judge found an unmet criterion. Name the unjudged check in the
|
|
106
|
+
final report. When the link has not appeared after a sync and a second look,
|
|
107
|
+
stop and name it as a blocker in the final report. Never record the result
|
|
108
|
+
with another link.
|
|
81
109
|
|
|
82
110
|
## Watch CI
|
|
83
111
|
|
|
@@ -20,12 +20,16 @@ whatever its size.
|
|
|
20
20
|
|
|
21
21
|
| Item and diff | Tier | Reviewers | Judge |
|
|
22
22
|
|---|---|---|---|
|
|
23
|
-
| No criteria | small | one generalist | no judge runs |
|
|
23
|
+
| No criteria recorded | small | one generalist | no judge runs |
|
|
24
24
|
| Under ~40 lines, off the floor | small | one generalist | when criteria exist |
|
|
25
25
|
| Up to ~800 lines, off the floor | medium | generalist + one focused reviewer | when criteria exist |
|
|
26
26
|
| Floor, or larger | full | generalist + up to three | when criteria exist |
|
|
27
27
|
|
|
28
|
-
An item with no criteria is `small` whatever its diff, and no judge
|
|
28
|
+
An item with no criteria recorded is `small` whatever its diff, and no judge
|
|
29
|
+
runs, so the `acceptance-criteria` check gets no result. That happens only when the build could not draft a single criterion, since
|
|
30
|
+
an issue with no criteria gets a drafted list. A drafted list
|
|
31
|
+
(`criteria.source` is `drafted`) is tiered and judged like criteria the issue
|
|
32
|
+
wrote.
|
|
29
33
|
|
|
30
34
|
- **Small.** One generalist reads the full diff. No focused reviewer and no
|
|
31
35
|
mutation agent. The orchestrator runs the repository's mutation tool itself
|