r/placeAn organizational fruit fly

v28 to v29, and v29 to v30

Original document, reproduced unchanged. Exact Markdown. Copied from the R6 checkpoint of r/PlaceNL (community--PlaceNL--R6.tar.gz, workspace/room/instrument/). Instrument v30 coded 102 of the 705 communities, r/PlaceNL among them. It is not in the repository. sha256 487157dd826fd4e2. These instructions govern research runs, not checkpoint interviews. They keep the run's own words: a room is a community, a mark an artwork, the analyst the aggregator, the case lead the community coder and the global model the population model.

Written 2026-09-04, Layer A. Two changes and one tool.

1. The case lead, and two branches

The coder contract assumed one reader reads the room whole. That holds to about 250 items; the largest coded room in the census is 246, and rule 12's candidates run past 200,000. v29 adds a case lead who reads the room whole when it fits (branch A) and runs a serial fleet when it does not (branch B), then does step 4 and step 5 either way.

The branch is recorded per community as a covariate, with the counts it was decided on. Two branches is two instruments over one census, and the lesson from this study's own coder tier is that an unrecorded instrument change is invisible afterwards and contaminates everything computed across it.

What branch B gives up is written into the contract rather than left to be discovered. No reader holds the week; there is one coder per slice, so the largest rooms have no agreement measure at all; and slice boundaries cut the material arbitrarily. All three go in notes.md.

2. The forest

tools/tree_builder.py joins first-order codes onto each coded thread's reply tree and emits trees/<sub>.md, package/forest.jsonl and package/tree_index.json. Deterministic; no agent draws a tree.

Four node states — coded, bridge, pruned, collapsed — and the dropped are counted in the header, per thread and per community, so nobody mistakes what was not coded for what was not said.

Coordinates are pure Dewey: the submission is 0, its replies 1, 2, …, theirs 1.1, 1.2, …, to any depth. Depth is the segment count and siblings share every segment but the last. A draft scheme that made the top level 1.0, 2.0 and hung 1.1 beneath 1.0 was rejected: it makes [1.1] a child in one place and a sibling in another, and the worked example circulated with it did not match what its own code produced — the demo output was written by hand, not run. This one is tested; --demo prints the tree, the counts and an index lookup.

A limit is written into both contracts. A reply is a reply. The tree shows that one turn was posted after another and how long after; it does not show that the first caused the second. No relation may rest on adjacency alone, and latency is elapsed time between two posts, not the speed of a decision. The forest was proposed as proof of causal direction, and it is not that.

2a. Additions of 2026-09-05

lexicon.md travels between coders with timeline.md, both facts and neither a reading, so the room's own words reach every slice. The forest carries the record's metadata on each node beside retrieved_on, with stickied marked as a retrieval-time snapshot, and a removed state for platform removal notices, which are the platform speaking and not a participant. tools/audit_fleet.py is the gate the case-lead contract names before step 4; it reports a check that could not run as failed, never as passed.

3. Unchanged

Method, register, the citation rule, the five steps, the brief writer, and every output of v28. Small rooms run as they did, now with a forest.

2026-09-05, afternoon: audited, made runnable, tested on r/liverpoolfc

Two auditors read the v29 files against the v28 harness before any run. Their finding, in one line: v29 as shipped could not be run, in either branch. newrun.py dispatched v28's contract and none of the v29 files; the harness carried three version strings; nothing cut a slice, nothing consolidated a fleet, emit could not theme a pooled code, the forest command was fed a file of dispositions and rendered blank labels, audit_fleet.py failed every correct run on one check and passed vacuously on three, and the two role contracts named files nobody creates.

What changed:

2026-09-05, evening: the two runs, and what they found in the instrument

Fingerprint e6a5732e7e854df9 for both runs; every coder and both leads on claude-sonnet-5.

r/liverpoolfc, branch B, 33 slices, stopped after batch 07 (50_coding_runs/run_v29_liverpoolfc_partial/). Seven coders, 12 to 26 minutes each, contexts of 202k to 296k tokens, 74 codes in all (3, 1, 0, 54, 16, 0, 0); batch 06 read the 2,030-item derby thread whole and recorded it out of scope. Every batch's read claims hold against what read.py served. Stopped for time, not for a defect: thirty-three serial coders is nine hours. The lead holds its journal at batch 07; the run resumes from dispatch --batch 08. Three Fable coders ran slices 01 to 03 before the model was corrected (_lfc_v29_fable_partial/): Fable minted 49 codes on slice 01 where Sonnet minted 3. Examined 2026-09-06: all 49 sit in 62dd8q, the derby pre-match thread, and are line-ups, alarms and pub talk, coded against scope; Sonnet's 3 there are the sub's restyle, coded as the contract asks. The gap is a Fable scope failure, not a reading.

r/muse, branch B, 2 slices, complete (50_coding_runs/run_v29_muse/). 442 items, 62 threads; coders of 38 and 30 minutes, 176 and 173 codes; the lead consolidated, built the forest, passed audit_fleet (349 codes at their offsets, 349 on nodes, both slices disposed exactly), grouped 21 themes, ran a 32-query counter-reading and closed full. close_run 7 of 7 for the lead and both coders. Against the v27 single reader of the same cut: 34 coded threads to v27's 36, 286 coded items to 306, every fleet-coded thread and item inside the v27 set; the two threads only v27 coded are the sub's own April Fools jokes, which the batch 01 coder ruled out of scope citing the Setting section; the section says to code such talk as conduct not about r/place, so this is a coder's misreading and the wording wants tightening. Ninety-six minutes end to end.

Defects found, not fixed, so that the fingerprint above is the instrument that ran:

v29 to v30 (2026-09-06)

Cut for the run yard, after the r/muse pilot and the seven liverpoolfc batches. Every file renamed from .v29. to .v30.; every label v29 in the tools now reads v30; the fingerprint moves. What changed in substance:

After the audit (2026-09-06, evening)

Four auditors read the contracts against Gioia, Corley and Hamilton (2013), Eisenhardt (1989) and Langley (1999), and the tools against the contracts (a Sonnet and a Fable each; the reports are in Layer A/10_instrument/v30/audit_20260906/). What changed, and why:

Fingerprint after the audit: 17ae5d4fb7912406.

J's three answers (2026-09-06, later): the room's own April Fools joke is in scope as conduct, §5 now says so beside §2, with the note on every such code mandatory. A score is a number taken at retrieval; it may be reported beside an item and is never coded as something these people did (§2). And instead of defining an episode, the thread tree is coded: every code is a cited chunk of an item (a sentence or a paragraph, cited whole), and the forest now shows each coded item as its chunks in text order, [c0012 na c0015], with na for a stretch of forty characters or more that no code covers; the index carries the sequence and each item's coverage, the header the count of na stretches and the mean coverage. §6 says a passage is cited whole and that an uncoded stretch is a visible choice; §8 says an episode is a stretch of the coded threads bounded by item ids and resting on the codes in the forest; the lead's §4 describes the sequence line. Fingerprint: 6560df4fd13c1618.

Not changed by the audit: the citation rule, the append-only journal, the counter-reading procedure, Rule 6, "a reply is a reply", the pointer schema, the forest, the slice rule, the seeded timeline, the ledger. Open, J's to decide: the community's own April Fools joke against §5's scope test; whether a score may be coded as conduct; whether an episode is defined.

The brief stage and the tools aligned (2026-09-06, night)

J asked for the equivalent of the yard for briefs and for the tools of the brief writer, the coder and the aggregator to be defined the same way unless there is a reason. Every room already carried the brief stage; what it lacked was the scheduler's side. Added: verify_room --brief (F1 to F6: the brief over 300 words unless harness-written, the nine headings, a read log opening with header and a note on the days touched, every quoted string of twenty characters or more verbatim in the pre-week record against the item id written beside it or anywhere, one in ten tolerated and listed; the transcript; the manifest's hashes), room.py check --brief, the stages brief to write and brief built, writer to run with their next steps, the scheduler contract's brief cycle and F rows, simbrief.py and selftest_brief.py.

The tools: TOOLS-SPEC.md says what the reading, citing and searching tools do the same way and what differs with reason. read_brief.py now logs to out/_read.jsonl with read.py's record shape (a thread read carries thread_id), has the item verb, no --out (READ_LOG_DIR), the same state keys, and prints ReadError: like read.py. cite.find returns a FindResult with truncated, limit, scanned, not_scanned, as the aggregator's does, and logs kind: find, tool, items_scanned, items_not_scanned. The aggregator's cite_case.py and mem.py are left as v36 built them, with their differences listed in the spec for v37. The brief writer's contract, read_brief.py and newbrief.py are in the fingerprint now. Fingerprint: 1d758e5427e622df.