feat: export gates generated work on approval, and signs it itself - #73
Merged
Conversation
khaneight
force-pushed
the
feat/extend-rung
branch
from
August 27, 2026 02:20
48eabb4 to
142b4a8
Compare
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
force-pushed
the
feat/export-gate
branch
from
August 27, 2026 02:21
92aaed7 to
4f90592
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 #72. Safeguards 3 and 4 from the design, enforced where publishing actually happens.
The gate
An
origin: extrapolatedarticle publishes only when its latest verdict isapproved. Approval is a different axis from maturity —stablemeansfinished,
approvedmeans the archive's owner signed it — so neither--statusnor--include-draftsopens it. Tested: a flag that could overridethis would make the gate advisory rather than structural.
Held-back articles are counted separately (
held_for_approval) and saidplainly. 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 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:
extrapolatedon every node — a UI that renders the clone's work like theauthor's own misleads its readers
persona— affirmed traits only. Aproposedtrait is an unconfirmedreading, and publishing one puts a claim about a person in front of readers
before the person has seen it. Each carries
evidence_count, never theraw/paths: citing documents nobody can open is citing sources at readers who
cannot check them.
expressed_inlinks a claim to what was written from it.in_progress— unpublished, awaiting approval, unconfirmed traits, wantedTwo defects found by reading the output
I exported a real archive and opened the file.
cargo fmthad wrapped thenotice 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