Skip to content

bc-dgx7.101: B7e-dossier — Every canon assertion about one named thing - #856

Merged
mordam merged 3 commits into
mainfrom
worktree-b7e-dossier-dgx7101
Aug 28, 2026
Merged

bc-dgx7.101: B7e-dossier — Every canon assertion about one named thing#856
mordam merged 3 commits into
mainfrom
worktree-b7e-dossier-dgx7101

Conversation

@mordam

@mordam mordam commented Aug 28, 2026

Copy link
Copy Markdown
Owner

Takes a name and reports every line in a workspace's canon that asserts something about
it, in source order, then two summaries over the fields those lines state — FIELDS (every
value found) and DISAGREES (the fields whose sources contradict one another). Six deluvia
sessions had each rebuilt this by hand, eight or nine greps and sed ranges at a time; one
of them found a real contradiction only because one grep in its hand-typed list happened
to be the right one, and another ran the same sweep as an audit, found three stale
statements and had nothing to tell it there were only three.

lib/dossier.js is the read: an ordered glob set that comes from config rather than a
constant (the order is the answer — it is what makes the first block canon and a later one
a draft), a tree walk over either the working tree or a git ref, line-level hits, four
prose field readers beside a generic labelled-field reader, and the two summaries.
bin/b7e-dossier is the argv and the printing. dossier.sources and
dossier.sourcesPerWorkspace hold the source set, with deluvia's own shelves shipped as
the worked example and a --kind slice (character/place/species) beside them.

Three decisions worth naming. The file is bin/b7e-dossier, not bin/b7e-dossier.js
as the bead's text says
— an agent reaches these by the name it types, and only an
extensionless filename resolves on the PATH lib/foundation.js sets; every recent sibling
is spelled the same way. The allowlist entry is an @grant read tag in the file's own
header
, not hand-written lines in lib/toolbelt.js and lib/grants.js: bc-wbrhi replaced
that mechanism, and the bead was filed before it landed. bin/b7e-register --dry-run
confirms nothing further is owed. A hit is a line that names the subject, or a line
carrying a field under a heading that names it
— the second half is what a grep cannot
do, and it is how ### §8 — Othens followed by a bare - Height: bullet gets found.

What I am least sure of is the field extraction, because it is heuristic over prose and
the only honest way to tune it was to run it against the real deluvia corpus and look. The
first three passes were unusable — every emotional arc: line in a chapter summary became
a field, and That is Ch. 33's chapter became a height of 33 feet, fifteen times over.
What is in now: a labelled value must be short and unpunctuated, a multi-word label must
be bulleted or bolded, a bare feet mark needs a size cue on the line and a guard against a
possessive apostrophe, and DISAGREES compares numbers by interval containment (a point
inside a range is one source being more specific, not a contradiction) and compares text
only where there are four or fewer short values. Every one of those is a test in
test/dossier.mjs with the line that motivated it. It will still surface the odd stray, and
I think that is the right side to err on for a shortlist that names its sources.

Numbers are read in digits and in words, which is not a nicety: the contradiction the bead
is named for is forty-three years old in a chapter against 173 years old in
reference/, and a reader that only understood digits would miss the one finding this
command exists to reproduce.

Tests: test/dossier.mjs is new — 27 checks, green. After downmerging current origin/main I re-ran every suite this diff touches wiring for: dossier, lockfile, tooldecl, grants, allowlist, configtable, filter, evidence, anchors, b7ereadme, session, sessiondir, usage — all exit 0. Also driven read-only against the real deluvia checkout: 'Korgath' reports a DISAGREES row of 173 years vs 43 years naming reference/CHARACTER_CONCURRENCY.md:54 and the Ch.5 draft; 'Othen --at ' lists six 15-25 ft statements across five files where dv-b5d.32 found three by hand; an unknown name exits 1 with one line. The local full gate did NOT complete: it queued behind three other sessions' runs twice, and yesterday's partial run reached 251/520 with one failure, test/adoptsweepreal.mjs, which the notes here record as a load flake red on main. CI's sharded run on this PR is the full sweep.

Worth knowing: The field extraction is heuristic over prose. It is tuned against the real deluvia corpus and every rule has a test naming the line that motivated it, but a corpus with different conventions may still surface a stray value in FIELDS. Nothing acts on the output — it is a shortlist that names its sources, and a disagreement deliberately does not change the exit code.

Left undone: No --json schema is pinned in the README beyond the field names, and the four prose field readers (age, lifespan, height, status) are the only ones: adding a fifth is adding a regexp to FIELD_READERS, which I left for whoever needs one rather than guessing at it.

Files changed — 7 files · +1322 −0 · against `main`
lib/dossier.js     +581 −0
test/dossier.mjs   +419 −0
bin/b7e-dossier    +195 −0
README.md          +75 −0
lib/config.js      +50 −0
package-lock.json  +1 −0
package.json       +1 −0

Opened by a beadcause worker session on bc-dgx7.101 — b7e-dossier — Every canon assertion about one named thing, with its source line, in one call. It merges itself once the checks report; merging is what closes the bead. If this is still open, something stopped that, and the reason is on bc-dgx7.101 and in Adam's inbox.

bead: bc-dgx7.101

Six deluvia sessions (dv-gr6.5, dv-5eu.1.3, dv-nsy.2, dv-2uu.5, dv-b5d.28,
dv-b5d.32) each opened by reconstructing what canon already says about one
entity, by hand, a different way every time. This is that lookup as a command.

lib/dossier.js is the read: an ordered glob set from config, a tree walk over
the working tree or a git ref, line-level hits (a line that names the subject,
or a line carrying a field under a heading that names it), four prose field
readers (age, lifespan, height, status) beside a generic labelled-field reader,
and the two summaries — FIELDS and DISAGREES. bin/b7e-dossier is the argv and
the printing. dossier.sources / dossier.sourcesPerWorkspace hold the source set,
with deluvia's own shelves shipped as the worked example.

Numbers are read in digits and in words, which is not a nicety: the finding the
bead is named for is `forty-three years old` in a chapter against `173 years
old` in reference/.
@mordam

mordam commented Aug 28, 2026

Copy link
Copy Markdown
Owner Author

A beadcause worker opened this and does not merge its own work. It is on the merge queue as bc-04s0b.

@mordam
mordam merged commit 4cb7fb2 into main Aug 28, 2026
5 checks passed
@mordam
mordam deleted the worktree-b7e-dossier-dgx7101 branch August 28, 2026 21:43
@mordam

mordam commented Aug 28, 2026

Copy link
Copy Markdown
Owner Author

Merged into main as 4cb7fb28 by the beadcause merge queue.

  • Straight through. No refusal, no downmerge: it was mergeable when the queue first read it.

The queue reports its own half only: how this branch got through, not what was in it. What the advocate actually did — the conflicts, which side it kept, the suites it ran and against which tree — is on bc-dgx7.101's merge bead, written by the window that did it. Nothing here is a summary of that; a process that did not watch the merge has no business paraphrasing one.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants