feat: origin: extrapolated, the extend rung, and /sentinel-extend - #72
Merged
Conversation
khaneight
force-pushed
the
feat/review-gate
branch
from
August 27, 2026 02:18
4f362ee to
861c3c0
Compare
The clone writes. An `origin: extrapolated` article is work it produced from traits the author affirmed — their thinking extended rather than summarised — and everything here is about making that traceable and reversible. `persona:` names the traits the prose rests on, and an extrapolated article that names none is a lint error: generated writing in somebody's voice that points at nothing is writing on nobody's authority. The traits must resolve, and they must be ones the author affirmed. Writing from a *rejected* trait is an error, because their "no" being on the file is the whole reason for recording it; writing from an unconfirmed one is a warning, since the reading may well be right but nothing has said it is theirs. `ORIGINS` splits. `INGESTABLE_ORIGINS` is what `ingest -o` accepts and is asserted a strict subset: `raw/` is the provenance floor, and a generated file sitting in it could later be cited as evidence for what its supposed author believes — the archive learning a person from its own output. `missing-sources` no longer fires on extrapolated work, which is not compiled from anything, so the warning named a document that does not exist. The `extend` rung offers affirmed traits nothing has written from, ranked by evidence behind each. Only affirmed ones: offering a `proposed` trait would let the clone bootstrap a voice out of its own guesses and then cite that voice as the author's. It sits below `connect`, because generating on top of a disconnected archive compounds what is wrong with it. Approval is deliberately not a rung. The agent cannot approve its own work, so `progress.awaiting_approval` is something for `/sentinel-grow` to stop on — after two unapproved articles — rather than something to act on. Running the workflow end to end found a gap the tests had not: `sentinel review` reported "nothing is waiting on you" while an unpublishable generated article sat in the wiki. Unapproved extrapolated work now appears in the queue, and a *rejected* article stays there — rejected is not handled, the article is still there and still unpublishable. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
khaneight
force-pushed
the
feat/extend-rung
branch
from
August 27, 2026 02:20
48eabb4 to
142b4a8
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #71. The clone starts writing.
The attribution chain
An
origin: extrapolatedarticle names thepersona:traits it rests on, thosetraits resolve, and the author affirmed them. Each link is a lint rule:
unattributed-extrapolationunresolved-traitwrote-from-rejectedwrote-from-unconfirmed/sentinel-improvegains all four, and in each case the repair is explicitlynot to attach plausible traits — that is inventing the authority the article
was written on.
ORIGINSsplitsINGESTABLE_ORIGINS(authored/researched/hybrid) is whatingest -oaccepts, asserted a strict subset of the article origins.
raw/is theprovenance floor: a generated file sitting there could later be cited as
evidence:for what its supposed author believes — the archive learning aperson from its own output.
schemapublishes both, and the test that everypublished origin is ingestable now enumerates from the right one.
missing-sourcesno longer fires on extrapolated work. It isn't compiled fromanything, so "its raw document will stay uncompiled" named a document that does
not exist;
unattributed-extrapolationis its provenance rule instead.The rung, and the thing that is not a rung
extendoffers affirmed traits nothing has written from, ranked by evidencebehind each. Only affirmed: offering a
proposedtrait would let the clonebootstrap a voice out of its own guesses and then cite that voice as the
author's. It sits below
connect— generating on top of a disconnected archivecompounds whatever is wrong with it.
Approval is deliberately not a rung. The agent cannot approve its own work.
progress.awaiting_approvalis reported for/sentinel-growto stop on —after two unapproved articles — rather than to act on. A loop that keeps
generating while unreviewed work in someone's voice piles up is producing
volume, not value.
A gap found by running it, not by testing it
I ran the whole flow against a real archive.
sentinel reviewsaid "Nothing iswaiting on you" while an unapprovable, unpublishable generated article sat in
the wiki — the queue knew about unconfirmed traits and changes-requested items,
and nothing else. Fixed, with tests: unapproved extrapolated work appears in the
queue, and a rejected article stays there, because rejected is not handled —
the article is still present and still unpublishable.
500 tests (+16), clippy and fmt clean.
Next in the stack:
export's approval gate and the attribution line it writesinto published files.
🤖 Generated with Claude Code