Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
697 commits
Select commit Hold shift + click to select a range
fc58731
TASK-114: the delegation prompt is rewritten; v1 must not be sent
ranjiao Aug 21, 2026
62dfbe3
Merge TASK-037 — a perry-goals refusal names the flag the value arriv…
ranjiao Aug 21, 2026
68ca393
Merge TASK-040 — `## Top risks` becomes a projection of a record store
ranjiao Aug 21, 2026
33bbc0d
record: close TASK-037; TASK-040 merged and blocked on USER-016
ranjiao Aug 21, 2026
459b81a
record: USER-015 dispatched; USER-016 is three entries, not one
ranjiao Aug 21, 2026
44f36ef
schema: declare the three record stores in claims[]; the risks refusa…
ranjiao Aug 21, 2026
8f33791
close TASK-114 at V3 — aiMark is on 1.14 / 2.1, and its four findings…
ranjiao Aug 21, 2026
99a3ff3
spec: TASK-040 write path (v3) and TASK-045 retire tolerance
ranjiao Aug 21, 2026
30a29ce
record: TASK-040 and TASK-045 dispatched
ranjiao Aug 21, 2026
421a4ea
goals: the drift severity is `warn` — decided by the user 2026-08-21
ranjiao Aug 21, 2026
6a9da46
TASK-040: `risks-write --from-board` — the one-way import, built
ranjiao Aug 21, 2026
e8f899a
TASK-045 — retire the per-shape id-column fallback; pin the readers t…
ranjiao Aug 21, 2026
56cd490
Merge TASK-040 — the risks write path
ranjiao Aug 21, 2026
066dd28
Merge TASK-045 — the tolerance audit: 20 branches examined, 1 retired…
ranjiao Aug 21, 2026
2316a77
record: close TASK-040 and TASK-045; three follow-ups
ranjiao Aug 21, 2026
f25ef50
spec: TASK-153 released and option A chosen — diagnose skips test fix…
ranjiao Aug 21, 2026
1784b46
record: TASK-153 dispatched
ranjiao Aug 21, 2026
c3a88e8
autopilot: first run, forced dry-run — 0 of 36 open rows are eligible
ranjiao Aug 21, 2026
1cad843
diagnose: a fixture's queue row is not this project's open decision
ranjiao Aug 21, 2026
932abb6
Merge TASK-153 — the queue register asks perry-explain's own predicate
ranjiao Aug 21, 2026
054bc47
record: close TASK-153 at V3 — the suite is down to one red module's …
ranjiao Aug 21, 2026
7a1a64a
intake: aiMark round 4 — six rows, and its top priority is already built
ranjiao Aug 21, 2026
37d366a
spec: TASK-168 (events tail) and TASK-169 (knowledge contract page)
ranjiao Aug 21, 2026
f19290a
record: TASK-168 and TASK-169 dispatched; 170 and 171 queued behind them
ranjiao Aug 21, 2026
6cf71c9
record: decisions 1-3 from the user, 2026-08-21
ranjiao Aug 21, 2026
634b035
events: the first page is the log's TAIL — perry-events/list 1.1 (TAS…
ranjiao Aug 21, 2026
6cb25cb
Merge TASK-168 — the first page of the event log is the tail, at 1.1
ranjiao Aug 21, 2026
d280606
record: close TASK-168 at V3; the busy-wait hazard filed
ranjiao Aug 21, 2026
9a6d7f1
schema: perry-knowledge/list/1.0 gets the page it always lacked
ranjiao Aug 21, 2026
09886cf
Merge TASK-169 — perry-knowledge/list/1.0 gets the contract page it a…
ranjiao Aug 21, 2026
a198376
record: close TASK-169 at V3; three findings and a scope note on TASK…
ranjiao Aug 21, 2026
3c93762
goals: P-O2.3's false green is withdrawn; rows for the key-parity and…
ranjiao Aug 21, 2026
923c129
spec: TASK-170 (answered asks) and TASK-171 (event kinds)
ranjiao Aug 21, 2026
3b5e32d
record: TASK-170 and TASK-171 dispatched
ranjiao Aug 21, 2026
1fff44c
study: how office-hours elicits, and what Perry's OKR setting is missing
ranjiao Aug 21, 2026
588f315
record: TASK-170 and TASK-171 re-dispatched after an ESC killed the f…
ranjiao Aug 21, 2026
e246599
wip(TASK-170): the dependency edge declares its own kind at 1.15
ranjiao Aug 21, 2026
7d907e4
schema: the events feed's event kinds, all twenty-five of them
ranjiao Aug 21, 2026
0db28c9
wip(TASK-170): contract page carries 1.15, version pins move
ranjiao Aug 21, 2026
a294374
test: the documented event kinds are derived from the writer, not kep…
ranjiao Aug 21, 2026
fcc9f19
test(TASK-170): the answered ask is legible at the edge, and no edge …
ranjiao Aug 21, 2026
8ebd60e
board: TASK-178 — delete the web viewer; aiMark is the consumption su…
ranjiao Aug 21, 2026
1c72274
schema: the kind rows say only what this feed actually projects
ranjiao Aug 21, 2026
9c215e3
test: the kinds pin runs when this file is run directly, too
ranjiao Aug 21, 2026
9a45f31
test(TASK-170): the frozen key set gains depends_on_resolved, deliber…
ranjiao Aug 21, 2026
2476ec0
Merge TASK-171 — the documented event kinds are pinned to what the wr…
ranjiao Aug 21, 2026
7983fcc
record: close TASK-171 at V3 — my spec measured the log where it shou…
ranjiao Aug 21, 2026
b3623d4
test(TASK-170): both list paths carry depends_on_resolved and agree
ranjiao Aug 21, 2026
cf511af
record: test_diagnose's queue reconcile is red again, and I caused it
ranjiao Aug 27, 2026
17da109
spec: TASK-178 — delete the web viewer, keep the shared read layer
ranjiao Aug 27, 2026
6aaea48
Merge TASK-170 — the dependency edge declares its own kind, at 1.15
ranjiao Aug 27, 2026
299c815
spec: TASK-176 — teach place to read a heading that names its containers
ranjiao Aug 27, 2026
923fa7c
record: close TASK-170 at V3; dispatch TASK-176 now that its defect i…
ranjiao Aug 27, 2026
a9c7f83
design: DESIGN-009 — an Objective is a title string, and every link t…
ranjiao Aug 27, 2026
b0b2510
delete the web viewer: serve.py, templates, static, launcher
ranjiao Aug 27, 2026
2587819
design: DESIGN-010 — autopilot cannot dispatch anything, and the spec…
ranjiao Aug 27, 2026
06f43b5
design: DESIGN-011 — the OKR is collected as ten fields where it shou…
ranjiao Aug 27, 2026
a66968e
route the viewer out of every doc and prose surface
ranjiao Aug 27, 2026
df21a52
parity: a key table's heading may name the collections it serves
ranjiao Aug 27, 2026
e7e8233
schema: the README's contract table names families, not versions — cl…
ranjiao Aug 27, 2026
9994bc3
spec: TASK-166 — a closed row whose title was lost, verified both halves
ranjiao Aug 27, 2026
1a76025
test: the tie is held open in a fixture, not borrowed from the board
ranjiao Aug 27, 2026
5dcefe8
fix: the date on everything written after tonight's resume was six da…
ranjiao Aug 27, 2026
43fc9ec
schema: tell a contract author the heading can name its collections
ranjiao Aug 27, 2026
ec1e9bf
test: the named table reads the same however full the arrays are
ranjiao Aug 27, 2026
cf8022a
Merge TASK-178 — the web viewer is deleted; aiMark is the consumption…
ranjiao Aug 27, 2026
689fb44
Merge TASK-176 — a key table can name the collections it documents
ranjiao Aug 27, 2026
550fec0
spec: TASK-165 — the report exemption covers dangling and not the que…
ranjiao Aug 27, 2026
2bc7519
record: TASK-165 and TASK-166 dispatched; TASK-176 and TASK-178 closed
ranjiao Aug 27, 2026
61644e2
spec: TASK-132 — 15 unobservable keys, not the 23 the row says
ranjiao Aug 27, 2026
2a3af4b
intake: two tools emit `intake.oldest_undischarged` and mean differen…
ranjiao Aug 27, 2026
8658b6a
diagnose: the queue register reads split_dangling's quoted verdict, n…
ranjiao Aug 27, 2026
e30e28e
spec: TASK-117 — one tool warns about drift where the other reports zero
ranjiao Aug 27, 2026
7839154
test: the queue register and the report exemption are pinned to one a…
ranjiao Aug 27, 2026
7125d2d
handoff: 2026-08-28 overnight
ranjiao Aug 27, 2026
8e99a78
spec: TASK-174 — autopilot re-derives a rule the contract computes once
ranjiao Aug 27, 2026
a6e73c6
fix: a closed row keeps its name — the check sees it and retitle reac…
ranjiao Aug 27, 2026
fc2d06b
spec: TASK-102 — evidence is one prose cell doing three jobs
ranjiao Aug 27, 2026
5e6257e
correction: my diagnosis of the USER-900 red named the wrong mechanism
ranjiao Aug 27, 2026
c1c5335
record: restore TASK-029's name, recovered from the journal rather th…
ranjiao Aug 27, 2026
f8070b0
docs: the four correctable cells are four only while the row is on th…
ranjiao Aug 27, 2026
88a72c5
Merge TASK-165 — the queue register reads the quoted verdict instead …
ranjiao Aug 27, 2026
c0c99cf
record: close TASK-165 at V3; my mechanism was wrong and the agent's …
ranjiao Aug 27, 2026
a5f8fbe
record: TASK-132 dispatched
ranjiao Aug 27, 2026
d1b67ac
fixture: a witness project whose real state fills the four collection…
ranjiao Aug 27, 2026
87387df
parity: a collection the live board leaves empty is read from the wit…
ranjiao Aug 27, 2026
fbe64f2
test: the fifteen witnessed keys are pinned by name, and each collect…
ranjiao Aug 27, 2026
503a66f
docs: the witness is named where the check is described — parity modu…
ranjiao Aug 27, 2026
c809521
Merge TASK-166 — a closed row's name is repairable, and TASK-029 has …
ranjiao Aug 27, 2026
79848e8
record: close TASK-166; dispatch TASK-117
ranjiao Aug 27, 2026
5ff14b2
board: TASK-179 — writing about an id costs a dangling entry, and thr…
ranjiao Aug 27, 2026
9d45623
handoff: updated with TASK-165, TASK-166 and the tension TASK-179 now…
ranjiao Aug 27, 2026
c4dde77
witness: hold review_idle open too — the twin that is only observable…
ranjiao Aug 27, 2026
fc1ed5b
handoff: correct the one line still carrying my wrong diagnosis
ranjiao Aug 27, 2026
83d0a3e
drift: unchecked is null, and a missing event log is unchecked
ranjiao Aug 27, 2026
934a0e4
test: the two tools agree about whether a comparison happened
ranjiao Aug 27, 2026
ec03774
Merge TASK-132 — a witness project makes 15 unverifiable keys verifiable
ranjiao Aug 27, 2026
dce20e3
record: close TASK-132; dispatch TASK-174
ranjiao Aug 27, 2026
4968a06
spec: TASK-154 — a two-id heading yields a title with a hole, or one …
ranjiao Aug 27, 2026
5de7be9
doc: the drift block's unknown value is null, and this page had promi…
ranjiao Aug 27, 2026
9355e0c
lint: the unchecked line names the check that still works
ranjiao Aug 27, 2026
aaf765d
guard: a procedure reads the contract's field, it does not re-derive it
ranjiao Aug 27, 2026
eaa8e94
autopilot: say how to read a row's absence from the will-dispatch list
ranjiao Aug 27, 2026
e9d31cd
guard: the measurement in the docstring is the one the walk actually …
ranjiao Aug 27, 2026
de4ef9e
Merge TASK-117 — drift is unchecked, not clean, and perry-lint was th…
ranjiao Aug 27, 2026
81e1eb2
contract: perry-task/list 1.15 -> 1.16 — the unchecked drift block re…
ranjiao Aug 27, 2026
cedf8be
Merge TASK-174 — a procedure may explain a contract field and may not…
ranjiao Aug 27, 2026
bbe0e3d
record: close TASK-117 and TASK-174; dispatch TASK-102 and TASK-154
ranjiao Aug 27, 2026
6785756
handoff: refreshed — nine rows closed overnight, one contract bumped
ranjiao Aug 27, 2026
846b877
task: evidence_relations[] — the cell is a list of things, typed, wit…
ranjiao Aug 27, 2026
46b1491
explain: a title loses the subject's own id, not every id in the heading
ranjiao Aug 27, 2026
6898bbb
test: round-trip every live evidence cell — 139 cells, 223 entries, 0…
ranjiao Aug 27, 2026
be4b316
spec: TASK-164 — the state root is assigned to a global that means th…
ranjiao Aug 27, 2026
8a12226
contract: perry-task/list 1.16 -> 1.17, and the witness holds the new…
ranjiao Aug 27, 2026
42e1039
doc: one blank line before the new sections, not two
ranjiao Aug 27, 2026
ce79a5e
test: the contract key sets carry evidence_relations and its entry shape
ranjiao Aug 27, 2026
0c14d35
Merge TASK-154 — a title loses the subject's own id, not every id in …
ranjiao Aug 27, 2026
68b7c3e
Merge TASK-102 — evidence is a typed list, and the row's own shape di…
ranjiao Aug 27, 2026
3d38344
spec: TASK-144 — the log stamps LOCAL time and the register stamps UTC
ranjiao Aug 27, 2026
691cfc8
spec: TASK-144 — the log stamps LOCAL time and the register stamps UTC
ranjiao Aug 27, 2026
90e2c69
handoff: eleven closed, two contracts moved, two more in flight
ranjiao Aug 27, 2026
413941b
record: TASK-164 was reserved and never dispatched for twenty minutes
ranjiao Aug 27, 2026
71d9e5d
one clock: the log stamps its offset, and ts_moment is the only reader
ranjiao Aug 27, 2026
5546f74
state: each root global gets the root its name means
ranjiao Aug 27, 2026
5f2618b
contracts: the two payloads that carry `ts` say which zone it is in
ranjiao Aug 27, 2026
7ee56d8
test: the one-converter guard is a search over bin/ and viewer/, not …
ranjiao Aug 27, 2026
c2056db
Merge TASK-164 — each root global gets the root its name means
ranjiao Aug 27, 2026
27b9451
Merge TASK-144 — the log stamps its offset, and ts_moment is the only…
ranjiao Aug 27, 2026
6bc8e8d
record: close TASK-164 and TASK-144; thirteen rows closed overnight
ranjiao Aug 27, 2026
c1ff540
close TASK-161 — resolved by TASK-176 and TASK-132, not by its own di…
ranjiao Aug 27, 2026
92cf0b4
spec: TASK-145 — the shape baseline is 44 keys behind and one of them…
ranjiao Aug 27, 2026
1dd29c2
spec: TASK-163 — localized to one call site using raw truthiness
ranjiao Aug 27, 2026
6b55c97
record: TASK-163 dispatched
ranjiao Aug 27, 2026
ae8a88b
handoff: fourteen closed; TASK-145 and TASK-163 in flight
ranjiao Aug 27, 2026
218d21d
task: a hand-written dash in a date cell is no clock, to both readers
ranjiao Aug 27, 2026
dcab64d
gate: the contract PAGE decides a type, and element zero stops deciding
ranjiao Aug 27, 2026
d9bb5b8
test: the dash is pinned on a HAND-EDITED board, read by both tools a…
ranjiao Aug 27, 2026
454d412
docs: what each arm of the gate actually covers, counted
ranjiao Aug 27, 2026
cdb1a4e
Merge TASK-145 — the contract page decides a type, and element zero s…
ranjiao Aug 27, 2026
8087834
Merge TASK-163 — a dash is not a clock, to either reader
ranjiao Aug 27, 2026
9653156
record: close TASK-145 and TASK-163 — the red count is one
ranjiao Aug 27, 2026
f37a470
spec: TASK-167 and TASK-156, both re-verified against 9653156
ranjiao Aug 27, 2026
993bda3
measure: TASK-179's cost is two store cells, not fourteen records
ranjiao Aug 27, 2026
a3cf98d
handoff: correct the TASK-179 frame and record the two in flight
ranjiao Aug 27, 2026
25236fa
handoff: a real sentence where a placeholder was
ranjiao Aug 27, 2026
001bd2d
close TASK-175 — aiMark had already built it, to the restraint the us…
ranjiao Aug 27, 2026
42720d6
handoff: seventeen closed; TASK-175 and the pattern behind it
ranjiao Aug 27, 2026
47352c0
find: a KR in the live phase cannot move and nothing says so
ranjiao Aug 27, 2026
d72b0a0
handoff: the stalled KR
ranjiao Aug 27, 2026
b632d9e
handoff: 37 undischarged intake rows, five of them mine tonight
ranjiao Aug 27, 2026
e545ed6
correct: the config store is absent by decision, not by omission
ranjiao Aug 27, 2026
9fe16c2
handoff: the config store is a one-command decision, and I had it wrong
ranjiao Aug 27, 2026
8d7eb36
lint: a linkage edge to a task no record carries is a finding — `link…
ranjiao Aug 27, 2026
1232a07
test: an answered ask stays legible; a new unanswered one is not this…
ranjiao Aug 27, 2026
e469020
Merge TASK-156 — a linkage edge to a task no record carries is a finding
ranjiao Aug 27, 2026
e3e998b
record: close TASK-156 — the guard is live and quiet on 31 resolving …
ranjiao Aug 27, 2026
319aee0
handoff: eighteen closed, one in flight, and why the second slot is e…
ranjiao Aug 27, 2026
1942180
handoff: 84 modules, 2510 tests, 1 red — measured after the TASK-156 …
ranjiao Aug 27, 2026
c55dc6d
handoff: 605 commits ahead, not 519; and merge-check's workflow alrea…
ranjiao Aug 27, 2026
d5bab6c
handoff: USER-903 belongs in the list you read first
ranjiao Aug 27, 2026
3ec7cc7
TASK-167: `perry-task purge` — the store's only removal, and the thre…
ranjiao Aug 27, 2026
65c007e
Merge TASK-167 — purge is the store's only removal path, and it is no…
ranjiao Aug 27, 2026
f6bcec1
record: close TASK-167 — nineteen rows closed overnight
ranjiao Aug 27, 2026
b7ca674
handoff: nineteen closed, nothing in flight, 85 modules and one red
ranjiao Aug 27, 2026
8692b97
spec: TASK-118 and TASK-124, both re-verified against b7ca674
ranjiao Aug 27, 2026
7637e6b
handoff: TASK-118 and TASK-124 in flight
ranjiao Aug 27, 2026
f6daff4
test: § 6 of the conformance suite reads a project in the repository
ranjiao Aug 27, 2026
af68614
mint: the three store-less registers read canonical-plus-departed, an…
ranjiao Aug 27, 2026
35f718e
Merge TASK-124 — one of four files was the defect; the other three we…
ranjiao Aug 27, 2026
88e18db
Merge TASK-118 — the three minters were right and their docstrings we…
ranjiao Aug 27, 2026
23ce1e0
record: close TASK-124 and TASK-118 — twenty-one rows closed overnight
ranjiao Aug 27, 2026
f6478c9
handoff: twenty-one closed, eight dispatches for eight merges
ranjiao Aug 27, 2026
23490d7
spec: TASK-125 and TASK-147, both re-verified against 23ce1e0
ranjiao Aug 27, 2026
a142a06
handoff: 86 modules, 2574 tests, 1 red; TASK-125 and TASK-147 in flight
ranjiao Aug 27, 2026
67b492b
test: the INSERT against a nested `### Anti-Goals` runs everywhere, n…
ranjiao Aug 27, 2026
84a38e5
Merge TASK-125 — the gap was the middle branch of three
ranjiao Aug 27, 2026
ffe92f9
record: close TASK-125 — twenty-two rows closed overnight
ranjiao Aug 27, 2026
25f1de9
consolidate: four citations pointing at a directory are one defect, n…
ranjiao Aug 27, 2026
dd49b8d
handoff: twenty-two closed; the citation defect consolidated
ranjiao Aug 27, 2026
fe61262
test: the table/bullet boundary is pinned where the tool can see it —…
ranjiao Aug 27, 2026
1b1cf17
Merge TASK-147 — two flips reddened nothing, and that is the row
ranjiao Aug 27, 2026
017132d
record: close TASK-147 — twenty-three rows closed overnight, eleven d…
ranjiao Aug 27, 2026
6106ce8
handoff: twenty-three closed, eleven for eleven
ranjiao Aug 27, 2026
6cceebb
spec: TASK-123 and TASK-158, re-verified against 017132d
ranjiao Aug 27, 2026
9b1e929
handoff: TASK-123 and TASK-158 in flight
ranjiao Aug 27, 2026
83fb960
fix: bin/perry-task's write-site id advisory reads the project's fami…
ranjiao Aug 27, 2026
9e4dfbd
goals: OKR.md § Commitments is decided from okr.jsonl, not from the m…
ranjiao Aug 27, 2026
4995aa5
handoff: correct a number I have quoted all night
ranjiao Aug 27, 2026
b7ee34d
Merge TASK-123 — the two writers were never in agreement; the check n…
ranjiao Aug 27, 2026
0b89b1b
record: close TASK-123 — twenty-four rows closed overnight
ranjiao Aug 27, 2026
52a59fa
handoff: twenty-four closed, twelve for twelve
ranjiao Aug 27, 2026
463d1fa
find: the id scanner honours a fence and not a backtick
ranjiao Aug 27, 2026
240d8d0
Merge TASK-158 — the check was none of my eight candidates
ranjiao Aug 27, 2026
1f00d1f
record: close TASK-158 — twenty-five rows closed overnight, thirteen …
ranjiao Aug 27, 2026
f4471ed
handoff: twenty-five closed; TASK-179's list is not what I reported
ranjiao Aug 27, 2026
83e8734
handoff: final measured numbers — 88 modules, 2609 tests, 1 red
ranjiao Aug 27, 2026
64776f4
handoff: the leftover branches, checked rather than assumed
ranjiao Aug 27, 2026
ff37391
find: a locked decision that never shipped — DESIGN-007 #4, KR id nam…
ranjiao Aug 28, 2026
0341c7b
handoff: DESIGN-007 #4 is the eighth thing, and it is a locked decision
ranjiao Aug 28, 2026
2da0324
spec: TASK-180 — the one-time phase-KR id migration, as the user deci…
ranjiao Aug 28, 2026
a666d73
find: a decision without a row does not happen — 5 for 5, 0 for 9
ranjiao Aug 28, 2026
99357ca
record: three user decisions — D009-1, D010-2, USER-903
ranjiao Aug 28, 2026
0e4af6d
migrate: .perry/config.md becomes a projection of .perry/config.jsonl
ranjiao Aug 28, 2026
44a30fa
lock DESIGN-009/010/011 and give every implementation step a row
ranjiao Aug 28, 2026
8ce9fcf
close TASK-094 on a rescoped verification; open five rows for the sto…
ranjiao Aug 28, 2026
1a8c677
spec: TASK-200 — draft the finance role card, per the user's 2026-08-…
ranjiao Aug 28, 2026
8e43789
correct TASK-200 mid-flight: gimegime-pmo is a hybrid board
ranjiao Aug 28, 2026
f62019c
TASK-200: the union holds the seam, not the money — and the spec was …
ranjiao Aug 28, 2026
65c4969
Merge TASK-200 — the finance role card, and three defects the extract…
ranjiao Aug 28, 2026
08584c0
record: close TASK-200 — the card exists, and it says why the model d…
ranjiao Aug 28, 2026
fdfe573
TASK-180 — phase-KR ids migrated, once, with no compatibility left be…
ranjiao Aug 28, 2026
7708d96
Merge TASK-180 — every phase-KR id is now P<NNN>-O<n>-KR<m>
ranjiao Aug 28, 2026
f691923
record: the migration event named three affected log entries; there a…
ranjiao Aug 28, 2026
2723729
record: close TASK-180 — the migration is done
ranjiao Aug 28, 2026
ff3c1b0
handoff: bring it up to the end of the daytime session
ranjiao Aug 28, 2026
94aade4
close TASK-195 — the risks store was built all along; only the comman…
ranjiao Aug 28, 2026
ae1b11a
spec: TASK-201 (P0, the escalation gate) and TASK-196 (Intake becomes…
ranjiao Aug 28, 2026
0262445
TASK-201 — the escalation gate reads a Chinese spec, and says so when…
ranjiao Aug 28, 2026
901eb99
Merge TASK-201 — the gate now sees Chinese, and a dropped fragment is…
ranjiao Aug 28, 2026
12b3ef1
record: close TASK-201
ranjiao Aug 28, 2026
981aa8c
TASK-196 — `## Intake` becomes a store, keyed on the position it is a…
ranjiao Aug 28, 2026
a74f37b
Merge TASK-196 — the Intake store, and a gate derived rather than copied
ranjiao Aug 28, 2026
afd3e56
record: close TASK-196
ranjiao Aug 28, 2026
fbcc308
spec: TASK-202 (hook has no not-extractable check) and TASK-197 (User…
ranjiao Aug 28, 2026
1dbbded
triage: aiMark round 5 — 8 of 8 accepted, four rows opened
ranjiao Aug 28, 2026
26ce7cb
TASK-197 — the ask store, and `Idle` is the column that is NOT stored
ranjiao Aug 28, 2026
bf5622e
status: the first weekly report this project has written
ranjiao Aug 28, 2026
f1d181a
Merge TASK-197 — the ask store, and a docstring stale two days after …
ranjiao Aug 28, 2026
0204acc
record: close TASK-197
ranjiao Aug 28, 2026
bbe7781
TASK-202 — the hook half of the union is checked now, by the same pre…
ranjiao Aug 28, 2026
3c74bff
Merge TASK-202 — the hook half of the check, and a fixture that belie…
ranjiao Aug 28, 2026
e3e4321
record: close TASK-202
ranjiao Aug 28, 2026
36598ff
status: TASK-197 and TASK-202 closed after the report was drafted
ranjiao Aug 28, 2026
ece2a58
triage: intake drained from 62 to 0, every row with exactly one outcome
ranjiao Aug 28, 2026
2727abc
spec: TASK-205 (semantics on three payloads) and TASK-210 (inline cod…
ranjiao Aug 28, 2026
7f0378f
goals: three phase-002 KR numbers re-measured, and one of them is not…
ranjiao Aug 28, 2026
cdff0c7
TASK-210 — the id scan honours a code span, and the spec is wrong abo…
ranjiao Aug 28, 2026
815bd31
TASK-205 — `semantics` on every read payload, and the empty array is …
ranjiao Aug 28, 2026
2392728
Merge TASK-210 — the scanner stops reading inline code as prose, and …
ranjiao Aug 28, 2026
dcf7a2b
record: close TASK-210
ranjiao Aug 28, 2026
ba29671
goals: phase 002 scored — 0.89, and its own argument untested
ranjiao Aug 28, 2026
04da960
Merge TASK-205 — semantics on every payload, and there are six not five
ranjiao Aug 28, 2026
f748cc7
record: close TASK-205
ranjiao Aug 28, 2026
b288399
record: score-phase's own snapshots trip NS-01
ranjiao Aug 28, 2026
38f000f
TASK-095: the track register is read from the store, not from config.md
ranjiao Aug 28, 2026
e993d85
TASK-209: the store-drift census covers six stores, not two
ranjiao Aug 28, 2026
2e41336
record: phase 002 retro, DESIGN-012 locked, attribution swept to zero
ranjiao Aug 28, 2026
b7cef79
TASK-209 fix: the entry point goes last, so the appended tests run st…
ranjiao Aug 28, 2026
38d7be6
record: three rows for gaps this session's own work exposed
ranjiao Aug 28, 2026
5cac6b5
Merge coding/task-209-store-drift-census — TASK-095, TASK-209, and th…
ranjiao Aug 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 8 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
name: tests

# This job already tests the MERGE RESULT: `actions/checkout` resolves
# `refs/pull/N/merge` on a `pull_request` event, not the branch head. What it
# cannot see is a base that moves after the run, or a second PR open at the
# same time — that is `merge-check.yml`, which explains both in full.

on:
push:
branches: [main]
Expand All @@ -13,7 +18,8 @@ jobs:
- uses: actions/setup-python@v5
with:
python-version: "3.11"
# No dependencies to install — Perry's scripts and tests are stdlib only.
# The viewer's Flask requirement is opt-in and not exercised here.
# No dependencies to install — Perry's scripts and tests are stdlib only,
# with no exception since TASK-178 deleted the web viewer (its Flask,
# markdown and jinja2 were the only non-stdlib packages Perry ever named).
- name: Run the suite
run: bash tests/run
99 changes: 99 additions & 0 deletions .github/workflows/merge-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
name: merge-check

# Why this is a second workflow rather than another job in ci.yml.
#
# ci.yml answers "is this pull request green?" and it already checks out the
# MERGE RESULT — `actions/checkout` resolves `refs/pull/N/merge` on a
# `pull_request` event, which the run for PR #16 on 2026-08-20 shows verbatim:
#
# git fetch ... +9e18354...:refs/remotes/pull/16/merge
# HEAD is now at 9e18354 Merge 96822a4e... into e9d8c4dc...
#
# So "check out the merge result" is not the missing piece; it is what already
# happens. What ci.yml cannot answer is "is the tree we are about to HAVE
# green?", for two reasons this workflow exists to cover:
#
# 1. That merge result is computed against the base as it stood when the
# event fired, and GitHub never re-fires `pull_request` when the base
# branch moves underneath an open PR. PR #14 and PR #15 were both
# computed against e9d8c4dc; #14 landed on 02e61fd and #15 landed on top
# of #14, so no run ever saw the tree that shipped.
# 2. Nothing ever tests two OPEN changes together. #14 added both store
# files to `claims[]`; #15 shipped tests asserting the world before that
# claim. Each was fine alone. Merged, two tests were red that neither
# change could have seen.
#
# Hence the trigger list below. `push` to an integration branch is exactly the
# moment a base moves under the PRs still queued against it, and that is when
# every one of them is re-checked.

on:
pull_request:
branches: [main, feat/work-modes]
push:
branches: [main, feat/work-modes]
workflow_dispatch:

concurrency:
group: merge-check-${{ github.event.pull_request.base.ref || github.ref_name }}
cancel-in-progress: true

jobs:
pairs:
runs-on: ubuntu-latest
# Pair search is quadratic in the number of open PRs and only pays when the
# combined tree is red. This is the ceiling on that, so a bad day costs an
# hour and not a runner until somebody notices.
timeout-minutes: 60
permissions:
contents: read
pull-requests: read
steps:
- name: Which branch are the open PRs queued against
id: base
run: |
echo "ref=${{ github.event.pull_request.base.ref || github.ref_name }}" \
>> "$GITHUB_OUTPUT"

# The DEFAULT ref, deliberately — which on a pull_request is that PR's
# merge result. Two reasons. It is the only tree guaranteed to contain
# tests/merge-check (checking out the base cannot run a checker the base
# does not have yet, which is how this workflow failed on the very PR
# that added it). And it matches what GitHub already does with the
# workflow file itself on a pull_request event, so the script and the
# yaml driving it come from the same place.
#
# This checkout is only the source of the SCRIPT. Every tree the suite
# actually runs on is built by tests/merge-check in its own clone, from
# the base sha and the PR heads fetched below.
- uses: actions/checkout@v4
with:
fetch-depth: 0

# One authenticated fetch of every PR head and of the base branch.
# tests/merge-check clones this checkout with --shared, so it reaches
# these commits without credentials of its own.
#
# The destination is refs/remotes/pull/*/head, NOT refs/remotes/pull/*:
# actions/checkout has already written refs/remotes/pull/<n>/merge for
# this PR, so refs/remotes/pull/<n> is a directory and cannot also be a
# ref. --force does not help with a D/F collision; a sibling name does.
- name: Fetch every pull request head and the base branch
run: |
git fetch --no-tags --force origin \
'+refs/pull/*/head:refs/remotes/pull/*/head' \
"+refs/heads/${{ steps.base.outputs.ref }}:refs/remotes/origin/${{ steps.base.outputs.ref }}"

- uses: actions/setup-python@v5
with:
python-version: "3.11"

# Stdlib only, like the rest of Perry. `gh` is preinstalled on the runner
# and only used to list open PRs.
- name: Every open PR merged together, against the current base tip
env:
GH_TOKEN: ${{ github.token }}
run: |
python3 tests/merge-check \
--base "${{ steps.base.outputs.ref }}" \
--all-open -j 4
13 changes: 13 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,10 +1,23 @@
# Auto-update timestamp written by bin/perry-update-check
.update-check


# macOS
.DS_Store
.gstack/

# Python bytecode from bin/ + viewer/
__pycache__/
*.pyc

# Subagent worktrees — temporary, created by the Agent tool
.claude/worktrees/
# `perry/tasks.jsonl` was ignored while it was DERIVED — `perry-tasks build`
# reconstructed it from BOARD.md plus the event log on every call, so a tracked
# copy would have been a second spelling of files already in the repo.
#
# TASK-089 made it the WRITE TARGET: `perry-task` writes the store and renders
# the board from it. It is truth now, and an untracked truth is a file that
# vanishes on a fresh clone while the projection of it stays. Tracked.

opencode.json
9 changes: 9 additions & 0 deletions .perry/config.jsonl
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{"kind": "setting", "key": "document_language", "label": "Document language", "value": "English", "order": 0}
{"kind": "setting", "key": "chat_language", "label": "Chat language", "value": "中文", "order": 1}
{"kind": "setting", "key": "repo_layout", "label": "Repo layout", "value": "single", "order": 2}
{"kind": "setting", "key": "state_root", "label": "State root", "value": "perry", "order": 3}
{"kind": "setting", "key": "pmo_repo_path", "label": "PMO repo path", "value": "/Users/bytedance/proj/Perry", "order": 4}
{"kind": "setting", "key": "code_repo_path", "label": "Code repo path", "value": "", "order": 5}
{"kind": "setting", "key": "last_updated", "label": "Last updated", "value": "2026-08-16", "order": 6}
{"kind": "track", "track": "main", "mode": "project", "spine": "phase/", "stages": "", "wip": "", "sla": "", "cycle": "", "default_rung": "V3", "order": 0}
{"kind": "track", "track": "intake", "mode": "queue", "spine": "standing", "stages": "new→triaged→in_progress→resolved", "wip": "6", "sla": "5d", "cycle": "weekly", "default_rung": "V3", "order": 1}
24 changes: 22 additions & 2 deletions .perry/config.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,38 @@
# Perry configuration

- Document language: English
- Chat language: 中文
- Repo layout: single
- State root: perry
- PMO repo path: /Users/bytedance/proj/Perry
- Code repo path: —
- Last updated: 2026-08-16

## Tracks

| Track | Mode | Spine | Stages | WIP | SLA | Cycle | Default rung |
|---|---|---|---|---|---|---|---|
| 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**
(`design/SKILL.md`, `design/state/design_TEMPLATE.md`), not a folder of design
(`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 `design/SKILL.md` as a
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
Expand Down
38 changes: 38 additions & 0 deletions .perry/conformance.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Perry conformance

> Written by `perry-conform declare`. Each row records that **the user**
> declared this file to match Perry's shape at that shape version
> (ADR-004 § 4). It is a decision, not a verdict: whether the file still
> matches is re-checked live on every write, and a row that no longer
> holds is reported rather than deleted.

> Paths are as `schema/state-schema.json` declares them — relative to the
> state root, except the `.perry/` ones which are relative to the project
> root. Delete a row to withdraw a declaration.

| File | Shape version | Declared | Route |
|---|---|---|---|
| .perry/config.md | 2 | 2026-08-20 | declare |
| .perry/hook.md | 2 | 2026-08-20 | declare |
| BOARD.md | 2 | 2026-08-20 | declare |
| DECISIONS.md | 2 | 2026-08-20 | declare |
| OKR.md | 2 | 2026-08-20 | declare |
| design/DESIGN-001-resumable-pipelines.md | 2 | 2026-08-20 | declare |
| design/DESIGN-002-namespace-collision.md | 2 | 2026-08-20 | declare |
| design/DESIGN-003-work-modes.md | 2 | 2026-08-20 | declare |
| design/DESIGN-004-deterministic-writes.md | 2 | 2026-08-20 | declare |
| design/DESIGN-005-state-and-contracts.md | 2 | 2026-08-20 | declare |
| design/DESIGN-006-roles-and-knowledge.md | 2 | 2026-08-20 | declare |
| design/DESIGN-007-the-entity-model.md | 2 | 2026-08-20 | declare |
| design/DESIGN-008-track-axes.md | 2 | 2026-08-28 | declare |
| design/DESIGN-009-the-objective-is-a-record.md | 2 | 2026-08-28 | declare |
| design/DESIGN-010-autopilot-writes-its-own-specs.md | 2 | 2026-08-28 | declare |
| design/DESIGN-011-the-okr-is-elicited-not-collected.md | 2 | 2026-08-28 | declare |
| knowledge/goals/linkage-graph-before-first-add.md | 2 | 2026-08-28 | declare |
| knowledge/toolchain/pycache-staleness.md | 2 | 2026-08-20 | declare |
| phase/001-linkage.md | 2 | 2026-08-20 | declare |
| phase/001-work-modes-live.md | 2 | 2026-08-20 | declare |
| phase/002-fields-are-typed.md | 2 | 2026-08-20 | declare |
| phase/002-linkage.md | 2 | 2026-08-28 | declare |
| phase/003-linkage.md | 2 | 2026-08-28 | declare |
| phase/003-storage-code.md | 2 | 2026-08-28 | declare |
Loading
Loading