Document the pr- campaign repository convention
Some checks failed
ci / build (push) Failing after 22s

Closes FLUID-WP-0009 T01. Writes down what a pr- repository is so the
second one need not be reverse-engineered from the first.

Keeps the workplan's insistence on naming propaganda alongside public
relations and promotion: the mechanism is identical in all three, and what
separates them is whether the campaign is accountable to something outside
itself -- a source it must not contradict, a named reviewer, a consent
basis it can lose.

Beyond the required contents, records the boundary table against fluid-*,
that a declared presence is brand and belongs to the campaign while the
credentials it produces belong to the interface, and that domain and topic
follow the subject being promoted rather than the activity -- the domains
are market sectors, and none of them is "marketing".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0172sgCZEEDJcnQmr4SGDvKa

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 1361245@bnt-lap001
Assistant-Session: b3b428ef-f3e6-4688-b091-01f71461d66a
This commit is contained in:
tegwick 2026-09-04 21:15:52 +02:00
parent 4819fd919a
commit f2330e68e0
2 changed files with 152 additions and 1 deletions

View file

@ -0,0 +1,141 @@
# The `pr-` convention — campaign repositories
A `pr-` repository is a **campaign**: an ongoing public-communication offering
with its own voice, cadence, consent records and budget. It consumes one or more
`fluid-*` interfaces and owns none of them.
This document exists so the second campaign repository does not have to be
reverse-engineered from the first. `pr-hall-of-helix` is the first instance.
## Why the prefix says `pr-`
The prefix covers public relations, promotion, **and propaganda** — including the
uncomfortable third word deliberately. A campaign repository that cannot name
what it is doing will not govern it well.
The distinction between the three is not the mechanism, which is identical in all
cases. It is whether the campaign is accountable to something outside itself: a
source document it must not contradict, a named reviewer, a consent basis it can
lose. Everything in this convention exists to keep that accountability
structural rather than cultural, because culture does not survive a deadline.
## What makes a repository a campaign
Three properties, together. A repository with only one or two of them is
something else.
1. **It speaks outward, in an organisation's voice**, to an audience that did not
ask to be written to.
2. **It writes about people** — usually people who did not commission the writing.
3. **It does not finish.** A campaign has a cadence, not a completion criterion.
This is why campaigns must not live inside a workplan: a workplan that never
finishes is a workplan that has stopped being honest.
## Required contents
### `INTENT.md`
The ordinary repository intent, plus the campaign's own three questions
answered explicitly:
- **Audience** — who is being written to, and what they did to deserve the
attention (usually nothing; they are strangers, and that is the point).
- **Voice** — how the organisation sounds here, and why that is appropriate.
- **What it will not say.** The most important of the three and the one most
often skipped. A campaign with no stated refusals has not decided anything; it
has merely not yet been tempted.
### Consent records
For every person the campaign writes about: the basis, its date, and how it may
be revoked.
Three rules that are not the campaign's to relax:
- **Absence of objection is not consent.** Silence is not agreement, and treating
it as such is the single most common failure in this class of work.
- **A standing agreement does not apply retroactively.** People whose
contributions predate the agreement are asked, not assumed in.
- **Revocation is honoured going forward**, and the record says so before anyone
needs it.
### Composition strategies as named variants
Every composed artifact records the `variant` label of the strategy that produced
it, at composition time.
Not afterwards. Reconstructing which strategy wrote what from timestamps is the
kind of inference that works until it quietly stops, and by then the comparison
it feeds has already been believed.
### A publishing cadence
Stated, and slow enough to review at. A backlog is a source to draw on, not a
queue to drain — publishing it in a burst is a rate-limit problem, an unkind
introduction for a new subscriber, and a volume of writing nobody has had time to
read properly.
### A review step
A person reads each artifact against its source before it goes out, and their
name travels with it.
This is not ceremony. A condensation can put a claim in someone's mouth that
their own source never made, and **in an audit trail an unfaithful artifact looks
exactly like a faithful one.** No downstream check recovers this, because there
is nothing anomalous to detect. The reviewer is the only mechanism that works.
## The boundary against `fluid-*`
| Campaign (`pr-`) owns | Interface (`fluid-*`) owns |
|---|---|
| Composition and the editorial voice | The contract and its revisions |
| Choosing what is worth publishing | The adapter: rendering and delivery |
| Variant strategies and their competition | Delivery experiments |
| Consent records and the review queue | Per-variant engagement reporting |
| The publishing cadence | Platform and channel configuration |
| The *declared* presence (names, descriptions, assets) | *Applying* that declaration, and custody of every credential |
A campaign reaches its interface through the published contract and nothing else.
It does not import the adapter, read the evidence store, or hold a credential.
The separation is architectural rather than stylistic: composition is a
probabilistic editorial task, and `ArchitectureBlueprint.md` §48.1 forbids an LLM
in the mandatory request path. Putting composition in the campaign is what keeps
the interface deterministic.
### Presence lives with the campaign
A bot's name, its description, and the channel titles a stranger reads are
**brand, not mechanism**, so the declaration belongs to the campaign. The
interface holds the schema, applies the declaration, and owns the credentials
that result. See `fluid-telegram/docs/provisioning.md` for the worked case.
## Registration
- Repository name: `pr-<campaign-slug>`
- State Hub domain: **the domain of the subject being promoted**, not a domain
named for marketing. The domains are market sectors, and a campaign is
classified by what it is about. `pr-hall-of-helix` is `infotech` because
HelixForge is.
- Topic: the subject's topic, so a query for that subject's work returns the
campaign with it (`pr-hall-of-helix``helix-forge`).
- Workplan prefix: derived from the repo slug (`PRHOH-WP-`).
## Its own FLUID loop
A campaign is a consumer of an interface, and it may also run its own FLUID loop
over its own artifacts — which composition variant travels — using the
per-variant engagement the interface reports.
These are different loops over different questions and should not be merged. The
interface's loop asks *how should this be delivered*; the campaign's asks *what
should be said*. The first is settled by the platform's constraints; the second
never fully settles.
## The test of this convention
Whether a second campaign can be created from this document without reading
`pr-hall-of-helix`. Until that has happened, treat the convention as a
description of one case rather than a general rule — see `FLUID-WP-0009` T05,
which makes the same point about the framework itself.

View file

@ -46,7 +46,7 @@ the wrong place.
```task
id: FLUID-WP-0009-T01
status: todo
status: done
priority: medium
state_hub_task_id: "2a3aab85-e464-5b17-980f-1896ecd3794f"
```
@ -63,6 +63,16 @@ audience, voice and what it will not say; consent records for anyone it writes
about; composition strategies as named variants; and a publishing cadence. It
consumes one or more `fluid-*` interfaces and owns none of them.
**Written: `docs/campaign-repositories.md` (2026-09-04.)** It adds a review step
to the list above, the boundary table against `fluid-*`, the registration rules
(domain and topic follow the *subject*, since the domains are market sectors and
none of them is "marketing"), and the point that a campaign may run its own FLUID
loop over its own artifacts without merging it into the interface's.
It states its own test: whether a second campaign can be created from the
document without reading `pr-hall-of-helix`. Until that happens it describes one
case rather than a general rule — the same caution T05 applies to the framework.
## T02 — Establish pr-hall-of-helix
```task