diff --git a/docs/campaign-repositories.md b/docs/campaign-repositories.md new file mode 100644 index 0000000..4705b12 --- /dev/null +++ b/docs/campaign-repositories.md @@ -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-` +- 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. diff --git a/workplans/FLUID-WP-0009-campaign-repos-and-example-separation.md b/workplans/FLUID-WP-0009-campaign-repos-and-example-separation.md index 037bb7a..503c9b8 100644 --- a/workplans/FLUID-WP-0009-campaign-repos-and-example-separation.md +++ b/workplans/FLUID-WP-0009-campaign-repos-and-example-separation.md @@ -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