campaign-state: the repo set in force and how Self changes it (cut-skill-campaign-repos r2) #37

Merged
eureka merged 1 commit from eureka-substrate/skill-campaign-repos into main 2026-11-01 01:01:05 +00:00

View file

@ -78,11 +78,11 @@ mismatch. The root is the campaign slug, or the instance for `instance`,
|---|---|---|---|---|
| `instance` | `self` | exists (`eureka:instance:self`) | instance, display name, host | |
| `stewardship` | `<repo>.n<seq>` | Self | instance, repo, sequence, note | |
| `campaign` | `self` | Self | title, repos, working branch, target doc | |
| `target` | `r<rev>` | Self | invariants (`label`, `statement`), not in scope, canonical implementations, doc | |
| `campaign` | `self` | Self | title, repos (the opening set), working branch, target doc | |
| `target` | `r<rev>` | Self | invariants (`label`, `statement`), not in scope, canonical implementations, doc, repos (the whole set from this revision on; empty keeps the previous) | |
| `question` | `<label>` | Imagination; Hands or Soul for a fork | title, question, options (≥2), recommended, depends, raised in | `raised_in` |
| `ruling` | `<label>` | Self | answers (none for an operator direction), choice, ruling, operator quote, date, authority | `answers` |
| `cut_spec` | `cut-<cut>.r<rev>` | Imagination | repo, branch, base, depends on (cut labels, never revision ids; a spec may not depend on its own cut), first, deletes, keeps and moves, adds, file changes, authority map, verification, estimate | `rulings`, `questions` |
| `cut_spec` | `cut-<cut>.r<rev>` | Imagination | repo, branch, base, depends on (cut labels, never revision ids; a spec may not depend on its own cut), first, deletes, keeps and moves, adds, file changes, reads (each a location and why; any location may carry a symbol), authority map, verification, estimate | `rulings`, `questions` |
| `cut_report` | `cut-<cut>.h<attempt>` (a fix batch is the next attempt) | Hands | commits, range, verification evidence (mutation totals included), mutations (survivors and the ones Soul should rerun), deviations, forks, structural delta, landed names, undone, promises | `cut_spec`, `forks` |
| `verdict` | `cut-<cut>.s<pass>` | Soul | range, claims (each with an outcome, evidence, findings, promise, mutations) | `cut_report`, `findings` |
| `finding` | `cut-<cut>.s<pass>.<label>` | Soul, in the verdict's batch | confidence, severity, claim, invariants, locations, failure scenario, evidence, origin | `verdict` |
@ -91,7 +91,7 @@ mismatch. The root is the campaign slug, or the instance for `instance`,
| `hand_off` | `<to>.<repo>.<date>` | Self (parked: Cut 12) | from, to, repo, documents, reason | `documents` |
Bounds: `Title` and `Short` are at most 200 bytes, `Line` 1,000, and `Para`
4,000. Narrative longer than that goes in the prose map, cited by a `DocRef`
4,000. A target's `repos` is at most 16, a campaign's 8. Narrative longer than that goes in the prose map, cited by a `DocRef`
(path, start and end line, commit). A `Label` is `[A-Za-z0-9_-]{1,64}`, and a
`Date` is `YYYY-MM-DD`. A subject's local key (the part after
`<campaign>:<kind>:`) is at most 64 bytes. A resolution's local is derived from
@ -100,7 +100,13 @@ resolved and withdrawn.
Rules that shape a batch (the rest arrive as refusals):
- A cut spec's repo must be one of its campaign's repos.
- A cut spec's repo must be in the repo set in force when the spec is admitted:
the target in force's `repos` when it names any, else the campaign's. Specs
already in force on a since-removed repo stay in force and can still be
reported, withdrawn or superseded; a new revision of one is refused. Self adds
or removes a repo with target `r<n+1>` naming the whole set, plus the
superseding resolution. A target revision may not empty a `repos` list its
predecessor named (`EmptyRepos`).
- A ruling that `answers` a question derives that question's `Answered`
resolution in the same commit. Its `choice` must be one of the question's
option labels. `operator_quote` is allowed only with `authority: Operator`.
@ -208,6 +214,10 @@ the `selection` value of `huginn query`; the CLI takes the object inside the `se
- **`<c>` is not in the list:** the slug is wrong or the campaign is in another
mind. Stop and report; never create a campaign to fit a brief.
**Repos in force:** `huginn target <c>`. Its `repos` when non-empty, else the
campaign's `repos` (`huginn campaigns`, the opening set). A cut spec's repo must be
in this set.
**Target in force:** `target`, with `root` = `<c>`, `in_force` = `true` and
`projection: document`.