Alignment Workspace

2026-08-11-attribution-provenance-names

2026-08-11 · project workspace · path prompts/2026-08-11-attribution-provenance-names

Prompt prompts/2026-08-11-attribution-provenance-names/PROMPT.md

PATCH ROUND — attribution, provenance, names, and a missing round record

Extends the governance architecture; AGENTS.md rules apply. Read from the public repo at 917c7da. Confirm current state yourself; pointers below are not a spec. Five items, all in root documents and CI scripts, dispatched together because they collide.

A. Model attribution at pull-request level

Commit trailers work — Model: and Prompt-author-model: are on recent commits. The gap is the pull request: a reviewer sees no attribution without opening each commit, and a squash merge can drop trailers into a body nobody wrote deliberately.

  1. PULL_REQUEST_TEMPLATE.md: add a Model attribution section beside the DCO section — they are the same kind of assertion. It asks for one of: human-written (no model); the executor model; or, for a dispatched round, executor plus prompt-author. State that unrecorded is correct where the executor is genuinely unknown, and that guessing is worse.
  2. AGENTS.md model-attribution paragraph: attribution is recorded at both levels — per commit as a trailer, and once in the pull-request body. A squash merge carries the attribution into the squashed message.
  3. CI: extend tests/dco.py or add a sibling wired into the same job that fails when the PR body has no non-empty Model attribution section. Check presence and non-emptiness; say in the docstring, as the DCO gate already does about itself, that this checks an assertion was made and not that it is true. If the PR body is unreachable in the current workflow context, report that rather than forcing it, and say what you would need.

B. Two provenance schemes are live at once (the real conflict)

AGENTS.md carries the three origin classes (human / llm-reviewed / llm-unreviewed) around line 145, and the two-field scheme — generator plus review status (maintainer-reviewed / ci-only) — around line 450. The governance round introduced the second to replace the first, because the three-class scheme cannot express an external contributor's work. Both stand in the binding document, so the repository does not have a provenance scheme; it has two.

Resolve to the two-field scheme. Rewrite the earlier section to define generator and review status, delete the three-class table, and update every dependent reference: PROVENANCE.md, the PR template's provenance section, the external-citation sentence if it names a class, and any script parsing class names. Keep what only the first section carries — unreviewed content is allowed and must be labelled, and flagship documents may not remain unreviewed. DECISIONS.md records the supersession; the document itself keeps no trace of the old scheme.

C. The program is still named after two people

README.md line 3 reads "the working monorepo for the Berns–Demski research program", against the standing names-off decision.

  1. Rewrite it as a description of what the program is, in the register the README already uses. Do not substitute initials or coin a lab name — the program has no name, and naming it is reserved to the maintainer.
  2. DECISIONS.md carries the same phrase. Judgment call, to be made by reading and reported: if that line is a dated record of what was decided, it is history and stays — the ledger is where history lives. If it functions as the repo's standing scope statement that other documents rely on, rewrite it and note the change in a new dated entry.
  3. Leave handles and URLs alone: CODEOWNERS, tests/path_gate.py, the FAF dependency URLs, .github/apply-branch-protection.sh, SETUP_REPORT.md, and the DECISIONS entry recording the second maintainer joining. Handles and URLs are infrastructure, not prose about a program.
  4. Add a name lint to the existing docs/lint job, or a small script it calls: scan tracked Markdown outside prompts/ and frozen/ for the maintainers' personal names; allow DECISIONS.md (ledger) and allow GitHub handles anywhere. Keep it small and easy to update when the maintainer set changes, and do not make it a spec-path dependency for contributors. The reason this is a lint and not a memo: the licensing round's residue sweep reported clean while this line sat in the README, because it searched for change-memorial phrasing and not for the other standing decision. If it cannot go in cleanly, say so and report what you would add instead.

D. Two rounds have no record under prompts/

prompts/ holds five round directories. PR #1 (go public, protection, first scrub) and PR #2 (scrub round 2) have none, though AGENTS.md requires every round's PROMPT.md and REPORT.md to be committed there. The dispatch-provenance trail has two holes in its first week.

Create both directories from the material that exists — the maintainer supplies the dispatched prompts; the reports can be reconstructed from the PR bodies and commit messages, clearly marked as reconstructed-after-the-fact with the date, not presented as contemporaneous. If a prompt is unavailable, record that rather than paraphrasing one into existence.

E. Stale claim-class list

The PR template's claim-class comment omits contributor-checked. Update it to the full ordering.

Report convention change (apply to your own report)

When a round reserves an item to the maintainer, the report lists it under Outstanding maintainer actions, not only in prose. The GitHub-side repository rename is the live example: #4 renamed everything in-repo and correctly left the settings-side rename to the maintainer, but nothing in the report surfaced it as an outstanding action, so the repository is still alignment-workstudio on GitHub while two files point at alignment-workspace. Add the convention to AGENTS.md, and list under it, for this round, anything you leave to the maintainer.

Report

ROUND_REPORT.md per convention: the attribution gate and what it cannot check; the provenance resolution with its dependent-reference list; the §C.2 determination with reasoning; the name lint and what it does not catch; what was and was not recoverable for §D; and the outstanding-actions list.


Prompt author: Claude Fable 5 (Anthropic), 2026-08-11, in a maintainer-directed session. Dispatched by the maintainer.

Report prompts/2026-08-11-attribution-provenance-names/REPORT.md

Attribution, provenance, names, missing round records — report

Dispatch: PROMPT.md beside this file, verbatim.

Outstanding maintainer actions

  1. Supply the scrub round 2 dispatch. Not recoverable from the repository; prompts/2026-08-11-scrub-round-2/PROMPT.md records the gap. Pasting the original over that file closes it.
  2. Supply the contributor-checkers dispatch. Same gap, not in §D's scope: prompts/2026-08-11-contributor-checkers/ has a report and no prompt.
  3. Decide whether the program gets a name. The README now describes the work instead of naming it. Naming is reserved.
  4. **Review tests/name_lint.py's allowlist** if the maintainer set changes — MAINTAINER_NAMES is the single place to edit.

Closed during this round: the GitHub-side repository rename, outstanding from PR #4. The maintainer performed it; the repository is alignment-workspace. This round attempted it and was refused by the executing environment's permission classifier, which blocks repository-settings mutations — worth recording, because it means the settings-side half of any future rename is not something a round can finish on its own.

A. Attribution at pull-request level

The template gains a Model attribution section beside the DCO section, with four options: human-written, executor model, dispatched round (prompt-author plus executor), and unrecorded. AGENTS.md records that attribution lives at both levels and that a squash merge must carry the section into the squashed message.

tests/attribution.py runs in the dco job. It reads the body from the workflow event payload, not the API — no token, no network, consistent with the zero-secrets rule.

What it cannot check: whether the attribution is true. No gate can tell which model wrote a paragraph. It refuses the silent omission, which is the failure mode actually seen — not a false claim but no claim at all. The docstring says this, as the DCO gate's does.

What it nearly failed to check. The first implementation stripped the - [ ] marker from unchecked options and tested the remainder for non-emptiness. Each template option carries its own label text, so an untouched template left "Human-written — no model produced…" behind and passed. A gate that accepts the pristine template is ceremonial. The parse now drops the whole option including wrapped continuation lines, and the seven cases — including the pristine template — are a --self-test wired into CI, not a one-time check.

One workflow change was needed. The event payload is a snapshot from when the event fired, and GitHub's "re-run jobs" replays that same snapshot. A contributor who fixed the body after a failure would re-run and fail identically, with no way forward but an empty commit. pull_request therefore now lists types: [opened, synchronize, reopened, edited]. The cost is that title and body edits re-run all eight jobs including Lean; removing edited reverts that and reintroduces the trap.

B. Provenance resolved to two fields

AGENTS.md's Provenance section now defines generator and review status; the three-class table is gone. The Identity section, which had been the second definition, now points at the first and keeps only the argument for why the fields are separate. What the old section uniquely carried is preserved: unreviewed content is allowed and must be labelled, and flagship documents may not remain ci-only.

Dependent references:

wherechange
PROVENANCE.mdheader rewritten; table column class → generator + review status; 13 rows converted; the prompts/*/PROMPT*.md and prompts/*/REPORT.md rows restated
CONTRIBUTING.mdreader rule 2, which defined the three classes
README.md"most of this repository is llm-unreviewed" → ci-only
.github/PULL_REQUEST_TEMPLATE.mdthe provenance section's field list
AGENTS.md external-citation sentenceno change needed — it already says "maintainer-reviewed" and names no class
scriptsnone — grep found no script parsing class names; the only matches outside prose were Markdown

GOVERNANCE_REPORT.md, SETUP_REPORT.md and SCRUB_REPORT.md say llm-unreviewed and keep it. They are round records, and no negative ontologies already settles that completed records keep the vocabulary that was true when written.

C. Names

C.1. README line 3 now describes the program: what makes an agent's normative state accountable, and what makes deference to a principal stable rather than merely imposed. No initials, no coined name.

**C.2 determination: the DECISIONS.md line is history and stays.** Three reasons. It sits under a dated heading in Settled, whose stated function is to record decisions and not re-litigate them. Nothing depends on it — grep finds no document referencing it, and the README's line was a parallel statement rather than a citation of it. And it is dated 2026-08-10, before the names-off posture existed, so it records a decision genuinely made under different terms; the README line was residue of it, not a live restatement.

The counter-argument, for the record: its heading reads "repository name and scope", and the rename round edited it in place, which is not how a frozen record is treated. That was mandated by no negative ontologies, and it changed a project name rather than the substance — but it does show the ledger is not strictly append-only, which weakens the "pure record" reading. If the maintainer reads it the other way, it is one edit plus a dated entry.

C.4. The lint. tests/name_lint.py, wired into the existing python job and into tests/run.py — deliberately not a new job, because CI job names are required-check contexts and a ninth would need branch protection re-applied before any pull request could merge. There is no docs/lint job to add it to; the python job is the nearest existing home.

Scope: tracked Markdown, excluding prompts/ and frozen/, exempting DECISIONS.md, ignoring anything in backticks or fenced blocks. It caught two passages in SCRUB_REPORT.md quoting a maintainer by name; both generalized. 37 files clean.

What it does not catch: non-Markdown files; a name split across a line break; a name inside backticks, which is the deliberate exemption for handles, paths and URLs and is therefore also a hole someone could write prose into; third-party names, since it knows only the maintainer set; and any description that identifies a person without naming them. It is a floor against the specific regression that already happened, not a guarantee of anonymity.

D. Missing round records

Two directories created, both marked reconstructed-after-the-fact with the date.

**2026-08-11-public-flip-and-scrub/** (PR #1). Recovered: the dispatch, which was three short inline instructions during the branch-protection session, quoted as given. The report is reconstructed from the pull-request body and three commit messages, and states what is not recoverable — the round's own account of its deviations. A report from a merged pull request can say what was done, never what the round decided and did not write down.

**2026-08-11-scrub-round-2/ (PR #2). The dispatch is not recoverable.** PROMPT.md records that, quotes the fragments held in the session record — the title, and the standing instruction the round worked from — and labels them as evidence about the dispatch rather than the dispatch. Not paraphrased into existence. The round's substantive report is not lost: SCRUB_REPORT.md was written contemporaneously, so REPORT.md points at it rather than restating it.

A third gap, outside §D's scope: prompts/2026-08-11-contributor-checkers/ has a report and no prompt. Listed above.

E. Claim classes

The template's claim-class comment now reads lean-proved / enumeration-verified / witness-checked / contributor-checked / test-supported / conjectured, strongest first, and notes that contributor-checked is capped by the invocation path rather than by what the pull request declares.

Gates

All green locally: name lint (37 files), attribution self-test (7/7), attribution, dco, contrib hygiene, path gate, conservativity, check_frozen, repo runner, checkers self-test (9/9), registries (3 entries). py_compile clean. The workflow YAML is not parsed locally — PyYAML is not installed — so the two CI edits were made as asserted string replacements and are validated by CI.

Attribution

prompt authorClaude Fable 5 (Anthropic)
executorClaude Opus 5 (Anthropic)
date2026-08-11

Claims it registered

None.

Items it filed or answered

None recorded in the index.

Nodes pointing at it