Read one reply thread
Select one currently qualified exact-root discussion with independent Python and shared Lace rules. No signing key, conversation host, or joinery imports are needed.
Run
With the sibling Lace Python environment prepared, run from the joinery directory:
uv run --project ../lace/python --no-sync python ingredients/thread/thread_reader.py \
/path/to/export/records --definitions /path/to/export/definitions \
--issuer "$ISSUER" --scope work --reader "$READER" --root "$ROOT_HASH"Choose the issuer, scope, public V.…H3 reader, and full
root hash explicitly. A public identifier is not proof of key control or
permission elsewhere. Optional repeated --signer "$AUTHOR"
flags narrow interest within the currently accepted writers; they cannot
override a withdrawal.
The completed, unchanged capture supplies canonical
<hash>.lace records. Each filename and record is
validated; non-.lace metadata is ignored.
--definitions supplies approved exact UTF-8 sources:
membership.interlang→membership;writers.interlang→writers;content.interlang→content;qualified-content.interlang→qualification.
The repository’s src/ can supply approved definitions.
No source is fetched; newline or BOM bytes are not repaired. Qualified selection owns
grant currentness, conflict handling, and reader/writer
qualification.
Navigation and output
- The root must qualify for the chosen reader and its accepted writer.
Otherwise JSON reports
root-unavailable, with current evidence but no content. - Traverse only singleton parsed
Reply+Link: reply HASHedges. Every child and intermediate independently qualifies. An absent, unreadable, or writer-withdrawn intermediate cuts its branch; deeper replies are not promoted. A qualifying descendant can instead be chosen as a new root. - Incoming root links are not followed. Links do not fetch or establish possession, permission, or deletion.
- JSON lists root depth zero, then breadth-first descendants with exact parents. Siblings sort by exact unsigned Unix seconds, then full hash. Output preserves all field occurrences, declared Timezone, plaintext, and current reader/writer evidence; controls and bidi text are escaped without rewriting record bytes.
One unchanged private memory Lace supplies one complete selection. The compiler and evaluator, not Python, decide qualification. Broad local capture clauses are not network policy. Missing evidence cannot establish global freshness.
Refresh by running on another completed capture. Withdrawals do not alter retained bytes or prior output. Malformed inputs and incomplete operations fail without partial JSON. Reading a reply or patch does not apply it or grant execution authority.
Check
Build joinery or use bundled bin/joinery,
then run:
timeout 55s uv run --project ../lace/python --no-sync python tests/thread.pyChecks cover qualified recursion and unavailable/withdrawn intermediate branch cuts, exact source boundaries, tiny limits, and relocated Python/native handoff.