Skip to content

ADR-0043: Mission Objective Model — Goals, Bounties & Multi-Currency Rewards

Companion spec: software/runtime/mission-objectives.md (Draft — the working design this ADR ratifies the shape of)


ADR-0028 / mission-control.md synthesize contracts procedurally, but the objective of a contract is implicit — buried inside phase definitions and an archetype’s story template. The economy is a single base_payout plus ad-hoc “bonus conditions” (mission-control.md §4.3) and a capability-result :bonuses list (§5.3). Three of that doc’s own Open Questions are blocked on this gap:

  • OQ-1 — the exact shape of the mission struct’s objectives.
  • OQ-2 — whether partial success carries a structured “what’s missing” list.
  • OQ-3 — how partial phase completion reconciles into the economy.

There is no way today to say “this goal is optional,” “this goal pays reputation rather than credits,” “this goal is hidden until you trip something,” or “you only keep this reward if you exit clean.” Those are the texture of a hacker-operator mission, and the model can’t express any of them.

  • Mission authoring needs a stable objective vocabulary. Campaign and module specs (campaign-economy.md, the launch-title bibles) describe objectives, branches, and bonuses prosaically; there is no schema to author them against.
  • OQ-2 / OQ-3 block economy work. Per-phase reputation/credit accounting is undefined until “what a goal is” and “when it pays” are pinned down.
  • The currencies already exist, scattered. Credits, reputation, knowledge_index (intel, the-vault.md), and cartridge_history/eligibility (access) each live in their own subsystem. There is no single, legible place where a goal grants one. Without that, a designer reaching for “a reward that isn’t credits” has nowhere to put it.
  • Goals are Lisp cells. The objective graph must be the interaction model (CAR/CDR/INFO/QUOTE), consistent with the deck’s paradigm (ADR-0002) — not a parallel C-only structure.
  • No change to the economy’s spine. ¤ rewards must still route through the schema :payout-formula, the threat clamp (ADR-0030), and the self-correcting modifier (campaign-economy.md). This ADR adds an objective layer above the economy; it does not re-open it.
  • No new hardware or display contract. The objective panel renders on the canonical 128×75 grid, Rows 1–73; Row 0 / Row 74 stay firmware-reserved (CLAUDE.md Canonical Hardware Specification). No Canonical Hardware Specification value changes.
  • Build on existing UDS fields. Persistence reuses credit_balance, reputation, cartridge_history, and the 256-byte phase_chain (deck-state.md, phase-chain-format.md).

A mission is an objective graph: named goal cells, each independently rewarded (or not), composable into branches and chains, navigable as a Lisp list. The full design is mission-objectives.md; this ADR ratifies its shape and the contract changes it requires.

FacetValuesControls
role:primary / :optionalWhether the mission fails without it.
reveal:briefed / :latentKnown at accept-time, or discovered through play.
rewardlist of (kind amount when)0..N rewards, mixed currencies. Empty = no payout.
link:requires x / :excludes yIn-mission chaining and mutually-exclusive branches.

Invariant: :primary:briefed (you cannot fail a mission for an unstated requirement); a :latent goal is :optional until revealed, then may flip to briefed. State machine: :locked → :open → :done | :failed | :forfeit | :void.

A reward is (<kind> <amount> <when>). Kinds: ¤ credits · rep reputation · intel (knowledge_index) · access (a discrete unlock — follow-on contract, eligibility flag, or program enrichment per ADR-0042). Timing: :on-complete (banked immediately) · :on-resolve (escrowed until a clean mission end) · :deferred / :recurring (episodic). The systemic rule: ¤ self-corrects through the economy; rep / intel / access do not — which shifts the late game onto the prestige currencies automatically. “No bounty” therefore means no ¤ — the goal may still pay another currency, be a pure gate, or be expressive (pays in mastery).

  1. The objective graph is the canonical representation of a mission’s objectives — resolving the objective portion of OQ-1. Per-phase goals nest inside the phase chain; completion serializes as a bitmask in the 12-byte phase-record payload (phase-chain-format.md).

  2. Rewards are multi-currency; “no bounty” ≠ “no reward.” The four currencies are unified at the goal layer; ¤ alone is economy-corrected.

  3. defcontract-schema gains an :objectives clause — spine (authored) + limbs (procedural). Archetypes author the primary spine and the key branch; the generator layers optional/latent goals and rewards on top. This amends ADR-0006’s schema-generator surface.

  4. NoshAPI gains five goal verbs(goal-complete …), (goal-reveal …), (goal-choose …), (goal-fail …), (goal-state …) — additive to the ADR-0029 mission-context tier. :hold predicates are engine-evaluated each tick; the cart never polls. This amends ADR-0005.

  5. Success / partial / escrow are defined — resolving OQ-2 and OQ-3. Mission success = all :primary goals :done. Partial success = the snapshot of goals not :done, with state. Settlement at resolve: :on-resolve pays iff the mission succeeded and the goal still holds; :on-complete rewards already banked are kept on failure/abandon, escrow is forfeited.

  6. No Capability Registry, threat-cap, or economy change. Threat-cap inheritance (ADR-0030) and the payout formula (campaign-economy.md) are unchanged; rewards plug into the existing pipeline via (scale N).

  7. The companion spec stays Draft until the tuning lands. This ADR fixes the model, not the numbers. Currency magnitudes/balancing, the objective-panel render, final FFI signatures, OR-group modeling, and intel persistence home are non-blocking follow-ons (Consequences).


Option A: First-class objective graph, multi-currency rewards, hybrid generation. (ACCEPTED)

Section titled “Option A: First-class objective graph, multi-currency rewards, hybrid generation. (ACCEPTED)”

Make the objective a first-class Lisp-cell graph; let a goal carry 0..N rewards across four currencies; generate via authored spine + procedural limbs.

Chosen because it is the only option that resolves OQ-1/2/3, expresses optional/latent/branch/constraint objectives, and gives the four existing currencies one legible home — while leaving the economy spine untouched. The sub-decision on generation (authored-spine + procedural-limbs) was chosen over pure-procedural (no guaranteed-good core) and pure-authored (no variety, no procgen leverage) to get a guaranteed core with emergent edges.

Option B: Keep objectives implicit — single base_payout + ad-hoc bonus conditions. (status quo)

Section titled “Option B: Keep objectives implicit — single base_payout + ad-hoc bonus conditions. (status quo)”

Rejected because it leaves OQ-1/2/3 open, cannot express un-bountied or optional or hidden goals, and forces every “extra reward” into bespoke per-mission scripting.

Option C: First-class objectives, single currency (¤ only); goals merely typed required/optional.

Section titled “Option C: First-class objectives, single currency (¤ only); goals merely typed required/optional.”

Rejected because an un-bountied goal in a ¤-only economy is junk players ignore; it fails to unify the reputation/intel/access currencies the game already has; and it gives up the automatic late-game shift onto prestige rewards.


DimensionA — objective graph + multi-currency (chosen)B — implicit (status quo)C — first-class, single-currency
Resolves OQ-1 / OQ-2 / OQ-3◐ (1/2 yes, currency reconciliation thin)
Expresses optional / latent / branch / constraint goals◐ (no currency texture)
Un-bountied goals have felt value
Unifies the four existing currencies
Late game shifts onto prestige currencies✓ (automatic)
Economy spine untouched
Tuning / balancing surface✗ largest✓ smallest

Accepted cost: the largest balancing surface — relative currency value must be tuned so the prestige currencies feel as desirable as credits.


  • Mission and campaign authors get a stable objective vocabulary (spine / limbs, the four facets) to write against.
  • mission-control.md OQ-1 / OQ-2 / OQ-3 are answered (objective shape, partial-success snapshot, per-phase economy).
  • The four currencies gain one legible home; the escrow-timing field turns optional objectives into a real push-your-luck loop for free.
  • The economy spine, threat-cap inheritance, and Capability Registry are untouched — this is purely additive.
  • Relative currency magnitudes are unset — the central balancing risk (a currency with no felt value is worse than none).
  • defcontract-schema :objectives and the five goal verbs are not implementable until the ADR-0006 / ADR-0005 amendments land.
  • The objective panel’s on-grid render + CIPHER-LINE goal-close announcements are unspecified.
  • Tuning (Gameplay Design): currency magnitudes / balancing; OR-group modeling (:any children); intel persistence home (UDS vs per-cart).
  • Spec: objective-panel render on 128×75 + CIPHER-LINE (screen-design-rules.md, cipher-voice.md); Mission Runner binding shape for the goal list (interaction with ADR-0007).
  • Engineering: (launch-style goal-* FFI primitives → ADR-0005 amendment; :objectives parsing → ADR-0006 amendment; promote the companion spec from Draft.

Documentation Updates (REQUIRED — Spec Hygiene Rule 3)

Section titled “Documentation Updates (REQUIRED — Spec Hygiene Rule 3)”

No Canonical Hardware Specification value changes (CLAUDE.md table untouched). The ADR-0005 / ADR-0006 amendments are applied in the accepting change (this PR) as appended dated amendment notes, per house precedent (cf. ADR-0030’s 2026-06-20 amendment).


Mission Control could always make a contract, but it could never quite say what the contract was for. The objective lived in the seams — implied by which phase ran, narrated by an archetype, paid out as one lump of credits with a bonus bolted on the side. That was fine when a mission was “breach the thing, get paid.” It is not fine for a deck whose whole texture is choice: grab the bonus dataset or bail clean, mirror the ledger quietly or corrupt it loudly, take the job that pays in standing instead of credits because standing is what opens the next door. This ADR makes the objective a thing you can hold — a named goal, a Lisp cell, with a reward that might be money or reputation or intel or access, or nothing but pride. It says the bounty is only the most legible reward, not the only one, and it lets the late game drift onto the currencies that don’t inflate. The numbers aren’t set yet, and they shouldn’t be — this fixes the shape, and the shape is what mission authors have been writing around for months. The goals were always there. Now they have cells.