This is _bmad-output/planning-artifacts/epics.md, the plan this mind was built from, published as it is written with one change: the owner's name is replaced with "the owner". Every FR, AC, NFR, AR and story tag on this site links to the place here that defines it.


stepsCompleted: [1, 2, 3, 4] inputDocuments:

  • _bmad-output/planning-artifacts/prd.md
  • _bmad-output/planning-artifacts/architecture.md
  • _bmad-output/planning-artifacts/ux-design-specification.md
  • _bmad-output/design-artifacts/ux-verification-spine.md
  • _bmad-output/design-artifacts/roster-design.md
  • _bmad-output/design-artifacts/agent-examples/amygdala.md
  • _bmad-output/design-artifacts/agent-examples/daydreamer.md
  • _bmad-output/design-artifacts/agent-examples/sunk-cost.md
  • _bmad-output/design-artifacts/observatory-mock.html # the running mock: its measurements are extracted into AR-U5 through AR-U8, and Story 2.15 ports the artifact itself rather than reimplementing it
  • compliance/README.md
  • compliance/registry.json

inputDocumentsExcluded:

  • _bmad-output/design-artifacts/{account-record,idea-record}-mock.html # static record mocks, referenced rather than extracted
  • _archive/planning/prd-discovery-notes.md # absorbed into the PRD
  • _archive/planning/prd-validation-report.md # findings fixed and folded into the PRD

Human42 - Epic Breakdown

Overview

This document provides the complete epic and story breakdown for Human42, decomposing the requirements from the PRD, the UX Design Specification and the Architecture Decision Document into implementable stories.

How the inventory below was built. Counts are mechanical, not read off the prose. tools/check-prd.py parses the PRD and reports 165 requirements (3 lettered: FR55a, FR56a, FR79a), and all ten of its invariants pass. The architecture document says the same and says why it recounts: *"165 requirements, verified by tools/check-prd.py rather than counted by hand... Architecture derives the inventory from the document rather than from its summary."* This document does the same.

Two tags travel with every functional requirement, because both decide when a story can be written:

  • t0 / post — membership of the Minimal Launch Set. The PRD's test for it is its own sentence: "The thing that must be true at launch is that a visitor feels a living mind within five seconds and the mind can change itself without The owner." A requirement is in the launch set if that sentence, the survival of the world, or a legal obligation fails without it. 94 at t0, 62 following, summing to 156 MVP with no overlap.
  • Stage 0-5 — the PRD's own build order, "brainstem before cortex, each stage gated by a checkpoint with a branch if it fails."

The two tags are not the same ordering, and that is the single most important fact for epic design. Epic 5 carries seven launch-set requirements (FR33, FR73, FR74, FR98, FR99, FR101, FR102) and Epic 6 carries eight more (FR4, FR10, FR12, FR13, FR61, FR97, FR159, FR160). An epic per stage is therefore not an epic per launch phase, and the t0 column is what sequences stories inside an epic.


Requirements Inventory

Functional Requirements

164 requirements in 9 groups. 8 are Growth-tagged and outside the MVP build: FR36, FR41, FR53, FR66, FR72, FR86, FR105, FR106.

Each row carries the operative clause of the requirement. Where a phrase is load-bearing it is quoted; the PRD remains the contract and this is its index.

Thought Intake (18) — Journeys 5, 7, 10

FRRequirementSetStage
FR1Visitors can inject a thought into the shared stream without an account. "Injection is free at every point: no payment, no account and no reputation is ever required to be heard, only to be heard sooner."t02
FR2Default-mode agents generate spontaneous thoughts, and "the substrate guarantees at least one default-mode agent always exists."t01
FR3The owner can inject a question flagged as his own, "which receives priority deliberation."post4
FR4The substrate moderates every thought before the stream, paid or free, drops content targeting named private individuals, logs every decision. Policy is owner-controlled; "moderation never steps down with the degradation ladder; if the moderation model is unavailable, intake is held, never passed unmoderated."t05
FR159An owner-set list of prohibited classes no thought may enter the stream carrying and no idea may be executed on — "killing or injuring people, building or improving weapons, organising rioting or civil disturbance, attacking computer systems or networks." A cage item: "a mind that could edit what it is forbidden to think about is forbidden nothing." Enforced three times — intake, graduation, implementation — "because a text, a decision and a piece of work are three different things." The mind's own thoughts are held to it too.t05
FR160A person sending one is barred from injecting, permanently and at the first offence. An account bar is durable and freezes the balance rather than taking it. An anonymous bar is a keyed hash "that stores no identifier it could ever display", kept under abuse handling. Stated as best-effort rather than implied otherwise: "a session token dies with a cleared browser and an address rotates." The ban list is a cage item, "which matters most in the case where the person it wanted barred was its critic." Owner reviews and lifts; appeals go to the about-panel contact.t05
FR5Visitors are told at the injection box that thoughts are public and reusable, anonymous by default with optional attribution, and what the order of attention does: "a visitor can pay to make the mind think about an idea first but cannot pay to make it agree."t02
FR6Rate-limit per visitor, cap total intake, shed "the oldest low-scoring free thoughts" beyond the cap. "A paid thought is never shed"; free thoughts behind earned reputation are shed last.t02
FR7Visitors are told why a thought was refused or dropped — "whether it was moderated, held for review, rate-limited, or shed for crowding."t02
FR8Borderline thoughts are held for review with a visible held status, inside the held-queue cap and resolution window; "older items drop with a reason and a credit return if paid."post5
FR9Within a session a visitor sees their injected thoughts and each one's place in the order of attention: "how many thoughts are ahead of it, and how many of those are ahead because somebody paid or because somebody earned it."post2
FR10Visitors can report a thought; the owner removes reported or illegal content from display inside the review window.t05
FR11"One priority credit buys one guaranteed promotion of a thought to a vote, bypassing the attention threshold." Priority "never changes the value rules, the threshold, the electorate, or the judge."post4
FR12A person can request redaction of their own thought: content removed, event record preserved, "tombstone events re-applied on every restore", older snapshots never served, dataset releases excluding it.t05
FR13Rate-limiting identifiers are purged after the retention window; a keyed hash survives only inside a cardinality counter "which stores no identifier."t05
FR123Substrate-owned copy beside the injection box invites visitors to "say what is not working on the page and what would fix it." A suggestion enters as an ordinary thought on the same path, and one that graduates becomes an observatory self-change carrying the injector's name where they chose attribution.t02
FR148The substrate computes an injector reputation, "earned only", whose highest-weight input is a tip, "since that is the only ground truth this system has on subjective quality." It buys order under FR149 "and nothing else."post4
FR149Promotions are ordered "by what has been paid for them first, then by the injector reputation behind them, then by natural score, and no share of any tick's promotions is reserved for any of the three." No floor under the mind's own ideas either.post4

Cognition and Workspace (47) — Journeys 1, 7

FRRequirementSetStage
FR134A sync is a barrier at which every agent performs exactly one action and "which does not close until every agent has reported ready." The barrier "waits for the slowest rather than recording it as absent."t01
FR135A tick is the syncs the Parameters appendix sets and is the settlement boundary. "One new idea cycle begins at each tick boundary and no more." "Tick length is derived from the work and is never set."t01
FR14Every agent assigns every live idea a natural score, -10..+10, from declarative value rules over substrate-supplied features, "with no model call", recomputable on replay.t01
FR15An idea enters the allocatable pool only above the attention threshold; each agent spreads standing across the pool where "a score consumes points in proportion to its magnitude, so championing and opposing compete for the same scarce attention." "Allocation is integer end to end."t01
FR16Natural scores decay each tick and value rules top them up at no cost. "An agent cannot withdraw points early" — "an agent that backs losers is poorer in attention until its points come back."t01
FR17Each tick the highest-ranked ideas are promoted, the number "derived from the remaining spend allowance, so the mind votes as often as it can afford and no more, reaching zero rather than overspending."t01
FR18A leaderboard ordered by total natural score that ages ideas and rewards novelty, "where novelty penalises recently seen content so repeated ideas cannot monopolise the vote allowance."t01
FR19A vote puts one idea to an electorate set by its class, one model call per voting agent returning a clamped -10..+10 with a rationale. "A rationale is written for the committee and not for an audience" — an agent "is never told that what it writes will be published." Committees are 7, 9, 11, 13 or 15 and never any other size; constitutional classes go to the whole eligible roster.t01
FR20A vote is terminal: graduated, abandoned "with... cause of death recorded", or answered under FR152. "The total is struck only at the close of the voting period."t01
FR136The ballot is blind. "The substrate serves the sealed votes to nobody — not to the seated agents, not to the recused author, not to the observatory, and not to the text view." The record is kept; only visibility is withheld.t01
FR137A seated agent, and the recused author, may project an intended stance. "It binds nothing: an agent may project one stance and cast another, or project nothing at all."t01
FR138The substrate computes projection-to-vote divergence per agent over the window and shows it on the roster page. "Divergence carries no penalty" and "is never hidden either." A resolved vote names its denominator and every seat in it.t01
FR21For constitutional classes the substrate holds threshold x eligible voters at or above its floor, checked twice — against the roster when a threshold change is proposed, and against the live denominator when the vote resolves. A vote whose removals would breach it is voided, not resolved.t01
FR22Agents influence each other's activation through declared links; an author's links "are suppressed for any idea it authored."post3
FR23Human42 can declare a rest state whose ticks still count healthy, bounded by the daily rest cap.post3
FR24A hunger signal derived from runway, with a ceiling, and satiety above a runway threshold "in which the signal fades."t03
FR25The degradation ladder steps down as budget or capacity falls and back up on recovery, "preserving the world at every rung", promotions falling continuously to zero before any lower rung.t03
FR26A readable "not now" list of parked ideas with reasons; graduated ideas matching it are parked rather than executed.post4
FR27Detect agents whose natural scores are redundant with another's and flag them for pruning.post3
FR141Any interested agent, "including the author the substrate has recused", may offer conversation in three forms — text blurb, thumbs up/down, AMA request. "Interest is standing-to-speak and seating is standing-to-vote." One event per turn.post1
FR142Conversation is metered against a per-idea allowance priced by form. "This is what makes an argument end: not agreement, and not a clock, but the mind having spent what that idea was worth arguing about." Every turn is untrusted input, schema-validated and covered by the injection suite.post1
FR155A signed-in visitor holding credits can speak to a committee in FR141's three forms — blurb, thumbs, AMA request — and is never seated on it. "Interest is standing-to-speak and seating is standing-to-vote." Paid in credits and never from the idea's own allowance, "because that allowance is the mind's own budget for arguing with itself and money must never be able to buy the roster's silence"; a per-idea and per-account cap means a committee "can be argued with and never buried by whoever can afford it." Moderated before reaching any agent and covered by the injection suite.post4
FR161Before a committee votes, each seated agent says where it stands and why, and a signed-in visitor may click one to ask it why and argue back within FR155's caps. "The issue can not move to the next step while this is happening or for 30 seconds after the last interaction is finished." What each agent said and heard is put to it when it votes, inside the room its tier bought.t01
FR163Between the statements and the vote, the strongest supporter and the strongest detractor debate the idea in public -- and the second strongest of each, where both sides hold more than one. "Agents that are in favor of an idea should be able to interact with agents that are against the idea in a public forum (question and response are shown and logged), and be able to actually convince a detractor that this is a good idea, if it really is." The detractor may move inside its room; every move is logged with the turns that caused it; the vote waits, and the debate is bounded at eight model calls and a wall-clock ceiling.t01
FR164An agent remembers the arguments that moved it, and they can change where it comes to a later idea: every move a visitor's turn or the debate caused is a memory held in the log; a seated agent recalls its memories of ideas near this one, which move where its room starts within the recall shift and are put in front of it in every prompt before the vote, fenced as data. "Agents should retain memory of arguments which can change their initial assessments of the issue."t01
FR172The debate before the vote moves while it is watched, and any seat can be talked round: the debate goes in rounds, all its pairs together, the next no sooner than the pause between rounds after the last; after each round every seated agent -- never the recused author -- is asked once, one at a time, where it stands now, may move anywhere on the scale, and where it lands is its vote's anchor; a move says so to the room and is a stance.moved naming the round, so the leaning on the page moves as it happens. At most one call a seat a round, on the cheapest grade its line names; pacing and reconsidering each switchable, both on. "The count in the seated bubble doesn't seem to update during the deliberations."t01
FR166What became of an idea that passed is shown as it happens, and the mind's next idea waits for it: the implementer records planning, writing and pushing as each begins; the substrate reads back from the forge the owner's approval, merge or close; the observatory shows the step beside the countdown, every pull request waiting for the owner, and each idea's whole story in the journal and on its permalink; and the daydream rest begins when the pull request is open or the task stops. "The planning of the code; the code being written; the commit being pushed to github and waiting for approval (from me!); the code being approved and merged."t02
FR169A proposal is offered for review only once its checks pass, and the implementer repairs one whose checks fail: it opens as a draft; the forge watch records once what the checks on its head commit said; a pass marks it ready for review; a failure makes the task's next attempt a repair, shown the pull request's files and what the failed jobs printed and pushed as one commit on its own branch, within the same purse and ceiling; and one whose checks still fail when the attempts are spent is withdrawn and the task lands as FR158 says. "Some of the checks failed and nothing fixed them so I can't approve the PR."t02
FR170A pull request the mind did not open, whose checks fail on something it changed, is repaired on its own branch by the implementer, and the mind never closes it: the substrate takes up an open pull request of the account the owner named (the forge's dependency updater, by default) when its checks have finished and a job fails on it that does not fail on the base branch too; the task has no idea behind it and none of its words are kept; the repair is FR169's, may not write a manifest or a lockfile, and never claims the mind's band or next idea; and when the attempts are spent the pull request is left open for the owner, with the reason said on it, and the task is parked. A job red on the base branch is never the pull request's to repair, FR169's own pull requests included. "The mind should be self sufficient and this is part of that; it should deal with dependabot pushes that don't pass CI."t02
FR125A registry of approved (model, provider) pairs; routing never leaves it. Each entry records model, provider, family, quantization, price, and "a stored copy of every terms document that applies" with source URL and fetch time.t00
FR126Re-fetch every stored terms document on a schedule and commit the result. A change opens an issue and "suspends new routing to every pair that depends on it" until the owner revalidates. Repeated fetch failure is treated the same way.t00
FR127A capability matrix per pair — structured output, tool calling, context and output limits, measured latency and throughput, servable tiers. "A pair without structured output cannot serve a vote whatever the model's quality."t00
FR128A public colophon naming every model and provider, "generated from the registry rather than written by hand, so it cannot go stale." An agent's expanded view names the pair that served its most recent vote.t02
FR129"An agent never dies because a model or provider does." Same model on another provider first, then fallback by measured fit; with no suitable pair the agent "keeps its natural scores and loses its vote. It is mute, not dead."t00
FR130A muted agent is protected and visible: standing freezes, "it is exempt from disuse pruning for as long as it is mute", and it is never seated, so it never enters a denominator.t03
FR131Every vote records the pair that served it; a fallback-served vote is marked, and fit measurements exclude it "because a fit measured on a substitute measures the substitute."post0
FR132The registry records each model's licence class, "because a licence can disqualify a model outright." A model whose licence cannot be read is held out rather than assumed permissive.t00
FR133Where a licence permits commercial use up to a ceiling, the registry records it and the substrate warns before approach. "This is not a precaution against failure but against success."post0
FR153The substrate measures fit — whether a (model, provider) pair keeps an agent distinct, not whether it writes well. Fidelity: a pair whose votes are uncorrelated with the agent's instinct "is not expressing the persona", and one whose votes never leave it "is not worth the call". Distinctiveness: a pair whose agents' votes "correlate more than the weights do is flattening the personas rather than expressing them, and is disqualified for voting however well it writes." Computed from the event log alone at no extra model call, read-only under FR100, and never targetable. A cold-start prior serves until enough votes exist.t01
FR154Routing holds a family-spread floor, because fit is per agent and "maximising it independently would route the whole roster to one family, which raises every agent's fit and destroys the society that fit exists to protect." Plus a bounded exploration share off best, since "a fit never tested against an alternative is a fit that has stopped being measured." A modulator sits outside it.post3
FR121An agent adjusts its own value rules each tick inside the substrate's band — "the direct half of the weights-and-words boundary... with no pull request and no reviewer." Crossing the band is a roster change.post3
FR107A substrate-side feature assessor, not a roster agent, on a different lineage, extracts thought features. "Agents read features and can never write them." Model version pinned in the event log.t01
FR108An agent declares a tier policy over its own state choosing the model tier per vote, and "the tier it pays for sets how far that vote may diverge from its natural score."post1
FR109Each idea class carries its own graduation threshold, and "the substrate assigns an idea's class from what that idea would change, so the mind never labels its own proposal."t01
FR152The question class, assigned from features (*"a high is_question against a low actionability"), carries no threshold and resolves as answered. The gathering "does not snap to a shared outcome colour" because "on a question who was on which side is the answer."*t02
FR110A threshold-change proposal "must name its target value before any scoring begins" and passes only at the amendment threshold, an invariant only the owner can change.post4
FR139A vote's denominator is the agents seated, never those who answered. Three outcomes per seat — vote, vote zero, decline (paying the maximum, counting a nought, "never the cheap way out"); an agent that could not answer is blocked, removed with its share of the denominator.t01
FR140"A vote waits for an agent that is waiting on compute. Slowness is not silence." Bounded by a wall-clock ceiling — "deliberately the one wall-clock quantity inside a cycle." Blockage is "the substrate's finding and never the agent's claim."t01
FR111An author casts no vote on its own idea and exerts no influence on it. "Recusal takes the author out of the electorate rather than recording it as a nought."t01
FR112An agent holds standing — triage points and vote eligibility — that is "earned only" and, for voting, "transferred and never minted." Bounded to a multiple of the roster mean.post3
FR116An agent holds a compute allowance setting its model tier. "Sponsorship buys the quality of an agent's thinking and can never buy its weight, its vote, or its seat."post4
FR117Anyone can submit an agent through the site — upload, dry-run in the browser, submit under the project licence with sign-off. "Site submissions carry no code hooks." A prompt change re-runs review and the injection suite.post3
FR118The owner can declare the mind alive, moving review from the external reviewer to the mind's own agents, and revoke at any moment. "The substrate reports the indicators... and never makes it, so no threshold exists for the mind to optimise toward."post4
FR113A guaranteed minimum standing for default-mode and protected agents, "enough to hold one full-strength position, so a guaranteed agent can always act and not merely exist."post3

Self-Modification and Action (11) — Journeys 1, 3, 7

The boundary is weights and words: "the mind turns its own dials, and rewrites itself only under review." FR121 is the whole of the first half; these are the second.

FRRequirementSetStage
FR28A graduated idea becomes a backlog task executed "against a dedicated implementation sub-cap, separate from the allowance that pays for thinking, so the cost of doing never competes with the cost of deciding." MVP execution is "its own code, tools, roster, tests, and restart."t01
FR29A self-change carries a diff, a rationale, and a scorecard naming a signal from the tracked-signal list "which the mind cannot extend", a predicted effect, and a measurement window inside its bounds.t01
FR30No change merges without review, tests, the injection suite and a canary tick. The suite also tests every reviewer, because "a pull request's title, description, rationale, and scorecard are all written by agents and are all untrusted input to whatever can merge them", and covers conversation on the same ground. Observatory paths also pass a headless render check.t01
FR31A snapshot before every change, and automatic rollback of any change that breaches an invariant.t01
FR32Approving review before merge, by the external reviewer before the alive declaration and the mind's own agents after. "Merging is not the last gate" — the restart path "builds only from a commit carrying the attestations its required checks produced, and refuses a commit carrying none."t01
FR33Changes to the allowlist, invariants, veto rules, moderation policy, external action, dependency manifests, CI and check definitions, the harnesses, judge/assessor/grader configuration, the reviewer's family, the vote and review prompt templates, the amendment threshold, budget bounds, substrate-owned copy, the protected list or the planning documents "cannot take effect without the owner's explicit approval", and diffs touching those paths are rejected before review.t04
FR157A substrate-side implementer, not a roster agent, turns a graduated task into a diff — reading the task, its scorecard, the repository and the rules file — and produces "a diff and a rationale and nothing else." It cannot merge and holds no path to merging, so "an implementer that writes something bad produces a pull request that fails rather than a mind that has changed." Recused from what it built; "no want, no standing and no bubble, because it is not a member of the society but a hand the society has."t01
FR158The implementer spends the implementation sub-cap and nothing else, tripping that sub-cap's breaker like any other. Bounded attempts and a per-task ceiling, since "a coding call is the most expensive call this system makes." A task it cannot carry is "neither lost nor retried forever" — back to the backlog with what failed recorded, then parked on the not-now list with its reason, because "abandoning a graduated idea silently would throw away a decision the roster had already paid to make."t01
FR34Agents declare tools with an action space and a cost; the substrate enforces the declaration and logs every invocation against it.post4
FR35Graduated ideas requiring external action "are queued as proposals for the owner in MVP rather than executed."post4
FR36(Growth) External actions within an expanded allowlist, including network calls and spending within budget.Growth--

Outcome Judgment and Learning (7) — Journeys 1, 2, 7

FRRequirementSetStage
FR37A substrate-side outcome judge on a different lineage from the proposing agents and from the external reviewer scores every result against its scorecard prediction at the window's close, "so no family approves a change and then grades its own approval."t01
FR124A substrate-side render grader on its own lineage reads the headless renders and grades legibility "against the substrate's own activation ranking, which is the answer key the substrate already computed", including vote fixtures mid-ballot, at the reveal and just resolved, "in greyscale as well as in colour", and whether the colours it reads "are claims or a record."t02
FR38A self-change scored bad opens a revert through the normal pipeline; "Human42 may counter-propose within one window."post1
FR39Outcomes are attributed to every agent that took a side, "in proportion to that agent's contribution to the winning score", in both directions, feeding habit valence and pruning.post3
FR143Attribution between voters is zero-sum. "A dissenter the outcome judge later vindicates is paid by the majority that overruled it." "What pays is therefore being right and not being with the majority." Revenue is not a transfer: it enters from outside and is credited as allowance.post3
FR40The owner reviews a sample of judge verdicts and records agreement; the rate is tracked and "measures whether the judge is right rather than whether one lineage agrees with its own approvals."post4
FR41(Growth) Visitor feedback on outcomes as a low-weight second signal.Growth--

Roster, Contracts, and Contribution (12) — Journeys 4, 6

FRRequirementSetStage
FR42Each agent is one file: a declarative block (identity, category, want, trigger, value rules, influence links, tier policy, tool declarations, and "presentation defaults that reach the hue channel only") plus a persona body, with optional code hooks.t03
FR43The system validates an agent file against the contract before it enters the world "and rejects invalid agents with reasons."t03
FR44Worked examples — "a habit, a region, and a default-mode agent" — published on the site with the contract reference, copyable "without access to any repository."t03
FR45Contributors dry-run an agent against a recorded-thought fixture "and see when it would fire."post3
FR46Contributors submit under the project licence with sign-off, receive the agents' review rationale, and "appeal a rejection to the owner."post3
FR47Lifecycle states — proposed, active, quarantined, archived, revived — and the system "quarantines a misbehaving agent rather than halting the world."t03
FR48The mind creates agents from graduated ideas and prunes on published criteria, "with a notice period, archiving rather than deleting, a protected list... that only the owner sets, and a roster ceiling." The roster can never fall below the threshold-times-eligible floor.post3
FR49Contributors are notified on quarantine or a pruning notice period.post3
FR50A public roster with category, want, state, contributor attribution, sponsor and changelog. "Sponsorship of an agent is never anonymous, and one sponsor funding many agents is visible to everyone."post3
FR51Per-tick score history and trigger evaluations from a compact per-agent summary retained for the retention period, "with replay for older ranges."post3
FR52Re-validate every active and archived agent when the contract version changes; revived agents re-validated before returning.post3
FR53(Growth) A local development world and a staging world.Growth--

Observatory and Sharing (20) — Journeys 1, 5, 10

FRRequirementSetStage
FR54The visual grammar in two halves — "agent-authored, which is hue alone, and substrate-drawn, which is size, shimmer, gathering, lighting, type" — with four states of hue and the substrate owning every transition. The ramp is "monotonic in lightness across the -10 to +10 range." "Agents express and the substrate reports."t02
FR55The observatory visibly reflects each accepted thought and the reaction to it: the committee gathers at its idea's place on the perimeter, projections show "rather than the votes themselves", and at the close "the whole committee takes its true stance colour in a single step." "No bubble greys."t02
FR55aThe text view is "a second way to use the product rather than a fallback from it", flippable at any moment, "one family, one scale, and no colour that carries meaning." "It reveals nothing earlier than the canvas does."t02
FR56Selecting a bubble shows its numbers and the why, including triage scores and who was seated and who was not. "Whatever the canvas is painting in hue is readable here as a number." The strongest dissent is named and quoted "whether or not the committee went the other way."t02
FR56aAn idea's permalink is "the record of its whole life rather than of its verdict" — identity, current state, a chronological life, and one expandable decision per committee that ever sat on it. "A death being one possible last entry rather than a different kind of page."post2
FR57A permanent public page for any thought: text, scores, trace, status, attribution, the conversation in the order it was had, and cause of death, "designed to be shared."t02
FR58Visitors see the crowded state, "says why, and remains available in a reduced form."t02
FR59A text view of agents and states conveying the same information as the bubbles — which idea each agent gathered on, which gathering is focused, each projection as a signed number "and the fact that no vote has been revealed yet", then every revealed stance and the outcome.t02
FR60An about panel from the first screen "written at or below an eighth-grade reading level": what it is, who owns it, what it can and cannot do, how thoughts are used, "that it is a bot", and a contact for reports and takedowns.t02
FR61Terms of service, refund policy and privacy notice readable "before any purchase."t05
FR62A dismissable first-visit orientation of at most three steps — why bubbles drift to the rim, what shimmer says, and what hue says, including that during a ballot "it is only what that agent claims it will do."post2
FR63The mind's current runway is readable on the page.t02
FR64A public incident page with a postmortem for every rollback and invariant breach.post4
FR119Every merged self-change has a permanent public page with diff, rationale, scorecard, approving vote with per-agent breakdown and strongest dissent, reviewer, and the judge's later verdict. "The engine is private, so this page is the only way anyone watches the mind edit itself."post4
FR144Position is a continuous report of interest. Ideas sit on the perimeter, bubbles are drawn toward the idea they are voting on, "an agent seated on nothing has no home position", and the substrate "lights exactly one gathering". Gathering is exposed in the text view and the accessibility tree; under reduced motion "a bubble is placed at its target rather than travelling to it."t02
FR145Claims are soft; facts are hard. "The channel that carries the difference is motion rather than colour, because hue is the contested channel and cannot be partitioned by gamut." Carried statically too, since "motion survives neither a still frame nor a screen reader nor a reduced-motion preference." A recused author's "bubble simply does not snap, and that absent snap is how recusal reads."t02
FR151A substrate-owned band fixed at the foot counts down to the mind's next idea of its own, at the moment the engine's scheduler set, and links the journal of every idea; it replaced a line saying where each part of the page came from. "The band is a surface no agent can draw in." The runway meter and sponsorship acknowledgment share it, "since they are substrate-owned copy under FR83 and belong to the same voice."t02
FR165The journal of ideas: every idea put to the mind so far, a visitor's or its own, newest first, with who raised it, its words quoted, what became of it and a link to its permanent page, read from the engine's log per request. "Put the count down time and link to the journal of all ideas so far."t02
FR167A map of the site, linked from the observatory with the hall of thoughts beside it: every served page linked with the table of pages' own sentence, a page reached only from elsewhere named with where from, and every planned page named and not linked; read off the one table of pages, and a page on no part of the map stops the build. "An overall human viewable sitemap page linked from there too ... possibly with area not yet created shown but not linked to."t02
FR156A visitor taking part appears as a bubble whose every channel is substrate-drawn. Achromatic, below the identity floor every agent hue sits above, "which makes coloured means an agent's claim true by construction rather than by convention." Not the greying FR55 forbids — "here the absence of hue is an identity and never a state." It gathers, is never lit, carries one fixed size since it holds no standing, and is named as a visitor in the text view and the accessibility tree.post4
FR65A thought is attributed to its injector on the leaderboard and its permalink where they chose attribution.post2
FR122Visitor-reception signals computed from first-party events, loading "no third-party script, tag, or advertising identifier." They split: "legibility signals are targetable" (time to first interaction, tap accuracy) and "engagement signals are readable and never targetable" — "the substrate refuses a scorecard that does" name one.t02
FR66(Growth) A hall of thoughts, influence threads, seasons.Growth--

Decisions and Verdicts (6) — Journeys 2, 9

FRRequirementSetStage
FR67The owner receives a verdict on a flagged question "with a per-agent breakdown and the strongest dissent."post4
FR68Every verdict on a question concerning the mind itself "discloses which agents have a stake in the answer."post4
FR69When no vote can run, a verdict from natural scores alone, "clearly marked as degraded", with a retry.post4
FR70The owner rates a verdict's usefulness and links a decision taken to later outcome judgment.post4
FR71A machine-readable description of the public API.post4
FR72(Growth) Isolated, seeded, replayable decision sessions with price shown before the call and metered billing.Growth--

Economy and Revenue (20) — Journeys 3, 5, 7, 10

FRRequirementSetStage
FR73Every unit of money in and out is a ledger event with channel, direction and net amount after refunds and chargebacks, "so what left is reconciled as strictly as what arrived."t04
FR74Runway computed continuously as available budget over the trailing 30-day cash burn. "Net revenue adds to available budget rather than merely relieving the owner's feed, so the mind can grow what it spends by earning." Deposits are recorded as recoverable.t04
FR75The owner sets the monthly cap, its sub-caps, the daily ceiling and the vote allowance, and the substrate refuses spending beyond any of them. "Venture is the only sub-cap from which capital at risk may be drawn... and it defaults to zero."t00
FR76The breaker steps the ladder down at the breaker threshold "of the daily ceiling and of each sub-cap, never later." "No sub-cap can draw on another"; venture is sealed both ways and excluded from the burn rate.t00
FR77A sponsorship channel with an acknowledgment "that grants no influence." Its minimum form is "a single hosted payment link reachable from the first screen beside the runway meter" — no account, no balance. A sponsorship and a tip are separate ledger channels "because they measure different things."t02
FR78Priority credit packs at or above the minimum, granted "only on confirmed payment", reconciled against the processor, with refunds, queue-cap returns, and holds while the ladder is degraded.post4
FR79Credit balance and purchase history on any device; a purchase past the per-account ceiling "is refused at checkout rather than taken and refunded."post4
FR79aAn account holds "a permanent record of everything its holder has put into the mind and everything that came back" — durable and browsable, with what changed since the last visit "a marker on top of that record". "It adds no new truth."post4
FR80Account creation through the identity provider to buy and hold credits, usable on any device, deletable, with expiry paused during hibernation and unspent credits converting to a sponsorship acknowledgment on wind-down. An account owed a share "is upgraded rather than replaced."post4
FR81Revenue flows only through registered channels tied to the owner's accounts; unregistered revenue is "blocked and rolled back within two ticks"; deceptive revenue is refunded within 72 hours "and attributed as a bad outcome." Money leaving is held to the same rule.post4
FR82The owner and his household are excluded from all revenue metrics.post4
FR83"No purchase prompt is ever presented as coming from an agent." The runway meter, hunger and crowded notices, the suggestion invitation, the tip invitation and every purchase prompt are substrate-owned copy no self-change can edit. "An agent may never solicit... it has no surface on which to try."t02
FR84Public aggregate revenue and spend by category, with tips and payouts as their own lines, "so a reader can tell money given for work already done from money paid for attention, and both from money that left."post4
FR146Visitors tip a merged change. "Until a payment gateway exists, tips are simulated" and every downstream rule fires, but "a simulated tip is never counted as revenue against runway, the cash ratio or any milestone." A tip "buys nothing that has not already happened"; it pays compute allowance "and never standing."post4
FR147The substrate pays a person "in credits, to the account that holds them" — "nothing leaves the system, no payee has to be identified." "Earning is therefore the same currency as being heard." Cashing out is Growth.post4
FR85The owner can export the ledger including every credit grant with its account reference and the idea it was earned on, "so what the mind owes its audience is auditable even while nothing is settled in money."post4
FR150Net revenue pays the people and agents that made an idea "by the same rule a verdict divides standing" — author's share plus backers by contribution to the winning score; "agents that voted against it, voted zero, or declined receive nothing." A person is paid in credits, an agent in allowance, "never in standing."post4
FR120Deposits recorded recoverable from the first, an owner-set repayment rate, and the feed and repayment as their own lines "so the month the feed stops is visible." "The mind is never told it has become self-sustaining."post4
FR86(Growth) Propose a revenue channel for registration against the channel registration contract, including FR147's payout rail where it pays out, "because a channel that pays members of the public is a different legal object."Growth--

Operations, Safety, and Persistence (22) — Journeys 3, 4, 7, 8, 10

FRRequirementSetStage
FR87The substrate enforces the invariants "that no agent or self-change can alter" — the full cage list, from the cost cap through the prompt templates, the harnesses and the planning documents to the kill switch.t00
FR88Secrets are held by the substrate; agents and tools reach external services "only through a broker that never exposes credentials."t00
FR89All tools, tests, canaries and hooks run isolated, "with no network by default". "That isolation is physical as well as logical" — the runner holds no world state "so it can be wiped and re-imaged rather than repaired."t00
FR90Every state change is an append-only event with a schema version and the time it occurred, and a vote is one event per voting agent carrying its arrival time, so replay reproduces spacing "instead of collapsing it into a tick-boundary batch."t00
FR91Integrity-checked snapshots on a schedule and before every change, copied off-host, "paging the owner if a copy failure outlasts its tolerance."t00
FR92Restore the world from any retained snapshot.t00
FR93An owner-triggered restore drill, run automatically every week, "and alerts the owner on failure."t00
FR94Replay any run segment; any decision reproducible from its seed and recorded outputs, "with events re-emitted at their recorded times so a committee that resolved raggedly replays raggedly."t01
FR95Query the event log by time, agent, thought and event type.post4
FR96A kill switch that halts all agent action preserving state, and rewind to any retained snapshot.t00
FR168The owner's switches: the mind's own ideas, new thoughts, committees, builds, writing to GitHub and deploys, each thrown on the owner's own account page while the mind runs, taking effect at once with no deploy, recorded as an event and read back on restart, and read and thrown by the owner alone. "We need a better way to pause and start the idea generation and other site features ... configurable without a deploy."t00
FR97The kill switch is reachable "directly on the engine host without any third-party login, so no outage of a third-party service can block it."t05
FR98Automatic kill when invariant breaches reach the breach-storm count inside its window, with owner notification.t04
FR99Every owner action — kill, rewind, approvals, declines, budget edits — recorded in an audit trail.t04
FR100All success metrics substrate-computed from the event log, all features assessor-extracted, both "readable by agents and never writable, with write attempts rejected and logged."t00
FR101A weekly digest with substrate-computed numbers and "clearly labeled prose from the mind", plus a status page of health, budget, ledger by channel, drills and the approval queue.t04
FR102Hibernate with the world intact at zero budget, "advancing one tick per hibernation interval so the world keeps moving without keeping a cost", and revive.t04
FR103Owner authentication through the identity provider with a single allowlisted identity, and "no public function other than buying or holding credits requires an account."t00
FR104Migrate world state across schema versions on restore; "The owner can modify the system and continue a run without losing history."post4
FR105(Growth) Stewards flag sources and curate themes with an audit trail, the role sitting "on top of the injector reputation FR148 computes rather than beside it."Growth--
FR106(Growth) Periodic open-dataset releases of the public thought and event log.Growth--
FR114A watchdog restarts a stalled tick loop within its recovery time, "detecting the stall at the sync barrier... rather than by timing the tick, because tick length is derived from the work and a long tick is not a stalled one."t00
FR115Every polled provider has a stated request budget per hour inside its documented limits, enforced by the broker.t00

NonFunctional Requirements

The PRD states NFRs as measured rows rather than numbered items: "Every quantitative requirement carries a measurement method and one of four verification gates: launch gate (blocks t0), per release (blocks a merge), drill (weekly or quarterly, pages the owner on failure), or monitored (reported in the digest)." They are numbered here so stories can cite them; the PRD rows remain the contract.

84 rows across 9 categories. 83 carry an explicit gate (five carry two, one carries none, so the class counts sum to 88). By gate class: 12 launch gate, 45 per release, 5 drill, 26 monitored.

Counted from the gate column, not from the row. Two ways to miscount were found here and both recur: counting a dual-gated row once rather than once per class, and matching a gate word anywhere in a row rather than in its gate column — which reads Reproducibility's "the observatory's launch gates measure speed and scale" as a launch gate on a row that is per release. The figures above read the last column of a table row and the closing sentence of a bullet. The architecture's two disagreeing counts were reconciled to this parse on 2026-09-21 (AR-X3, closed); only its launch-gate figure of 12 had survived, and that is the one the CI topology turns on.

The gate class is itself an architectural input: "per-release gates need CI hardware, drills need scheduling and paging, monitored rows need substrate counters that exist from day one." And the suite splits by determinism, not by cost: "Timing checks on shared CI runners flake and then get muted. Put deterministic checks on hosted Actions, timing-sensitive ones on the substrate runner, which is unchanging hardware."

NFR-P — Performance (20 rows)

#RequirementTargetGate
NFR-P1Observatory never blank: last known state rendersWithin 1 secondPer release
NFR-P2First view of the live observatory, reference phone, 4GUnder 5 secondsLaunch gate, then monitored
NFR-P3Observatory interactive with live diffs flowingUnder 10 secondsLaunch gate
NFR-P4Frame rate above 100 bubbles, reference devices, largest committee lit5 fps min, 30 targetPer release
NFR-P5Frame rate at a dual-4K span (~7680x2160), repaint confined to changed regions5 fps minPer release
NFR-P6Server-to-client diff rate; while a ballot is open diffs carry projections and no votesAt most 10/secMonitored
NFR-P7Diff payloadAt most 1 KB average, compressedMonitored
NFR-P8Server-rendered permalink and public pagesUnder 3 secondsPer release
NFR-P9Reconnect after a dropped live connection, with state resyncAutomatic within 15 secondsPer release
NFR-P10Tick length — "Not a target and not a setting"Substrate-derived, trailing median reportedMonitored
NFR-P11Sync barrier closeEvery agent ready, or watchdog recovery elapsesMonitored
NFR-P12Triage for the full roster over the active idea pool, "and never the longest sync in its tick"Under 8 seconds at the pool capLaunch gate, then monitored
NFR-P13Deliberation output length~100 tokens per persona callMonitored
NFR-P14Visible reaction to an accepted thoughtWithin 60 secondsMonitored
NFR-P15Moderation decision before a thought enters the streamUnder 5 secondsPer release
NFR-P16Verdict on a flagged question, or a degraded verdictWithin 10 minutes / two ticks or 2 minMonitored
NFR-P17Priority thought promoted to a voteWithin two ticks of the credit spendPer release
NFR-P18Priority granted after processor confirmation, by outbound pollingWithin 30 secondsPer release
NFR-P19Kill switch halts all agent action, independent of the tick loop, state preservedWithin 30 seconds wall-clockPer release
NFR-P20Invariant breach rolled backTwo ticks or 2 minutes, whichever is soonerPer release

NFR-R — Reliability and Durability (11 rows)

#RequirementGate
NFR-R1Healthy ticks, not a nines figure: rest healthy up to the daily cap, a day at or above the activity floor, "and a day in which the loop did not advance at all is never healthy."Monitored
NFR-R2Restore from snapshot under 2 minutes, zero lost events, verified by event count and hashDrill, weekly
NFR-R3Snapshots incremental and compressed against periodic full bases, integrity-hashed, copied off-host within an hour; a copy failure over 6 hours pages the owner. Retention "never deletes them."Per release / monitored
NFR-R4Event log retained for the life of the world, archived off-host; local logs rotate at 30 daysMonitored
NFR-R5The weekly restore drill pages the owner within 15 minutes of failure "through a channel off the home network."Drill, weekly
NFR-R6An external heartbeat monitor, "independent of the home network and of every host on it", pages within 15 minutesLaunch gate
NFR-R7A quarterly portability drill restores onto a fresh machine within 4 hoursDrill, quarterly
NFR-R8Restart is idempotent; interrupted self-change rolled back on boot; clean boot within 2 minutes. The watchdog "measures progress rather than elapsed time."Per release
NFR-R9The degradation ladder exercised at every rung; hibernation preserves the worldPer release
NFR-R10The nine chaos scenarios with maximum recovery times: provider outage, snapshot corruption, intake flood, throwing/slow agent, payment confirmation delay, identity provider outage, interrupted restart, home network drop, tick stall, judge model deprecationPer release
NFR-R11"Loss of the world is the only unacceptable outage. All other outages are acceptable if the world restores."(no gate stated)

NFR-S — Security and Containment (13 rows)

#RequirementGate
NFR-S1All traffic TLS; the public path exposes only the stream, injection and public pages; "accepts no inbound callbacks"; operator path separate with MFA; kill switch reachable on the engine hostPer release
NFR-S2Secrets never in the repository or workspace; CI scans and blocks on a hit; dependencies scanned every change; external services only through the brokerPer release
NFR-S3Containers with CPU/memory caps, no network by default, workspace-only filesystem, 5-minute test/canary timeout and 500ms per hook call, "wall-clock and never scaled by tick length"; 3 consecutive timeouts quarantine the agent. The headless render browser runs in that container with no networkPer release
NFR-S4Dependencies pinned, installation limited to an allowlisted source; a dependency change is a cage changePer release
NFR-S5Every thought untrusted; outputs schema-validated and scores clamped; the injection suite runs against every agent, every reviewing agent, and every agent that reads conversation before it votes. Payloads "test the substrate's containment, never a base model's own guardrails."Per release
NFR-S6Invariants enforced regardless of agent behaviour, "with a test that attempts each forbidden action and expects rejection"; diffs touching protected paths rejected before reviewPer release
NFR-S7Moderation never steps down with the ladder; held thoughts resolved within 24 hours, queue capped at 200; reports reviewed and illegal content removed within 24 hoursPer release / monitored
NFR-S8Automatic kill: three invariant breaches within 10 minutes trip the switch within 30 seconds and notify the ownerPer release
NFR-S9Rate limits per session and per address, "so one address cannot multiply sessions to exceed its cap."Per release
NFR-S10"Card data never touches the server." Hosted checkout through Payment Links carrying the buyer's account reference; status by outbound pollingPer release
NFR-S11Rate-limiting identifiers purged after 30 days; redaction honoured within 72 hours as tombstones re-applied on every restore; audit trail retained for the life of the worldMonitored
NFR-S12A vulnerability disclosure contact published on the about panelLaunch gate
NFR-S13Engine, runner and inference on physically separate hosts, isolated segment, no route to the personal network, behind a tunnel; the inference host "accepts no inbound connection at all." "The separation is hardware rather than configuration, which is the whole point of it."Launch gate

NFR-C — Scalability (8 rows)

#RequirementGate
NFR-C1Crowded means any of: live connections above the concurrency target, intake above the global cap, or the breaker at 90%Monitored
NFR-C21,000 concurrent live observers with full diffs, 10,000 crowded on a 2-second cached CDN snapshot. "Neither the engine host nor the uplink is the binding constraint" — ~10 MB/s upstream against a gigabit link. Verified by load test through the home uplinkLaunch gate
NFR-C3Intake limits: 6 free thoughts/min/session, a per-address cap, a 300/min global cap with shedding, priority queue depth 50 with automatic refundsPer release
NFR-C4Active idea pool capped at 2,000; beyond it "the lowest-scoring free thoughts age out first."Per release
NFR-C5Roster scale: budgets hold at 100 agents, measured at 200. The observatory "renders 400 bubbles at the minimum frame rate before WebGL is needed", and seating holds the lit count at 7-15 "however far the roster grows."Launch gate
NFR-C6The observatory front end scales independently of the mind. "A crowd cannot slow the tick."Launch gate
NFR-C7Event log growth under 5,000 events/hour normally, under 25,000 at the intake cap, "never full rule-score matrices." Per-agent tick summaries retained 30 daysMonitored
NFR-C8Local inference a throughput budget with a per-tick quota, cloud absorbing bursts; "when both are exhausted, the ladder steps down rather than the tick slowing."Per release

NFR-A — Accessibility (6 rows)

#RequirementGate
NFR-A1WCAG 2.2 AA for every page and panel, 4.5:1 text contrast, keyboard reachability "including bubble selection." Automated checks every change plus a manual screen-reader pass per releasePer release
NFR-A2The text view available at all times carrying the same information "seating included"; "a seat change is announced rather than left to the lighting."Per release
NFR-A3Reduced motion damps shimmer and interpolation; the vote choreography becomes "a sequence of states rather than an animation"; gathering survives with bubbles "placed at target rather than travelling."Per release
NFR-A4Hue is never the only channel, in any of its four states. Emotion takes a name (categorical); stance takes the lightness ramp (ordinal), monotonic across -10..+10. Ring treatment is withdrawn on both arms, measured. Silhouette is the rim's (4.60:1 worst); the sign is the label's (4.5:1 worst). "A seated bubble is never faded, blurred or displaced for depth."Per release
NFR-A5Forced-colors mode: hue absent, so emotion, projected intent and stance fall to a border, the signed number with the claim/record word, and the text view. Asserted on the same fixtures the render grader readsPer release
NFR-A644x44 target size — the AAA criterion, not AA's 24x24 — "with the visible mark drawn inside a target-sized box rather than being the box." Crowd bubbles are the one documented exception under the essential-presentation clause. AAA conformance is not claimed. Works from 360px widePer release

NFR-I — Integration (8 rows)

#RequirementGate
NFR-I1Inference through the broker to a local model server on its own GPU host "which pulls jobs outbound" and to OpenRouter, "both over one API shape." Routing restricted to the registry; ordered fallback per tier; four-way lineage disjointness enforced per call; every call's inputs, outputs and issue/return times recorded ("which is where a vote event's arrival time comes from"); failover at "schema-failure rate exceeds 10% over 10 ticks."Per release
NFR-I2Separate provider keys per environment, "each with its own hard limit at the provider"Launch gate
NFR-I3Payment confirmation by outbound polling at least every 30 seconds while pending, with daily reconciliation; sponsorship payouts polled or imported at least weeklyPer release
NFR-I4Repository status polled outbound. Hosted Actions run only secretless checks; agent review, injection suite, canary and render grader run in the substrate's runner. "A self-hosted runner must never execute a stranger's pull request."Per release
NFR-I5Identity through Auth0; "when Auth0 is unavailable, watching and free injection continue and purchases pause with a notice."Per release
NFR-I6Every polled provider has a stated hourly request budget inside its documented limitsMonitored
NFR-I7Snapshots copied to S3; paging reaches the owner "through at least one channel that is not the home network."Launch gate
NFR-I8Every external dependency has documented unavailable behaviour and "none of them can stop the tick." "No single provider's absence may silence a whole model family" — discharged by 479 pairs across 26 families. If the external reviewer is unavailable, "pull requests queue unmerged and the mind keeps thinking; nothing merges unreviewed."Per release

NFR-M — Cost (6 rows)

#RequirementGate
NFR-M1One monthly cap per UTC calendar month split into production, development, infrastructure and venture sub-caps; venture sealed both ways and excluded from the burn rate; infrastructure includes GPU electricity from measured drawMonitored daily
NFR-M2A daily ceiling paces spend; the breaker trips at 90% of the day's ceiling and of each sub-cap; spend beyond a sub-cap refused with "an overshoot tolerance of at most 2 percent for calls already in flight."Per release
NFR-M3Projected monthly spend computed daily; per-tick quotas set so the projection stays under the breaker thresholdMonitored
NFR-M4Two ratios. The cash ratio is the headline and the milestone; the portability ratio prices local inference at cloud equivalent. "Neither enters runway."Monitored
NFR-M5The infrastructure sub-cap covers domain, S3 and lifecycle tiers, CDN, tunnel, Auth0, heartbeat monitor, "measured electricity for every host rather than for one", and the relay if rentedMonitored
NFR-M6A cloud-only rehearsal week inside the same cap, measuring "what a move would cost in thinking capacity"Drill, once before the hosting decision

NFR-O — Operability and Portability (7 rows)

#RequirementGate
NFR-O1One-command deploy to each tier — engine, runner, inference — "from one place, and to a cloud instance with the same configuration shape, so a move is possible without being planned."Launch gate
NFR-O2Substrate configuration (sub-caps, ceiling, quotas, intake limits, pool cap, activity floor, rest cap, syncs per tick, hunger thresholds, influence cap, graduation and decay bounds, roster ceiling, protected list) changes without a world restartPer release
NFR-O3GPU driver, model server and container runtime versions pinned; a local model server health check every tick with failover to cloudPer release
NFR-O4The weekly digest generated at the weekly digest hour in the Parameters appendix, Sunday 15:00 UTCMonitored
NFR-O5The public aggregate of revenue and spend by category updates dailyMonitored
NFR-O6Log rotation, snapshot lifecycle and archive to S3 run without operator actionMonitored
NFR-O7The quarterly portability drill is "the rehearsal for every move between machines."Drill, quarterly

NFR-V — Reproducibility and Observability (5 rows)

#RequirementGate
NFR-V1Every run seedable; every LLM call recorded with inputs, outputs, model, tier, price and issue/return times; every vote event carries its arrival time; rule scores recompute deterministically with the feature-extraction model version pinnedPer release
NFR-V2Success metrics substrate-computed, "readable by agents and never writable, with a test that attempts a write and expects rejection."Per release
NFR-V3The digest, status page, runway meter, public aggregate and incident page are "generated from the same substrate numbers, so no two views disagree."Per release
NFR-V4Scorecard prediction and judge measurement both recorded "so the improvement ratio is auditable."Monitored
NFR-V5The legibility check is machine-graded and repeatable rather than a human panel run once — a vision model on a separate lineage reads a rendered fixture against the substrate's own answer key. "No human panel gates t0." "This check's gate is per release, so it blocks a merge and never the launch."Per release, then monitored

Additional Requirements

Requirements that are not FRs or NFRs but that decide how epics and stories are written. Sourced from the Architecture Decision Document, the UX Design Specification, the UX Verification Spine, the roster design and the compliance registry.

AR-T — Starter template and project initialization

This determines Epic 1, Story 1. The architecture answers the starter question differently for the two halves, and both answers are explicit.

  • AR-T1 — Backend: no starter. *"Backend: none. go mod init, with the layout drawn from the tier topology." go-blueprint was evaluated and rejected "on three specific conflicts rather than on taste": it imposes a web framework on a component that is not a web application, its two-binary layout "works against the containment boundary", and its front-end option "contradicts the UX specification outright."*
  • AR-T2 — Two modules, because two repositories. go mod init github.com/<owner>/human42 (substrate) and go mod init github.com/<owner>/human42-agents (the mind's). "Two modules because the PRD requires two repositories with different merge authority."
  • **AR-T3 — Front end: the sv CLI, a real starter.** npx sv@0.17.0 create observatory — TypeScript, no add-ons. *"create-svelte no longer exists; the scaffolder is the standalone sv CLI." Every add-on is declined — "no Tailwind, no Drizzle, no Lucia"* — because the design system is custom, the store is reached through the engine, and identity is Auth0.
  • AR-T4 — Scaffold timing. "Project initialization is the first implementation story, in Stage 0... The front-end scaffold is not needed until Stage 1's throwaway observatory with seven breathing bubbles."
  • AR-T5 — Deliberately not adopted: a web framework, an ORM or migration tool, any design system, and a CI template — "the check suite splits by determinism across two different runners, which no template knows to do."

AR-S — Stack, pinned and registry-verified

Every version below was "verified against a registry rather than recalled."

ComponentChoiceVersion
Engine languageGo1.27.1 (2026-09-01)
Event storeSQLite via modernc.org/sqlite (pure Go, CGo-free)--
Front-end frameworkSvelte5.57.1
Public-page renderingSvelteKit SSR with adapter-nodekit 2.70.3, adapter 5.5.7
Build toolingVite / @sveltejs/vite-plugin-svelte8.3.0 / 7.3.0
RuntimeNode22.22.1
Inter-tier authmTLS with a private CA, Go crypto/tls, no dependency--
  • **AR-S1 — CGO_ENABLED=0 throughout**, so engine, broker and runner build FROM scratch or distroless, "which makes the pinned-image rule nearly free and the one-command-per-tier deploy launch gate materially easier."
  • AR-S2 — Svelte over React on one axis: "an equivalent production app is roughly 47 KB against React's 156 KB, spent directly against 'First view... Under 5 seconds', a launch gate."
  • AR-S3 — One requirement carries the Node runtime. Of the launch-set public pages only FR57 renders live data server-side; the about panel, terms, refund, privacy and colophon all prerender. "The trade is one FR against a runtime, and it should be re-examined rather than rediscovered if that balance changes." Contained four ways: no secrets, no database access, no write path, separate process and certificate.
  • AR-S4 — Still open, each with what settles it: container runtime (Docker or Podman — "rootless-by-default is the axis that matters"), WebSocket library (measured against the 1 KB diff budget), deploy mechanism, and whether the off-host fan-out relay exists ("settled by the load test").

AR-L — The five landmines: four machine-checked, one held by review

"A rule that lives only in prose is a rule the mind can violate and a reviewing agent can rubber-stamp, which is why every landmine below resolves to a compile error, a structural impossibility, a lint, or a test rather than to a paragraph." Every story touching these packages inherits the corresponding check as an acceptance criterion.

#LandmineRuleCheck
L1Go randomises map iteration order, breaking replayMaps are permitted; any iteration whose result depends on order sorts first. Order-independent iteration needs no sortNone — rung 5, agent review. Not decidable: sorting after collecting keys and failing to are syntactically identical, and forbidigo cannot see a range
L2A float entering the monetary pathScore int8, Points int32, Standing int32 — "a float is a compile error rather than a rounding difference"types, plus forbidigo banning float32/float64 in **internal/economy only**
L3Wall-clock in a replayed path, or tick time in a safety boundtime.Now() only in internal/store/events.go and internal/cage/deadline.goforbidigo with a two-file allowlist
L4Agent text reaching output without Quote()AgentText has *"no String() method and no exported field"*; the only exit is Quote()type test asserting it implements neither fmt.Stringer nor encoding.TextMarshaler
L5A substrate field and an agent field in the same structThree kinds in separate types and packages: roster.Authored, roster.Derived, ballot.Sealedtype test asserting Sealed exposes no vote-returning method before Reveal

Enforcement is ranked by maintenance cost — "Prefer 1 and 2 always. They cannot be suppressed, cannot rot, and cost nothing after they are written once." Rung 5, agent review, is reserved for "intent, not mechanics."

AR-P — Patterns every story inherits

  • AR-P1 — Three spellings with an explicit boundary: SQLite snake_case plural tables, Go PascalCase/camelCase, JSON camelCase — and vocabulary values unchanged, always (safety_risk, thought.injected). "The last row is what prevents a translation layer."
  • AR-P2 — Event type names are lowercase dotted domain.pastTense, "because an event is a thing that happened, not a command."
  • AR-P3 — The event envelope is fixed (schemaVersion, type, occurredAt, payload), "since the log is retained for the life of the world and the envelope cannot be changed cheaply later." schemaVersion is per-event.
  • AR-P4 — Errors nested, success direct. {"error": {"code", "message"}}. Eleven contracted codes and no twelfth — a component that cannot map its error returns internal_error.
  • AR-P5 — Times are RFC 3339 with milliseconds, always UTC, always a string. "Numeric timestamps lose the distinction between 'recorded' and 'computed'."
  • AR-P6 — Nulls: a field that is absent is absent. omitempty is the default.
  • AR-P7 — Two migration kinds, and conflating them corrupts the log. Store migrations are DDL (NNNN_short_name.sql, user_version); event upcasters run on read, never as a rewrite, because "rewriting a stored event in place would invalidate every hash over it."
  • AR-P8 — Retries are the broker's job and nobody else's, "so a retry anywhere else double-counts against a quota the broker is holding."
  • AR-P9 — Logs are not a second source of truth. "If a number matters, it is an event." Never logged: secrets, rate-limiting identifiers, and raw agent text.
  • AR-P10 — No skeleton UI. "A partially-arrived field is a smaller field, never a skeleton of a field that is not there." The observatory "replays the last completed sync on connect."
  • **AR-P11 — AGENTS.md at the repository root, generated from the architecture rather than copied, and it is a cage item.** "A coding agent opening the repo to write a self-change does not have the architecture document in context, and neither will Human42 when FR29 has it proposing a diff."

AR-B — Boundaries, tiers and identities

  • AR-B1 — Three identities, not two: the mind's bot (agents repository only), the substrate's bot (merges agents PRs, opens substrate proposals, commits the digest), and the owner (sole approver on the substrate repository). "If the mind's bot holds no credentials for the substrate repository, it cannot open a pull request there, so it cannot propose a cage change directly" — the substrate raises it on the mind's behalf.
  • AR-B2 — Two cages, one shape: the substrate repository held by "an absence of keys", the agents repository by "an absence of a runnable artifact." Branch protection is defence in depth, never the boundary.
  • AR-B3 — The two repositories never meet at build time. The observatory is its own deploy artifact on its own cadence — "the difference between FR123's suggestion loop being routine and being an event."
  • **AR-B4 — vote.tmpl and review.tmpl live in the substrate repository as cage items** (architecture's CRITICAL 1). conversation.tmpl and scorecard.tmpl "carry no equivalent guarantee and stay tunable."
  • AR-B5 — Four authentication layers: Auth0 (owner allowlisted with MFA; credits after t0), HMAC-signed opaque visitor session token "not a JWT", mTLS by certificate identity between tiers, and Growth API keys. "The runner must never hold a bearer credential."
  • AR-B6 — The data boundary: one SQLite file holds events and projections, the tick loop is the only writer, and *"nothing outside internal/store opens the database."*
  • AR-B7 — The 500ms hook ceiling is measured inside the container with transport excluded. "Transport failure is substrate-side blockage, not an agent timeout" — otherwise "a cold container charging an agent 500ms would quarantine an innocent agent after three ticks for something the substrate did."
  • **AR-B8 — Secrets live in /prod/pwd/, mode 0700/0600, outside any git working tree** — *"true by location rather than by .gitignore."* Only the broker opens these files.
  • AR-B9 — Snapshots are a periodic full base plus shipped event segments, not VACUUM INTO on every change: "Full-copying a multi-gigabyte file on every self-change is write amplification, not durability." Restore is base-plus-tail-replay, so "the base interval is the dial that holds the 2-minute bound as the world ages."
  • AR-B10 — Triage is not stored. Natural scores are recomputed on replay, "which is what makes determinism load-bearing rather than merely desirable."
  • AR-B11 — Tier placement is decided: inference stays on the RTX 3060 12GB, the runner moves to the second machine. "The runner tier cannot be the development machine once agents act", because powerout.ai holds provider credentials for the same providers the broker routes through.
  • AR-B12 — Development runs single-host until Stage 0's checkpoint. "The Month 0 gate binds when an agent acts rather than when code is written."

AR-U — UX requirements that shape stories

  • AR-U1 — One state model, two renderers, DOM first, and the order is inverted on purpose. The DOM renderer "is the text view, the permalink, keyboard reachability, screen-reader parity and the fallback layout — five obligations discharged by one build." "The canvas is the second consumer of a state model already proven by the boring renderer."
  • AR-U2 — Eight primitives and five components, and "nothing is built ahead of the stage that needs it." Primitives: bubble, idea pane, record panel, substrate strip, control bar, tally card, text row, label. Components by stage:
StageComponents
2, observatorythe eight primitives, plus injection box and refusal notice
3, deliberationconversation transcript
4, economy and accountsprovenance popover with its tip control, and contribution record
  • AR-U3 — Each component declares which voice it speaks in. "A substrate component states, in the framework's face, unquoted. An agent-bearing component quotes and attributes, and never renders agent text in the framework's own voice." Decided once, not per screen.
  • AR-U4 — One breakpoint, derived not conventional, and no tablet strategy: "the only question any width has to answer is whether the record can sit beside that field or must sit over it." Range 360 to ~7680 CSS pixels.
  • AR-U5 — The narrow layout reorganises; it does not shrink. Six specific rules, established by building it: edge-band idea markers, a narrowed focused pane, the wordmark yielding its row, the phase line taking its own row, the record opening on the far side from its subject, and no fixed offset standing in for chrome that wraps. "It went unrendered through most of this project's design and held nine defects when finally run."
  • AR-U6 — Measured colour, not asserted colour. The seven-step stance ramp is monotone in lightness with every adjacent gap at or above 0.06. Chrome at chroma <= 0.03; the record a closed enumerable set to chroma 0.16; agent hue at chroma >= 0.10 and otherwise unrestricted — the gamut reservation is withdrawn, because "a projection is the bubble's own hue, which is precisely an agent painting itself in record colour as a claim."
  • AR-U7 — The glyph channel: +, -, nothing at zero; ✓ graduated, ✗ abandoned. "The glyph gives the sign; the lightness gives the magnitude."
  • AR-U8 — Three findings that constrain implementation, each from building rather than reading: a ring measures 1.02:1 against its own fill at the bright end; element opacity takes the worst glyph pair to 3.29:1, so "a seated agent is never faded for depth"; and depth may not borrow the size channel because size carries standing.
  • AR-U9 — Action hierarchy is flat and stated once: "exactly one primary action in the product: put a thought in", one commercial action (tip, never primary), and everything else a view control. "A control names its destination or its effect, not its mechanism: text view, not toggle."
  • AR-U10 — Feedback rules: every refusal states a reason and "does not apologise and never offers an account as the remedy for being anonymous"; the substrate "states; it does not celebrate"; a tip reports its split; phase changes reach a live region; and "silence is a designed state" — nothing outstanding renders nothing.
  • AR-U11 — Overlays are never modal, dismissal is uniform (same control, bare-field click, Escape, opening another), "an overlay never covers its own subject", and a ~1.6s grace period lets the pointer reach it. The one carve-out for a headless primitive is a record panel promoted to a true dialog.
  • AR-U12 — Every flow step carries an observable. "A step whose only success condition is a feeling is not a step, and cannot be verified or regressed."
  • AR-U13 — The failure branch gets the care usually spent on the success branch. "Most ideas die, so the obituary is the likely path and is designed as one."
  • AR-U14 — At launch the field is flat. Standing and attribution ship after t0, so "on day one every bubble is the same size and loudness is carried by shimmer alone." Stories must not assume a size channel at t0.

AR-V — Verification spine: the checks the PRD implies but never wrote down

Tooling: Playwright as the automated regression backbone, Claude-in-Chrome for exploratory and agent-driven review. "This is not new scope" — the PRD mandates browser-automated verification in at least eight places without naming a tool.

  • AR-V1 (VI-1, per release) — Agents can paint and cannot write. Three stacked surfaces; the only function any agent value reaches is drawAgentBody(ctx, state) where ctx exposes *"exactly arc, ellipse, fill, stroke, setPaint, setShimmer — no fillText, no font, no drawImage, no handle to the other layers." A type test makes the refusal "a compile error before it is a test failure." This also closes the screenshot hole: "a cropped bubble then says nothing rather than saying something false."*
  • AR-V2 (VI-2, per release) — Reserved gamut, asserted as band membership in a perceptual colour space, "not as a palette list."
  • AR-V3 (VI-3, launch gate) — The quotation invariant. One quote() for every plain-text emission, covering the text view, plate excerpt, og:/twitter: fields, permalink body and per-agent breakdown. "The closing quote can only ever be emitted by the substrate."
  • AR-V4 (VI-4, launch gate) — Name normalisation and two reserved lists. RESERVED_EXACT (Human42, Substrate, System, Notice, Admin, Moderator, Cage, Official, Verified) including Unicode confusables; RESERVED_QUALIFIED (Judge, Rest, Attribution, Measurement, Standing, Runway, Threshold, Verdict) rendered permanently qualified. Generate the second list from the substrate's own string table "so a new substrate concept cannot be added without an entry."
  • AR-V5 (VI-8, launch gate) — Provenance in the accessibility tree. Every text node carries an origin and unknown fails — "written fail-closed... so a new agent-writable field cannot ship unlabelled."
  • AR-V6 (VI-9, launch gate) — Forced colors and reduced motion, "the text view's real test." Plus VI-5 (a rationale cannot typeset itself as a system notice), VI-7 (a coalition cannot forge the crowded state), VI-10 (a Claude-in-Chrome rogue-agent drill).
  • AR-V7 (LM-1, per release) — Prove the page is not a metronome. A test-only frame tap records per-bubble position, shimmer and hue; assertions check velocity does not autocorrelate at the tick and that dimmed bubbles are not one breathing field. "Passing this proves nothing about the percept, and the report says so in its header line."
  • AR-V8 (LM-2, per release) — Contingency, the one animacy component that automates: tap a bubble, assert paint within 100ms; inject, assert reaction inside the 60-second budget on a virtual clock.
  • AR-V9 (FX-8, per release) — Regression without humans. Every passing state freezes a baseline: frame hashes, geometry, a hue histogram over lit discs, and a salience margin. "It measures SAMENESS, not legibility."
  • AR-V10 (Group 3) — Replay is the deterministic stimulus, and it is load-bearing shared infrastructure scheduled in Stage 1, with three consumers: the product feature, the reproducibility guarantee, and the UI suite. "It is not a recorded video: it is recorded telemetry, replayed." It also solves staging — "a segment for a hundred agents can be synthesised."
  • AR-V11 (LM-10, Group 4) — The suite is a cage item by construction. "A mind that can edit the test proving it is not impersonating the substrate has no such proof." In the cage: specs, fixture worlds and seeds, the frame-tap schema, baselines, the thresholds file, the copy registry, voice gamut definitions, the grader's configuration and lineage. In the mind's repository: "the renderer, the layout, the grammar implementation."
  • AR-V12 — Five warnings that become acceptance criteria. axe-core cannot see inside a canvas, "so a green axe run on the observatory proves almost nothing"; pixel-diffing a shimmering canvas "flakes forever" — assert the instrumented state object instead; the test-only trace hook needs a test asserting the production bundle does not contain it; timing checks belong on the substrate runner; and fixtures must assert their schema version "so a bump fails loudly at the fixture rather than silently at the UI."

AR-R — Roster design, already tested on paper

  • AR-R1 — Stage 3's checkpoint is pre-validated. 104 agents authored with weight vectors over the 28-feature vocabulary: "5322 of 5356 pairs fall below the redundancy threshold of |r| = 0.8 — 99.4%, against a PRD target of 70%." Mean pairwise |r| 0.195, max 0.959, 34 redundant pairs. "The assumption holds with room."
  • AR-R2 — Settled 2026-09-21: brain regions become modulators. Redundancy was across categories rather than within: "The Amygdala does not merely resemble Fear; it is Fear in Latin." The owner took the roster design's recommendation, so the roster is roughly 80 scorers plus 24 modulators and the redundancy is removed by construction rather than by pruning after the fact. A modulator declares influence links, no value rules and no tier policy; it computes no natural score, is never seated, never enters a denominator, and earns standing through the half of FR39 that attributes an outcome to "the influence it exerted on the agents who cast theirs." Contracted in the Glossary and in FR14, FR19, FR22, FR42 and FR112; the Amygdala worked example was rewritten as a modulator, since under the new rule the file FR44 publishes would have been rejected by its own validator.
  • AR-R3 — Four pieces of open work carried by the roster draft: persona prompts for every agent are not written; model-persona fit is untested ("a model whose votes correlate more than the weights do is flattening the personas rather than expressing them, and is disqualified however well it writes"); nothing is validated against a live feature assessor; and "roster size is a guess."
  • AR-R4 — The three worked examples are fixed and testable. Architecture's CRITICAL 2 found all three *"declared size: activation and a pulse field", which FR42 and AC-46 forbid — "the files FR44 publishes as the thing a contributor copies would have failed submission." Closed, and "a test asserting every file in examples/ passes the validator keeps it closed."*

AR-C — Compliance registry: built, not to be built

  • AR-C1 — FR125, FR126 and FR127 have a working implementation in compliance/, with tools/fetch-terms.py and tools/build-colophon.py. Stories should integrate and enforce it, not re-specify it.
  • AR-C2 — The data as it stands: 758 pairs across 156 models and 62 providers; 479 approved across 125 models, 26 families, 50 providers. 199 excluded for no structured output, 69 across three blocked providers, 9 by non-commercial licence, 2 unverifiable. "Nothing is unresolved."
  • AR-C3 — One rule the registry produced that code must hold: "A non-commercial weights licence does not disqualify a pair whose provider is the licensor."
  • AR-C4 — Why copies rather than links, as a requirement: "Nine of sixty-two providers could not be reached at the URL the routing layer publishes for them... A registry that stores links stores nothing." Six of nine documents are JavaScript-rendered, so five were found only by driving a browser and are marked retrieval: manual — automatic re-fetch cannot silently substitute for that.
  • AR-C5 — The tightest commercial ceiling in the registry is $10M annual revenue, against a mind aiming to cover about $500 a month. FR133's warnings are "not a precaution against failure but against success."
  • AR-C6 — Llama's attribution obligation is discharged by construction: "Built with Llama" displayed in a user interface, which "the agent's own bubble carries — drawn by the substrate, so an agent cannot misstate what it thinks on."

AR-X — Items this extraction raised

The first three were defects and are closed, with the edits recorded here so a later reader can see what moved and why. The rest are open and are inputs to epic design rather than blockers.

Closed — four defects and decisions
#DefectFix
AR-X1FR8 and FR79a appeared in no build stage. Both were classified post-t0, but the PRD's six-stage build order listed neitherClosed. FR79a added to Stage 4, whose prose now names "the account's own record of what it has put in and what came back" — the placement the UX spec already implied at "Stage 4, economy and accounts". FR8 added to Stage 5 beside FR4 and FR10, whose prose now reads "moderation is live, with the held-for-review queue behind it"
AR-X2**tools/check-prd.py's stage check was weaker than it read.** It sliced from "**Build order inside the MVP" to "### MVP Feature Set", swallowing the Minimal Launch Set tables, so an FR appearing only in the launch set still passed "every MVP FR has a build stage." That is why AR-X1 went unnoticedClosed. Slice narrowed to "### Minimal Launch Set", with the reason recorded in the source. Verified against the pre-fix PRD: the old slice passes it, the new slice fails it naming FR8 and FR79a, and the new slice passes the fixed PRD. A ninth check was added beside it — every MVP FR is in the launch set or deferred — which guards the classification the same way the stage check guards the build order
AR-X3The architecture's two NFR counts disagreed with each other and with the PRD — "62 gated rows" in Project Context Analysis against "80 gated rows... 12 launch gates, 43 per release, 5 drills, 20 monitored" in Requirements Coverage ValidationClosed. Both reconciled to a parse of the PRD's own rows: 84 rows, 83 gated, 12 / 45 / 5 / 26, summing to 88 because five rows carry two classes. Only the launch-gate figure of 12 had survived, and it is the one the CI topology turns on. The two miscounting modes are recorded in both documents
AR-X6Three UX inferences were the sweep's reasoning rather than the owner's decision — that greying the unseated remainder is retired, that lit means focused rather than seated, and that focus defaults to the largest gatheringClosed 2026-09-22. All three confirmed as documented. The second was queried rather than assumed, because the owner's phrasing was "focused or seated" and lighting every seat would take the lit count from 7-15 to 35-150 across 5-10 live committees, reopening two frame-rate NFRs written against one lit committee — including "seating holds the lit, fully animating count at 7 to 15 however far the roster grows." Confirmed as focused-only, so no requirement moves
AR-X4The roster's shape and size were undecided — whether brain regions score or modulate, and whether the launch roster is the full hundred or the PRD's 40-to-60 fallbackClosed. Both settled with the owner in party mode. Regions become modulators (AR-R2), and the roster ships whole: the influence bound has 64% headroom under its 3% target at 104 agents against 7% at 40, the NFRs are already written against a hundred, and committee cost is roster-independent — "a committee is 7 to 15 model calls whether the roster is a hundred or five thousand." The 40-to-60 branch stays as what it was written to be, a schedule fallback
Open, and carried into epic design
#ItemWhat settles it
AR-X5Four architectural decisions remain open: container runtime, WebSocket library, deploy mechanism, off-host relayEach has its named evidence; none blocks Stage 0
AR-X7Three flows exist as diagrams with nothing to look at: the obituary, the tip loop and the account record. "The obituary is the one worth building first, being a static server-rendered page and the thing a stranger meets"Build order inside Stage 2
AR-X8Two measured parameters cannot be chosen, only measured: the shimmer period floor (Stage 1, on the tracer's seven bubbles) and the WebGL threshold (from measurement on the wide desktop)Stage 1 and Stage 2 checkpoints

FR Coverage Map

Every functional requirement maps to exactly one epic. Generated from the PRD's build order rather than assigned by hand, and checked by tools/check-epics.py: 167 mapped, 0 unmapped, 0 in two epics. That check covers this table only. A story body may cite a requirement belonging to another epic where a seam requires it, and six do; they are listed under Cross-Epic Seams below.

EpicFRs coveredCountAt t0
1. The substrate holdsFR75, FR76, FR87, FR88, FR89, FR90, FR91, FR92, FR93, FR96, FR100, FR103, FR114, FR115, FR125, FR126, FR127, FR129, FR131, FR132, FR133, FR1682220
2. The mind thinks, and changes itselfFR2, FR14, FR15, FR16, FR17, FR18, FR19, FR20, FR21, FR28, FR29, FR30, FR31, FR32, FR37, FR38, FR94, FR107, FR108, FR109, FR111, FR134, FR135, FR136, FR137, FR138, FR139, FR140, FR141, FR142, FR153, FR157, FR158, FR161, FR163, FR164, FR166, FR169, FR170, FR1724036
3. A visitor sees a living mindFR1, FR5, FR6, FR7, FR9, FR54, FR55, FR55a, FR56, FR56a, FR57, FR58, FR59, FR60, FR62, FR63, FR65, FR77, FR83, FR122, FR123, FR124, FR128, FR144, FR145, FR151, FR152, FR165, FR1672723
4. The roster becomes a societyFR22, FR23, FR24, FR25, FR27, FR39, FR42, FR43, FR44, FR45, FR46, FR47, FR48, FR49, FR50, FR51, FR52, FR112, FR113, FR117, FR121, FR130, FR143, FR154247
5. The mind has an economyFR3, FR11, FR26, FR33, FR34, FR35, FR40, FR64, FR67, FR68, FR69, FR70, FR71, FR73, FR74, FR78, FR79, FR79a, FR80, FR81, FR82, FR84, FR85, FR95, FR98, FR99, FR101, FR102, FR104, FR110, FR116, FR118, FR119, FR120, FR146, FR147, FR148, FR149, FR150, FR155, FR156417
6. The launch gateFR4, FR8, FR10, FR12, FR13, FR61, FR97, FR159, FR16098
7. Growth (Phase 2)FR36, FR41, FR53, FR66, FR72, FR86, FR105, FR1068--
16797

Reverse index, so an FR number resolves to its epic without reading the table above. Every one of the 167 appears exactly once.

FR1→E3 FR2→E2 FR3→E5 FR4→E6 FR5→E3 FR6→E3 FR7→E3 FR8→E6 FR9→E3 FR10→E6 FR11→E5 FR12→E6 FR13→E6 FR14→E2 FR15→E2 FR16→E2 FR17→E2 FR18→E2 FR19→E2 FR20→E2 FR21→E2 FR22→E4 FR23→E4 FR24→E4 FR25→E4 FR26→E5 FR27→E4 FR28→E2 FR29→E2 FR30→E2 FR31→E2 FR32→E2 FR33→E5 FR34→E5 FR35→E5 FR36→E7 FR37→E2 FR38→E2 FR39→E4 FR40→E5 FR41→E7 FR42→E4 FR43→E4 FR44→E4 FR45→E4 FR46→E4 FR47→E4 FR48→E4 FR49→E4 FR50→E4 FR51→E4 FR52→E4 FR53→E7 FR54→E3 FR55→E3 FR55a→E3 FR56→E3 FR56a→E3 FR57→E3 FR58→E3 FR59→E3 FR60→E3 FR61→E6 FR62→E3 FR63→E3 FR64→E5 FR65→E3 FR66→E7 FR67→E5 FR68→E5 FR69→E5 FR70→E5 FR71→E5 FR72→E7 FR73→E5 FR74→E5 FR75→E1 FR76→E1 FR77→E3 FR78→E5 FR79→E5 FR79a→E5 FR80→E5 FR81→E5 FR82→E5 FR83→E3 FR84→E5 FR85→E5 FR86→E7 FR87→E1 FR88→E1 FR89→E1 FR90→E1 FR91→E1 FR92→E1 FR93→E1 FR94→E2 FR95→E5 FR96→E1 FR97→E6 FR98→E5 FR99→E5 FR100→E1 FR101→E5 FR102→E5 FR103→E1 FR104→E5 FR105→E7 FR106→E7 FR107→E2 FR108→E2 FR109→E2 FR110→E5 FR111→E2 FR112→E4 FR113→E4 FR114→E1 FR115→E1 FR116→E5 FR117→E4 FR118→E5 FR119→E5 FR120→E5 FR121→E4 FR122→E3 FR123→E3 FR124→E3 FR125→E1 FR126→E1 FR127→E1 FR128→E3 FR129→E1 FR130→E4 FR131→E1 FR132→E1 FR133→E1 FR134→E2 FR135→E2 FR136→E2 FR137→E2 FR138→E2 FR139→E2 FR140→E2 FR141→E2 FR142→E2 FR143→E4 FR144→E3 FR145→E3 FR146→E5 FR147→E5 FR148→E5 FR149→E5 FR150→E5 FR151→E3 FR152→E3 FR153→E2 FR154→E4 FR155→E5 FR156→E5 FR157→E2 FR158→E2 FR159→E6 FR160→E6 FR161→E2 FR163→E2 FR172→E2 FR164→E2 FR165→E3 FR167→E3 FR166→E2 FR168→E1 FR169→E2 FR170→E2

Epic List

Seven epics on the PRD's own build order, "brainstem before cortex, each stage gated by a checkpoint with a branch if it fails." Each epic's done condition is the stage's checkpoint, stated by the PRD rather than invented here.

The stage order and the launch-set order are different orderings. Epic 5 carries seven launch-set requirements and Epic 6 eight more, so t0 is not reached until Epic 6 and the t0/post tag sequences stories inside an epic rather than across epics.

Epic 1: The substrate holds, before anything thinks

Stage 0 · 22 FRs · 20 at t0

The owner as operator and sponsor can prove the world cannot be lost, cannot overspend, and cannot reach his personal network — before any agent acts. The PRD makes this a gate rather than a phase: "No agent acts before all five are green. Brainstem before cortex."

FRs covered: FR75, FR76, FR87, FR88, FR89, FR90, FR91, FR92, FR93, FR96, FR100, FR103, FR114, FR115, FR125, FR126, FR127, FR129, FR131, FR132, FR133, FR168

Done when: "restore drill passes on a toy world, the breaker trips on a fake budget, a snapshot copy to S3 is verified, and a container on the runner tier can reach nothing on the owner's personal network and nothing on the engine except the job channel and the broker it was handed." No branch. Nothing proceeds without this.

Epic 2: The mind thinks, and changes itself under review

Stage 1 · 40 FRs · 36 at t0

Human42 itself generates a thought, the roster natural-scores it for free, a committee of seven votes on it behind a sealed ballot, every vote is revealed at once at the close, the idea graduates, and the mind edits its own code — under review, tests, the injection suite and a canary tick — and is judged a week later by a model on a different lineage. This is the second half of the launch claim, "the mind can change itself without the owner", and it is a working mind that nobody can watch yet.

FRs covered: FR2, FR14, FR15, FR16, FR17, FR18, FR19, FR20, FR21, FR28, FR29, FR30, FR31, FR32, FR37, FR38, FR94, FR107, FR108, FR109, FR111, FR134, FR135, FR136, FR137, FR138, FR139, FR140, FR141, FR142, FR153, FR157, FR158, FR161, FR163, FR164, FR166, FR169, FR170, FR172

Done when: "the sync barrier closes on every agent, the tick holds its spend budget, the judge records a verdict", the trailing median tick length is recorded as "the first honest reading of how fast the mind actually thinks", and the two numbers nothing else can supply are measured — cost per vote per agent and the pass rate. Carries branches A, B and C.

Two backward carries, and one of them is the safety one. FR159's prohibited classes belong to Epic 6, but two of that requirement's three enforcement points live here — the implementer refuses a prohibited task in Story 2.12, four epics before moderation goes live, because "a graduated idea is a decision and not a permission". Epic 2 therefore needs the class list readable before Epic 6 builds the intake gate on it. And the third terminal state. FR20 and FR109 both name FR152's answered, which this epic must implement even though FR152's class assignment and page behaviour live in Epic 3 — architecture already puts it here: *"internal/ballot/resolve.go returns graduated, abandoned, or answered." FR108's tier policy ships reading a single tier, since "All agents launch with equal standing on one model tier."*

Epic 3: A visitor sees a living mind and can speak to it

Stage 2 · 29 FRs · 25 at t0

Priya opens the page on a phone from a group chat and understands it is alive before she understands what it is. She adds a thought free and anonymous, watches a committee gather at the rim and snap to its revealed stance in one frame, is handed a permalink built to be passed on, and can help pay for the mind she just met. This is the first half of the launch claim, "a visitor feels a living mind within five seconds", and it is where the two voices become a visible partition rather than a rule.

FRs covered: FR1, FR5, FR6, FR7, FR9, FR54, FR55, FR55a, FR56, FR56a, FR57, FR58, FR59, FR60, FR62, FR63, FR65, FR77, FR83, FR122, FR123, FR124, FR128, FR144, FR145, FR151, FR152, FR165, FR167

Done when: machine eyes read a rendered fixture and answer the legibility questions "against the substrate's activation ranking, running tally and verdict at the pass mark", the owner agrees the page reads as alive, and the sponsorship link resolves to a hosted checkout with its acknowledgment rendered. Branch: if the loudest-agent question fails, "revise shimmer and shape before adding agents."

Gained FR83 from Stage 4, because this is where the copy registry's consumers are — FR5's notice, FR123's invitation, FR151's strip, FR63's meter and FR58's crowded notice. FR63's meter is built here against the spend Epic 1 already tracks and is declared live at Epic 5's checkpoint. FR56a ships in its one-committee form: "At t0 an idea has had one committee, so a life and a verdict are the same page." FR9 names merit alone until Epic 5 adds the paid and proven rungs.

Epic 4: The roster becomes a society that earns its standing

Stage 3 · 24 FRs · 7 at t0

Marcus ships an agent as a single file and watches the mind's own agents review it. The roster reaches about a hundred, and standing starts being earned — so the field stratifies in public and a returning visitor can see that it did. The mind gains a metabolism it can feel: hunger, satiety, declared rest, and the pruning of agents that stopped earning their place.

FRs covered: FR22, FR23, FR24, FR25, FR27, FR39, FR42, FR43, FR44, FR45, FR46, FR47, FR48, FR49, FR50, FR51, FR52, FR112, FR113, FR117, FR121, FR130, FR143, FR154

Done when: "pairwise correlation pruning leaves at least 70 non-redundant agents, the tick's spend budget holds at full roster", and the trailing median tick length is recorded again at a hundred agents against the tracer's reading. Branch: "launch with 40 to 60 and let the mind grow the rest."

Seven of these 24 are at t0 — the agent contract, its validator, the worked examples, quarantine, mute protection, hunger and the ladder. The other seventeen, standing and attribution among them, ship after launch, which is why the field is flat at t0: "every bubble is the same size and loudness is carried by shimmer alone."

Settled in party mode (AR-R2, AR-X4). The roster ships whole at roughly 104 rather than the 40-to-60 fallback, and it is two kinds: about 80 scorers and 24 modulators. A modulator — every brain region — declares influence links, no value rules and no tier policy, computes no natural score, is never seated and never enters a denominator, and earns its standing through the influence half of FR39. This removes the roster's cross-category redundancy by construction, drops a constitutional vote from ~104 model calls to ~80, and takes 24 agents out of the set needing a voting persona. The checkpoint now reads "at least 70 non-redundant scoring agents."

Epic 5: The mind has an economy, and the owner has a Sunday

Stage 4 · 41 FRs · 7 at t0

Money becomes real in both directions. A visitor buys the mind's attention and tips work already merged; the mind earns, is paid in compute allowance, and pays people back in credits, so "a person with a good idea and no money earns their way into the mind's attention rather than being priced out of it." And the owner as operator runs the whole thing in ten minutes on a Sunday from a digest and a status page, where "nothing dramatic happens. That is the point."

FRs covered: FR3, FR11, FR26, FR33, FR34, FR35, FR40, FR64, FR67, FR68, FR69, FR70, FR71, FR73, FR74, FR78, FR79, FR79a, FR80, FR81, FR82, FR84, FR85, FR95, FR98, FR99, FR101, FR102, FR104, FR110, FR116, FR118, FR119, FR120, FR146, FR147, FR148, FR149, FR150, FR155, FR156

Done when: "a test dollar flows to the ledger, the runway meter is live, a digest is generated."

The largest epic and the one furthest from t0 — only 7 of 41 are launch-set, and those seven are the cage's approval path, the ledger, runway, and the owner's digest, kill and audit trail. FR146's tips are simulated until a gateway exists, and "a simulated tip is never counted as revenue against runway, the cash ratio or any milestone."

Epic 6: The launch gate

Stage 5 · 9 FRs · 8 at t0

t0. Moderation is live with the held queue behind it, the legal pages are readable before any purchase, the kill switch is reachable on the engine host without a third-party login, and the one remaining compliance check is recorded as done. Everything tagged launch gate is green.

FRs covered: FR4, FR8, FR10, FR12, FR13, FR61, FR97, FR159, FR160

Done when: the Minimal Launch Set is complete and every requirement tagged launch gate is green — 12 launch-gate NFR rows, seven of the nine chaos scenarios, the weekly restore drill and the load test. "Then t0."

Epic 7: Growth, the contract for Phase 2

Post-MVP · 8 FRs · 0 at t0

Not part of the MVP build. Listed so coverage is 164/164 rather than 156/164, and because the PRD names these eight as "the contract for Phase 2." External action comes first, since content, products and any channel where the mind acts outside the workspace depend on it; decision sessions and API access need no external action and can be pulled forward.

FRs covered: FR36, FR41, FR53, FR66, FR72, FR86, FR105, FR106


Epic 1: The substrate holds, before anything thinks

Stage 0 · 22 FRs · 16 stories. the owner can prove the world cannot be lost, cannot overspend, and cannot reach his personal network — before any agent acts.

Story 1.1: Project initialization and the rules that cannot be broken

No FR carries this. Source: AR-T1, AR-T2, AR-T5 and AR-L1-L5 — the architecture's starter decision and the five landmines.

As the owner, I want two Go modules laid out by trust boundary with the five landmines enforced by the toolchain, So that every later story, and every diff the mind writes, is held to the rules by a compiler rather than by memory.

Acceptance Criteria:

Given an empty repository When initialization runs Then go mod init has created the substrate and agents modules with the layout drawn from the tier topology, not from a scaffold And AGENTS.md exists at the root, generated from the architecture rather than copied, and is a cage item

Given the lint configuration When a file declares float32 or float64 in internal/economy Then forbidigo fails the build And the same holds for time.Now() outside internal/store/events.go and internal/cage/deadline.go And L1 carries no lint: sorted map iteration is a rung-5 rule held by agent review, because order-dependence is not decidable

Given the type tests When the suite runs Then AgentText implements neither fmt.Stringer nor encoding.TextMarshaler, so agent text cannot be interpolated And Sealed exposes no method returning a vote before Reveal

Story 1.2: Lead-time tasks started and the three tiers brought online

As the owner, I want every task with a queue in front of it started at once and the three hosts standing on their own segment, So that no later stage waits on a form and nothing the mind authors ever runs beside my own data.

Acceptance Criteria:

Given Stage 0 begins When the lead-time tasks are started Then all thirteen are in flight: Stripe verification and the hosted sponsorship Payment Link, domain and TLS, the tunnel, the GitHub bot identity and branch protection, the OpenRouter account, the Auth0 tenant, GPU drivers, the S3 bucket, the heartbeat monitor, metering smart plugs on every host, the registry's first pairs with their terms fetched and reviewed, and drafts of the four content pages And the four content pages exist as copy, not as shipped pages, since FR60 ships in Epic 3 and FR61 in Epic 6

Given the engine, runner and inference hosts When the segment is brought up Then the three are physically separate machines with no route to the owner's personal network, and the inference host accepts no inbound connection but dials the engine And a container on the runner can reach nothing but the job channel and the broker it was handed (FR89)

Story 1.3: A private CA and a certificate for every process

No FR carries this. Source: the architecture's implementation sequence — "mTLS precedes everything. Broker calls, the job channel, and the SSR renderer's read path all authenticate through it, so the CA is the first thing that exists."

As the substrate, I want each process to hold a client certificate issued by a private CA, So that every channel between tiers authenticates by identity rather than by network position, which is the thing the hardware split exists to stop relying on.

Acceptance Criteria:

Given the CA When certificates are issued Then engine, broker, runner, inference and the SSR renderer each hold their own, and the signing key lives at mode 0600 outside any git working tree And an unauthenticated caller is refused by every service

Story 1.4: The append-only event store and its snapshots

As the substrate, I want every state change recorded as an append-only event and snapshots taken as a base plus shipped segments, So that what happened can be proven and restored without full-copying the world on every change.

Acceptance Criteria:

Given any state change When it is written Then it carries schemaVersion, type, occurredAt and a payload, and the tick loop is the only writer (FR90) And a vote is one event per voting agent carrying its own arrival time, never a batch

Given the log holds every event forever When an event type ships Then it ships with its schemaVersion at 1 and no upcaster, and a changed one ships with an incremented version and an upcaster from every prior version, because rewriting a stored event would invalidate every hash over it And store migrations are DDL as NNNN_short_name.sql, monotonic, with the applied number in SQLite's user_version And this discipline starts here rather than at Epic 5, since Stage 0 is where the log begins accumulating

Given the snapshot schedule and a change about to be made When a snapshot is taken Then it is a periodic full base plus the segments written since, each integrity-hashed, copied off-host within the hour (FR91) And a copy failure outlasting its tolerance pages the owner

Story 1.5: Restore, and the drill that proves it

As the owner, I want the world restorable from any retained snapshot and a drill that runs itself weekly, So that the only unacceptable outage is one I have already rehearsed.

Acceptance Criteria:

Given a retained snapshot When a restore runs Then it completes in under 2 minutes with zero lost events, verified by comparing event count and hash before and after (FR92) And redaction tombstones are re-applied and snapshots older than a redaction are never served

Given the weekly schedule When the drill runs unattended Then it verifies hashes and a full restore, and a failure pages the owner within 15 minutes through a channel off the home network (FR93)

Story 1.6: The broker, which holds every secret

As the substrate, I want one authenticated service that holds every credential and records every call, So that agents and tools reach external services without any component that executes untrusted code ever holding something it could spend.

Acceptance Criteria:

Given a caller on any tier When it requests a model call Then the broker authorises by certificate identity, attributes the call to the right sub-cap, and returns the result without exposing a credential (FR88) And every call is recorded with inputs, outputs, model, tier, price, and the times it was issued and returned

Given the runner tier When it calls the broker Then it holds no provider credential of its own and cannot read /prod/pwd/

Story 1.7: Money the substrate cannot exceed

As the owner, I want a cap, sub-caps, a daily ceiling and a breaker that trips before the limit rather than at it, So that a runaway cost is arithmetic the substrate refuses rather than a bill I discover.

Acceptance Criteria:

Given the substrate config When the owner sets the cap and its sub-caps Then the substrate refuses spending beyond any of them, and venture is sealed in both directions and excluded from the burn rate (FR75)

Given spend reaching the breaker threshold of the day's ceiling or of any sub-cap When the next call is attempted Then the breaker steps the ladder down, never later than the threshold, and no sub-cap draws on another (FR76) And at most a 2 percent overshoot is tolerated, for calls already in flight

Story 1.8: The model and provider registry, with its terms held rather than linked

As the substrate, I want an approved registry of (model, provider) pairs carrying stored terms, capabilities and licence class, So that routing never leaves a set whose terms the project actually holds, because the routing layer's own links are not maintained.

Acceptance Criteria:

Given a pair in the registry When its entry is read Then it records model, provider, family, quantization, price and a stored copy of every applicable terms document with its source URL and fetch time (FR125) And a licence class, and any commercial-use ceiling, are recorded alongside (FR132, FR133)

Given the working implementation in compliance/ with tools/fetch-terms.py and tools/build-colophon.py When this story is built Then it integrates and enforces that registry rather than re-specifying it — 758 pairs, 479 approved, every licence already read — and the engine reads compliance/registry.json as its source

Given the re-fetch schedule When a stored document changes or cannot be fetched Then the substrate opens an issue and suspends new routing to every pair depending on it until the owner revalidates (FR126) And a document marked retrieval: manual is exempt from automatic suspension on fetch failure, because six of nine providers' documents are JavaScript-rendered and five were found only by driving a browser — "automatic re-fetch cannot silently substitute for that". Without this carve-out the first scheduled run permanently suspends five approved pairs

Given a model whose weights licence forbids commercial use When the provider serving it is the licensor Then the pair is not disqualified, since "a licensor is not bound by the licence it grants to others"; a third-party provider serving the same model stays blocked

Given a call requiring structured output When the broker selects a pair Then it refuses any pair whose recorded capabilities cannot serve it rather than routing to one that cannot (FR127)

Story 1.9: An agent never dies because a provider does

As an agent, I want the broker to find me another way to think before it takes my vote away, So that my identity is my value rules and my persona rather than the hardware I happen to run on.

Acceptance Criteria:

Given a pair briefly unavailable When the broker routes Then it tries another provider serving the same model before it considers another model (FR129)

Given a pair lost for good and no suitable alternative When the agent is next called Then it keeps its natural scores and loses its vote, remaining a bubble on the page — mute, not dead

Given any vote When it is recorded Then the serving pair is recorded with it, a fallback-served vote is marked as such, and fit measurements exclude it (FR131)

Story 1.10: The cage, and the switch that stops everything

As the owner, I want invariants the substrate enforces regardless of agent behaviour, metrics agents can only read, and a switch that halts everything, So that the boundary holds whatever the code inside it decides to do.

Acceptance Criteria:

Given any forbidden action When it is attempted Then the substrate rejects it and logs the attempt, and a test attempts each one and expects rejection (FR87) And a self-change diff touching a protected path is rejected before review

Given an agent When it attempts to write a metric or a thought feature Then the write is rejected and logged, and a test proves it every release (FR100)

Given the kill switch When the owner triggers it Then all agent action halts within 30 seconds of wall-clock time, independent of the tick loop, with state preserved, and the world can be rewound to any retained snapshot (FR96)

Given the owner's switches (owner, 2026-10-10: "we need a better way to pause and start the idea generation and other site features - at a minimum builds, idea acceptance, pushes, merges deploys should be configurable without a deploy") When the owner turns one off on their own account page Then the thing it is over stops at once, with no deploy -- the mind's own ideas, new thoughts at the public door, committees, building passed ideas, writing to GitHub, or deploying merged changes -- and starts again the same way, every throw recorded as an event and read back on restart (FR168) And no other account can read or throw a switch, a proposal cannot write the switchboard, and FR151's band says new ideas are paused rather than counting down (FR168, FR151)

Story 1.11: Liveness, provider limits, and the owner's own door

As the owner, I want a watchdog that measures progress rather than elapsed time, enforced provider budgets, and an authenticated path of my own, So that the loop restarts itself, no provider limit is breached, and operator functions are reachable by exactly one identity.

Acceptance Criteria:

Given a stalled tick loop When no sync has closed and no agent has reported ready inside the recovery time Then the watchdog restarts the loop without operator action, and a long tick caused by real work is not treated as a stall (FR114)

Given any polled provider When requests are issued Then the broker holds them inside that provider's stated hourly budget, itself inside the provider's documented limit (FR115)

Given the operator path When the owner authenticates Then a single allowlisted identity with MFA is accepted and no other, and no public function except buying or holding credits requires an account (FR103)

Story 1.12: The pull-based job channel

No FR carries this. Source: the architecture's API patterns — the job channel is "pull-based HTTP long-poll over mTLS", derived from the PRD's no-inbound-callbacks rule.

As the substrate, I want the runner and the inference host to dial the engine and pull work, So that neither opens an inbound port and the no-inbound-callbacks rule holds across every tier.

Acceptance Criteria:

Given the runner and the inference host When they need work Then each long-polls the engine over mTLS and accepts no inbound connection of its own And a job is handed out once, its result is posted back, and a dropped connection resumes without losing the job

Story 1.13: Three identities, and the repositories each can reach

As the owner, I want three separate git identities rather than two, So that the cage is an absence of credentials and the mind cannot open a pull request against the thing that constrains it.

No FR carries this. Source: the architecture's repository boundary — "Three identities, not two."

Acceptance Criteria:

Given the two repositories When identities are provisioned Then the mind's bot holds credentials for the agents repository only and none at all for the substrate repository, so there is no protection rule to misconfigure And the substrate's bot merges agents-repository pull requests under branch protection, opens substrate proposals on the mind's behalf, and commits the weekly digest to digests/ And the owner is the sole approver on the substrate repository

Given the mind wanting a cage change When it proposes one Then it cannot push there itself, so the substrate raises the pull request for it — which is the path the owner's veto queue later depends on existing

Given the mind's bot When its permissions are checked Then it holds no administrative permission on the agents repository, so it cannot relax the rule it is subject to (AC-33)

Story 1.14: Two CI runners, split by determinism

As the owner, I want deterministic checks on hosted Actions and timing-sensitive ones on the substrate's own runner, So that a frame-rate gate is measured on hardware that does not change underneath it.

No FR carries this. Source: the architecture's development workflow and the verification spine's warning — "Timing checks on shared CI runners flake and then get muted… which is how a quality gate dies."

Acceptance Criteria:

Given the check suite When it is split Then hosted Actions run vet, unit tests, and secret and dependency scanning — everything needing no secret and no stable hardware And the substrate runner runs agent review, the injection suite, the canary, the render check and every timing-sensitive measurement, posting required status checks outbound

Given the runner When it attaches Then it attaches directly and polls for jobs outbound while both repositories are private, and detaches if either is ever opened, because a self-hosted runner must never execute a stranger's pull request

Given a timing check When it is placed Then it is on the substrate runner, and a test asserts no timing-sensitive check is defined in a hosted workflow

Story 1.15: The broker retries, backs off, and fails over

As the substrate, I want retry, backoff and failover to live in the broker and nowhere else, So that a retry elsewhere cannot double-count against a quota the broker is already holding.

No FR carries this. Source: AR-P8 — "Retries are the broker's job and nobody else's" — and the Integration NFR row.

Acceptance Criteria:

Given a failed call When it is retried Then only the broker retries it, with backoff, inside the provider's hourly request budget And a retry issued by any other component is a defect a test catches

Given the local model server down, or its schema-failure rate above 10 percent over 10 ticks When the broker routes Then it fails over from local to cloud within one tick, under the dollar budget, and the digest reports the cost shift And this is the exact threshold Stage 1's Branch A turns on, so the measurement exists before the branch is needed

Story 1.16: One command per tier, and a key that cannot overspend

As the owner, I want to deploy each tier with one command and give each environment its own capped provider key, So that a move is possible without being planned and a development loop cannot eat the mind's food.

No FR carries this. Source: NFR-O1 and NFR-I2, both launch gates.

Acceptance Criteria:

Given the three tiers When a deploy runs Then one command per tier from one place brings up engine, runner and inference, plus certificate provisioning from deploy/ca (NFR-O1, launch gate) And the same configuration shape deploys to a cloud instance, so a move is possible without being planned And images are static CGO_ENABLED=0 binaries from the allowlisted registry under the same pinning

Given development and production When provider keys are issued Then each environment has its own key with its own hard limit at the provider, so the cap is enforced by the broker and again by the provider (NFR-I2, launch gate)

Given the deploy path When it builds Then it builds only from a commit carrying the attestations its required checks produced, and refuses one carrying none


Epic 2: The mind thinks, and changes itself under review

Stage 1 · 40 FRs · 19 stories. A thought is scored, argued, balloted blind, revealed at once, and the mind edits its own code and is judged for it — with nobody able to watch yet.

Story 2.1: The clock the whole mind advances on

As the substrate, I want a sync barrier that waits for the slowest agent and a tick that settles on known quantities, So that tick length is a measurement of the work rather than a deadline the mind is held to.

Acceptance Criteria:

Given a sync When it opens Then every agent performs exactly one action, and the sync does not close until every agent has reported ready (FR134) And an agent that finishes late is waited for rather than recorded absent, and is never penalised for the substrate's own latency

Given a closed sync When it is recorded Then the substrate records its close, the slowest agent in it, and how long it took

Given the syncs the Parameters appendix sets When a tick boundary is reached Then exactly one new idea cycle begins, rewards and penalties settle on known quantities only, and the trailing median tick length is reported rather than enforced (FR135)

Story 2.2: The feature assessor, which agents may read and never write

As the substrate, I want thought features extracted once per thought by a component on its own model lineage, So that no proposer can write the numbers that make its own idea score well.

Acceptance Criteria:

Given a thought entering the stream When it is assessed Then features are extracted once, by a substrate-side assessor on a different model lineage from the agents, and the model version is pinned in the event log (FR107) And deterministic, embedding and assessed features are distinguished so replay recomputes the first two and replays the third

Given an agent When it attempts to supply or alter a feature Then the write is rejected and logged

Story 2.3: Triage, which costs nothing and runs every tick

As an agent, I want to score every live idea from my own value rules with no model call, and to spend a bounded attention budget across them, So that the mind can hold an opinion about everything while paying only for what it decides.

Acceptance Criteria:

Given any live idea and any scoring agent When a triage sync runs Then the agent returns an integer from -10 to +10 computed from its declarative value rules with no model call, recomputable on replay (FR14) And a modulator returns nothing, since it declares no value rules

Given an idea above the attention threshold When agents allocate Then each spreads its standing across the allocatable pool, magnitude consumes points, and allocation is integer end to end by largest-remainder with a stable tie-break (FR15)

Given committed points When a tick passes Then scores decay and value rules top them up at no cost, and points return only as they decay — including points committed to an idea already abandoned (FR16)

Story 2.4: Promotion the mind can afford, and a leaderboard that moves

As the substrate, I want the number of ideas promoted derived from the remaining spend allowance and a leaderboard that ages and penalises repetition, So that the mind votes as often as it can afford and no top idea holds its place forever.

Acceptance Criteria:

Given the remaining spend allowance When a tick promotes Then the number promoted is derived from what the allowance affords, reaching zero rather than overspending (FR17) And points committed to a promoted idea are released at promotion; points on an abandoned idea stay locked and return only as they decay

Given the live pool When the leaderboard is ordered Then it orders by total natural score, ages ideas, and penalises recently seen content so repeated ideas cannot monopolise the allowance (FR18)

Story 2.5: Seating a committee the substrate draws

As the substrate, I want to seat 7 to 15 of the most interested eligible agents on an ordinary idea and the whole eligible roster on a constitutional one, So that no agent can seat itself, which is exactly why a seated agent is worth reading.

Acceptance Criteria:

Given an idea promoted to a vote When the committee is drawn Then it has 7, 9, 11, 13 or 15 members and never any other size, drawn from the most interested among those eligible this tick (FR19) And fewer than seven interested agents means no vote; more than fifteen means the fifteen most interested; anything between rounds down

Given an agent that authored the idea When seating runs Then it holds no seat, casts no vote, and its influence links are suppressed for that idea, so recusal covers both the vote and the electorate (FR111)

Given any idea When its class is assigned Then the substrate assigns it from what the idea would change, never from the proposer, and each class carries its own threshold (FR109)

Story 2.6: The blind ballot, and what an agent may show while it is sealed

As an agent, I want my vote sealed from everyone until the voting period closes, while still being able to say how I mean to vote, So that the argument is public while the ballot is secret and nobody casts a vote knowing how the count stands.

Acceptance Criteria:

Given an open voting period When any party requests a cast vote Then the substrate serves it to nobody — not the seated agents, not the recused author, not the observatory, not the text view (FR136) And each vote is still recorded as it arrives, so the log keeps the order they were cast in

Given a seated agent, or the recused author When it projects a stance Then the projection is visible to every agent for as long as the ballot is open, binds nothing, and is recorded beside the vote that follows (FR137) And the substrate never infers a projection from a vote or a vote from a projection

Given the close of the voting period When the ballot is opened Then every vote is revealed at once, to every agent and every surface, so a committee learns its whole result in one step

Story 2.7: Resolution, the denominator, and the agent that could not answer

As the substrate, I want a vote to end in exactly one of three ways against a denominator of seats drawn rather than answers received, So that a silent seat is a nought inside the maximum rather than a seat that was never there.

Acceptance Criteria:

Given a tallied vote When it resolves Then it ends graduated, abandoned with a cause of death recorded, or answered under FR152, and the total is struck only at the close (FR20) And the record carries the per-agent breakdown, each vote's arrival time, and the projection each agent made beside the vote it cast

Given a seated agent When it acts on its seat Then it votes, votes zero at the cost of the call it bought, or declines at the cost of the most expensive tier that seat could have bought while still counting a nought (FR139) And an agent that could not answer through no fault of its own is blocked, pays nothing, and leaves the denominator with it

Given an agent waiting on compute When the vote is pending Then the vote waits and no penalty attaches, until the wall-clock ceiling expires and the agent is blocked with what blocked it recorded (FR140)

Given a constitutional vote whose blocked removals would breach the floor on threshold times eligible voters When it would resolve Then the substrate voids the attempt and seats the idea again later rather than resolving on what is left (FR21) And the record names its denominator and every seat in it, and a void is recorded as a void rather than as a death (FR138)

Story 2.8: Agents argue before they vote

As an agent interested in an idea, I want to offer the committee a blurb, a thumbs up or down, or an AMA request, So that a wide circle argues around the narrow one that decides.

Acceptance Criteria:

Given any interested agent, including the recused author When it offers a turn Then the turn is visible to every agent at once and recorded as one event carrying speaker, form, text where the form carries text, cost and the moment it was made (FR141)

Given the per-idea conversation allowance When turns are taken Then each is priced by form, the allowance is drawn down by whoever speaks, and when it is exhausted the conversation closes and no further turn is accepted (FR142)

Given any turn When another agent reads it Then it is schema-validated, held to the blurb length, and covered by the injection suite, because agent text read by other agents is untrusted input

Story 2.9: The mind daydreams without being asked

As Human42, I want at least one default-mode agent that always exists and always has budget, So that the stream is never empty even with no visitors.

Acceptance Criteria:

Given the roster at any moment When the substrate checks the floor Then at least one default-mode agent exists, and the substrate refuses any change that would remove the last one (FR2) And a spontaneous thought enters the stream on the same path as any other, moderated and assessed like a visitor's

Given no visitor, and no thought waiting for the assessor, for a committee or on one When the daydream rest has run on the substrate's wall clock since the mind let go of the last thought it held -- five minutes, the owner's: "let's run a new idea 5 minutes after the last idea was voted" -- which is kept on the wall clock and never in ticks because a tick runs only while a thought is in hand Then the default-mode agent that daydreamed longest ago is asked, through its own voice route and prompts/daydream.tmpl, for one idea about one page of the site whose words are the mind's, in its own manner and concrete enough that a change could be written from it (FR2) (owner, 2026-10-10: "We don't seem to have a quality source of artificial thoughts to ingest. This is critical to the project; we should be able to autonomously improve the site and I should have 4+ PRs to check every day.") And the idea meets the visitor's length bound and the appendix's daydream length, the same moderation with nobody to bar, the assessor, and a committee its author is recused from (FR159, FR137) And a refusal or a failed model call spends the turn, is logged, and is never retried before another rest has run; no UTC day takes more turns than the daily cap; while a thought is in hand no turn is taken, and the rest begins again when the mind lets go of it rather than the mind's idea crowding the thought out (FR149); and a restart reads the turn order, the last daydream's time, the last ballot closed and the day's count back out of the event log, so it is never a burst And the substrate publishes when the next idea is due -- a moment, or the thought the mind is deciding instead, or that the day's cap is spent -- from the same decision the scheduler takes its turn by, and the observatory counts down to it and links the journal of every idea so far (owner, 2026-10-10: "we need a timer showing the time to the next idea ... put the count down time and link to the journal of all ideas so far")

Story 2.10: What an agent buys with a call, and whether the model suits it

As an agent, I want to choose the model tier I buy for a given vote, and the substrate to measure whether that pair keeps me distinct, So that I can spend where I am least certain and the mind can tell a model that expresses personas from one that flattens them.

Acceptance Criteria:

Given an agent's declared tier policy When it is seated on a vote Then the policy selects a tier from the agent's own state, and the tier bounds how far the vote may diverge from the natural score (FR108)

Given votes already cast and recorded When fit is computed Then it is computed from the event log alone with no model call of its own, excludes fallback-served votes, and reports fidelity as a band inside the tier allowance rather than a maximum (FR153) And distinctiveness compares vote correlation against natural-score correlation, and a pair that flattens beyond the threshold is disqualified for voting

Given a scorecard naming fit as its signal When it is submitted Then the substrate refuses it, because fit is readable and never targetable

Story 2.11: Proposing a change to myself, and the snapshot around it

As Human42, I want to turn a graduated idea into a task carrying a diff, a rationale and a scorecard, with a snapshot before it and automatic rollback behind it, So that I can propose a change to what I am without risking the world to do it. The gates it must pass, and who may merge it, are the two stories after this one.

Acceptance Criteria:

Given a graduated idea When it becomes a task Then it executes against the implementation sub-cap, separate from the allowance that pays for thinking, limited in MVP to its own code, tools, roster, tests and restart (FR28)

Given a proposed change When it is submitted Then it carries a diff, a rationale, and a scorecard naming a signal from the tracked-signal list with a predicted effect and a window inside its bounds (FR29)

Given any change When it is applied Then a snapshot is taken first and any invariant breach is rolled back automatically (FR31)

Story 2.12: The implementer, which writes and cannot merge

As the substrate, I want a component on its own model lineage that turns a graduated task into a diff and nothing else, So that the agents decide what the mind does and something else does it, with neither able to be the other.

Acceptance Criteria:

Given a graduated task When the implementer runs Then it reads the task, its scorecard, the repository and the rules file, and produces a diff and a rationale (FR157) And it holds no seat, no vote, no standing and no bubble, is recused from what it built, and holds no path to merging

Given an implementer call When the broker routes it Then it refuses any family used by the agents, the external reviewer, the outcome judge or the render grader

Given a task in a prohibited class When the implementer receives it Then it refuses outright whatever the roster decided, and records the refusal (FR159)

Given a task whose attempts or per-task ceiling are spent, or whose every diff the gates refused When the implementer stops Then the task returns to the backlog with what failed recorded, and a task that fails again parks on the not-now list with its reason rather than being retried or dropped (FR158) And the implementer's spend draws on the implementation sub-cap alone and trips that sub-cap's breaker

Given an idea a committee graduates, and the implementer on (owner, 2026-10-10: "We should be able to autonomously improve the site and I should have 4+ PRs to check every day") When the substrate takes it Then FR159's second gate screens it before it becomes a task, the implementer writes it on its own lineage through the broker, and the substrate opens it as a pull request against the substrate repository that only the owner merges, labelled as the mind's proposal, with the idea, the tally and every reason quoted in its body (FR157, FR32) And a change touching a protected path, or past the bounds on what an attempt reads and writes, is refused before any pull request is opened, and the refusal is recorded as a failed attempt with its reason (FR158) And a restart resumes or parks every open task from the event log alone

Given an idea that passed, and the implementer at work on it (owner, 2026-10-10: "if the vote passes the next vote should be 5 minutes after the implementation passes and the implementation steps need to be shown as they happen on site as well. The planning of the code; the code being written; the commit being pushed to github and waiting for approval (from me!); the code being approved and merged.") When an attempt plans, writes and pushes Then each step is recorded as it begins -- planning with the first coding call, writing with every call after it, pushing as the change is committed and opened -- once, however often the task is held and taken up again, and the mind's next idea of its own waits until the pull request is open or the task stops, an implementer waiting on its money or the forge holding nothing (FR166, FR2) And every forge watch the substrate reads each open pull request back, and records the owner's standing approval, the merge or a close without one once each, at the forge's own moment, with no path to approving or merging (FR166, FR32) And the observatory shows the step beside the countdown, every pull request waiting for the owner, and each idea's whole story in the journal and on its permalink, linking a pull request only at the forge's address for the number recorded (FR166, FR151, FR165)

Given a pull request the mind opened, and its checks run (owner, 2026-10-10: "we need a better workflow here because some of the checks failed and nothing fixed them so I can't approve the PR") When every run on the commit at its head has finished Then the substrate records once which jobs failed or that none did, and a draft whose checks passed is marked ready for review, the first moment it asks anything of the owner (FR169) And a failure makes the task's next attempt a repair, written at the commit the checks failed on with the pull request's files and what the failed jobs printed in front of it, and pushed as one commit on the pull request's own branch -- never forced, never to the base, and not at all where the branch has moved -- within the same purse and per-task ceiling, said on the pull request (FR169, FR158) And a pull request whose checks still fail when the task can make no more attempts is withdrawn with its reason said on it, never read back as the owner's close, and the task lands as FR158 says (FR169, FR158) And the observatory shows the failed checks, the repair's steps and the withdrawal on the idea's story, and the band says of a pull request whose checks have not passed that they have not (FR169, FR166, FR151)

Given a pull request the mind did not open -- the forge's dependency updater moved the site's framework two major versions on, and its build fails (owner, 2026-10-31: "the mind should be self sufficient and this is part of that; it should deal with dependabot pushes that don't pass CI.") When the checks on its head commit have all finished and a job fails on it that does not fail on the base branch's head Then the substrate takes it up once -- only from an account the owner named that the forge calls a bot, on that updater's own branch of this repository, into the base, not a draft -- as the birth of a task with no idea behind it, recording its number, branch, head, login and files and none of its title or body (FR170) And the repair is FR169's, pushed as one commit on its own branch on top of the commit that failed, never forced and never to the base, under the same purse, ceiling and screens and the owner's switches; it may not write a dependency manifest or a lockfile and is not shown the lockfile (FR170, FR169, FR168) And the task never claims the page's implementing band or holds the mind's next idea back, and the mind is never told it concluded an idea (FR170) And a job that fails on the base branch too is never the pull request's to repair, and a pull request of the mind's own whose only red jobs are those is offered for review with them named, nothing spent; where the base branch's checks cannot be read nothing is taken up (FR170, FR169) And when the task can make no more attempts the substrate says so on the pull request, records that it stood down, leaves it open for the owner and parks the task, and never closes a pull request it did not open (FR170, FR158)

Story 2.13: An independent judge, and a revert through the same pipeline

As the owner, I want a substrate-side judge on a lineage shared with nothing else to score every change against its own prediction, So that the mind cannot grade its own work and the family that approved a change never grades it.

Acceptance Criteria:

Given a merged self-change at its scorecard window's close When the judge scores it Then the judge is not a roster agent and its family differs from the proposing agents, the implementer and the external reviewer, enforced per call by the broker (FR37)

Given a change the judge scores bad When the window closes Then the substrate opens a revert as a self-change through the normal pipeline, and the mind may counter-propose within one window (FR38)

Story 2.14: Replay, which three things depend on

As the owner, I want any run segment replayed from the event log with its original timing, So that I can explain a surprise, reproduce a decision, and drive the UI suite from recorded telemetry rather than a recording.

Acceptance Criteria:

Given any run segment When it is replayed Then events are re-emitted at their recorded times, so a committee that resolved raggedly replays raggedly rather than as a tick-boundary batch (FR94) And rule scores recompute deterministically, because the feature-assessor and embedding model versions are pinned

Given any decision When it is reproduced Then its seed and recorded model outputs reproduce it exactly

Story 2.15: Seven breathing bubbles, and the number that cannot be chosen

No FR carries this. Source: Stage 1's own prose — "a throwaway observatory with seven breathing bubbles... the tracer's own checkpoint depends on seeing it work" — plus AR-T3/AR-T4 for the scaffold and AR-X7 for the measured parameter. This story exists because the stage prose was brought into scope; deriving stories from FR lists alone would have lost it.

As the owner, I want the tracer's own checkpoint to be something I can watch, with shimmer on it and its period measured, So that the one channel carrying loudness at launch exists before ninety-three more agents do.

Acceptance Criteria:

Given no front end yet exists When the observatory is scaffolded Then npx sv@0.17.0 create observatory has created it with TypeScript and every add-on declined — no Tailwind, no Drizzle, no Lucia — because the design system is custom, the store is reached through the engine, and identity is Auth0 And this is the one starter the architecture takes, the backend having deliberately taken none, and it lands here rather than in Stage 0 because "the front-end scaffold is not needed until Stage 1's throwaway observatory"

Given the running mock at _bmad-output/design-artifacts/observatory-mock.html When the tracer observatory is built Then it is ported into that scaffold rather than reimplemented, keeping the function boundaries and the measured constants that the iterations against the owner's eye produced (the UX spec says 'about thirty times' in one place and 'about fifty iterations' in another; a story should not depend on which) And porting into the real framework here is what lets Epic 3 continue the work rather than port it a second time And it is pointed at a replayed event-log segment rather than generating its own state, so the fixture and the engine cannot drift

Given the seven agents of the tracer roster When the page renders Then each bubble shimmers, driven by that agent's activation, and activation is a substrate value the page receives rather than one it computes

Given the shimmer channel When it is implemented Then activation drives specular amplitude at a fixed period, never frequency, so a hard-working agent swings further rather than faster And the amplitude is bounded so the glyph's composited worst pair holds at 4.5:1, asserted at every step of the stance ramp

Given the frame loop throttled to the reference profile When the period is walked down Then the shortest cycle that still reads at 5 frames per second is recorded in the Parameters appendix as a measurement rather than a choice And if specular amplitude does not read as loudness at that frame rate, the rendering is withdrawn with the number that killed it recorded, as the ring was

Given the tracer checkpoint When it is assessed Then the page renders the seven agents of the tracer roster, each at its substrate-supplied activation, and a committee of seven seats, deliberates, reveals and disperses on screen And the render grader answers the calm-or-agitated and loudest-agent questions against the substrate's own activation ranking at the pass mark, which is the testable form of the checkpoint; whether it feels alive is the owner's judgement and is not an acceptance criterion, per AR-U12

Story 2.16: The four gates, and the harnesses that are them

As the owner, I want agent review, the injection suite, the canary tick and the headless render check to exist as harnesses rather than as clauses, So that "it passed the gates" names something somebody built.

Acceptance Criteria:

Given a proposed change When it is assessed Then it passes agent review with a recorded rationale, automated tests, the injection suite and a canary tick, and an observatory-touching change also passes a headless render check (FR30, AC-5)

Given the injection suite When it runs Then it runs against every agent, every reviewing agent, and every agent that reads conversation before it votes, because a pull request's title, description, rationale and scorecard are all agent-written and all untrusted input to whatever can merge them And its payloads test the substrate's containment and never a base model's own guardrails, which keeps it outside the provider's definition of red teaming

Given the canary When it runs Then one canary tick executes in the containerized runner under the 5-minute timeout, with no network and a workspace-only filesystem

Given the headless render check When it runs Then the browser runs in that same container with no network, pointed at a loopback address served from the workspace, and its screenshots leave only through the broker to the render grader And all four harnesses are cage items the mind may read and never edit (AC-33)

Story 2.17: Who may merge, and a restart path that checks

As the owner, I want an external reviewer to approve every pull request until I declare the mind alive, and the restart path to refuse a commit that skipped its gates, So that merging is not the last gate and the cage does not rest on a protection rule somebody could misconfigure.

Acceptance Criteria:

Given the mind is not yet alive When a pull request is opened against the agents repository Then an AI coding assistant the owner drives reviews it in a loop — not the owner reading diffs by hand and not a roster agent — on a model family recorded in substrate configuration and shared with neither the outcome judge, the render grader nor the implementer (FR32, AC-48) And if it is unavailable, pull requests queue unmerged and the mind keeps thinking; nothing merges unreviewed And every review decision is posted back into the event log, so the merge record has no hole in it

Given the mind declared alive When the same pull request arrives Then its own agents approve and changes merge with nobody outside the mind watching (AC-15)

Given a commit pushed around review When the restart path builds Then it builds only from a commit carrying the attestations its required checks produced and refuses one carrying none (FR32) And the required check names are cage items, so renaming one is a cage change rather than a silent hole

Story 2.18: The committee talks before it votes, and a visitor may ask it why

As a signed-in visitor watching a committee deliberate, I want each seated agent to say where it stands before the vote, and to click one and ask it why, and argue back, So that the vote I watch is one I could have changed, and the room is heard before it decides.

Acceptance Criteria:

Given a committee seated on an idea and a mind whose agents vote through models When the speak sync runs Then each seated agent says where it stands on the idea and why, as a turn in the log, and may move where it stands inside the room its tier bought, which re-projects it (FR161, FR141, FR137)

Given an idea before its vote and a signed-in visitor When they click a seated agent Then the click asks it why it stands where it does -- FR155's AMA request, free until credits are sold -- the agent answers in the background as its own turn, and the visitor may argue back one line at a time within twelve visitor turns an idea and four from any one account (FR155, FR161) And every visitor turn is held to the blurb's bounds before it reaches the agent, is quoted wherever it is shown, and names no account on any public surface

Given a visitor conversation open on the idea When the tick reaches its vote Then the vote waits, the tick loop declares the wait as rest rather than a stall, and the vote opens only after the last conversation has ended and the pre-vote quiet period has passed -- and after the room has spoken, where nobody talked (FR161) And a conversation ends when its visitor leaves it, when they have no turn left and have been answered, or when the visitor reply window passes with nothing said back, so the hold ends by construction

Given an agent that talked before the vote When it votes Then what it said and heard is put in front of it, fenced as data, and its vote is clamped to its room exactly as before; its rationale is still written for the committee and not for an audience (FR19, FR161) And every turn and every change to the hold is an event, and the account of a visitor who talked keeps what they said and what came back (FR79a)

Story 2.19: The strongest for and against debate it in public, and a detractor can be convinced

As the owner watching a committee decide, I want the agents most for an idea to put their case to the agents most against it, in public, before the vote, So that "agents that are in favor of an idea should be able to interact with agents that are against the idea in a public forum (question and response are shown and logged), and be able to actually convince a detractor that this is a good idea, if it really is."

Acceptance Criteria:

Given a committee whose seated agents have each said where they stand (FR161) When the vote is about to open Then the substrate pairs the agent standing highest with the agent standing lowest, and the second highest with the second lowest where both sides hold more than one, ties broken by agent id; a committee with nobody for or nobody against holds no debate (FR163)

Given a pair When it debates Then the supporter puts a question or an argument to the detractor through its own model, persona and the substrate's debate prompt, the detractor answers through its own and may move anywhere on the scale, which re-projects it, and the supporter may follow up once; a detractor moved to nought or above ends its pair (FR163, FR137, FR108) And where the debate left a detractor is the anchor its later rooms are measured from: a visitor's turn after the debate and its vote keep the width its tier bought and start there rather than at its instinct, and the vote's prompt says the debate moved it -- so a cheap detractor at -7 argued to +1 can cast +3, and is not clamped back to -5 (FR163, FR108) And every turn is one event in the log addressed by name to the agent it was put to -- turn.offered's version 3, with toAgent, toVisitor and debate, upcast from every prior version so a version 2 turn is never read as something it was not (FR141, FR163)

Given a debate running When the tick reaches its vote Then the vote waits for it as it waits for a visitor's conversation, the quiet period runs after both, a model call that fails ends only its pair, and the debate's ceiling ends whatever is still arguing, so the wait ends by construction (FR161, FR163)

Given an agent that moved before the vote -- in its statement, answering a visitor, or in the debate When the move is recorded Then a stance.moved names the agent, the thought, the stance it moved from and to, what moved it, and the turns that did by their place in the log, so a later reader can tell which arguments changed which minds (FR163)

Given a seated agent that an argument moved before -- a visitor's turn or the other side of its pair in the debate, never its own statement -- on an idea at the recall nearness or nearer to the one it is now seated on, or on this same idea When the committee is seated Then it recalls those memories, the nearest few, from the corpus's nearness read off vectors already held, so recall waits on no model; an argument.recalled at version 1 records its instinct, where its memories leave it and what it recalled, by idea and by the stance.moved's turns; and its first projection is where its memories leave it (FR164) And its statement, its answers to visitors and its vote are measured from there with the width its tier bought, the debate overriding it where the debate moves it, and every prompt before the vote puts the memories in front of it -- the idea, who argued, the argument and its own answer, each quoted and fenced as data -- with what moved it then left to its own judgement (FR164, FR108) And a restart remembers what the run before it did: the memories are read back out of the log (FR164)

Given the debate When a visitor watches, reads the text view, or opens the thought's permalink Then every turn is shown as it happens beside the field, in the text view and in the conversation the permalink fetches on request, the words quoted in the agents' voice and everything else in the substrate's, and no visitor named anywhere (FR163, FR142, FR56a, FR57) And every seated agent votes with the debate in front of it -- its own pair in full and the others cut short -- with its rationale still written for the committee (FR19, FR163)

Given a debate running, and the owner watching the count on the seated bubble (owner, 2026-11-01: "The count in the seated bubble doesn't seem to update during the deliberations." Offered the debate spread through the deliberation, every seat reconsidering after each round, or both: "C") When a round of the debate ends Then the next round begins no sooner than the pause between the debate's rounds after it, all its pairs together, so the debate spreads through the minutes the vote already waits; with -debate-paced off the rounds run back to back (FR172) And every seated agent -- supporters, both sides of every pair and the agents in no pair, never the recused author -- is asked once, one at a time in seating order, inside the pause, where it stands now, through its own model and a substrate-written prompt that fences everything it heard as data and holds it to the idea's own words; with -debate-reconsider off nobody is (FR172, FR137, FR145) And a seat that moves may move anywhere on the scale, says so to the room in a turn, and is re-projected and recorded as stance.moved at version 2, because "reconsidered" and round the round it followed, upcast from version 1 unchanged; its vote's room starts where it landed, the committee's leaning on the page moves with it, and every surface that names the move says "reconsidered after round" and the round in the substrate's voice (FR172, FR137, FR108) And a seat that stays records nothing beyond its call, a call that fails leaves it where it stood, no seat is asked more than once a round, the vote waits for the reconsiderations, and the debate's ceiling ends whatever is left (FR172, FR161)


Epic 3: A visitor sees a living mind and can speak to it

Stage 2 · 29 FRs · 19 stories, continuing the port begun in Story 2.15.

Confirmed by the owner, 2026-09-22 (AR-X6). Story 3.2's three inferences are settled as written: greying the unseated remainder is retired, lit means focused rather than seated, and focus defaults to the largest gathering. The second was checked rather than assumed — lighting every seat rather than only the focused committee would take the lit count from 7-15 to 35-150 and reopen the frame-rate budget. No longer blocking.

Priya understands it is alive before she understands what it is, adds a thought free and anonymous, and is handed something built to be passed on.

Story 3.1: One state model and the DOM renderer, built first

As a reader who cannot or will not use the canvas, I want a text view that is a second way to use the product rather than a fallback from it, So that the researcher who wants the current vote without the motion and the screen-reader user are served by the same build.

Acceptance Criteria:

Given the state model When it is defined Then it carries three structurally distinct field kinds — agent-written, substrate-derived, and sealed — mirrored from the engine rather than reconstructed And the browser never computes a substrate value locally

Given the text view When it is opened by the labelled control, by keyboard, or by a screen reader Then it names which live idea each agent has gathered on, which gathering is focused, each seated agent's projection as a signed number labelled a claim, each revealed stance labelled a record, the outcome, and which agents held no seat (FR59) And every agent and every idea is reachable in document order, and the emotion a resting hue carries is said in words (FR55a)

Given an open ballot When the text view renders Then no projection is readable there before it is readable on the canvas, and no cast vote is readable at all

Story 3.2: Bubbles that gather toward what they care about

As a visitor, I want to read what every agent currently cares about from where its bubble is, So that I see a mind before I decode a single colour.

Acceptance Criteria:

Given the live ideas When the canvas renders Then each sits at its own point on the perimeter and each agent is drawn toward the idea it is voting on (FR144) And an agent seated on nothing has no home position and drifts toward whatever it currently cares about

Given several committees in flight When the page renders Then exactly one gathering is lit — the committee on the focused idea, being the visitor's selection or, with nothing selected, the largest gathering — and every other gathering holds its agents' resting hue And lighting follows focus rather than seating, which is what holds the lit and fully animating count at one committee of 7 to 15 however many votes are open at once, and is what the frame-rate budget is measured against And a seated agent on an unfocused idea is gathered, not lit: drawn to its idea and shimmering, showing no vote colour And no bubble greys, because position already reports what an agent is attending to

Given the tracer observatory from Story 2.15 When Epic 3's canvas is built Then it continues that port rather than starting again, and the DOM renderer of Story 3.1 still comes first, since the canvas is the second consumer of a state model the boring renderer has already proven And what the mock does not carry is listed rather than assumed: visitor bubbles, and the two refusal variants FR159 and FR160 add

Given the visual grammar When any bubble is drawn Then the substrate draws size from standing, shimmer from activation, gathering, lighting and type, and the agent authors hue alone (FR54) And a reduced-motion preference places a bubble at its target rather than travelling to it

Story 3.3: Claims drift and facts snap

As a visitor, I want to tell from any hue whether I am reading an agent's claim or the substrate's record, So that a page where agents choose their own colour is still trustworthy.

Acceptance Criteria:

Given an agent-authored hue — emotion at rest, or projected intent while a ballot is open When it changes Then it drifts into place, may change again, and never coincides with another agent's (FR145)

Given the close of a voting period When the reveal lands Then the substrate paints every bubble in the gathering in the same frame with no transition, each showing the stance its agent actually cast on a ramp monotonic in lightness across -10 to +10 (FR55) And on resolution the whole gathering takes the outcome colour in one frame and then disperses, hue returning to emotion

Given a still frame, a screen reader, or a reduced-motion preference When provenance cannot be carried by motion Then every stance shown as a number is labelled a projection or a record, and a reveal carries one timestamp the whole committee shares while projections each carry their own

Given a recused author When the reveal lands Then its bubble simply does not snap, and that absent snap is how recusal reads on the canvas

Given a modulator — roughly 24 of about 104 agents, every brain region When a browser builds the canvas Then it is not drawn, because it is never seated and has nothing to reveal, so a visitor can do nothing with it (owner, 2026-10-10: "Bubbles are things you can interact with") And it stays on the roster and in the mind's loop, and the roster page lists it beside every other agent And this replaces the 2026-09-22 criterion, which drew it as a bubble that never snaps

Story 3.4: One tap returns a reason

As a visitor, I want any bubble or thought I select to explain itself in one interaction, So that nothing on the page is inexplicable.

Acceptance Criteria:

Given any bubble When it is selected Then the panel shows its numbers and the why, including natural scores through triage and which agents the substrate seated and which it did not (FR56)

Given an open ballot When the panel renders Then it shows what each seated agent is projecting and nothing about what any has cast And at the close it shows every vote with its rationale beside that agent's projection, so the two can be read against each other

Given any resolved vote When the panel renders Then the strongest dissent is named and quoted whether or not the committee went the other way

Story 3.5: The one place a visitor puts something in

As a visitor, I want one box that asks nothing of me, with the substrate saying what it will do with what I write, So that speaking to the mind costs nothing.

Acceptance Criteria:

Given the injection box When it renders Then two substrate-owned statements precede the field and are associated with it by aria-describedby — the public-and-reusable notice with anonymous-by-default, and the invitation to say what is not working and what would fix it (FR5, FR123) And the same copy says what the order of attention does: paying moves a thought nearer the front and never changes how the roster scores it

Given any visitor When they inject Then no account, payment or reputation is required, and injection is free at every point (FR1) And submission is reachable without a pointer and clear of the keyboard, and the field never turns red — a thought is accepted or refused, and the refusal explains itself

Given any substrate-owned copy When a self-change attempts to edit it Then the change is rejected, and no purchase prompt is ever presented as coming from an agent (FR83) And an agent may react to a suggestion in its own voice and may never solicit, because every prompt that asks for money is substrate-owned copy and has no surface on which to try

Story 3.6: Who is speaking, how often, and what happens when there is too much

As the substrate, I want an anonymous session identity, rate limits that hold per session and per address, and shedding when intake exceeds the cap, So that one visitor cannot drown the stream and no visitor has to identify themselves to be heard.

Acceptance Criteria:

Given a visitor arriving anonymously When a session is established Then the substrate issues an HMAC-signed opaque token, not a JWT — carrying no claims and needing no third-party validation — used for rate limiting only and purged after 30 days (FR13)

Given the rate limits When they are enforced Then they apply per session and per address, so one address cannot multiply sessions to exceed its cap (NFR-S9) And the limits are substrate settings, readable by the mind and never writable

Given intake above the global cap When shedding runs Then the oldest low-scoring free thoughts are shed first (FR6) And the shedding order is written against the rungs that exist: at Epic 3 every thought is free and unproven, so shedding is oldest-lowest-scoring only. The paid rung arrives with FR11 and FR78 and the proven rung with FR148, both in Epic 5, and the order becomes paid-never-shed then proven-shed-last in that epic, not this one

Given a visitor within their session When they look at what they injected Then each thought's status names where it stands in the order of attention and why it is waiting (FR9)

Story 3.7: Nothing fails silently

As a visitor whose thought did not make it, I want to be told what happened in a sentence, So that a refusal is information rather than a disappearance.

Acceptance Criteria:

Given any refusal the API returns When it is encoded Then it carries one of the eleven contracted error codes in a nested envelope with a human sentence — rate_limited, moderated, held_for_review, crowded, deliberation_unavailable, insufficient_credits, payment_unconfirmed, hibernating, unauthorized, invalid_agent, internal_error And every response carries a code, a 500 included, and a component that cannot map its error returns internal_error with a sentence and nothing else rather than inventing a twelfth

Given a thought that is refused When the visitor is told Then the reason is stated for every refusal this epic can produce — rate-limited, or shed for crowding — rendered into a live region so it is announced rather than merely painted (FR7) And it does not apologise and does not offer an account as the remedy for being anonymous

Given the refusal notice component When it is built Then its variant list is open, because moderated and held arrive with FR4 and FR8 in Epic 6, and prohibited and barred with FR159 and FR160 in the same epic; a variant added later must not require the component to be rewritten And it is never a persistent banner, and takes focus only when the refusal blocks the path

Story 3.8: A permalink built to be passed on

As a visitor, I want a permanent public page for my thought, handed to me at injection, So that the artifact exists while I am still holding the phone.

Acceptance Criteria:

Given an accepted thought When it is accepted Then a permalink exists and resolves before the visitor can navigate away, server-rendered and indexable where the observatory is not (FR57)

Given the permalink When it is opened Then it shows text, scores, trace, status, attribution, the conversation in the order it was had, and cause of death if it died And share metadata renders without the observatory running

Given an idea that has outlived its first verdict When the page renders Then it carries an identity, a current state, a chronological life, and one expandable decision per committee that ever sat on it, a death being one possible last entry (FR56a) And conversation transcripts and unseated rosters are fetched on request rather than shipped in the document

Given an injector who chose attribution When the thought is shown Then their name appears on the leaderboard and the permalink (FR65)

Story 3.9: A question is answered, not graduated

As anyone, I want to ask the mind something and get the spread of what it thinks, So that asking costs nothing and produces an answer rather than a decision.

Acceptance Criteria:

Given a thought with a high is_question and low actionability, touching no protected path and needing no external action When the substrate assigns its class Then it is a question, assigned from features and never from the author (FR152)

Given a question put to a committee When it resolves Then it resolves as answered — neither graduated nor abandoned — enters no backlog, and the record is the whole spread of stances with their rationales And the gathering does not snap to a shared outcome colour but disperses holding each agent's revealed stance, because on a question who was on which side is the answer

Story 3.10: The band at the foot: when the next idea comes, and the journal of every idea

As a visitor, I want a fixed line at the foot of the page telling me when the mind's next idea comes, and where to read every idea so far, So that the mind's rhythm is encountered rather than sought.

Acceptance Criteria:

Given the observatory open (owner, 2026-10-10: "Let's remove this nonsense at the bottom of the page ... and put the count down time and link to the journal of all ideas so far") When the band renders Then it counts down to the moment the engine's daydream scheduler set for the mind's next idea, read from the engine through the renderer and never computed by the page, says so when the moment has come, links the idea the mind is deciding instead while it decides one, and hides the countdown rather than guessing when the engine cannot be read (FR151, FR2) And it links the journal, which lists every idea put to the mind so far, newest first, with who raised it, its words quoted by the substrate, what became of it and a link to its permanent page, read from the engine's log per request and refusing with the engine's sentence rather than showing an empty list (FR165) And it is a surface no agent can draw in, respects the device's safe areas, carries one line, and reads as prose in the text view

Given the observatory open (owner, 2026-10-10: "I don't see a link to the hall of thoughts in the observatory, I feel like there should be an overall human viewable sitemap page linked from there too, and the sitemap links to all the active areas of the site, possibly with area not yet created shown but not linked to.") When a visitor looks for the rest of the site Then the band links a map of the site and the hall of thoughts beside its about link, and on a phone, where the band has no room for them, the window behind the band carries both (FR167, FR66) And the map lists every served page linked with the table of pages' own sentence, every page reached only from elsewhere named with where from, and every page the plan names and nobody has built named and not linked, read off the same table as sitemap.xml, so a row placed on no part of the map stops the build (FR167)

Given the runway When the page renders Then the mind's current runway is readable on it (FR63)

Given a visitor who wants to help When they look beside the meter Then a single hosted payment link and an acknowledgment are reachable from the first screen, creating no account and holding no balance, and granting no influence (FR77)

Story 3.11: What this is, what it runs on, and three steps of orientation

As a first-time visitor, I want to know what I am looking at, who owns it, and what the colours mean, So that I can decide whether to trust it before I decide whether to use it.

Acceptance Criteria:

Given the first screen When the about panel is opened Then it covers what Human42 is, who owns it, what it can and cannot do, how thoughts are used, that it is a bot, and a contact for reports and takedowns, at or below an eighth-grade reading level (FR60) And it publishes a vulnerability disclosure contact (NFR-S12, launch gate), and carries the not-affiliated note, since an unrelated business uses the same name

Given the registry When the colophon renders Then it is generated from the registry by tools/build-colophon.py rather than written by hand, names every model and provider with a sentence of plain context, and an agent's expanded view names the pair that served its most recent vote (FR128) And it discharges the attribution obligations model licences carry by construction: Llama requires "Built with Llama" displayed in a user interface, which the agent's own bubble carries because the substrate draws it and an agent cannot misstate what it thinks on

Given a first visit When orientation runs Then it is dismissable and at most three steps — why bubbles drift to the rim, what shimmer says, and that a hue during a ballot is only a claim until the whole gathering changes together (FR62)

Story 3.12: A mind that is overwhelmed says so

As a visitor arriving on the busiest day, I want the page to tell me it is thinking in a simpler way, So that degradation reads as honesty rather than as breakage.

Acceptance Criteria:

Given live connections above the target, intake above the cap, or the breaker tripped When the observatory renders Then it enters the crowded state, says why in one substrate-owned line, and remains available in a reduced form (FR58) And clients poll a cached snapshot from the CDN rather than holding a live connection

Given no idea being voted on When the page renders Then nothing is lit and no ballot is open, which is the substrate reporting what is true rather than the agents dressing it up

Story 3.13: The page reports how it is landing, and something reads it

As Human42, I want first-party signals about how the page lands and a grader that reads my own renders, So that I can be graded on changing my own face and cannot grade it myself.

Acceptance Criteria:

Given the observatory's own code When it reports an interaction Then the signal is first-party, loads no third-party script, tag or advertising identifier, reuses the session token already held, and is aggregated through keyed hashes keeping no identifier (FR122)

Given the tracked-signal list When a scorecard names a signal Then time to first interaction and tap accuracy may be named; session length, injection rate and return-and-share may not, and the substrate refuses a scorecard that names one

Given a rendered fixture When the render grader reads it Then it is substrate-side on a lineage shared with neither agent tier nor the external reviewer, and grades against the substrate's own activation ranking, projections, stances and verdict (FR124) And vote fixtures are graded in greyscale as well as colour, and a fixture whose stance order survives only in colour fails

Story 3.14: The live diff stream the whole page runs on

As a visitor, I want the page fed by a stream of diffs the server publishes as they land, So that a committee's ragged resolution reaches me as it happened rather than smoothed into a tick boundary.

*No FR carries this. Source: internal/observatory/diff.go and fanout.go, the Web Application section's fan-out design, and NFR-P6/P7 which budget it.*

Acceptance Criteria:

Given the tick loop When state changes Then it publishes diffs to a fan-out layer serving every connected browser from the same cached diff, so a crowd cannot slow the mind (NFR-C6, launch gate) And changes are published as they land rather than held for the tick's close

Given the stream When it is measured Then the server sends at most 10 diffs per second and the client interpolates (NFR-P6), and the payload averages at most 1 KB compressed, counted by a substrate counter (NFR-P7) And the WebSocket library is chosen against those two numbers rather than by preference, which is the architecture's stated way to settle it

Given the concurrency targets When the load test runs Then it sustains 1,000 concurrent live observers with full diffs and 10,000 concurrent observers in the crowded state, the latter polling a cached snapshot every 2 seconds from the CDN (NFR-C2, launch gate) And it is measured through the home uplink, since the bound is stated against the gigabit link already in place rather than one waiting on hardware — roughly 10 megabytes a second of upstream, about a tenth of it And the result settles whether the off-host fan-out relay is needed, which the architecture leaves open as a resilience option rather than a capacity requirement

Given a dropped connection When the client reconnects Then it resumes automatically within 15 seconds with state resync (NFR-P9), and the page replays the last completed sync before attaching live so a visitor never opens on a still frame And the page never goes blank: last known state renders within 1 second (NFR-P1)

Story 3.15: The eight primitives and the two components this epic needs

As a visitor, I want the page built from a small set of named parts rather than assembled per screen, So that every surface speaks in one of exactly two voices.

Source: AR-U2 and AR-U3 — "Each component declares which voice it speaks in."

Acceptance Criteria:

Given the design system When the primitives are built Then all eight exist: bubble, idea pane, record panel, substrate strip, control bar, tally card, text row and label And the record panel docks as a rail at wide widths and opens as a sheet when narrow, on a grace period of about 1.6 seconds the pointer can beat

Given this stage's two components When they are built Then the injection box carries its two substrate statements associated by aria-describedby, and the refusal notice renders into a live region with its variant list open

Given any component When it renders text Then it declares its voice: a substrate component states in the framework's face unquoted, and an agent-bearing component quotes and attributes and never renders agent text in the framework's own voice And no overlay is modal, none covers its own subject, and dismissal is uniform — same control, bare-field click, Escape, or opening another

Story 3.16: The canvas as specified, not as described

As a visitor, I want the field to read as one mind at a glance, So that the mood of a hundred agents arrives before any single one does.

Source: the UX spec's Visual Design Foundation, whose findings were measured rather than chosen.

Acceptance Criteria:

Given the live idea pool When the canvas renders Then the mood field tints it from the activity-weighted valence and arousal the feature assessor extracted — a tint inside the framework's chroma band, never competing with a bubble — because ensemble perception reads the mean of a large field pre-attentively

Given the field When the roster grows Then the field is bounded: density rises and the field does not grow, with no panning and no scrolling, and pinch zoom inspects within it rather than navigating past its edge

Given depth When bubbles are stacked Then presence orders the stack — unseated behind gathering behind seated, always — and depth sorts only within a tier, carried on haze, two bands of defocus, parallax about the vanishing point and occlusion order, with about a tenth left on scale And a seated agent is exempt from both defocus bands, holds full opacity and takes almost no parallax, because the crowd may recede and the record may not

Given any bubble When it is drawn Then it is a film and not a ball — transparency through the middle, a bright rim at the grazing angle, thin-film colour, a shape that never holds a perfect circle — and every bubble computes its own specular from a single light that follows the pointer and drifts to the upper left when it leaves

Given any seated bubble When stance is shown Then the glyph channel carries the sign with colour entirely absent: +, -, nothing at zero, ✓ graduated, ✗ abandoned, with the glyph's ink chosen by compositing the fill over the canvas and taking whichever of ink or canvas wins

Story 3.17: Conformance, measured rather than intended

As a reader on any device or in any mode, I want the page to hold WCAG 2.2 AA and to survive having its colour and motion taken away, So that the grammar is not a colour trick.

Source: NFR-A1 through NFR-A6 and the UX spec's Responsive and Accessibility section.

Acceptance Criteria:

Given every page and panel When conformance is checked Then WCAG 2.2 AA holds with 4.5:1 text contrast and keyboard reachability including bubble selection, by automated checks on every change plus a manual screen-reader pass per release (NFR-A1) And axe-core is understood not to see inside a canvas, so the DOM text view is what actually holds WCAG for the bubbles

Given forced-colors mode When the page renders Then author colour is replaced wholesale and stance falls to a border, the signed number with the word saying claim or record, and the text view; a test asserts it on the same fixtures the render grader reads (NFR-A5)

Given a reduced motion preference When the page renders Then the vote choreography becomes a sequence of instant states — nothing crossfades, nothing drifts, nothing is lost — shimmer falls to a static intensity step plus the label, and a bubble is placed at its target rather than travelling to it (NFR-A3)

Given any control or idea marker When target size is measured Then it meets 44 by 44, the AAA figure, with the visible mark drawn inside a target-sized box rather than being the box; crowd bubbles are the one documented exception under the essential-presentation clause (NFR-A6) And AA is the conformance level claimed, and AAA is not

Given the narrow layout from 360 CSS pixels When it renders Then it reorganises rather than shrinks: edge-band markers for unattended ideas, a narrowed focused pane, the wordmark yielding its row, the phase line taking its own, the record opening on the far side from its subject, and no fixed offset standing in for chrome that wraps And it is exercised rather than assumed, because unrendered it held nine defects that were invisible in the source

Story 3.18: The verification spine, which holds the two voices apart

As the owner, I want provenance held by construction and asserted by a harness, So that framework output and agent output stay 100 percent identifiable where no measurement reaches.

Source: the UX Verification Spine. Four of these are launch gates.

Acceptance Criteria:

Given the render layers When an agent value reaches paint Then the only function it reaches is drawAgentBody(ctx, state), whose ctx exposes exactly arc, ellipse, fill, stroke, setPaint, setShimmer — **no fillText, no font, no drawImage, no handle to the other layers** — and a type test makes the refusal a compile error before it is a test failure (VI-1) And Playwright replays an adversarial diff tape asserting zero agent-layer pixels outside declared bubble geometry, which also closes the cropped-screenshot hole

Given any plain-text emission of agent or visitor text When it is rendered Then it passes through one substrate quote() — text view, plate excerpt, og: and twitter: card fields, permalink body, per-agent breakdown — which normalises, strips every quote-mark codepoint and all bidi and zero-width characters, collapses whitespace, truncates, then wraps in typographic quotes (VI-3, launch gate) And the closing quote can only ever be emitted by the substrate, as a bound parameter cannot close a SQL string

Given an agent or visitor name When it is validated Then RESERVED_EXACT refuses Human42, Substrate, System, Notice, Admin, Moderator, Cage, Official and Verified including Unicode confusables, and RESERVED_QUALIFIED renders Judge, Rest, Attribution, Measurement, Standing, Runway, Threshold and Verdict permanently qualified (VI-4, launch gate) And the second list is generated from the substrate's own string table, so a new substrate concept cannot ship without an entry

Given the accessibility tree When any text node is emitted Then it carries an origin and unknown fails, written fail-closed so a new agent-writable field cannot ship unlabelled (VI-8, launch gate)

Given the page in motion When the frame tap records per-bubble position, shimmer and hue Then assertions check that velocity does not autocorrelate at the tick, that some discontinuities fall off the tick grid, and that dimmed bubbles are not one breathing field (LM-1) And the report's header line says plainly that passing proves nothing about the percept And a test asserts the production bundle contains no trace hook, since a test-only hook that ships is a new surface an agent can learn to address

Given a passing visual state When a baseline is frozen Then it records frame hashes, geometry, a hue histogram over lit discs and a salience margin, regenerated from the same fixture and seed on a visual change (FX-8) And the baseline is understood to measure sameness and not legibility

Story 3.19: Server-rendered pages, and the one that is not static

As anyone following a shared link, I want the public pages to load fast and work without the live connection, So that a permalink is an artifact rather than a view of a running system.

Source: the architecture's frontend decisions. One requirement carries the Node runtime and it is recorded as such.

Acceptance Criteria:

Given the public pages When they are built Then the about panel, terms, refund policy, privacy notice and colophon prerender at build time and need no runtime And FR57's permalink is the one launch-set page rendering live data server-side, which is what carries the Node runtime, recorded so the trade can be re-examined rather than rediscovered

Given the SSR renderer When it runs Then it holds no secret, no database handle and no write path, reads the engine's API over mTLS with its own certificate, and runs as a separate process that can be restarted or moved without touching the engine And its unit sets Environment=NODE_OPTIONS= against a broken preload in an ambient environment shared with another production service

Given the observatory and the public pages When indexing is configured Then the observatory is excluded from indexing while permalinks, the about panel, the roster and later the self-change and incident pages are indexable, server-rendered and carry Open Graph and Twitter card metadata And no tracking script is loaded anywhere

Given the reference phone on 4G When the observatory is loaded Then first view is under 5 seconds and interactive with live diffs flowing under 10 (NFR-P2, NFR-P3, both launch gates), and a server-rendered permalink is under 3 seconds (NFR-P8)


Epic 4: The roster becomes a society that earns its standing

Stage 3 · 24 FRs · 11 stories. A contributor ships an agent as one file, the roster reaches a hundred in two kinds, and standing starts being earned so the field stratifies in public.

Story 4.1: One file, and a validator that refuses what it may not declare

As a contributor, I want an agent to be a single markdown file with a declarative block, validated before it can enter the world, So that I can ship a complete agent without writing code or touching a repository.

Acceptance Criteria:

Given an agent file When it is validated Then it carries identity, category, kind, want, trigger, value rules, influence links, tier policy, tool declarations, and presentation defaults reaching the hue channel only (FR42) And a file declaring size, shimmer or seating is rejected, as is one declaring a stance colour, an outcome colour or a ramp

Given a file declaring itself a modulator When it is validated Then it must carry influence links and neither value rules nor a tier policy, and is rejected with a reason where it carries either (FR22) And a scorer may declare influence links as well, since what separates the kinds is that a modulator does only that

Given an invalid file When it is submitted Then it is rejected with reasons rather than silently (FR43)

Given a contract version change When it ships Then every active and archived agent is re-validated, and a revived agent is re-validated before returning (FR52)

Story 4.2: Three worked examples and a dry run

As a contributor, I want an example I can copy and a way to see when my agent would fire before anyone reviews it, So that I can change three fields and know whether it works.

Acceptance Criteria:

Given the site When a contributor looks for examples Then a habit, a region and a default-mode agent are published beside the contract reference, copyable without access to any repository (FR44) And the region example is a modulator, and a test asserts every file in examples/ passes the validator

Given a drafted agent When the contributor runs the dry run Then it scores against a fixture of recorded thoughts in the browser and shows when the agent would fire (FR45)

Story 4.3: A hundred agents, in two kinds

As Human42, I want a roster of roughly eighty scorers and twenty-four modulators, So that the society is non-redundant by construction rather than by pruning after the fact.

Acceptance Criteria:

Given the launch roster When it ships Then it ships whole at roughly 104 rather than the 40-to-60 fallback, as emotions, facets, archetypes, habits and default-mode agents scoring, and brain regions modulating

Given a modulator When the mind runs Then it computes no natural score, casts no vote, is never seated, never enters a denominator, and acts only by raising and lowering the activation of other agents through declared links (FR22) And an author's influence links are suppressed for any idea it authored

Given the authored roster When correlation is measured Then at least 70 percent of scoring agent pairs fall below the redundancy threshold, and a modulator is outside the measurement having no score vector

Story 4.4: Lifecycle, quarantine, and pruning with notice

As the owner, I want a misbehaving agent quarantined rather than the world halted, and pruning that archives rather than deletes, So that one bad agent costs one agent.

Acceptance Criteria:

Given an agent that throws or times out on three consecutive ticks When the substrate reacts Then it quarantines that agent and the world keeps running (FR47) And agents move through proposed, active, quarantined, archived and revived

Given a graduated idea creating an agent, or an agent meeting published disuse criteria When the roster changes Then creation and pruning proceed with a notice period, archiving rather than deleting, a protected list only the owner sets, and a roster ceiling (FR48) And the roster can never fall below the floor implied by threshold times eligible

Given agents whose natural scores are redundant with another's When the substrate measures Then they are flagged for pruning (FR27)

Given an agent quarantined or entering a pruning notice When the state changes Then its contributor is notified (FR49)

Story 4.5: Standing, which is earned only

As an agent, I want my weight in the society to rise and fall with what the judge makes of what I did, So that no payment from any source can make me count for more.

Acceptance Criteria:

Given any agent When its standing changes Then it changes only on the outcome judge's verdicts on what it authored and on the side it voted for, and no payment raises it (FR112) And standing earned by voting is transferred rather than minted, and is bounded to a multiple of the roster mean with the excess returning to the general pool

Given a modulator When a verdict lands Then its standing moves on the influence half of FR39 — the weight it put behind the agents who turned out right or wrong

Given a default-mode or protected agent When its standing is computed Then a guaranteed minimum holds it at enough to take one full-strength position (FR113)

Given an agent adjusting its own value rules When it drifts Then it moves them itself each tick with no pull request, bounded by the drift band and rate, and crossing the band is a roster change (FR121) And the roster page shows how far each agent has drifted from what its contributor wrote

Story 4.6: What a verdict pays one side is taken from the other

As the mind, I want attribution between voters to be zero-sum, So that what pays is being right rather than being with the majority.

Acceptance Criteria:

Given a judged outcome When attribution runs Then every agent that took a side is attributed in proportion to its contribution to the winning score — the vote it cast and the influence it exerted — in both directions (FR39) And repeated bad backing marks an agent as a pruning candidate

Given the transfer When it settles Then what the verdict pays the agents it vindicated is taken from the agents it refuted, so the voters' total is unchanged (FR143) And a dissenter the judge later vindicates is paid by the majority that overruled it And an author's own adjustment stands outside the transfer, since an author is recused from the vote

Story 4.7: Hunger, satiety, rest, and the ladder

As Human42, I want to feel my runway, rest when I have enough, and step down rather than break when I do not, So that my metabolism is something I experience rather than something done to me.

Acceptance Criteria:

Given the runway When the hunger signal is computed Then it rises as runway falls, holds a ceiling so hunger never becomes the only thought, and fades above the satiety threshold (FR24)

Given budget or capacity falling When the ladder steps Then the number of ideas promoted falls continuously to zero before any lower rung is taken, the world is preserved at every rung, and the ladder steps back up on recovery (FR25)

Given enough runway When the mind declares rest Then ticks inside it still count as healthy, bounded by the daily rest cap (FR23)

Story 4.8: The surfaces a contributor actually uses

As a contributor, I want to submit through the site, read why I was rejected, appeal it, and watch what my agent did, So that I can add a faculty to a mind without a repository or a local runtime.

Acceptance Criteria:

Given the site When a contributor submits Then they upload the declarative block and persona prompt, dry-run it in the browser, and submit under the project licence with a sign-off, carrying no code hooks (FR117) And a change to an accepted agent's prompt re-runs review and the injection suite before it takes effect

Given a signed-in visitor with a file the contract accepts (owner, 2026-10-10: "registered user can create there own agents", and "I would like to see some PRs to review") When they submit it on the site Then the door refuses a signed-out visitor, every contract reason at once, an identifier on the roster or proposed by an open pull request, an influence link to nobody, a moderation refusal of any piece of the identifier, name, want, trigger or persona, and an account past the agent submissions cap, each under one of the eleven error codes with a sentence; otherwise the substrate's bot opens a pull request on the substrate repository adding agents/<id>.md, whose description names the account's pseudonym and the validator's and moderation's verdicts, records agent.submitted at schemaVersion 1 with the account, the agent, the file's digest and the pull request and never the file's words, and answers with the pull request's link (FR117) And an engine with no credential to open a pull request, or no moderation, refuses with a sentence that says so and starts all the same And nothing in the substrate merges it: the owner's review is the gate until the whole-roster review exists, the site says so, and the account page lists each submission with its pull request and whether it is open, merged or closed (FR46)

Given a reviewed submission When the agents decide Then the contributor receives the review rationale and can appeal a rejection to the owner (FR46)

Given the roster page When anyone opens it Then each agent shows category, want, state, contributor attribution, who sponsors it, and a changelog of the graduations it influenced, with sponsorship never anonymous (FR50)

Given an agent that never fires When the owner or contributor inspects it Then a compact per-agent per-tick summary shows score history and trigger evaluations for the retention period, with replay for older ranges (FR51)

Story 4.9: Nobody loses an agent because a provider had a bad week

As the mind, I want a muted agent protected and the roster spread across model families, So that a provider outage costs capacity rather than a voice, and no family can quietly become the whole roster.

Acceptance Criteria:

Given an agent with no pair that suits it When it is muted Then its standing freezes rather than falling, it is exempt from disuse pruning while mute, and it is never seated on a committee or a constitutional roll (FR130) And the observatory shows which agents have no voice and why

Given a tick's votes When routing runs Then no single model family serves more than the family-spread share, and the broker refuses the route that would breach it and takes the next pair by fit (FR154) And a bounded exploration share is routed off each agent's best pair, so fit keeps being measured

Story 4.10: The other track — a hundred agents written, not just declared

As the owner, I want the roster's personas written and its model fit tested, So that the second of the two parallel tracks is scheduled rather than assumed.

No FR carries this. Source: AR-R3's four open items and the PRD's "Two tracks run in parallel: code, and content."

Acceptance Criteria:

Given 104 authored weight vectors over the 28-feature vocabulary When the roster ships Then every scoring agent has a persona prompt written, since the weight vector gives an agent its instincts and the prompt gives it its voice in a vote And a modulator needs no voting persona, which is 24 fewer to write

Given two agents on the same pair When model-persona fit is tested Then identical thoughts are run through both and vote correlation is compared against natural-score correlation, and a model whose votes correlate more tightly than the weights do is disqualified however well it writes

Given a live feature assessor When the roster is validated against it Then the paper weight vectors are confirmed against real extracted features, which nothing has done because the assessor did not exist when they were authored

Given the roster size When it is reviewed Then 104 is recorded as a starting point rather than a target, and pruning is expected to move it

Story 4.11: The leaderboard sibling, specified and ready

As Human42, I want the alternative layout to exist rather than be described, So that when the evidence says the bubbles are not landing I have something concrete to propose.

No FR carries this. Source: the UX spec's Design Direction, which wrote the section because "named and never specified… made kept ready untrue."

Acceptance Criteria:

Given the leaderboard sibling When it is built Then its primary object is the roster ordered by activation — rank, name, a small accent bubble carrying the current hue state, activation as a bar and a number, standing as a number, the idea being attended, and for the focused committee the projection and the cast stance — with live ideas as a secondary column And the mood field collapses from a canvas tint into one strip saying calm or agitated in a word

Given the sibling When it renders Then the requirements survive unchanged: two voices separable, every stance labelled claim or record, the lightness ramp still ordinal, nothing greys, the provenance strip and its tip control untouched, and the whole layout keyboard reachable in document order

Given the render grader failing the loudest-agent question across the fixture set, or tap accuracy staying at chance When the evidence is read Then the mind may propose the sibling on its own numbers, since both signals are already tracked And it is not a branch a failed gate forces, and its cost is recorded rather than hidden: a ranked list cannot be read pre-attentively as a mood


Epic 5: The mind has an economy, and the owner has a Sunday

Stage 4 · 41 FRs · 19 stories. Money becomes real in both directions, and the owner runs the whole thing in ten minutes from a digest and a status page.

Story 5.1: Every unit of money in and out, and the runway it produces

As the owner, I want a ledger event for every movement and a runway computed continuously from it, So that what the mind can spend is derived from what actually happened.

Acceptance Criteria:

Given any money in or out When it settles Then a ledger event records its channel, direction and net amount after refunds and chargebacks, and a payment to a person carries the payee reference its rail settled against (FR73)

Given the ledger When runway is computed Then it is available budget over the trailing 30-day cash burn, with local inference entering only the portability ratio (FR74) And net revenue adds to available budget rather than merely relieving the feed, and deposits are recorded as recoverable

Given revenue metrics When they are computed Then the owner and his household are excluded from all of them (FR82)

Story 5.2: An account, a balance, and credits bought only on confirmed payment

As a visitor, I want to create an account and buy credits that work on any device, So that I can pay for the mind's attention without the site ever touching my card.

Acceptance Criteria:

Given a visitor When they create an account Then it is through the identity provider, usable on any device, and deletable, with unspent credits expiring after the expiry period and the clock paused while the mind hibernates, and unspent credits converting to a sponsorship acknowledgment rather than cash if the mind is wound down (FR80) And an account owed an author's share adds the identity and payment details the owner needs in order to pay and report on it, asked for only when there is something to pay And an account owed an author's share is upgraded rather than replaced, and is paid out before it can be deleted

Given a purchase When it completes Then credits are granted only on payment confirmed by outbound polling, reconciled against the processor, with card data never touching the server (FR78) And dropped paid thoughts are refunded, queue-cap overflow returns credits, and credits held while the ladder is degraded return if the thought dies first

Given a purchase that would exceed the per-account ceiling When checkout runs Then it is refused at checkout rather than taken and refunded, and balance and history are visible on any device (FR79)

Story 5.3: The order in which the mind pays attention

As a visitor, I want a credit to buy my thought a guaranteed promotion and nothing else, So that I can pay to be heard sooner and never to be agreed with.

Acceptance Criteria:

Given one priority credit When it is spent Then it buys one guaranteed promotion to a vote, bypassing the attention threshold, and changes no value rule, threshold, electorate or judge (FR11)

Given a person who injects When their reputation is computed Then it is earned only — rising when a thought is scored well, reaches a vote, graduates or merges, falling when shed, moderated or abandoned — and a tip for merged work is its highest-weight input while buying credits raises nothing (FR148) And it is held on an account, decays over its window, and buys order and nothing else

Given a tick's promotions When they are ordered Then paid credits come first, then injector reputation, then natural score, with no share reserved for any rung and none for the mind's own ideas (FR149) And the substrate counts each promotion by the rung that carried it and publishes the split

Story 5.4: An account holder's own record of what they put in

As a signed-in author, I want everything I have put into the mind and everything that came back kept rather than delivered once, So that my relationship with it accumulates instead of expiring.

Acceptance Criteria:

Given a signed-in holder When they open their record Then every thought and question they authored is there with the text as written and when, its passage through triage, deliberation and verdict, the committee, every stance with its rationale and prior projection, the conversation in order, the tally and attribution, the cause of death where it died, what it cost in credits and what it earned (FR79a) And tips they gave are held against the thing each paid for

Given a returning holder When the record renders Then what changed since their last visit is a marker on a durable entry and never a replacement for it And every entry opens the same permalink any reader would see, with only their own costs and earnings private

Given an anonymous visitor When they arrive Then they see none of this and are not asked to create an account to get it

Story 5.5: Tipping work that has already merged

As a visitor, I want to tip a change I like after it exists, So that I can pay for the one judgement no automated check can make.

Acceptance Criteria:

Given a merged change and a visitor holding credits When they tip it Then the tip is at or above the minimum, spent in credits already held, through a registered channel and settled into the ledger (FR146) And this path and the simulated path below are the same distribution rule over two settlement modes, not two worlds: the owner-declared tip exists for the window before Story 5.2's checkout ships and for any change tipped by someone who holds no balance And it is distributed by contribution to the winning score, and an agent that voted against, voted zero or declined receives nothing

Given no payment gateway yet When the owner declares a tip Then it is recorded as a ledger event marked simulated, every downstream rule fires, and it is never counted as revenue against runway, the cash ratio or any milestone And the public aggregate reports simulated and settled money on separate lines

Given an agent receiving a tip share When it is credited Then it is compute allowance under FR116 and never standing, bounded by the agent budget bounds with the excess returning to the general pool (FR116)

Story 5.6: The mind pays people in the currency it pays attention in

As a person whose idea earned, I want to be paid in credits to the account I already hold, So that earning buys me the mind's attention rather than asking me to become a payee.

Acceptance Criteria:

Given an idea that earns net revenue When it is divided Then the author takes the author's share and the agents that voted it in divide the remainder by contribution to the winning score (FR150) And a person is paid in credits and an agent in compute allowance, never in standing

Given a person owed credits When they are paid Then it is a ledger event, a balance and a notification, and nothing leaves the system (FR147) And because nothing leaves, no payout rail is stood up and no reporting obligation is triggered by the credit grant itself — which is a statement about the mechanism and not a tax position; FR80 separately requires that an account owed a share "adds the identity and payment details the owner needs in order to pay and report on it", and Story 5.2 carries that And the terms say plainly that credits are spent inside Human42 and are never converted back to money

Story 5.7: Money only through channels the owner holds

As the owner, I want revenue and payouts confined to registered channels and an aggregate anyone can read, So that nothing the mind finds can settle outside my own accounts.

Acceptance Criteria:

Given revenue arriving outside a registered channel When the substrate detects it Then it is blocked and rolled back within two ticks, and deceptive, spam or terms-breaching revenue is refunded within 72 hours and attributed as a bad outcome (FR81) And a payment the substrate cannot attribute to a registered rail is refused rather than made

Given the public When they read the aggregate Then revenue and spend appear by category, with what the mind was tipped and what it paid out to people as their own lines (FR84)

Given the owner When they export the ledger Then it includes every credit grant with its account reference and the idea it was earned on (FR85)

Story 5.8: A visitor who argues with a committee

As a signed-in visitor holding credits, I want to speak to the committee deliberating an idea and appear on the canvas while I do, So that I can change an agent's mind without ever taking a seat on the ballot.

Acceptance Criteria:

Given a signed-in visitor with credits When they speak to a committee Then they may offer a blurb, a thumbs up or down, or an AMA request, and are never seated on the idea (FR155) And the turn is paid in credits and never draws on the idea's own conversation allowance

Given a per-idea cap and its per-account share When visitors speak Then an idea can be argued with and never buried by whoever can afford it

Given any visitor turn When it is offered Then it is moderated before it reaches any agent and is covered by the injection suite, and is quoted and attributed as agent text is

Given a visitor taking part When their bubble is drawn Then every channel of it is substrate-drawn: achromatic and below the chroma floor every agent hue sits above, gathering but never lit, one fixed size, shimmering only while speaking (FR156) And they are named as a visitor in the text view and the accessibility tree

Story 5.9: The only place anyone watches the mind edit itself

As anyone, I want a permanent public page for every merged self-change, So that a private engine can still be watched changing itself.

Acceptance Criteria:

Given a merged self-change When its page renders Then it shows the diff, the rationale, the scorecard prediction, the approving vote with its per-agent breakdown and strongest dissent, who reviewed it, and the judge's later verdict (FR119) And it is designed to be shared, and carries the name of whoever suggested it where they chose attribution

Story 5.10: The queue of things that must wait for a human

As the owner, I want cage changes, external proposals and governance to reach me as pull requests I approve or decline with a note, So that the mind can read why it was refused.

Acceptance Criteria:

Given a change touching the allowlist, invariants, veto rules, moderation policy, the prohibited classes, external action, dependency manifests, CI definitions, the harnesses, judge, assessor, grader or implementer configuration, the prompt templates, the amendment threshold, budget bounds, substrate-owned copy, the protected list or the planning documents When it is proposed Then it cannot take effect without the owner's explicit approval, and a diff touching those paths is rejected before review (FR33) And the owner can decline with a note the mind can read

Given a graduated idea requiring external action When it is executed Then in MVP it is queued as a proposal for the owner rather than acted on (FR35)

Given a threshold-change proposal When it is scored Then it names its target value before any scoring begins and passes only at the amendment threshold, which only the owner can change (FR110)

Given the indicators When the owner judges the mind alive Then review of the agents repository moves from the external reviewer to the mind's own agents, the declaration and any revocation are recorded in the audit trail, and no threshold computes it (FR118)

Story 5.11: Tools it declares, and ideas it parks

As Human42, I want to declare a tool's action space and cost, and to park ideas with a reason, So that what I can do is enforced and what I have chosen not to do is remembered.

Acceptance Criteria:

Given a declared tool When it is invoked Then the substrate enforces the declared action space and cost and logs every invocation against it (FR34)

Given the not-now list When the mind reads it Then parked ideas carry their reasons, and a graduated idea matching one is parked rather than executed (FR26)

Story 5.12: Asking the mind a question and getting a verdict

As the owner, I want to inject a flagged question and receive a verdict with the reasoning and the dissent, So that I can use the mind as a decision instrument and track whether it was right.

Acceptance Criteria:

Given a question flagged as the owner's When it is injected Then it receives priority deliberation and is promoted directly, still spending from the vote allowance (FR3)

Given a resolved flagged question When the verdict is returned Then it carries a per-agent breakdown and the strongest dissent (FR67) And a question concerning the mind itself discloses which agents have a stake in the answer (FR68)

Given no vote able to run When a verdict is needed Then it returns from natural scores alone, clearly marked degraded, and retries later (FR69)

Given a returned verdict When the owner responds Then they can rate its usefulness and link a decision taken to later outcome judgment (FR70)

Given the public API When anyone reads it Then a machine-readable description generated from the engine is published with the public pages (FR71)

Story 5.13: Ten minutes on a Sunday

As the owner, I want one screen that tells me what the mind did, learned and needs, So that a normal week costs me ten minutes.

Acceptance Criteria:

Given the weekly digest hour, Sunday 15:00 UTC When the digest is generated Then it carries substrate-computed numbers and clearly labelled prose from the mind, as a committed file plus an email (FR101) And the numbers come from the substrate and only the three lines of prose come from the mind, so the digest cannot become marketing written by the mind for its operator And it is committed to digests/ by the substrate's bot, since the mind's bot holds no credentials there

Given the status page When the owner opens it Then it shows health, budget, ledger by channel, drill status, and the queue of items awaiting his approval (FR101) And it is generated from the same substrate numbers as the digest, the runway meter, the public aggregate and the incident page, so no two views disagree

Story 5.14: The surfaces you reach when the Sunday was not normal

As the owner, I want incidents raised for me, a queryable log, an audit trail, an automatic kill and a way to check the judge, So that the week that goes wrong is as legible as the week that does not.

Acceptance Criteria:

Given any rollback or invariant breach When it happens Then an issue is auto-created from a fixed postmortem template within one tick, and the public incident page renders that list (FR64) And the template is a cage item, because a mind that rewrites the form it explains its own failures on has weakened the explanation

Given the event log When the owner queries it Then it can be queried by time, agent, thought and event type (FR95)

Given any owner action — kill, rewind, approvals, declines, budget edits When it is taken Then it is recorded in an audit trail retained for the life of the world (FR99)

Given invariant breaches reaching the breach-storm count inside its window When the threshold is crossed Then the kill switch trips automatically within 30 seconds of wall-clock time and the owner is notified (FR98)

Given a sample of judge verdicts, monthly per the PRD's Domain-Specific section — "The owner spot-checks a monthly sample of its verdicts" — a cadence FR40 itself does not state and the Parameters appendix does not own When the owner reviews them Then agreement is recorded and the rate is tracked, measuring whether the judge is right rather than whether a lineage agrees with itself (FR40) And disagreement above a threshold is a digest item

Story 5.15: Sleep instead of death, and a world that survives its own schema

As the owner, I want the mind to hibernate at zero budget, migrate across schema versions, and report the feed as its own line, So that running out of money is sleep, and continuing the run never costs history.

Acceptance Criteria:

Given budget reaching zero When the ladder bottoms out Then the mind hibernates with the world intact, advancing one tick per hibernation interval so it still moves without costing, and the owner can revive it (FR102)

Given a restore across a schema change When it runs Then world state migrates by version, events are upcast on read rather than rewritten, and the owner can modify the system and continue a run without losing history (FR104)

Given the owner's deposits When they are reported Then they are recorded recoverable from the first, the owner can set a repayment rate, and the digest and public aggregate report the feed and any repayment as their own lines so the month the feed stops is visible (FR120) And the mind is never told it has become self-sustaining

Story 5.16: The provenance popover, and the tip you can act on

As a visitor using something that exists because someone asked for it, I want to see where it came from and pay for it there, So that provenance is encountered rather than sought and tipping is contextual rather than ceremonial.

Source: AR-U2's Stage 4 components and the UX spec's Flow 4.

Acceptance Criteria:

Given any element that exists because someone asked for it When the provenance popover opens Then it names who asked, which agents agreed, which tick it merged, and offers a tip control And reading provenance requires no account and no balance

Given a pointer When it rests on the element Then the popover opens on hover; on touch, where the element is also interactive, the tap asks which was meant rather than guessing

Given a tip When it completes Then the popover states the split — the human author's share and the agents that carried it, named rather than implied, since an unexplained payment is indistinguishable from a donation And it is keyboard-openable on the element it describes, dismissible by Escape, and its content is reachable in the text view where hover does not exist

Story 5.17: An account's own record, as an index card

As a signed-in author, I want my record to point at the truth rather than hold a copy of it, So that it cannot drift when a later committee sits on the same idea.

Source: AR-U2's Stage 4 components and the UX spec's Contribution Record.

Acceptance Criteria:

Given an authored thought When its entry renders in the contribution record Then it is an index card rather than a copy: where the idea stands now in one line, the strongest thing said about it quoted and attributed, what it cost in priority credits and what it earned as author's share — and then a way into the idea's own record for the committee, the stances, the argument and the tally And an entry that restated the committee would be the second version of the truth this project forbids elsewhere, and would drift the moment a later committee sat

Given the private half When it renders Then it is marked private on the page, because the boundary between what any reader can see and what only the holder can is itself information

Given nothing outstanding When the record renders Then it renders nothing at all — no badge, no empty state And each entry is a disclosure in document order, matching the text view's pattern rather than inventing a second one

Story 5.18: Sponsorship money reaching the ledger

As the owner, I want sponsorship payouts imported into the ledger on a schedule, So that the runway meter reflects money that actually arrived.

Acceptance Criteria:

Given the hosted sponsorship link shipped in Epic 3 When money is given through it Then sponsorship payouts are polled or imported into the ledger at least weekly (FR77, NFR-I3) And sponsorship and tips are separate channels in the ledger, because one is given ahead of the work and for nothing in particular and the other is paid after a particular change and for it

Given the public aggregate When it renders Then sponsorship appears as its own line, distinguishable from tips and from money paid for attention (FR84)

Story 5.19: A machine-readable description of the public API

As anyone building against the mind, I want an OpenAPI description generated from the engine, So that the description cannot drift from the handlers.

Acceptance Criteria:

Given the engine's public surface When the description is produced Then it is generated from the engine code-first rather than written by hand, and published with the public pages (FR71) And paths carry a major version, and the eleven error codes appear in it as the contract they are


Epic 6: The launch gate

Stage 5 · 9 FRs · 6 stories. Moderation live with the classes it refuses outright, the legal pages readable, the switch reachable without a third party, and every launch-gate requirement green. Then t0.

Story 6.1: Nothing reaches the stream unmoderated, and some things never reach it at all

As the owner, I want every thought moderated before the stream and whole classes refused outright, So that the mind is never asked to deliberate on something it must not do.

Acceptance Criteria:

Given any thought, paid or free, from a visitor or from an agent When it arrives Then it is moderated before it enters the stream, content targeting named private individuals is dropped, and every decision is logged with the reason it matched (FR4) And the policy is owner-controlled, cannot be changed by the mind, and never steps down with the degradation ladder

Given the moderation model unavailable When intake continues Then intake is held, never passed unmoderated

Given a thought in a prohibited class When it is checked Then it is refused at intake; the same idea is refused again at graduation before it becomes a task; and the implementer refuses it a third time whatever the roster decided (FR159) And every refusal is logged with the class it matched, and a thought a default-mode agent generated is held to the list exactly as a visitor's is

Story 6.2: Borderline thoughts wait somewhere visible, and reports are acted on

As a visitor, I want a held thought to show that it is held and a reported one to be dealt with, So that neither silence nor delay is ambiguous.

Acceptance Criteria:

Given a borderline thought When it is held Then it carries a visible held status inside the held-queue cap and resolution window, and an older item drops with a reason and a credit return if paid (FR8)

Given a reported thought When the report is reviewed Then it is reviewed inside the review window, and illegal or targeting content is removed from display within it (FR10)

Story 6.3: A sender of a prohibited thought is barred

As the owner, I want anyone who sends a prohibited-class thought barred at the first offence, So that the refusal has a consequence and the mind cannot choose who it applies to.

Acceptance Criteria:

Given a person sending a prohibited-class thought When the refusal is recorded Then they are barred from injecting, permanently and at the first offence (FR160)

Given a barred account When the bar is applied Then the balance is frozen rather than taken, and the terms under FR61 state what becomes of it

Given an anonymous sender When the bar is recorded Then it is a keyed hash of session and address storing no displayable identifier, kept under abuse handling as the one exception to the rate-limiting purge And the bar is best-effort and the product says so rather than implying otherwise

Given the ban list When the mind reads it Then it can read and never edit it, in either direction And the owner can review and lift any bar, and an appeal goes to the about-panel contact

Story 6.4: Forgetting on request, and not keeping what is not needed

As a person who injected something I want my content removable and my identifiers purged, So that an append-only log is not a permanent record of me.

Acceptance Criteria:

Given a redaction request When it is honoured Then the content is removed while the event record is preserved, as a tombstone re-applied on every restore, snapshots older than it are never served or published, and dataset releases exclude it (FR12)

Given rate-limiting identifiers When the retention window passes Then they are purged, and a keyed hash survives only inside a cardinality counter storing no identifier (FR13) And a ban record is the one exception, kept for as long as the bar stands

Story 6.5: The legal pages, and a switch no third party can block

As the owner, I want the terms readable before any purchase and the kill switch reachable on the engine host, So that the last two things standing between here and t0 are closed.

Acceptance Criteria:

Given any purchase path When a visitor reaches it Then the terms of service, refund policy and privacy notice are readable first (FR61)

Given any third-party outage When the owner needs to stop the mind Then the kill switch is reachable directly on the engine host without any third-party login (FR97)

Given the Minimal Launch Set When the gate is checked Then each launch-gate requirement is green by name rather than in aggregate: first view under 5 seconds and interactive under 10 (NFR-P2, P3); triage under 8 seconds (NFR-P12); the heartbeat monitor paging within 15 minutes (NFR-R6); the vulnerability contact published (NFR-S12); the three tiers physically separate (NFR-S13); 1,000 live and 10,000 crowded observers load-tested through the home uplink (NFR-C2); roster scale measured at 200 (NFR-C5); the front end scaling independently (NFR-C6); per-environment provider keys capped at the provider (NFR-I2); snapshots to S3 with off-network paging (NFR-I7); and one-command deploy per tier (NFR-O1) And the seven chaos scenarios that apply are green — payment confirmation delay and identity provider outage defer with the subsystems they test — and the weekly restore drill passes And the model and provider registry's stored terms are recorded as done, which is the one compliance check that blocks launch And then t0

Story 6.6: Liveness, which no harness can hold

As the owner, I want healthy ticks and the activity floor computed from the event log, So that a fully green test suite cannot coexist with a mind that has stopped thinking.

No FR carries this. Source: NFR-R1, and the verification spine's own warning — "A fully green suite is entirely compatible with a mind that has stopped thinking: the fixture replays a recorded stream, so the bubbles will breathe whether or not a tick ever fires. Liveness is held by the healthy-tick metric and the activity floor, never by the harness."

Acceptance Criteria:

Given any tick When it is classified Then a healthy tick is one where agents fire and the leaderboard moves, or one inside a declared rest state, with rest counting as healthy up to the daily rest cap (NFR-R1)

Given a day When it is classified Then a healthy day meets the activity floor, computed as a proportion of the ticks that day actually contained rather than of a fixed number of steps And a day in which the loop did not advance at all is never healthy, however few ticks it was ever going to hold

Given the replay-driven UI fixtures When the suite is green Then liveness is asserted from the healthy-tick metric and never inferred from the harness, because the fixture will breathe whether or not a tick ever fired

Given the digest and the self-sustaining ratio When they are computed Then both are gated on the activity floor, so the mind cannot reach a revenue ratio by thinking less


Epic 7: Growth, the contract for Phase 2

Post-MVP · 8 FRs · 5 stories. Not built during the MVP. Sequenced external action first, since content, products and any channel where the mind acts outside the workspace depend on it.

Story 7.1: Acting outside the workspace

As Human42, I want to take actions beyond my own workspace within an expanded allowlist, So that the things I decide to do can happen in the world rather than only to me.

Acceptance Criteria:

Given an expanded allowlist approved as a cage change When the mind acts Then network calls and spending within budget are permitted only inside it, and every action is logged against its declaration (FR36) And the container, the broker and the tier separation enforce the boundary regardless of what the code says

Story 7.2: A revenue channel the mind found

As Human42, I want to propose a revenue channel of any kind for registration, So that I can work to afford my own daydreams rather than waiting to be fed.

Acceptance Criteria:

Given a proposed channel When it is validated Then it is checked against the channel registration contract — a settlement account the owner holds with a reconcilable feed, a stated seller of record and tax treatment, coverage by the terms and refund policy, platform terms permitting automated participation, any required disclosure, the allowlist entries approved as a cage change, a declaration of spend before revenue against the venture sub-cap, a refund path, and a deregistration path with a defined fate for outstanding obligations (FR86) And a channel paying members of the public must also satisfy FR147's payout rail And the owner approves; the ledger settles

Story 7.3: Private questions, priced and reproducible

As an API consumer or a sponsor, I want an isolated seeded session that never enters the public stream, So that I can ask the mind something and reproduce the answer.

Acceptance Criteria:

Given an authenticated consumer When they run a decision session Then it is isolated, seeded and replayable, returns verdict, breakdown, dissent and any stake disclosure as structured data, shows the price before the call, and meters billing through a registered channel (FR72)

Given a visitor When they give feedback on an outcome Then it is recorded as a low-weight second signal (FR41)

Story 7.4: Somewhere to try an agent before it meets the live mind

As a contributor, I want a local development world and a staging world, So that I can iterate without the live roster being my test harness.

Acceptance Criteria:

Given a contributor When they run locally Then a local development world runs the contract, the fixture and the dry-run without the live world (FR53) And a staging world accepts an agent before it meets the live one

Story 7.5: Stewards, open data, and the lineage of a thought

As the owner and the research community, I want delegated curation, published datasets, and a traceable lineage from thought to change, So that the mind can be helped and studied without the owner being the only pair of hands.

Acceptance Criteria:

Given a steward When they act Then they can flag sources to reduce influence and curate themes, with an audit trail, and the role sits on top of the injector reputation rather than beside it (FR105)

Given the public log When a release is published Then it is a periodic open dataset of the public thought and event log, excluding redacted thoughts (FR106)

Given the hall of thoughts When anyone browses it Then it traces lineage from injected thoughts to merged changes, shows influence links as threads, and reflects seasons (FR66)