Skip to content

feat: export gates generated work on approval, and signs it itself - #73

Merged
khaneight merged 1 commit into
mainfrom
feat/export-gate
Aug 27, 2026
Merged

feat: export gates generated work on approval, and signs it itself#73
khaneight merged 1 commit into
mainfrom
feat/export-gate

Conversation

@khaneight

Copy link
Copy Markdown
Owner

Stacked on #72. Safeguards 3 and 4 from the design, enforced where publishing actually happens.

$ sentinel export --out ./content --flat
Exported: 2 article(s) → ./content

  ! 1 article(s) written by the clone are finished but unsigned.
    sentinel review           # see them
    sentinel review <slug> --approve

The gate

An origin: extrapolated article publishes only when its latest verdict is
approved. Approval is a different axis from maturity — stable means
finished, approved means the archive's owner signed it — so neither
--status nor --include-drafts opens it. Tested: a flag that could override
this would make the gate advisory rather than structural.

Held-back articles are counted separately (held_for_approval) and said
plainly. It is the one exclusion the owner can clear with a single command, and
folding it into a list headed "not publishable" reads as work that is not ready.

The notice

---

*Written by a language model working from this archive, extending its author's
own writing rather than reproducing it. Written from: Builds an argument from a
concrete case before generalising. Approved by khaneight on 2026-08-26.*

Written by the exporter, not by the agent that wrote the article — an agent
that composes its own disclosure is an agent that can leave it out. It names the
claims the piece was written from, in the words the trait records, so a reader
who disagrees can disagree with the premise rather than only the conclusion.
Ordinary compiled articles get no notice: attaching it to everything would make
it furniture.

The bundle

What a front end needs to show a system rather than a website:

  • extrapolated on every node — a UI that renders the clone's work like the
    author's own misleads its readers
  • personaaffirmed traits only. A proposed trait is an unconfirmed
    reading, and publishing one puts a claim about a person in front of readers
    before the person has seen it. Each carries evidence_count, never the raw/
    paths: citing documents nobody can open is citing sources at readers who
    cannot check them. expressed_in links a claim to what was written from it.
  • in_progress — unpublished, awaiting approval, unconfirmed traits, wanted

Two defects found by reading the output

I exported a real archive and opened the file. cargo fmt had wrapped the
notice string into the middle of a sentence (archive — extending),
and joining claims that already end in a full stop produced generalising...
Both fixed, with a test that asserts the notice reads as a sentence rather than
that it merely contains the right substrings.

506 tests (+6), clippy and fmt clean.

🤖 Generated with Claude Code

Two changes, both about the same reader: somebody who opens the site and
takes what they find for the author's own writing.

**The gate.** An `origin: extrapolated` article publishes only when its
latest verdict is `approved`. Approval is a different axis from maturity
— `stable` means finished, `approved` means the archive's owner signed it
— so neither `--status` nor `--include-drafts` opens it. A flag that
could would make the gate advisory. Held-back articles are counted
separately in the report and told plainly, because unsigned is the one
exclusion the owner can clear with a single command, and burying it under
"not publishable" reads as work that is not ready.

**The notice.** The exporter appends the attribution to every published
extrapolated article — not the agent that wrote it, which could leave it
out. It names the claims the article was written from, in the words the
trait records, so a reader who disagrees can disagree with the premise
rather than only the conclusion, and it names who signed it and when.

The `--data` bundle gains what a front end needs to show a system rather
than a website: `extrapolated` on each node, the persona profile, and
counts of work in flight. The profile is **affirmed traits only** — a
`proposed` trait is an unconfirmed reading, and publishing one puts a
claim about a person in front of readers before the person has seen it —
and it carries `evidence_count` rather than the `raw/` paths, since a
bundle citing documents nobody can open is citing sources at readers who
cannot check them.

Reading the published file rather than only asserting on it caught two
defects in the notice: `cargo fmt` had wrapped the string into the middle
of a sentence, and joining claims that already end in a full stop
produced "generalising..". Both fixed and pinned.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@khaneight
khaneight changed the base branch from feat/extend-rung to main August 27, 2026 02:21
@khaneight
khaneight merged commit fee9e69 into main Aug 27, 2026
6 checks passed
@khaneight
khaneight deleted the feat/export-gate 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