Skip to content

feat: origin: extrapolated, the extend rung, and /sentinel-extend - #72

Merged
khaneight merged 1 commit into
mainfrom
feat/extend-rung
Aug 27, 2026
Merged

feat: origin: extrapolated, the extend rung, and /sentinel-extend#72
khaneight merged 1 commit into
mainfrom
feat/extend-rung

Conversation

@khaneight

Copy link
Copy Markdown
Owner

Stacked on #71. The clone starts writing.

$ sentinel next
Next: extend
  1 trait(s) the author affirmed that nothing has been written from —
  views they hold the archive has never expressed

  • held — belief · 2 source(s) · high confidence

  run: /sentinel-extend held

The attribution chain

An origin: extrapolated article names the persona: traits it rests on, those
traits resolve, and the author affirmed them. Each link is a lint rule:

rule severity
unattributed-extrapolation error generated prose naming no trait is writing in someone's voice on nobody's authority
unresolved-trait error the attribution points at nothing
wrote-from-rejected error their "no" is on the file — this is what recording it was for
wrote-from-unconfirmed warning the reading may be right; nothing has said it is theirs

/sentinel-improve gains all four, and in each case the repair is explicitly
not to attach plausible traits — that is inventing the authority the article
was written on.

ORIGINS splits

INGESTABLE_ORIGINS (authored/researched/hybrid) is what ingest -o
accepts, asserted a strict subset of the article origins. raw/ is the
provenance floor: a generated file sitting there could later be cited as
evidence: for what its supposed author believes — the archive learning a
person from its own output. schema publishes both, and the test that every
published origin is ingestable now enumerates from the right one.

missing-sources no longer fires on extrapolated work. It isn't compiled from
anything, so "its raw document will stay uncompiled" named a document that does
not exist; unattributed-extrapolation is its provenance rule instead.

The rung, and the thing that is not a rung

extend offers affirmed traits nothing has written from, ranked by evidence
behind each. Only affirmed: 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 — generating on top of a disconnected archive
compounds whatever is wrong with it.

Approval is deliberately not a rung. The agent cannot approve its own work.
progress.awaiting_approval is reported for /sentinel-grow to 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 review said "Nothing is
waiting 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 writes
into published files.

🤖 Generated with Claude Code

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
khaneight changed the base branch from feat/review-gate to main August 27, 2026 02:20
@khaneight
khaneight merged commit 6d361ef into main Aug 27, 2026
6 checks passed
@khaneight
khaneight deleted the feat/extend-rung branch August 27, 2026 02:33
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.

1 participant