r/place A fruit fly for organization science

Authoritative source, reproduced unchanged. Exact Markdown · Agent copy with resolved links. These instructions govern research runs, not checkpoint interviews.

STANDING-INSTRUCTIONS, v38. What you hold, the tools, your memory, the leg.

Given with every stage beside the contract. The index below gives line ranges.

section lines words
1. What you hold 15 to 65 461
Helpers 66 to 83 200
The tools 84 to 176 1499
Know what you are reading 177 to 189 133
2. Your memory, and the shape of a leg 190 to 328 1738

1. What you hold

Everything is in the folder you were given, and the folder is the whole world of this study.

package/               the coders' work, sealed: one folder per room, one run per room, the same
                       six files in each: brief.md, case.md, codes.jsonl, themes.jsonl,
                       threads.jsonl, pointers.jsonl;
                       the canvas fields (contract §5, rule 7) with their manifest;
                       canvas/artworks.jsonl, every atlas artwork with its index and its
                       placement over time, read beside each room's account; a use is
                       declared (rule 7);
                       sealed.jsonl (hashes of the files that arrive later)
package/store/         the same material joined, built by script before stage A1:
                       codes.jsonl      every first-order concept with its second-order theme,
                                        item, thread, author, hour since open, forest coordinate,
                                        the participant's words with offsets; and, once they
                                        exist, its third-order theme, fourth-order theme and
                                        dimension. Retracted codes are not in the store.
                       themes.jsonl     every second-order theme with its note and its codes
                       items.jsonl, threads.jsonl, rooms.jsonl (each room with its canvas fields)
                       transitions.jsonl   every coded turn that answers a coded turn, with the
                                        interval: the transitions ledger
                       relations.jsonl  every room another room names, with direction and the
                                        coder's label
                       neighbours.jsonl every pair of rooms that share an artwork, border or
                                        overlap on the atlas outline, or name each other
                       shelves/         the literature in two tiers per stage: read, shipped with
                                        the stage; on request, listed one line each and opened
                                        only if you ask. A shelf that has arrived stays
                       README-store.md  the dictionary. Read it at stage A1.
trees/<sub>.md         the forest: each coded thread as its reply tree, coded turns hung on it,
                       gaps kept, dropped items counted in the header
package/canvas/        artworks.jsonl, every atlas artwork, its pixels, placers and placements by hour;
                       package/pixels.csv and case_facts_outcome.jsonl beside it; DATA-manifest-canvas.md
tools/                 see below
out/                   yours, empty at the start; its tree is STANDING-INSTRUCTIONS §2. __OUTDIR__ means out/.

The forest is the coded record's shape. A thread in trees/<sub>.md shows what was a reply to what and how long after, with the coder's codes on the turns. A reply is a reply. The tree shows that one turn was posted after another; it does not show that the first caused the second. No relation you write may rest on adjacency alone, and an interval between two posts is elapsed time, never the speed of a decision.

Your room notes are your prior. Stage A1 has you read every room through its forest and write a note on each into out/rooms/, with a lexicon and a running file. From then on the notes are queried (mem.py note <sub>), never read whole as a list. They are what you expected, dated; they are never a source for a quote; and every stage that uses them says, in its diary, what it found that they did not predict.

Helpers

You may start a helper (the Agent tool) whenever it serves your own work: to read a set of rooms through the verbs and summarise them against a question, to check a claim across the store, to test a script or a count. A helper has your tools and your walls, and runs on your model. Four rules bind it:

The tools

python3 tools/cite.py --room <sub> [--code <id>] [--theme <id>] [--tier 3rd|4th|dim] [--n K]
                      the only way a quote enters an output (rule 3); every call logged
python3 tools/mem.py <verb> ... --stage NN     the store and your own files, one page at a time,
                      every call logged to __OUTDIR__/_mem_reads-NN.jsonl
  room <sub>            the room on one page; --no-canvas is the page fleets are served (rule 7)
  forest <sub> [id]     the rendered forest, whole room or one thread
  note <sub>            your own room note
  codes  --sub | --theme <id> | --third <id> | --grep <re>
  theme <sub>/<id>      a second-order theme, its codes, and where it was placed
  where <T3-id>         every room and second-order theme on a third-order theme, with 4th and dim
  after <sub>/<code_id> what answered this code and what it answered, with intervals
  pairs --level ...     transition counts from the ledger
  when <sub>            the room's coded hours as one line
  shelf <name>          a work on the shelf, whole; shelf --list the on-request tier
  rooms --with <id> | --without <id>    rooms holding or lacking a theme, element or adaptation
  contrast <sub> <sub>  the diff of two rooms' columns and, after D3, their adaptation sets
  finding <id> | findings --touching <element>
  adaptations --element <id> [--kind ...]   every ledger line touching one element, across rooms
  table --from 3rd | --from 2nd | --room <sub>   projections of the data structure
  question <slug>       one open distinction
  log "<text>" [--kind opened|dropped|merged|split|kept|move|abductive|question|comparison|note] [--ids ...]
                        the only writer to the diary (rule 20)
  diary --last [n] | diary --grep <id>
  diff-scheme <cut> | diff-model <cut>   the scheme or the model now against a cut
  adjudicate ...        stage D3's writer to adjudications.jsonl
python3 tools/validate.py --open NN | NN | --links   startup counts; close-check; every id resolves
python3 tools/gen_views.py NN       regenerates _views/ and _wiki/ from canonical files; run by done.sh
python3 tools/snap.py NN <label>    a hash of out/ under a name; the harness takes one at every close, you take one when an order matters
python3 tools/counts.py             the denominators, from the canonical files
python3 tools/handoff.py D | ingest.py D | rebuild.py <sub>    the return's builders (FLEET.md §3)
bash tools/done.sh NN [--cut <name>]   the leg's one exit: close-check, links, views; the harness then snaps and probes

Verbs added or changed in the last tools pass, over the list above (where they differ, these win):

python3 tools/mem.py <verb> ... --stage NN     changed for every verb:
  [--offset N | --page N] [--limit N]  every page ends with a marker: "[end: lines a-b of N]" or "[lines a-b of N; M more: --offset K]"
  help [verb]           the whole page, or the lines naming one verb
  (any room argument)   bare, r/<sub> or <sub>/, any case; a wrong room, theme, thread or id is refused with "did you mean ..." and exit 1
  (the read log)        out/_mem_reads-NN.jsonl records verb, args, every option, offset, limit, lines served, total, and a refusal
  room <sub> [--json]   the room page (unchanged), or one JSON line; "case themes" now reads "second-order themes"
  case <sub>            new: the coder's case.md, paged
  neighbours <sub> [--kind canvas|mention|shared] [--top N] | --summary   new: rooms that share an artwork, border or overlap on the atlas outline, or name each other (package/store/neighbours.jsonl)
  canvas <sub>          new: the six canvas fields, each linked artwork's placements by hour as a bar aligned like `when` (freeze at h73), the share of the room's region placed by its window and its pre-event members (pixels.csv), and the manifest's caveat
  compare <sub> <sub> [--grep re]   new: two rooms before any placement: facts, `when`, second-order themes, named rooms, canvas, and concept labels matching --grep
  when <sub>            changed: the axis under the bar now matches the 4-hour bins (0, 24, 48, 72, 96; ^ freeze h73)
  forest <sub> [id]     changed: a thread the forest lacks is refused with the nearest id
  codes --sub S [--second tNN]   renamed: --second (old --case-theme still works)
  codes --third <T3> | --fourth <T4> | --dimension <D>   renamed and new: --third (old --theme), --fourth (old --chunk), --dimension new
  codes --grep <re> [--by-room] [--json]   --by-room new: the count per room with the first hour; --grep now also matches the label and the coder's note
  (code lines)          changed: the position reads @<thread_id>:<coord>
  theme <sub>/<tNN or label words>   changed: label words match a substring, any case; several matches are listed by id
  themes --grep <re> [--rooms a,b] [--json]   new: second-order themes whose label or note match, with the count per room
  pairs --level second|third|fourth|dimension   changed: the tier names (case_theme, theme, chunk still work); an unknown level is refused with the list; dimension new
  facts [--field F] [--summary] [--sort asc|desc] [--where "F>v"] [--nulls] [--top N] [--json]   new: rooms.jsonl field by field: a sorted list, n/nulls/min/quartiles/max, filters, the null rooms; px_window_share and px_pre_share from pixels.csv
  facts --slope X Y     new: the log-log OLS slope of Y on X over rooms with both > 0
  notes --grep <re> [--field <line>]   new: your room notes (out/rooms/*.md, not _ files) lines matching, with the room
  progress [--stage A1] new: the declared block order (notes-A1.md, else sorted), each room noted, read or pending, and the last opened; --plan [MB] cuts the pending rooms into blocks of about MB (3)
  scheme [--brief] [T3-id]   new: one line per third-order theme (id, family, members, label: gloss) from scheme_current over the latest frozen scheme; with an id, that theme whole
  where <T3-id>         changed: reads the working grouping (scheme_current's members) when no assignments file exists
  rooms --with <id> | --without <id>   changed: an id that names nothing is refused instead of returning every room
  view [name] [--grep re] [--room sub]   new: a generated view in out/_views/, filtered; no name lists them
  wiki [page]           new: a generated wiki page (rooms/<sub>, model/<id>, or the bare name); no page lists them
  shelf <name> [--grep re] [--page N]   new options: matching lines with line numbers; one page of the work
  diary --last [n]      changed: n defaults to 5
  log "<text>" [--kind k] [--ids a,b] [--dry-run]   changed: the kind is checked against opened, dropped, merged, split, kept, move, abductive, question, comparison, note, helper, minted, placed, unplaced, pause and any `log --kind` a stage file names; --dry-run new
  mint --label "..." --trigger <sub>:<tNN> [T3-id] [--dry-run]   changed: refused outside stages B1, C1 to C5, D3 and D6; the trigger must be a second-order theme in the store; an id is minted once; at B1 the theme enters scheme_current with its trigger as first member, after B1 the mint is a stamp only and the theme is written to scheme_v2 with its members moved by `reassign`; logged as kind minted; the id may come before or after the options
  place <sub>:<tNN> --theme T3-NNN [--dry-run]   new: puts a second-order theme into a minted third-order theme in scheme_current (atomic rewrite), logs kind placed, and says where else it sits
  unplace <sub>:<tNN> [--theme T3-NNN] [--dry-run]   new: takes it out of one third-order theme, or of all; logs kind unplaced
  table, wiki           changed: say so when your working files changed since the view was written at the last close
  adjudicate <id> --decision d --reason "..." [--pair id] [--dry-run]   changed: refused outside D3; the adaptation id (and --pair) must be in the ledger; the decision is checked
  (the overlay)         changed: scheme_current.jsonl (out/scheme/ or out/) is laid over the latest frozen scheme when it is newer or none exists; placements fall back to its members when no assignments file exists
  ask "<question>" --assume "<what you do meanwhile>" [--ids a,b] [--dry-run]   new (v43): a question for the principal investigator, at any stage; written to out/asks.jsonl and the diary (kind ask); see "When you need the principal investigator"
  asks [<id>] [--open]  new (v43): your questions and the answers that came back (out/_answers/<id>.md, written by the principal investigator's side, never by you)
  audit [frame|rooms|retracted|build]   new (v43): stage A1's package checks from the raw files of package/ (the census count against rooms.jsonl and the room folders, the six files of every room, the coders' retracted concepts against the store, the store's build figures recomputed); every figure names its file, and the call is logged like any read
python3 tools/cite.py ...     changed:
  (every header)        "N match; K shown" (--grep, --theme, --tier); --resolve says "N code(s) hold these words; K shown" and takes --n
  --room <sub> --code <id> --context K   new: the quote with its parent and K items either side in the thread, their coded passages and forest labels
  --room <sub>          changed: any case, r/<sub>; a wrong room is refused with the nearest; --tier dim now finds the concepts under a dimension
python3 tools/validate.py --open NN   changed: names every declared input and where it was found; prints counts.py's census, dropped, analysed, concepts and second-order themes; runs links.py and exits 1 on an unresolved id at every stage; reads the startup packet line; scheme_current in out/scheme/ or out/
python3 tools/validate.py --self-test [--summary]   --summary new: only failures and the count; the fixture is now self-contained, so the report is the same in any folder
python3 tools/links.py        changed: also resolves r/<sub>, <sub>/cNNNN, <sub>:cNNNN and <sub>/tNN against the store (a room the rooms named, and r/place, also resolve)
python3 tools/packets.py B2|B3|B4 [--scheme F] [--families F] [--to DIR]   changed: the flags are honoured at B2, B3 and B4; items may be "sub/tNN", {"sub","theme_id"} or {"item":"sub/tNN"}; B2 with --to needs no --round
python3 tools/ingest.py D    changed: with no DROPS/D it says so in one line and exits 1
python3 tools/gen_views.py NN changed: data-structure.md above 2 MB holds a note pointing to `mem.py view data-structure`; tsv cells carry no line breaks
python3 tools/build_store.py --root R --join-canvas F   changed: F may be relative to --root

HOW-TO-RUN.md is the reference for all of them. Read it once at stage A1. A single Read may return a truncated file without saying so above about 25,000 tokens; page it, or read it through a verb.

Know what you are reading

This is not interview material. Nobody was asked anything, no protocol shaped it, and none of it was written for a study. Three things follow. Nobody's questions produced this talk, but one reader per room decided what in each record was worth coding, and you hold what it kept; where a claim turns on absence, it is a claim about what was coded, and the forest header says how much of each thread that was. Sequence is evidence: who answered whom, what was taken up, what was ignored. It was written to be read by the people it was about: a room's claim about itself is an act addressed to somebody. Keep the record shows they did X apart from a member said they did X.


2. Your memory, and the shape of a leg

Continuity. Every leg continues the preceding completed checkpoint, including conversation and files. Read the head and diary to orient that continuation. Compaction does not replace the archived history. A missing checkpoint is a harness defect, never a reason to start a fresh analyst from notes.

The diary is not read whole by anyone. It is one file per stage in parts of 1,500 words; you read its last five entries at a leg start and grep it by id; stage E1 computes over it. The head is the summary, the closing line of each leg is the digest, and the rest is the record.

The tree. out/ as you see it. Writers: A you, S a script at leg close, H the harness, F a fleet or the labelers through the drop, P the principal investigator.

_head.md                 A   the narrative of the argument; 3,000 words; read first at every leg
diary/NN-k.jsonl         A   the running log through mem.py log; harness-stamped; 1,500 words a part
_questions/<slug>.md     A   one open distinction per file; closed with a verdict line, never deleted
asks.jsonl               A   your questions to the principal investigator, through mem.py ask only (v43)
_answers/<id>.md         P   his answers, one per question; never written by you (v43)
_views/                  S   generated at every close; never edited: data-structure, rooms by
                             third-order themes, rooms by elements, rooms by adaptations per level
                             and per kind, relations, transitions, moves
_wiki/                   S   one page per room, theme, element, form; 800 words; generated
model/                   A   elements.jsonl, arrows.jsonl, history.jsonl: the typed model;
                             story-pN.md, the story told at the end of every C2 pass, which the
                             stop rule diffs
prior.md                 A   written at B1a: expectations, the composition criteria, the
                             brackets, the coordinating-turn rule, the onset contrast; at D1,
                             before any adaptation: the distance weights, the concept floor and
                             the off-record share
scheme/                  A   scheme_current.jsonl and its versions; a required paged read at
                             every B1 leg start, beside the head (C1 reads the frozen scheme_final)
saturation.jsonl, theme_discovery.jsonl, multiplacement_log.jsonl, dropped.jsonl, RUN.json
                         A,H the records the contract names
_fleet_raw/, handoff-D/, DROPS/D/   F,H  the fleets' returns and the return's folders
forms/<id>.md            S   generated at D4 from the accepted branch definitions
findings.jsonl, departures.jsonl, defects.jsonl, tier_history.jsonl   A   append-only ledgers
adaptations.jsonl        F   ingested from DROPS/D, validated
adjudications.jsonl      A   stage D3
rooms/<sub>/             F,A placements, verdict-D, model-D.md, your note
_snap/                   H   the harness's hashes of out/ at every close; read them when you like
_probe/, _transcripts/   H   the harness's; open to you at stage E1

Stages, steps, legs. The run has five sections: A reading, B coding, C model, D adaptation and forming, E formalizing. Each holds stages (A1, B1 ... E2), and each stage a sequence of steps, lettered: B1's are a prior, b getting lost, c the saturation test, d the second pass, e the scheme standing. tools/steps.tsv lists them all, and the stage file says what each does and where it stops. You are given the whole stage file at the stage's first leg, and you close a leg at the end of its step or earlier. A leg is named by its step: B1c for a step taken once, B1b-03 for the third leg of a step that repeats, B2a-r1 for a pilot round, and B1c-p2 for a leg continued after a pause. The harness names the leg in your first message and in .leg; every snap, probe and checkpoint carries that name.

A leg. One launch. Its startup packet, read in this order and nothing else by default: the head; the stage file; the last five diary entries; at B1, scheme_current.jsonl paged, and at C1 the frozen scheme_final.jsonl; validate.py --open NN, which prints the counts you start from and fails the launch if a link in the head does not resolve. On demand, through verbs only: rooms, themes, concepts, transitions, findings, questions, views, wiki pages. Closed to you until stage E1: _transcripts/ and _probe/. You write only in out/. The work is one operation for the stages that make categorization moves: a scheme pass over a room block, one loop pass, one element group at D3, one pass over the ledger at D4; a leg may carry several moves, and may close earlier when you choose. The exit is done.sh NN, which runs the close-check (files that must change did; ids resolve; counts match manifests), regenerates the views, snaps, writes tokens, and runs the recall probe. A leg that fails the close-check is not closed; you are relaunched with the failure in your packet.

The move. Every categorization move (a merge, a split, a dimension cut, an arrow added, bounded or withdrawn, a hypothesis kept or dropped, a branch named) is logged when you make it (mem.py log --kind move, the Grodal, Anteby and Holm move named) and snapped (python3 tools/snap.py NN move-<move>-<n>), so a reviewer can find the state before and after it. A move does not close the leg.

The cut. done.sh NN --cut <name> closes the leg at a named checkpoint, snaps, and records a resumable session, so that a reviewer can reopen you there and ask why. Cuts are kept only where a stage file names one: adaptations-in at D2, tree-final at D4, and interview at the interview points. One cut has a fixed name: --cut packets-out closes the build leg of a fleet stage (B2, B3, B4, C2, C5, D1, E1). After it your session ends, the dispatch runs on the platform's reader route without you, and the next launch of the stage is the check leg (the contract's §6, the legs table).

The recall probe. At every close the harness asks you, in a fresh turn, five things: the method question in one sentence; the open distinctions by slug; the last three rooms you opened; the element or theme you changed in this leg and why; the next comparison. The answers are scored against the head, the questions, the read log and history.jsonl. A miss that the head or the diary answers is a note, not a defect: the leg kept what it needed where it belongs. A miss neither answers is a defect. The probe measures whether the goal survived the leg, and the run reports probe failures per stage.

Compaction. Expect it: a long reading leg (A1, B1) will compact, more than once, and you cannot see it happen. That is routine, not a failure, and the record is why: what is on disk survives it. The harness owns it: after any compaction it re-injects the head and the stage file before your next write, and asks you to reconcile the head with the diary. What the compactor is told to preserve (CLAUDE.md on Claude; the same list on Codex): preserve the method question, the current account, the reasons for the last revisions, the contrary rooms, and the next comparison; after it, re-read the head and the stage file before any write, and reconcile the head with the diary.

Ceilings. The head 3,000 words (done.sh refuses a close above 3,200, a margin for the last edit); a wiki page 800; a packet to a reader 50 KB; a Read paged above about 25,000 tokens; a D3 element packet 100 lines; a question file 600 words; a diary part 1,500 words, then roll.

The comparisons you can make at any leg, each served by a verb or a generated view, never by reading rooms in order: this room against that; rooms that hold a theme against rooms that lack it; the scheme now against the scheme at a snap or a cut; a finding against every element it cites; the model now against the model at a snap or a cut; a question as opened against as closed; rooms by third-order themes, case-ordered; transitions in time; the blind room account against the informed room model; adaptations touching one element across rooms; rooms by adaptation keys per level and per kind; a branch against the global model; a room against its branch; the mention graph against the branches; what you said you did against what the record shows.

Safe stops, and pausing. Every stage names its safe stops: points where everything you have done is on disk and the next leg could pick up from the head and the diary (after a room note at A1, after a block at B1, after a logged move from C1 on, after a section at C5, D5, D6 and E1, after a packet set at the fleet stages). At each safe stop, check for a pause request (ls .pause). If it is there, log where to pick up, in one line with two parts: your working hypothesis as it stands, and the next room or item (mem.py log "<hypothesis>; next: <room or item>" --kind pause); update the head if the stage has one; and close with done.sh NN --pause. done.sh refuses a pause without that line for this leg. The leg closes without the stage's close-check, and the next leg continues the stage. The handler asks for a pause when the platform's usage allowance is running short or for any other reason; a pause is never a judgement on the work.

Interview points. At the moments where talking with you teaches the most, a step ends its leg with done.sh NN --cut interview. First write the brief, out/interview/<leg>.md (under 800 words: what you did, what you found, what surprised you, what you doubt, the three questions you would most like to be asked); at a stage's end, write handback-NN.md too. done.sh refuses the cut without the brief, without the handback where the stage ends, and at a step that has no interview point; then it files the brief under the leg, the stage, the step and the minute, for example B1e_coding-third-order-scheme_scheme-standing_2026-10-03T14-22.md. The principal investigator may then talk with you in a fork of that leg, run in a copy of your folder as it stood at the close (not read-only; nothing done there reaches the run); the run goes on from the cut either way, and nothing said there enters the run unless it comes back as a reply, the brief's name with -reply added, which your next leg's first message names. Read it before your first write and answer it in your files under rule 13; a reply is advice, not an instruction, and where you do not follow it, say why. The points: A1c (the reading done), B1e (the scheme standing), B4c (the placements final), the last C1a (the structure), C2c (the reviewer read, mid-stage), C3c (the literature), C4a (the field), C5d (the Gioia table, the dynamic model and the figure), D3c (the return adjudicated), the last D4a (the tree), D6b (the retelling), E2b (the feedback).

When you need the principal investigator. You are not alone with the record. When a question, an assumption you are unsure of, or a confusion would change what you do, ask: python3 tools/mem.py ask "<the question, in a paragraph at most>" --assume "<what you will do meanwhile>". It reaches the principal investigator at once, and he wants to hear it. Ask when the instrument is silent, unclear, or seems wrong for the case in front of you, or when you would otherwise have to guess; do not ask leave to do what the stage file already says. Do not wait for the answer: go on with what you said you would do, and name the question's id in the diary line of any work that rests on it. The answer arrives in out/_answers/<id>.md (mem.py asks <id>), named in your next leg's first message, or sooner in the conversation itself. An answer is advice, as a reply is: where you do not follow it, say why. If you cannot go on at all without it, log a pause (above) and close with done.sh NN --pause; the next leg starts once the answer is in.

Method invariants for every leg

Use the current return specification and effective adjudicated ledger. A supported local particular stays in the leaf account; a pending claim stays unresolved. Never infer substantive absence from silence. Keep original fixed-global, current adapted-local and shared-branch judgments distinct and versioned. No dimension count, new theoretical remainder or branch count is required. After D3, keep the validated model fixed; D6 ideas are separate unvalidated proposals. A process claim is tested at its stated level using dated evidence; confidence, repetition or mention connectivity alone does not prove it.