Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
277 commits
Select commit Hold shift + click to select a range
9a64021
TASK-203 round 4, step 2: an ordinary write may never SHRINK a canoni…
ranjiao Aug 29, 2026
40c322a
TASK-182 is TASK-236's precondition, not its conflict — and the goals…
ranjiao Aug 29, 2026
9aa85c1
TASK-095 round 6: one drift rule, owned by perry-lint; the refusal ba…
ranjiao Aug 29, 2026
9687f9d
USER-907 and USER-908 answered; TASK-199 re-scoped, TASK-238 filed
ranjiao Aug 29, 2026
87b52ab
TASK-095 round 6 delivered and in V4 review
ranjiao Aug 29, 2026
a8f8b84
dispatch: TASK-235, TASK-226, TASK-230 — three free file surfaces
ranjiao Aug 29, 2026
39c87ff
TASK-050 round 8: one `header_index()`, and a check over a symbol
ranjiao Aug 29, 2026
d2914e9
record: TASK-050 round 8 result
ranjiao Aug 29, 2026
cabae16
TASK-050 round 8 delivered and in V4 review
ranjiao Aug 29, 2026
4054a63
record: the discover-runner count was not measured, said so
ranjiao Aug 29, 2026
54df3e7
TASK-050: branch tip moved to 68e63cf, evidence-only, and the reviewe…
ranjiao Aug 29, 2026
fa7ce94
TASK-203 round 4, step 3: the refusal's way forward names a subcomman…
ranjiao Aug 29, 2026
2ec9575
TASK-203 round 4 resumed: a mutation was left applied and no RESULT w…
ranjiao Aug 29, 2026
8a92943
TASK-203 round 4, step 4: the tasks.jsonl call site gets a test that …
ranjiao Aug 29, 2026
50d3e4e
TASK-095 round 6 PASSES V4 — first PASS after five FAILs
ranjiao Aug 29, 2026
cdf32fa
TASK-235 resumed to commit, and USER-909 filed from what it found
ranjiao Aug 29, 2026
0d88e4c
TASK-235: DECISIONS.md stops existing; `perry-decide list` is the sur…
ranjiao Aug 29, 2026
1ee402d
TASK-235 RESULT: the three findings promoted, and the parsers.py hunk…
ranjiao Aug 29, 2026
71aeaa1
TASK-095 round 6 addendum: the drift set's record-kind filter gets a …
ranjiao Aug 29, 2026
79f6834
Merge coding/task-095-round6 — the first PASS on this row after five …
ranjiao Aug 29, 2026
43e1f0f
TASK-235 fix: my own byte-cap trim tripped the hand-edit guard
ranjiao Aug 29, 2026
0528abf
TASK-203 round 4: the RESULT
ranjiao Aug 29, 2026
1ac6fc3
TASK-235 RESULT: baselines, the defect the full run caught, and the gap
ranjiao Aug 29, 2026
0d8b5b3
TASK-235 RESULT: drop a paragraph finding 1 said twice
ranjiao Aug 29, 2026
588f590
TASK-203 round 4 in V4 review — and a correction to my own attribution
ranjiao Aug 29, 2026
4b028be
TASK-235 RESULT: the viewer-HTML gap was not a gap; viewer/ has no HTML
ranjiao Aug 29, 2026
79d0207
TASK-235 delivered; holding dispatch — parallelism has started costin…
ranjiao Aug 29, 2026
39a4d35
TASK-157: a phase KR is declared once — committed by the PMO, NOT ver…
ranjiao Aug 29, 2026
39037cb
TASK-230 WIP: the parallel runner, preserved after a rate-limit termi…
ranjiao Aug 29, 2026
c844cf8
Session rate limit terminated all six agents; work triaged and preserved
ranjiao Aug 29, 2026
051ab6c
main is green after the TASK-095 merge: the 2 extra failures are not …
ranjiao Aug 29, 2026
0bf6f2e
TASK-203's merge onto main is clean — measured before the verdict, no…
ranjiao Aug 29, 2026
7a1afab
handoff: the night of 2026-08-29 to 30, written as it ran
ranjiao Aug 29, 2026
c181063
TASK-157 round 2: the suite runs f15d234 never had
ranjiao Aug 29, 2026
d375214
TASK-235 V4 correction: the gate refused the whole command, not just …
ranjiao Aug 29, 2026
00fb073
Three verdicts: TASK-235 PASS, TASK-050 round 8 FAIL, TASK-203 round …
ranjiao Aug 29, 2026
38ac0b2
TASK-203 round 5, step 1: the exemption is unbounded — three tests, RED
ranjiao Aug 29, 2026
7d869b7
record: the intake rows from TASK-235's merge check
ranjiao Aug 29, 2026
d82e779
Merge coding/task-235-decisions-index — DECISIONS.md stops existing
ranjiao Aug 29, 2026
d35e737
close TASK-235 and TASK-214 at V4; handoff updated
ranjiao Aug 29, 2026
e01c139
TASK-203 round 5, step 2: an allowed command may shrink by exactly wh…
ranjiao Aug 29, 2026
4b25051
TASK-157: hold the phase half of `linkage-kr-exists`, which nothing held
ranjiao Aug 29, 2026
83a55be
TASK-157 fix: `linked` in 001-linkage.md was copied from the wrong table
ranjiao Aug 29, 2026
4edb666
TASK-226 PASSES V4, and its reviewer found a live hole the RESULT cal…
ranjiao Aug 29, 2026
82aa8d6
TASK-203 round 5, step 3: drop a guard nothing can reach
ranjiao Aug 29, 2026
6bb1c2e
TASK-226: the phantom row was writer #1, run by the user at 10:25:11Z
ranjiao Aug 29, 2026
36c812b
TASK-203 round 5, step 4: the RESULT, and round 4's is marked superse…
ranjiao Aug 29, 2026
8bbc736
Merge coding/task-226-conformance-phantom — the third writer does not…
ranjiao Aug 29, 2026
6b2703f
close TASK-226 at V4; the carried runner figure is finally measured
ranjiao Aug 29, 2026
a49ec8f
TASK-050 round 9 (WIP): delete the shape net, rebuild the corpus with…
ranjiao Aug 29, 2026
18d869e
TASK-157: the RESULT now says who measured what
ranjiao Aug 29, 2026
29a648f
TASK-050 round 9: the runtime watch stops listing readers it cannot see
ranjiao Aug 29, 2026
a1721e8
TASK-157 round 2 delivered — and the restore point it inherited was w…
ranjiao Aug 29, 2026
33d640e
TASK-203 round 5: the tests/run baseline
ranjiao Aug 29, 2026
6cda651
TASK-203's FAIL gets two additions, and the second is about method
ranjiao Aug 29, 2026
d30ebd8
TASK-203 round 5, step 5: the line the suite stopped one short of
ranjiao Aug 29, 2026
a35d21a
TASK-203 round 5: baselines, MB1b, and spec item 5 completed
ranjiao Aug 29, 2026
c18f1d4
TASK-203 round 5: the discover baseline at afb3a48 settles the three …
ranjiao Aug 29, 2026
ea66cbf
TASK-203 round 5 delivered — the exemption is bounded, and the proof …
ranjiao Aug 29, 2026
4814589
dispatch TASK-230 to verify its own restore point
ranjiao Aug 29, 2026
5ddc54b
TASK-157 PASSES V4 — the audit of a rescued restore point was worth d…
ranjiao Aug 29, 2026
d601a61
TASK-157: the register's own template was the half left behind
ranjiao Aug 29, 2026
c5fbc0d
TASK-230 audit: the inherited --ids set silently dropped 14 tests
ranjiao Aug 29, 2026
0f65aa7
TASK-157: record M13/M14 and the suite run after the template fix
ranjiao Aug 29, 2026
a677a26
Merge coding/task-157-kr-declared-once — a phase KR is declared once
ranjiao Aug 29, 2026
bf5dfa4
close TASK-157 at V4; handoff updated
ranjiao Aug 29, 2026
3198477
record: TASK-050 round 9 result, and round 8's result retracted in place
ranjiao Aug 29, 2026
692840f
record: drop a minted task id from the round 9 result
ranjiao Aug 29, 2026
bbcdc85
record: name both `bash tests/run` runs, and which tree each measured
ranjiao Aug 29, 2026
2ff10ba
TASK-050 round 9 delivered — the shape net is deleted and the cost is…
ranjiao Aug 29, 2026
74f20c3
TASK-203 round 5 PASSES V4 — five rounds, and the fifth door is shut
ranjiao Aug 29, 2026
f4bd042
TASK-203 round 5: the control now controls, and a wrong attribution i…
ranjiao Aug 29, 2026
f56805d
TASK-203 round 5: name the correction commit, and MB1c
ranjiao Aug 29, 2026
38fc346
Merge coding/task-203-round4 — an ordinary write may never shrink a c…
ranjiao Aug 29, 2026
efaaf64
The six declared stores now all exist — and I got there by accident
ranjiao Aug 29, 2026
df7d2e7
TASK-230: the accounting guard gets a test, and the docstring gets nu…
ranjiao Aug 29, 2026
098f189
record: TASK-203's round 4 review lands its final version, after the …
ranjiao Aug 29, 2026
8026494
dispatch TASK-233 and TASK-241, both with the spec a P1 row is owed
ranjiao Aug 29, 2026
feb603e
TASK-230 result: the schedule is optimal, and the set it is checked a…
ranjiao Aug 29, 2026
83fae70
TASK-230 delivered — the third rescued restore point audited, the thi…
ranjiao Aug 29, 2026
0019194
A decorated row in the conformance record is no longer a declaration
ranjiao Aug 29, 2026
3753fc2
Three shapes, three named tests, each carrying its own control
ranjiao Aug 29, 2026
2766d72
TASK-050 round 9 FAILS V4 — and the reviewer ruled the round's core c…
ranjiao Aug 29, 2026
fda4fa7
TASK-230 PASSES V4 — the safety claim verified by a method the author…
ranjiao Aug 29, 2026
ed77116
TASK-230 V4 item 1: the --ids refusal is now wired into main() under …
ranjiao Aug 29, 2026
aecc18f
TASK-233 (1/3): the config settings come out of the store, not the pr…
ranjiao Aug 29, 2026
7fd8ced
TASK-230 V4 items 2-4: three claims that overstated what I measured
ranjiao Aug 29, 2026
784f065
TASK-233 (2/3): `perry-config render` rebuilds the file from the stor…
ranjiao Aug 29, 2026
e5aa2ac
TASK-050 round 10: resolve a direct alias binding, so the guard is ov…
ranjiao Aug 29, 2026
4b92300
TASK-230: the first quiet-machine measurement, and a flake count that…
ranjiao Aug 29, 2026
34bbbaf
TASK-050 round 10: the three minor findings, and the reader the revie…
ranjiao Aug 29, 2026
b66341d
Merge coding/task-230-suite-cost — the suite is scheduled, and the id…
ranjiao Aug 29, 2026
c6d59cb
TASK-241 RESULT — the round trip alone did not reach all three shapes
ranjiao Aug 29, 2026
b294cd4
TASK-241 delivered, and it corrects the reviewer who found the defect
ranjiao Aug 29, 2026
f48fafd
TASK-233 (3/3): the prose gets a home a render cannot destroy, and a …
ranjiao Aug 29, 2026
e032c33
TASK-050 round 10: two GREEN mutations are two corpus gaps
ranjiao Aug 29, 2026
618ea0e
TASK-233: the 'unreadable store' guard was guarding one branch of two
ranjiao Aug 29, 2026
26a3959
TASK-233: 'refuses' has to mean a refusal, not a traceback
ranjiao Aug 29, 2026
aa5fc4b
TASK-233: the result — what changed, the byte comparison, 23 mutation…
ranjiao Aug 29, 2026
9e7024a
TASK-241 round 1 FAILS V4, and the review corrects a sentence I wrote
ranjiao Aug 29, 2026
5e155cd
TASK-233: "is there a `.perry/config.md`" stopped being "is this conf…
ranjiao Aug 29, 2026
330a9c9
TASK-233: the result, updated for the fourth reader class and batch 3
ranjiao Aug 29, 2026
e43f98d
record: TASK-050 round 10 result, and round 9's two corrections made …
ranjiao Aug 29, 2026
13e35e4
A fence closes on markdown's rule, not on any line that looks like one
ranjiao Aug 29, 2026
41bd9fe
TASK-233 delivered — and it caught a measurement error of mine that h…
ranjiao Aug 29, 2026
7fd14c8
record: name the exact trees the two suite runs measured, and the tre…
ranjiao Aug 29, 2026
63a4311
record: the round 9 corrections are two, not one
ranjiao Aug 29, 2026
b4bd8aa
Merge main into coding/task-050-header-index — 88 commits the branch …
ranjiao Aug 29, 2026
72e9959
TASK-050 round 10 delivered, and it corrects the reviewer who found t…
ranjiao Aug 29, 2026
60999a0
TASK-233 round 1 FAILS V4 — and its own justification still reproduce…
ranjiao Aug 29, 2026
9f97f8b
TASK-241 RESULT — round 2: the fence, the mechanism choice, and two s…
ranjiao Aug 29, 2026
066dc5a
TASK-233: `bin/perry-state` asked it too, in two places round 1 calle…
ranjiao Aug 29, 2026
8fce247
TASK-241 RESULT: spell the fence shapes in words so the tables render
ranjiao Aug 29, 2026
c58aab9
TASK-233: § 4 said "these were the rest" and had never checked; the r…
ranjiao Aug 29, 2026
07febdc
TASK-050 round 10 FAILS V4 — the mechanism won, the arithmetic lost
ranjiao Aug 29, 2026
c812292
TASK-233: the X4 guard's control tripped the live-state sweep; it did…
ranjiao Aug 29, 2026
742810d
TASK-241 RESULT: baseline the branch HEAD too, and record the flake i…
ranjiao Aug 29, 2026
e811035
TASK-241 RESULT: date the main-tip observation instead of asserting it
ranjiao Aug 29, 2026
9081919
TASK-233: baselines get a tree AND an hour, and round 1's "2 failures…
ranjiao Aug 29, 2026
2e6d0b7
TASK-233: the result's own commit table, brought up to round 2
ranjiao Aug 29, 2026
6a3e7dc
Merge main into coding/task-241-conformance-decoration — 18 commits
ranjiao Aug 29, 2026
35f2ae3
TASK-233 and TASK-241 round 2 both delivered, both in V4 review
ranjiao Aug 29, 2026
96c209e
TASK-050 round 11: a row carried on a dict key is a row
ranjiao Aug 29, 2026
da5c336
TASK-050 round 11: a table handed over by `yield` is still a local case
ranjiao Aug 29, 2026
201ece1
Merge coding/task-233-config-readers — the config readers ask the store
ranjiao Aug 29, 2026
a2c134c
TASK-241 round 2 PASSES V4 — the rejected framing was rejected twice,…
ranjiao Aug 29, 2026
442f3f9
TASK-241 RESULT: two claims narrowed to what was measured
ranjiao Aug 29, 2026
595cdee
TASK-050 round 11: measure the remainder, guard WATCHED both ways, pl…
ranjiao Aug 29, 2026
bd54af0
TASK-241 RESULT: the merge landed mid-round, so measure the merged tr…
ranjiao Aug 29, 2026
f5aa90d
close TASK-241 at V4 — and restore an event log I truncated
ranjiao Aug 29, 2026
72da718
Merge coding/task-241-conformance-decoration — a decorated row is not…
ranjiao Aug 29, 2026
62bee05
TASK-050 round 11: mutate every new line, delete the ten nothing pinned
ranjiao Aug 29, 2026
7c56c7c
record: TASK-050 round 11 result — the remainder is eight, and it is …
ranjiao Aug 29, 2026
58e0193
record: correct the probe accounting and re-time the static net
ranjiao Aug 29, 2026
913e245
TASK-050 round 11 delivered — and it proved the cause of a stray writ…
ranjiao Aug 29, 2026
30cde5c
handoff: rewritten for the morning, with what I got wrong in it
ranjiao Aug 29, 2026
a4aa0b2
TASK-050 round 11 PASSES V4 — eleven rounds, and the number was rebui…
ranjiao Aug 29, 2026
716f5da
TASK-050 round 11 correction 3: sweep it mechanically, not by hand
ranjiao Aug 29, 2026
f4bdaaa
record: the three round 11 review corrections, applied and re-measured
ranjiao Aug 29, 2026
4962889
TASK-050's corrections went past the charge, so they go back for a de…
ranjiao Aug 29, 2026
4a05e23
TASK-050's delta is CONFIRMED — and the reviewer found the thing its …
ranjiao Aug 29, 2026
04ee80d
TASK-050 round 11 delta: a declared bound is not a covered class
ranjiao Aug 29, 2026
bb1c8ec
TASK-050 round 11 delta: run the sweep past the bound, and find a sec…
ranjiao Aug 30, 2026
3f040f4
record: the delta-pass corrections — a declared bound is not a covere…
ranjiao Aug 30, 2026
d589735
record: the failure count moved on an unchanged tree, and the proof i…
ranjiao Aug 30, 2026
5d612e5
Merge coding/task-050-header-index — one header_index(), after eleven…
ranjiao Aug 30, 2026
119c8be
close TASK-050 at V4 after eleven rounds; handoff finished
ranjiao Aug 30, 2026
5979aad
record main's real baseline: four failures, and the fourth is a finding
ranjiao Aug 30, 2026
09bb074
dispatch the next four — TASK-249, 234, 239, 243
ranjiao Aug 30, 2026
8a84934
TASK-249 fix: the call site, and a guard that does not care how the w…
ranjiao Aug 30, 2026
1ca8914
TASK-243: a count-preserving substitution is REPORTED, not refused
ranjiao Aug 30, 2026
4c3effb
TASK-234: .perry/conformance.md becomes .perry/conformance.jsonl
ranjiao Aug 30, 2026
21ec64e
TASK-249: the guard's own test, with the plant and the mutation
ranjiao Aug 30, 2026
352cf40
TASK-234: move TASK-241's 69 tests to the door they now guard
ranjiao Aug 30, 2026
ce4e21b
TASK-243 tests: 25 tests, every one on a board where a substitution i…
ranjiao Aug 30, 2026
4bb7956
TASK-234: perry-migrate declares with its run id, and preflights both…
ranjiao Aug 30, 2026
7b05263
TASK-234: the header-fold site was renamed, not removed; procedure gu…
ranjiao Aug 30, 2026
b74b72f
TASK-234: § 12 — the store's own properties, the bootstrap, and what …
ranjiao Aug 30, 2026
25406b9
TASK-234: mutation harness (uniquely named, refuses a dirty tree)
ranjiao Aug 30, 2026
c8cf185
TASK-234: mutation M11 found a hole — a stale markdown could overwrit…
ranjiao Aug 30, 2026
ec16359
TASK-249: bin/README.md documents step 0 and the two flags it did not…
ranjiao Aug 30, 2026
04ffdab
TASK-249 RESULT: the call site, the mechanism, the mutation, the base…
ranjiao Aug 30, 2026
794b231
TASK-234: RESULT, and the last markdown-named docstring
ranjiao Aug 30, 2026
a441933
TASK-234: the entry point goes last (TASK-209's guard, caught by test…
ranjiao Aug 30, 2026
49f2c8f
TASK-249 RESULT: the second full run, and a flake recorded rather tha…
ranjiao Aug 30, 2026
11714bf
TASK-234: RESULT — final baselines by runner, tree and hour
ranjiao Aug 30, 2026
afa676a
TASK-234: a refusal from inside perry-conform walked past perry-migra…
ranjiao Aug 30, 2026
1f2a936
TASK-234: RESULT — M21 and the 21st mutation
ranjiao Aug 30, 2026
1335e05
settle the baseline dispute: the number is not a property of the commit
ranjiao Aug 30, 2026
ea47623
TASK-243 result: the ending, the reproduction, ten mutations, two bas…
ranjiao Aug 30, 2026
5c6eacd
TASK-243 delivered — three endings, two refuted by evidence gathered …
ranjiao Aug 30, 2026
c18e132
TASK-234: RESULT — final run recorded
ranjiao Aug 30, 2026
1f622e4
TASK-234 delivered — the two questions to settle first turned out to …
ranjiao Aug 30, 2026
7bdf2e4
TASK-234 FAILS V4 — the architecture is right, the mitigation it depe…
ranjiao Aug 30, 2026
2aac390
TASK-239 PASSES V4 — and the reviewer founded the ending better than …
ranjiao Aug 30, 2026
5719c6f
TASK-234 V4 FAIL: the fixed-point refusal now prints the diff
ranjiao Aug 30, 2026
c75ec26
the baseline dispute was never about the board — tests/run reports th…
ranjiao Aug 30, 2026
6c42fd0
TASK-249 FAILS V4 — a row about corrupted measurements shipped one
ranjiao Aug 30, 2026
1dcede8
TASK-249 wip: three ignore lists pinned, mode recorded, PERRY_PROJECT…
ranjiao Aug 30, 2026
62f6c03
TASK-234: pin six of seven surviving defensive branches; name the sev…
ranjiao Aug 30, 2026
4a64b4b
TASK-243 PASSES V4 — and the one guard that survives its own deletion…
ranjiao Aug 30, 2026
128b960
TASK-243: the regression test the V4 review asked for — the cap is on…
ranjiao Aug 30, 2026
622ab01
TASK-249: close three V4 defeats of the guard — ignore lists, mode, P…
ranjiao Aug 30, 2026
431071c
TASK-234: mutations M22-M29 — the diff, the cap, and the six pinned b…
ranjiao Aug 30, 2026
2886e4e
TASK-249 RESULT: retract the baseline correction, and say what happened
ranjiao Aug 30, 2026
549d2e8
TASK-243 result: the cost of the ending, and the three mutations that…
ranjiao Aug 30, 2026
008cf04
TASK-234: M24 caught the cap test asserting the notice and never the …
ranjiao Aug 30, 2026
888f49f
TASK-234: RESULT — mutations M22-M29
ranjiao Aug 30, 2026
1f6c29e
TASK-243: re-baseline the tip after the regression test — 104 / 3124 …
ranjiao Aug 30, 2026
d871399
TASK-249 RESULT: the post-correction full run, counted the right way
ranjiao Aug 30, 2026
9d3d322
TASK-234: RESULT — V4 round 2 baseline
ranjiao Aug 30, 2026
c0a8313
record: TASK-251 gains its mechanism, and the PMO state for the night…
ranjiao Aug 30, 2026
038f02d
Merge coding/task-243-substitution — TASK-243 at V4
ranjiao Aug 30, 2026
648cb27
hand-off: the 04:00-10:45 stretch, and TASK-251's mechanism
ranjiao Aug 30, 2026
d7c0c52
file TASK-253: --dry-run writes, and it had been living in another ro…
ranjiao Aug 30, 2026
5518027
TASK-234 round 3 V4 review: FAILS on the --root the refusal drops
ranjiao Aug 30, 2026
7e448ad
knowledge: numbers migrate between sentences, and only re-measurement…
ranjiao Aug 30, 2026
2f904b3
TASK-249 round 2 V4: PASS — 12/12 mutations red, one withdrawn claim …
ranjiao Aug 30, 2026
49d85b4
record: the two round-N verdicts, before their review docs land
ranjiao Aug 30, 2026
02b4383
Merge the two V4 review documents — TASK-234 round 3 (FAIL) and TASK-…
ranjiao Aug 30, 2026
75e9aca
record: a flake that two reviewers had to compare notes to identify, …
ranjiao Aug 30, 2026
0825c7a
TASK-249: fix the three round-2 V4 defects — a withdrawn claim, a cou…
ranjiao Aug 30, 2026
cc2bba4
TASK-234: the refusal hands back a command with the root the caller used
ranjiao Aug 30, 2026
53b00bf
TASK-234: the assertion checks the command the CALLER could run, not …
ranjiao Aug 30, 2026
90fed51
TASK-249 RESULT: record round 2's three defects, the fixes, and both …
ranjiao Aug 30, 2026
7b7300b
TASK-234: the class beyond perry-conform, and the mutation that was G…
ranjiao Aug 30, 2026
433e040
TASK-249 RESULT: nine mutations, three baselines, and what I could no…
ranjiao Aug 30, 2026
44a82bb
TASK-234: the sweep ships, the record is corrected, and two numbers s…
ranjiao Aug 30, 2026
5a18da2
TASK-234: round-4 baselines, counted the way the runner makes hard
ranjiao Aug 30, 2026
69c8f86
TASK-249 RESULT: the final two runs, on the tip and on the merge that…
ranjiao Aug 30, 2026
598e9e8
record: TASK-249 round 3 fixes, and the ignored-directory blind spot …
ranjiao Aug 30, 2026
67aab22
TASK-234: record the suite run at the tip the corrections landed on
ranjiao Aug 30, 2026
467dd30
record: TASK-234 round 3 corrections, and TASK-254 for perry-lint's 22
ranjiao Aug 30, 2026
323aac5
TASK-249 round 3 V4 review: PASS, one material defect, five trees mea…
ranjiao Aug 30, 2026
8beb6c3
Merge the TASK-249 round-3 review — PASS, one bullet blocks the merge
ranjiao Aug 30, 2026
b70e54a
record: the round-3 verdict, and the ignore hole is wider than the ro…
ranjiao Aug 30, 2026
8659e45
TASK-249: the round-3 blocker bullet, and four fixes with their tests
ranjiao Aug 30, 2026
9fa6bbb
TASK-234 round 4 V4 review — FAIL on an unquoted root, plus four gree…
ranjiao Aug 30, 2026
9f66e1b
TASK-249: pin the blocker — every ignored name must have a bullet in …
ranjiao Aug 30, 2026
bff8ea9
Merge the TASK-234 round-4 review — FAIL on an unquoted --root, and f…
ranjiao Aug 30, 2026
810da15
record: TASK-234 round-4 FAIL, and TASK-253 is a hazard not a tidy-up
ranjiao Aug 30, 2026
69d3b7f
file TASK-255: the class is project-wide, and shlex appears nowhere
ranjiao Aug 30, 2026
c54e767
TASK-249: three findings from mutating my own fixes
ranjiao Aug 30, 2026
4ccc996
TASK-234: a handed-back command's arguments are shell-quoted at one c…
ranjiao Aug 30, 2026
0234887
TASK-234: every fixture root is shell-hostile, and the assertion parses
ranjiao Aug 30, 2026
8f03d28
TASK-249 RESULT: round 3 closed — the blocker, four fixes, twenty mut…
ranjiao Aug 30, 2026
d1787eb
TASK-234: the sweep reads HOW an argument got into a handed-back command
ranjiao Aug 30, 2026
59ef127
TASK-249 RESULT: the fifth run — the document does not move the number
ranjiao Aug 30, 2026
0915e44
TASK-234: the three paths that were green because nothing reached them
ranjiao Aug 30, 2026
90e08e9
file TASK-256: an md5 restore-check that compares against what it jus…
ranjiao Aug 30, 2026
041774c
TASK-234: the shape is asserted, and the harness carries the round-5 …
ranjiao Aug 30, 2026
ea0df14
TASK-234: the overclaim guard catches 9 of 9, and the widening not taken
ranjiao Aug 30, 2026
7b5145e
TASK-234: RESULT -- the round-4 FAIL, and the two claims that did not…
ranjiao Aug 30, 2026
6676905
TASK-249 round 4 V4 review — PASS on the delta; the blocker's pin hol…
ranjiao Aug 30, 2026
97d4efc
Merge coding/task-249-suite-writes — TASK-249 at V4, after four rounds
ranjiao Aug 30, 2026
d17d79d
file TASK-257: the pin reads a substring, and one substring blinds th…
ranjiao Aug 30, 2026
7d0cc38
TASK-234: record the round-5 suite runs -- main, the tip, and the mer…
ranjiao Aug 30, 2026
de0d5a1
TASK-234: RESULT -- the class outside these two tools, measured with …
ranjiao Aug 30, 2026
8da32c1
TASK-234: the round-5 numbers, from the runs at the commit that carri…
ranjiao Aug 30, 2026
372e90c
TASK-234: re-baseline and re-probe against the main that moved mid-round
ranjiao Aug 30, 2026
e44d088
record: TASK-234 round 4, the class sized at 25, and a test that copi…
ranjiao Aug 30, 2026
0d51b6b
TASK-234 round 5: V4 review — PASS, and the third layer is not there
ranjiao Aug 30, 2026
d9318e4
Merge coding/task-234-conformance-store — TASK-234 at V4, after five …
ranjiao Aug 30, 2026
6c24730
close TASK-234 and TASK-249 at V4; correct TASK-255's population; fil…
ranjiao Aug 30, 2026
6884315
Three gates for what a session actually costs, all three configurable
ranjiao Aug 31, 2026
a4eb411
Two rules that make a V4 round able to end, and the checks behind them
ranjiao Aug 31, 2026
6ce1f5b
TASK-261: the ADR-004 conformance gate comes out, and migration is th…
ranjiao Aug 31, 2026
436d0fb
USER-910 answered A: migration goes too, and perry_schema.py with it
ranjiao Aug 31, 2026
37e9af5
The prose stops promising a gate and a migrator that no longer exist
ranjiao Aug 31, 2026
b0ebffb
Merge pull request #32 from ranjiao/coding/task-261-drop-conformance-…
ranjiao Sep 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 0 additions & 29 deletions .perry/config.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,32 +14,3 @@
|---|---|---|---|---|---|---|---|
| main | project | phase/ | — | — | — | — | V3 |
| intake | queue | standing | new→triaged→in_progress→resolved | 6 | 5d | weekly | V3 |

`intake` carries the work that ARRIVES — a defect an agent found mid-run, a
sibling a sweep turned up, a review finding. It is not decomposed from a goal,
it shows up, and its useful questions are queue questions: what has been
waiting longest, how deep is the backlog, what keeps recurring.

`main` carries the work that is DECOMPOSED — the phase, its KRs, the rows that
serve them.

Declared 2026-08-20 as the experiment in TASK-133. `Default rung` is V3 rather
than queue mode's V2 default: an arriving row here is a code defect, and a
resolution note is not evidence that it is fixed.

## Why the state root is not `.`

Perry's own `design/` directory is the **design lane skill**
(`decide/SKILL.md`, `decide/state/design_TEMPLATE.md`), not a folder of design
documents. Pointing the state root at the project root would make Perry claim
its own source tree, and every lint run would report `decide/SKILL.md` as a
malformed design doc.

`okr/` and `pmo/` are lane skills for the same reason. `.perry/` stays at the
project root: it holds this pointer, so it cannot sit behind it.

This is the collision described in `perry/design/DESIGN-002-namespace-collision.md`
— Perry is its own proof case, and this file is the escape hatch that document
argues should be offered automatically rather than written by hand.

See `schema/README.md § Where the files are`.
38 changes: 0 additions & 38 deletions .perry/conformance.md

This file was deleted.

291 changes: 291 additions & 0 deletions .perry/events.jsonl

Large diffs are not rendered by default.

42 changes: 42 additions & 0 deletions .perry/hook.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,45 @@ be automated (TASK-015, TASK-018, TASK-024, TASK-026) already carry
`Dispatch mode: manual` in their specs, which is the gate that actually holds —
listing them here too would create a second copy to keep in sync, and Perry's
own rule is one fact, one place.

## Configuration notes

> **Moved here from `.perry/config.md` on 2026-08-30 (TASK-233), verbatim.**
> That file is a projection of `.perry/config.jsonl` now: `perry-config render`
> rebuilds it from the store with no copy of it on disk, and what a store holds
> is settings and track rows — never prose. Prose in the projection survives a
> render only while a file is there to copy it out of, which is a guarantee
> that ends the first time the file is deleted or a project is cloned without
> it. This file is not rendered from anything, so it cannot lose them.
> `reference/config.md § Prose in this file is layout` is the general rule.

### What the two tracks carry

`intake` carries the work that ARRIVES — a defect an agent found mid-run, a
sibling a sweep turned up, a review finding. It is not decomposed from a goal,
it shows up, and its useful questions are queue questions: what has been
waiting longest, how deep is the backlog, what keeps recurring.

`main` carries the work that is DECOMPOSED — the phase, its KRs, the rows that
serve them.

Declared 2026-08-20 as the experiment in TASK-133. `Default rung` is V3 rather
than queue mode's V2 default: an arriving row here is a code defect, and a
resolution note is not evidence that it is fixed.

### Why the state root is not `.`

Perry's own `design/` directory is the **design lane skill**
(`decide/SKILL.md`, `decide/state/design_TEMPLATE.md`), not a folder of design
documents. Pointing the state root at the project root would make Perry claim
its own source tree, and every lint run would report `decide/SKILL.md` as a
malformed design doc.

`okr/` and `pmo/` are lane skills for the same reason. `.perry/` stays at the
project root: it holds this pointer, so it cannot sit behind it.

This is the collision described in `perry/design/DESIGN-002-namespace-collision.md`
— Perry is its own proof case, and this file is the escape hatch that document
argues should be offered automatically rather than written by hand.

See `schema/README.md § Where the files are`.
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ the live project state is rooted at `perry/` through `.perry/config.md`.
- Follow `work/reference/git-boundaries.md` for commit, push, PR, and merge
authority. Never merge your own implementation.
- Green on your own base is not green merged — `tests/merge-check --help`.
- Calling a tool costs more than its output (52% of context vs 26%): cwd persists, so no `cd <repo> &&`; a long or repeated step goes in a scratchpad file, not the prompt. `perry-context-budget`.

Keep this file under roughly 60 lines. It is the always-loaded startup protocol,
not a second copy of `SKILL.md`, the dashboard, or the architecture record.
5 changes: 2 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ Don't start from a blank page — Perry can read what's already there:

It reads your README, roadmap, git history, existing design notes, TODOs and issues, then **proposes** goals, tasks and decisions. Nothing is written until you say yes.

**Adoption is a migration, and it is meant to happen once.** Perry used to adapt at runtime to whatever shape your files were already in, and that tolerance is where its bugs lived — two branches guessing differently about the same table and quietly losing a row between them. So it was traded away on purpose ([ADR-004](perry/decisions/ADR-004-mandatory-migration.md)). The rule now: **a project migrates to Perry's structure in order to use Perry's write features, and a project that will not migrate stays readable rather than drivable.**
**Adoption writes Perry's own state, once.** Perry used to adapt at runtime to whatever shape your files were already in, and that tolerance is where its bugs lived — two branches guessing differently about the same table and quietly losing a row between them. So it was traded away on purpose ([ADR-004](perry/decisions/ADR-004-mandatory-migration.md)). The rule now: **`/perry adopt` reads what you already have as evidence and writes Perry's structure from it; it never rewrites your files in place.** ADR-004 also made every writer refuse a file nobody had declared conformant. That gate is deleted (`TASK-261`) — in 23 declarations it never once disagreed with the live check, so nothing now refuses a write for want of a declaration.

Readable is not the consolation prize. `/perry diagnose` runs on any folder at all, and reading an unmigrated project is exactly how you decide whether to migrate it. And the migration owes you four things: the complete diff before anything is written, no lost rows or IDs, a restore point, and no step you did not ask for.

Expand Down Expand Up @@ -242,7 +242,6 @@ your-project/
│ ├── phase/ the current stretch of work + saved snapshots
│ ├── BOARD.md open tasks, right now
│ ├── journal/ what happened each day
│ ├── DECISIONS.md index of decisions
│ ├── decisions/ one file per decision, with the reasoning
│ ├── design/ design docs / RFCs
│ ├── evidence/ proof that tasks were finished
Expand Down Expand Up @@ -317,7 +316,7 @@ Any language works for prose. Details, and how to switch later: [reference/i18n.

**Can I use it for non-code projects?** Yes — research, writing, ops, business planning. Those are not a bolt-on: they are the [four modes](#four-kinds-of-work), each with its own horizon, throttle and triage. `/perry diagnose` recognises them from what's on your board.

**Can Perry drive the board I already have?** Only after `/perry adopt` migrates it. Perry stopped bending at runtime to arbitrary file shapes ([ADR-004](perry/decisions/ADR-004-mandatory-migration.md)) — that flexibility was where its data-losing bugs came from. An unmigrated project stays readable and diagnosable; it is just not driven.
**Can Perry drive the board I already have?** Not in place. `/perry adopt` reads it as evidence and writes Perry's own state alongside; Perry then drives that. Perry stopped bending at runtime to arbitrary file shapes ([ADR-004](perry/decisions/ADR-004-mandatory-migration.md)) — that flexibility was where its data-losing bugs came from. A project Perry has not adopted stays readable and diagnosable; it is just not driven.

**What if my project already has a `design/` folder?** Nothing collides — Perry's own files live under `perry/` by default, so your `design/` stays yours. Setup checks for the collision before it writes anything, and only asks if you tell it to use the project root instead.

Expand Down
5 changes: 2 additions & 3 deletions README_cn.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ git clone https://github.com/ranjiao/Perry.git ~/perry && ~/perry/setup

它会读你的 README、路线图、git 历史、已有的设计笔记、TODO 和 issue,然后**提议**目标、任务和决策。你不点头,它什么都不写。

**adopt 是一次迁移,只做一次。** 以前 Perry 会在运行时迁就你原有的文件格式。它的 bug 大多出在这里:两处代码对同一张表的读法不一致,中间悄悄丢掉一行。所以这份灵活性被有意放弃了,理由记在 [ADR-004](perry/decisions/ADR-004-mandatory-migration.md)。现在的规矩是:**要用 Perry 的写入能力,项目就得先迁到 Perry 的结构;不迁的项目仍然可读,但 Perry 不会去驱动它。**
**adopt 写出 Perry 自己的状态,只做一次。** 以前 Perry 会在运行时迁就你原有的文件格式。它的 bug 大多出在这里:两处代码对同一张表的读法不一致,中间悄悄丢掉一行。所以这份灵活性被有意放弃了,理由记在 [ADR-004](perry/decisions/ADR-004-mandatory-migration.md)。现在的规矩是:**`/perry adopt` 把你已有的东西当证据读,据此写出 Perry 的结构;它不会就地改写你的文件。** ADR-004 当初还让每个写工具拒绝未被声明合规的文件,那道门禁已经删除(`TASK-261`)—— 23 次声明里它一次都没和实时检查产生过分歧,现在没有任何写入会因为缺一份声明被拒。

「可读」不是安慰奖。`/perry diagnose` 在任何目录上都能跑,而读一个没迁移的项目,恰恰是你判断该不该迁的依据。迁移本身欠你四件事:动手之前先给出完整 diff、不丢任何一行和任何一个 ID、留一个可回退的还原点、以及绝不做你没让它做的事。

Expand Down Expand Up @@ -244,7 +244,6 @@ your-project/
│ ├── phase/ 当前阶段 + 历史快照
│ ├── BOARD.md 此刻的开放任务
│ ├── journal/ 每天发生了什么
│ ├── DECISIONS.md 决策索引
│ ├── decisions/ 一个决策一个文件,含推理过程
│ ├── design/ 设计文档 / RFC
│ ├── evidence/ 任务做完的凭据
Expand Down Expand Up @@ -319,7 +318,7 @@ Perry 本身是英文写的,你的项目不必是。首次配置时它会记

**能用在非代码项目上吗?** 能 —— 研究、写作、运维、业务规划都行。这不是外挂上去的:它们就是[四种 mode](#四种工作形态),各有各的收尾条件、节奏控制和 triage 问法。`/perry diagnose` 会从你板子上的样子把它们认出来。

**Perry 能直接驱动我现有的板子吗?** 得先用 `/perry adopt` 迁一次。Perry 已经不再在运行时迁就任意文件格式了([ADR-004](perry/decisions/ADR-004-mandatory-migration.md))—— 那份灵活性正是它丢数据的那类 bug 的来源。没迁的项目仍然可读、可以 diagnose,只是不被驱动。
**Perry 能直接驱动我现有的板子吗?** 不是就地驱动。`/perry adopt` 把它当证据读,在旁边写出 Perry 自己的状态,之后 Perry 驱动的是后者。Perry 已经不再在运行时迁就任意文件格式了([ADR-004](perry/decisions/ADR-004-mandatory-migration.md))—— 那份灵活性正是它丢数据的那类 bug 的来源。没被 adopt 过的项目仍然可读、可以 diagnose,只是不被驱动。

**我的项目已经有** **`design/`** **目录了怎么办?** 不会撞上 —— Perry 自己的文件默认就在 `perry/` 下面,你的 `design/` 还是你的。setup 在写任何东西之前先查一遍冲突,只有你坚持要用项目根目录时它才会问。

Expand Down
12 changes: 6 additions & 6 deletions SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,11 +70,11 @@ The table is that sentence applied to a file list. It is a **file-ownership** co
|---|---|---|
| **`goals`** (`goals/`) | `OKR.md` — **including `## Commitments`** — and `phase/<NNN>-<slug>.md` | weekly tasks, handed to `work` |
| **`work`** (`work/`) | `BOARD.md` (incl. `## Intake`, `## Cadence`), `journal/`, `PROJECT_STATE.md`, `evidence/`, `weekly/`, `handoff/`, **`.perry/agents.jsonl` → `.perry/roles/`** | KR attribution edges, handed to `goals` |
| **`decide`** (`decide/`) | `design/<DESIGN-ID>-<slug>.md`, **`DECISIONS.md` and `decisions/`** | implementation tasks on lock, handed to `work` |
| **`decide`** (`decide/`) | `design/<DESIGN-ID>-<slug>.md` and **`decisions/`** | implementation tasks on lock, handed to `work` |

**Two changes from the previous contract** — `DECISIONS.md` + `decisions/` moved from `work` to `decide`, and `OKR.md § Commitments` became explicitly `goals`. **The lane names and the directories now agree**, an edit needing no second signature because the ownership set above is byte-identical across it. Both accounts: `reference/hand-off-contract.md`.
**Two changes from the previous contract** — `decisions/` + its then-index moved from `work` to `decide`, and `OKR.md § Commitments` became explicitly `goals`. **The lane names and the directories now agree**, an edit needing no second signature because the ownership set above is byte-identical across it. Both accounts: `reference/hand-off-contract.md`.

**What "only writer" forbids.** A lane needing a change in another lane's file **asks in chat and stops** — it does not write and apologise, and not "just this once" because the other lane is not loaded. Three cases that must refuse: `goals` writing `BOARD.md`; `work` writing `DECISIONS.md`; `decide` writing `journal/`.
**What "only writer" forbids.** A lane needing a change in another lane's file **asks in chat and stops** — it does not write and apologise, and not "just this once" because the other lane is not loaded. Three cases that must refuse: `goals` writing `BOARD.md`; `work` writing `decisions/`; `decide` writing `journal/`.

## Mandatory first move: combined snapshot

Expand All @@ -86,7 +86,7 @@ Always run this first. Steps −2 to 3 are ordering-critical; the rest is `refer

0. **Auto-update check**: run `bash "$PERRY_HOME/bin/perry-update-check"`. It is throttled to once per 7 days; surface output verbatim. OpenCode and Codex may run this bounded check synchronously.

1. **Read `.perry/config.md`** for document language, chat language and repo layout. If absent and any state file exists, prompt for first-time setup. **Everything rendered from here uses the chat language**; files use `Document language`. Contract: `reference/i18n.md`.
1. **Read `.perry/config.jsonl`**, else `.perry/config.md`, for document language, chat language and repo layout. If neither exists and a state file does, prompt for first-time setup. **Everything rendered from here uses the chat language**; files use `Document language`. Contract: `reference/i18n.md`.

2. **Check for an interrupted run, but only after recovery safety — before anything else reads project state.**

Expand Down Expand Up @@ -192,9 +192,9 @@ Moves every path Perry claims under a new state root and rewrites `State root:`

## Configuration

`.perry/config.md` is where a project's preferences live; every lane and script reads it. First-time setup creates it. Field **names** stay English in every language, because this file declares the language and must be readable before it is known. An optional `## Tracks` table turns on `pipeline` / `queue` / `inquiry` mode; absent means one implicit `main` track, mode `project`.
`.perry/config.md` projects `.perry/config.jsonl`; prose belongs in `.perry/hook.md`. First-time setup creates both. Field **names** stay English in every language, because this file declares the language and must be readable before it is known. An optional `## Tracks` table turns on `pipeline` / `queue` / `inquiry` mode; absent means one implicit `main` track, mode `project`.

The field list and the four subjects with consequences worth reading before you change them are `reference/config.md`: **repo layout** (single, or the two-repo PMO ↔ code split), **state root** (`perry` is what setup writes; the *code* fallback is still the project root and must stay that way), **tracks**, and the **conformance gate** (enforces — never run `perry-conform declare` for the user; adoption proposes, the user declares).
The field list and the three subjects with consequences worth reading before you change them are `reference/config.md`: **repo layout** (single, or the two-repo PMO ↔ code split), **state root** (`perry` is what setup writes; the *code* fallback is still the project root and must stay that way), and **tracks**. The ADR-004 **conformance gate** was a fourth; it is deleted (`TASK-261`) — nothing refuses a write now.

## Style rules

Expand Down
Loading
Loading