r/place A fruit fly for organization science

out/notes-B3.md

Saved at B3.B3b: check. This reading copy substitutes participant identifiers in saved text; it is not a new interview response. Reading Markdown.

Participant handles in these reading copies use the pixel stream's identifiers: base64(SHA1(username)), case preserved, without a salt. These are linkable pseudonyms. Profile links are removed; missing-author markers remain. Original research files are unchanged. Quote offsets refer to original text. Source and reading-copy hashes are listed separately.

Source commit: 25b2a8e4a123, 2026-10-12T23:18:58+02:00. Saved-state date: 2026-10-12T21:18:42Z. Catalogue close receipt Commit date and saved-state date are distinct.

Original GitHub file. Original SHA-256: 6ae146f8e22f2774b37bb29d017d220fdaebbe22f7334a8e4482cc373fb7b9de. Reading-copy SHA-256: 6ae146f8e22f2774b37bb29d017d220fdaebbe22f7334a8e4482cc373fb7b9de.

Notes, stage B3

Leg B3a, the build, 2026-10-12

Declarations, made before any packet exists

The allocator is out/_analysis/b3_allocate.py. Its dry run gave the counts below; the batches are written after these declarations.

The unit and the frame. Every second-order theme of the analysed set: 705 rooms (the census; none dropped) and 7,844 second-order themes, which is counts.py's assignment_items_expected.

R = 2. Each room is read by two readers, one per replicate, never the same reader. Two readers make a disagreement visible, and stage B4 rules on it. A third reader would cost half the fleet again to turn a disagreement into a vote, and rule 13 says a vote is not a warrant. A higher R would have bought a per-item majority and an estimate of each item's reliability; it would not have bought a better placement, and stability was measured once, in the pilot (stability-B2.md, 0.807).

The seed. 20261015. The connectivity gate forced 7 redraws; the allocation stands under the suffix 20261015:redraw7, from which it is reproducible.

The item cap per batch: 40, from notes-B2.md. Every packet file must stay under FLEET.md's 50 KB ceiling, which the B3 check asserts. So the allocator packs whole rooms to 40 items and 44,000 bytes of rendered text (the items in fleet ids and the rooms' sibling blocks), leaving room under the ceiling for the batch's header, its gold copies and its duplicate.

A room that leaves less than 6,000 bytes or 4 items under those limits is large: it opens a batch of its own, which takes at least one more room so that it is no island in the room-batch graph, and is served in parts to one reader in one conversation (stage B3 section 1.2). Such a batch holds up to 40 items and 160,000 bytes, or the large room's own size and 12,000 bytes more. Two rooms hold more than 40 items; each takes at most 3 more items beside it, so its batch may exceed the cap by that much (54 positions at most, with its copies). B2's pilot rounds served packets of up to 135,742 bytes of item text to one reader without fault; 160,000 bytes in parts keeps a reader's conversation near that.

Batches: one-file batches hold a median of 27 positions. 332 of the 624 batches are served in parts.

The cost, for the token record (no stage carries a budget, contract section 4). B2's gold round cost 0.026 USD a reader for 14 items, about 32,000 input tokens (the index and the families opened, about 28,000) and 25,000 output tokens. Here: about 40 MB of item text over the whole fleet (about 11 million input tokens) and 624 readers' shared pages (about 17 million), with about 1,800 output tokens a position for 17,089 positions and the second pass (about 31 million or more). By B2's gold round's prices the fleet costs about 30 to 40 USD.

The warm-up block: in reserve. Stage B3 section 1.2 uses a warm-up only if stage B2 found a convention still forming inside a round, its readers improving from first items to last. B2 found the opposite: agreement with the other two readers fell from the first half of a packet to the last in 9 of 12 readers at round 2 and 9 of 15 at round 3, on packets too short (7 to 15 items) for a first-ten against last-ten curve. notes-B2.md had declared a 10-item warm-up at B2a-r1; this declaration replaces it, and the position curve of the check leg decides whether it is needed (QB3-001).

The gold seeding rate: one gold copy per 20 items, as notes-B2.md declared, at most two per batch. In each batch the expected number is its item count over 20; the whole part is seeded and the fraction seeded by a seeded draw. 777 gold copies are seeded; each of the 40 gold items is seeded 19 or 20 times, drawn round-robin from a seeded order.

The gold policy (stage B3 section 1.6).

The duplicate. One item per batch, an item of the batch's own, presented twice at positions at least a quarter of the batch apart, tagged in duplicate_items.

The batch count and the reader count, computed by the allocator from its own packing: 624 batches, 624 readers (one reader per batch), 17,089 positions in all (15,688 readings at items × R, 624 duplicates, 777 gold copies).

The exemplar arm: none. No exemplar is served to any reader, as in B2, so that B3's figures compare with B2's within one arm (the description alone). The return line carries exemplar_read: null.

The order of batches. A seeded shuffle of the 624 batch ids (out/_analysis/b3_dispatch_order.json), dispatched in two groups: the first 60 batches, then the other 564. The gold fidelity check of stage B3 section 3.2 runs after group 1 and decides whether group 2 is sent.

The reissue policy (fleet.py, stage B3 section 2): a batch that comes back missing, truncated, malformed or short of its item count goes whole to a fresh reader id holding none of its rooms, up to twice, recorded as reissue 1 or 2 with the original reader id. When reissues are exhausted on a batch, the dispatch stops and reports, and the build leg rebuilds those packets.

The bag flags. The ten biggest bags of notes-B1.md: 2007scape t04, theblackvoid t12, ainbowroad t04, t03 and t07, sweden t01, leagueoflegends t02, theblackvoid t09, ainbowroad t11 and dota2 t05. Each is marked in its packet, on the item, with the instruction unchanged: place from the concepts, not from the coder's grouping. batches-B3.jsonl lists them in bag_flags.

Fleet ids (J). Every packet carries only fleet ids for concepts and second-order themes, in headings, concept lines and sibling blocks alike, and each MANIFEST entry carries codes_by_item for fleet.py's citation check. Returns are translated back to room ids before scoring.

What rests on QB3-001 (asked 2026-10-12). The 50 KB file ceiling with parts for large rooms; leagueoflegends t02 (89 KB alone) split across two consecutive parts of one reader, one item and one line; gold copies listed in items; the multiplacement records riding on the item line and the second pass in lines carrying revises; the warm-up in reserve and no exemplars.

The build

The allocation (out/_analysis/b3_allocate.py --seed 20261015, written to batches-B3.jsonl).

The next table lists the counts.

figure value
batches (one reader each) 624 (replicate 1: 310, replicate 2: 314)
batches served in parts 313
packet files 1,080, every one under 50 KB (largest 50,878 bytes)
positions 17,089 (15,688 readings, 624 duplicates, 777 gold copies)
gold copies per gold item 19 or 20
items per batch 13 to 54, median 27

The packets (out/_analysis/b3_packets_fleet.py, in out/_packets-B3/).

One coder note held a room id. nyjets t11's theme_note says "Code c0104 remains instead with...". The packet serves that code as its fleet id; the note's words are unchanged. No other label or note in the store holds a room id.

Strings shaped like room ids. Two packets (B059, B449) carry "t34" and "t90" in a warthunder participant's words. These are tank names (the T-34 and the T-90) and no id of any room in those packets; warthunder's themes run t01 to t15. Participants' words are never altered (QB3-002, point c).

Items longer than a part. Five placements run over two consecutive parts of one reader. leagueoflegends t02 (89 KB) is in B282 and B463. ainbowroad t11 (48 KB) is in B157, and twice in B523, as that batch's duplicate. The heading repeats with "(continued)", and the item's line is due after the part it ends in, so some parts are due 0 lines, B282-p2 for one (QB3-001, point 2; QB3-002, point d).

The return specification. RETURN-B3.md sets the order: rule 0 in the contract's words; the prediction line; the return line, with bag and with also_present under J's two rulings, word for word; the multiplacement record on the line; the second pass, one line per position carrying revises; the end marker and the confirmation.

The manifest. run_manifest.json has a B3 entry, 10 entries in all. It records the readers (deepseek/deepseek-v4.1-flash, direct, medium effort, max_tokens 128,000), the seed and its suffix, R, 624 agents, the counts, the groups (60 and 564), the frozen scheme's sha256 and RETURN-B3.md's.

The close-check, B3a

validate.py B3 reported:

stage B3:
  batches 624, R 2, rooms 705, graph one component
  leg: build (0 dispatch folders with DONE)

ERROR  batches-B3.jsonl B001 lists item polska/t10 from a room not in its rooms; a batch holds whole rooms  [777 lines with this shape; first: B001]
ERROR  batches-B3.jsonl B157 holds room ainbowroad without 20 of its second-order themes (['t14', 't15', 't16']); no room is ever split  [10 lines with this shape; first: B157]
ERROR  batches-B3.jsonl: replicate 1 lacks 56 of the 7900 items assignment_items_expected counts (['2007scape/t15', '2007scape/t16', '2007scape/t17'])
ERROR  batches-B3.jsonl: replicate 2 lacks 56 of the 7900 items assignment_items_expected counts (['2007scape/t15', '2007scape/t16', '2007scape/t17'])

789 errors (4 distinct shapes), 0 warnings

What the errors are.

None of these is a fault in the batches. The leg stays open until the handler answers QB3-001 and QB3-002. Nothing is rebuilt meanwhile.

Declarations revised under J's ruling (QB3-001, QB3-002; 16:37 Berlin), before the new packets

J's ruling.

What changed in the build.

The item cap: 15 positions a batch (corpus items, gold copies and the duplicate's second copy) and 180,000 bytes of item text (J). The allocator (out/_analysis/b3_allocate2.py) works as follows:

The allocation (seed 20261015, under the suffix 20261015:redraw2: the connectivity gate forced 2 redraws).

The gold positions. Each gold item is seeded 18 or 19 times, more often than a batch has positions, so no rule can keep every reader of a gold item on a different position. Each copy instead takes a position at which its gold item has been seeded least often so far, which spreads each gold item over the positions.

The duplicate. One item a batch, from its own corpus items, presented twice. The two copies sit at least a third of the batch apart, or as far apart as a small batch allows.

The rooms on a packet. A batch's rooms are the sibling blocks its packet carries: the rooms of its corpus items, and the rooms of its gold copies, so that a gold copy looks like any other item.

The order of batches. A seeded shuffle of the 1,210 batch ids (out/_analysis/b3_dispatch_order.json), in two groups: the first 100 batches, then the other 1,110. The gold check of stage B3 section 3.2 runs between them.

The cost. 1,210 readers, each reading the index and the families it opens (about 28,000 input tokens, as at B2's gold round), about 34 million input tokens. The item text over the whole fleet is about 11 million more. Output runs about 1,800 tokens a position for 17,653 positions, about 32 million, and more for the second pass. By B2's gold round's prices the fleet costs about 40 to 55 USD.

The rebuild in B2's packet shape

The close-check, B3a

validate.py B3 reported:

stage B3:
  batches 1210, R 2, rooms 705, items 7844, graph one component
  leg: build (0 dispatch folders with DONE)


0 errors (0 distinct shapes), 0 warnings

The leg closes with done.sh B3 --cut packets-out. J runs the dispatch in two groups, the first 100 batches and then the other 1,110, with the gold check of section 3.2 between them.

Leg B3a-p2: the gold check after group 1

J dispatched group 1 (the first 100 batches of b3_dispatch_order.json) at 15:17Z. It ended at 15:32Z: 100 valid returns, 0 exhausted, 4 replies reissued (3 cited a concept outside the item, 1 line not JSON). The record is out/_fleet_raw/B3/PARTIAL-2026-10-12T153202Z.json. No DONE exists, since group 2 has not gone out. This leg is a continuation of the build leg (the PI, 15:51Z): it runs the gold check and closes at --cut packets-out.

The stop rule, declared before any gold figure is computed. The build leg declared no number for "a fall beyond the stability floor". I fix it here.

What group 1 returned (out/_analysis/b3_gold_group1.py; per copy in b3_gold_group1.tsv, figures in b3_gold_group1.json).

The next table compares group 1's gold copies with B2's nine frozen-scheme readings of the same items, weighted copy by copy. The fall is B2 minus B3, and the interval resamples batches.

figure B3 group 1 B2, same copies fall 95% interval of the fall
fidelity against gold_items.jsonl 0.637 0.625 -0.011 -0.065 to +0.045
fidelity against the rechecked placements 0.657 0.646 -0.011 -0.065 to +0.045
primary match 0.833 0.812 -0.022 -0.071 to +0.028

Decision: group 2 goes out as built. Group 1 scored slightly above B2 on gold, not below it. The upper end of every interval (+0.045 at most) lies far inside the floor of 0.193. No batch or packet changes, and no question goes to J.

Per copy. 31 of the 72 copies match my set exactly, and 11 score 0. No set is empty. The misses follow the pattern B2 found. Readers drop my second placement, most often T3-063 (9 copies), T3-004 (5) and T3-039 (4). They add T3-033 on 4 copies.

Items whose own fall exceeds the floor. These are one to four copies each, read as cases and not as a figure:

What the figure licenses. The readers share an architecture with me and with each other. So the figure bounds whether the written instrument decides the same way at fleet scale as in the pilot, not whether it is right.

Left to the check leg. fidelity-B3.md (per batch and per reader over both groups), the screen of section 3.1, the position curve and the register. This leg writes none of them. The copy-level table above is their input for group 1.

The close-check, B3a-p2. validate.py B3 reads the leg as a build leg with no DONE, so the PARTIAL record needs no question to J. It reported:

stage B3:
  batches 1210, R 2, rooms 705, items 7844, graph one component
  leg: build (0 dispatch folders with DONE)

0 errors (0 distinct shapes), 0 warnings

The leg closes with done.sh B3 --cut packets-out. Group 2 (1,110 batches) is J's to send.

Leg B3b: the check

What the dispatch left (the PI, 20:02Z). out/_fleet_raw/B3/DONE and four PARTIAL records. Per DONE, 1,204 of 1,210 packets were valid on the main run, at 32.78 USD. Every packet now has a valid return except B0192 and B0927, which failed six tries each (EXHAUSTED.tsv). Under J's ruling (21:39 Berlin), the handler rebuilt those two in halves with tools/packets.py (out/batches-B3-split.jsonl, out/_packets-B3-split/). All four halves came back valid on the first try. B0019a and B0019b are unused spares, since B0019 passed on retry.

The split put into the fleet's record

J's ruling 2 for this leg: the record must show the batches as served, never deleting. out/_analysis/b3_split_merge.py did this:

A fault in the halves (QB3-003). tools/packets.py writes room ids. The four halves were served with room ids in their headings and lines (t01, c0009) and with no codes_by_item. So their 30 positions reached readers against J's fleet-id ruling, and fleet.py could not check their concepts. A hand check (out/_analysis/b3_halves_support.py) found no harm: all 289 concepts these lines cite belong to their own items, and every typed id matches its cell. But tools/assemble.py refuses all 30 lines, because "t01" does not resolve in fleet_ids.jsonl, and it writes nothing. J's ruling 1 forbids a hand assembly. So QB3-003 asks J for one of three choices:

The failed replies, read as one set (J's ruling 3)

out/_analysis/b3_failed_review.py reads every *.failed.txt (the dispatch's reason on the first line, then the reply). It classes every concept each reply cites against the item at the line's cell. Figures are in b3_failed_review.json.

86 failed replies over 55 packets (1,298 replies in log.jsonl). The next table counts them by the dispatch's reason.

reason replies
a concept outside the item 71
a line not JSON (cut off mid-line) 6
a partial return: 5 to 15 lines against 14 or 15 due 5
also_present naming a theme with fewer than three concepts 4

The concept failures are concepts of a neighbouring item in the same packet. Of the 71 replies:

The dispatch names only the first bad line, but the failed replies cite 453 off-item concepts in all, and 452 belong to another item of the same packet. The neighbour usually sits close by: 347 of the 453 come from an item one to three positions away.

They sit mostly where a reader names other themes:

So a reader filling also_present reaches into the items around it. The handler's count holds: almost all failures cite a neighbour's concepts.

Six packets failed more than twice: B0192 and B0927 (six each), B0019 (five), B0822 (four), B0880 and B1194 (three each). B0192 and B0927 both hold r/MMA's eight items, whose concepts readers carried from one item to the next.

The accepted replies hold no concepts from neighbouring items. I screened all 1,212 accepted replies: 17,653 pass-1 lines and 17,653 pass-2 lines.

So a neighbouring item's concepts reached no accepted line in any field. The screen cannot see whether a neighbour swayed a reading without being cited.

Declarations for the check, made before any figure is fitted

Where the check stands (QB3-003 and QB3-004 open)

The meanwhile line of QB3-003 does not work as written. It said that, without an answer, I would assemble on option (c) in out/. But the assembler reads out/batches-B3.jsonl, which now holds the halves under J's ruling 2. Leaving them out there would undo that ruling. So out/ holds no assembly yet: no assign_raw.jsonl, no assign_pass2.jsonl and no b3_classes.jsonl. B1's multiplacement_log.jsonl (6,663 lines) still stands, and the real assembly's --supersede will rename it.

The check folder. checks/stage_B3.py reads the last folder named _packets-B3*. The handler's _packets-B3-split/ therefore hid _packets-B3/, and the check reported 1,208 batches "without a packet". I moved _packets-B3-split/ to out/_analysis/packets-B3-split_handler_merged/; its four halves used in the fleet were already in _packets-B3/.

QB3-004. The check refuses 32 accepted returns that carry no prediction line (fleet.py accepted them). I asked J to waive them by name or have them sent again.

Reports from the trial assembly. fidelity-B3.md, position-B3.md, multiplacement_register-B3.md and agent_report-B3.md are rendered by out/_analysis/b3_check.py and b3_reports.py from b3_check_scratch_c.json. Each opens by saying it is a trial. Once J rules, the real assembly runs (tools/assemble.py B3 --supersede --accept-sub-label --families out/families.jsonl), then b3_check.py --from out --tag record --write-defects, then b3_reports.py --tag record --write, which keeps the trial reports under superseded names. defects.jsonl and handback-B3.md wait for that run.

The trial figures (halves left out, 19 items missing a replicate):

J's answers to QB3-003 and QB3-004 (22:30 Berlin)

QB3-004: the 32 returns are waived by name. out/_analysis/b3_waivers_qb3004.py found the accepted returns without a prediction line from the returns themselves. They are exactly the 32 named in the question. It wrote one line for each to return_waivers.jsonl, in the form J gave: stage B3, the file, check "no_prediction", a reason, and "J, 2026-10-12, QB3-004". The file now holds 52 lines. validate.py B3 counts them aloud: "returns without a prediction line waived by J by name: 32". My assumption was a waiver by name, and it stands. The item lines are scored as given, agent_report-B3.md names the 32, and each still goes into defects.jsonl as a reader omission.

QB3-003: (b), the four halves rebuilt in fleet ids and sent again. J ruled that the error was the handler's. out/_analysis/b3_halves_fleet.py rebuilt them under new batch names, so no folder holds two accepted returns. The next table gives the old and new names.

room-id half (superseded) rebuilt in fleet ids agent replicate items item bytes gold copy duplicate
B0192a B0192c a1217 1 9 75,877 mit t01 ucf t12
B0192b B0192d a1218 1 6 12,512 - -
B0927a B0927c a1219 2 9 75,912 - MMA t02
B0927b B0927d a1220 2 6 29,547 lego t13 -

What rested on my assumption for QB3-003. I had assumed (c). Nothing in out/ was assembled on it, because that would have undone J's ruling 2. The four reports remain marked as trial, and they will be replaced. The trial assembly in $TMPDIR is not the record.

Dispatch. J sends the four from out/_packets-B3. The command, built from the handler's words and the PARTIAL records' only field:

python3 tools/fleet.py B3 --only B0192c,B0192d,B0927c,B0927d

After the four returned (J, 20:45Z; B0192c valid on its second try), the check leg ran the steps below. Their results are in the next section.

  1. python3 tools/assemble.py B3 --supersede --accept-sub-label --families out/families.jsonl;
  2. python3 out/_analysis/b3_check.py --from out --tag record --write-defects;
  3. python3 out/_analysis/b3_reports.py --tag record --basis "<the record>" --write;
  4. handback-B3.md, the head, and done.sh B3.

The check of record

The assembly (J's flags):

Figures (b3_check_record.json). They match the trial assembly to the third decimal, and coverage is now complete:

Two faults in my scripts, fixed:

The failed replies, again. There are 87 over 56 packets: the earlier 86, plus B0192c's first try, which cited a neighbour's concept. The accepted replies cite 120,413 concepts in fleet ids, all from their own item.

The justifications. The sample from the record is not the trial's sample. I read its 40 texts too. All 40 name material that one theme leaves out, and the counts in the register are unchanged.

defects.jsonl. 55 stage B3 lines were appended after A1's 8, 63 lines in all:

The close-check (QB3-005). validate.py B3 reports 23 errors on 22 lines, read one by one in out/_analysis/b3_support_defects.py:

On every multi line, each added theme has at least one concept of its own. So none is "the same reading twice", and none meets section 3.1's reduction. I asked J to waive the 22 by name (QB3-005). Meanwhile they are kept as given and listed in defects.jsonl. No waiver is written without J's word.

Written:

QB3-005, answered (J, 23:09 Berlin): the 22 are waived by name and the placements kept as given. out/_analysis/b3_waivers_qb3005.py finds them with the check's own tests and writes one line for each to return_waivers.jsonl, keyed by batch and position as J asked:

The file now holds 74 lines. My assumption was a waiver by name, with the placements kept and the 22 listed in defects.jsonl. It stands, so no figure, report or defect line changes.

The close-check, B3b

validate.py B3 reported:

  returns without a prediction line waived by J by name: 32 (return_waivers.jsonl)
  lines waived by J by name (return_waivers.jsonl): no_multi 4, support_count 8, support_overlap 11
0 errors (0 distinct shapes), 0 warnings

It counts 11 support_overlap against 10 waiver lines because two positions each carry two multiplacement records. The leg closes with done.sh B3.