Computaco

Building worlds

Government offices#

The simulated internet has a small jurisdiction to navigate: a federal revenue service, the State of Arden's Secretary of State and Department of Revenue, the City of Port Linden's permit center, and the national post whose mailbox their letters arrive in. Each office is a portal with accounts and identity proofing, multi-page forms with validation, uploads, fees, case and confirmation numbers, review that takes business days on the world clock, requests for corrections, rejections with reasons, approvals, a register of what it issued, filings those records then owe, inspections, and letters about all of it. Nothing reaches a real government.

SiteService idWhat it does
frs.gov.examplegov-frsFederal Revenue Service: Employer Identification Numbers, issued online at once; a name and SSN that do not match federal records is refused with reference 101, as the real one is.
sos.arden.gov.examplegov-arden-sosArden Secretary of State: LLC and corporation formation, name availability, the public business entity search, annual reports due by the end of the anniversary month ($50 late fee; delinquent, then administratively dissolved 60 days later).
revenue.arden.gov.examplegov-arden-revenueArden Department of Revenue: the sales tax license (checked against the Secretary of State and the FRS over the network before it is issued) and monthly returns at 6.25%, due the 20th, with a non-filing notice, 5% a month penalty (at most 25%, at least $15) and revocation 120 days on.
permits.portlinden.gov.examplegov-portlindenPort Linden Permits and Licensing: sign permits through an automated plan check (sign area by zone, height, address on the sheet, no roof signs), building permits reviewed in a ten-business-day queue, inspections booked into open slots, business licenses checked against the state license and renewed yearly.
mailbox.post.gov.examplegov-postThe National Postal Service's mailbox: what is coming (sender and expected date) and, once delivered, the letter.

The epoch is Thursday 17 September 2026, 09:00 (the clock mail and Calendar read); business days skip weekends. Letters take the office's mail_days business days and are delivered at 14:00.

The service kinds#

Two kinds, in crates/services/gov:

  • agency is one office. Everything it offers is data: a programs map in its seed. The code is the clerk; the seed is the statute and the procedures manual.
  • postal is the mailbox. Offices post to POST /api/deliver over the synthetic network; only the nodes in its senders may. Its residents are also the identity records the offices proof accounts against.

An office's seed#

KeyMeaning
name, short, seal, jurisdiction, banner, tagline, address, phone, skin, themeHow it presents itself. address is the return address on its letters.
identity.fromA service whose seed residents ({user: {name, dob, ssn, address, zip}}) are its identity records; identity.attempts wrong codes lock an account (3).
post, mail_daysWhere letters are posted (http://post.gov.example/api/deliver), and their business days in transit.
staffUsers who see /staff: the review queue, the automated plan check's findings, approve / request corrections / reject, and inspection results.
card_fee_bpsThe card processor's convenience fee.
registerThe public register's title; empty for an office without one.
programs{id: Program}, below.

A program is one thing a person can file:

KeyMeaning
title, summary, category, order, case_prefixThe service list. A case number reads <case_prefix><year>-<sequence>.
verifiedNeeds an identity-verified account (default true).
againstRecord kinds it is filed about (an annual report, a return); its record field picks one the applicant owns or is authorised on, and the earliest unfiled obligation for it is the period filed.
pages[{title, intro, fields}]. A field has name, label, hint, kind (text, name, date, money, integer, choice, ssn, ein, email, zip, phone, state, yesno, record), required (default true), choices, min/max, max_len, suffixes and unique (a business name), and prefill (account.name, record.<field>, ...). Each page is validated as it is saved; errors come back on the page.
attachments[{name, label, hint, required, keys}]: a sheet pasted as Key: value lines, which must carry every key.
computed[{name, label, kind, of, bps}]: difference (never below zero) or rate, in cents.
feebase_cents, plus a computed field (the tax), plus bps of a money answer bps_of (a valuation); late (flat_cents, bps_per_month of the field, max_bps, min_cents) once the obligation's due date has passed; methods card and/or bank (an ABA-checked routing number).
reviewmode: instant, queue (decided by the office's system after business_days, or earlier by staff) or staff. verify: lookups at other offices (url with {{answers}}, expected fields of the JSON answer). rules: requirements, below. corrections_days: after this the case is withdrawn (30).
issueWhat approval puts on the register: kind, label, number (prefix, start, width, dash_after), name_field, public, status, letter, obligations, inspections, expires_days.
on_approveFor a filing against a record: the record's new status, and record_fields copied onto it.
lettersapproved, corrections, rejected, withdrawn: {subject, body} with {{placeholders}} (any answer, case, number, reasons, response_due, period, amount, ...).

A rule names a value (field, a computed amount, or an attachment's key) and one requirement: min/max, max_by ({field, table}: the limit for the zone), max_of (another answer), one_of, has, lacks, same_as, available (a name not on the register) or ssn_of (the SSN belongs to the person named in that field). A missing value fails. outcome is corrections (default) or reject; reason is what the letter says, with {{value}} and {{limit}}.

An obligation spec is {program, every: month|quarter|year, due_day, grace_days, notice, overdue_status, lapse_days, lapse_status, lapse_letter}. A year is counted from the record's issue month and due at the end of the anniversary month; months and quarters are due on due_day of the month after.

An inspection spec is {kind, lead_days, window_days, per_day, result, final_status}: open dates start lead_days business days out; result: "pass" has the inspector pass it on the day without staff.

State#

Under World::inspect() at /state/services/<id>/state, beside the seed:

KeyShape
accounts{user: {name, dob, ssn_last4, address, zip, email, verified, method, code, attempts, locked}}
cases{case number: {program, actor, status, confirmation, record, obligation, period, answers, attachments, computed, fee_cents, late_cents, paid_cents, payment, submitted, due, decided, response_due, revision, checks, comments, reasons, history, issued}}; status is draft, verifying, in_review, corrections_required, approved, rejected or withdrawn
records{number: {kind, label, program, name, status, owner, team, fields, issued, since, case, history}}
obligations{id: {record, program, spec, seq, label, start, end, due, status, case, filed, next_created}}; status is open, overdue or filed
letters{id: {to, name, address, kind, subject, body, case, record, mailed, delivered, post}}
payments, inspectionswhat was paid, by which method and its last four digits; inspections with date, status (scheduled, passed, failed)

A world can seed records and obligations (an entity that already exists and the report it owes) the same way: a record from before the clock began carries since (2019-03-04), which anchors its periods; spec is the index of the obligation in its program's issue.obligations. Use ids that are not OB-<n>. No timer stands behind a seeded obligation, so the office sweeps on every request and timer: the first time it is touched after the due date (plus grace) the obligation is marked overdue, the notice is mailed and the next period opens.

Routes and element ids#

/ services; /services/<program> (start, start-submit; ?record= for a filing); /account (acct-name, acct-dob, acct-ssn, acct-address, acct-zip, acct-email, account-submit; verify-code, verify-submit); /cases/<n>/page/<k> (f-<field>, err-<field>, next); /cases/<n>/attachments (a-<name>, attachments-submit); /cases/<n>/review (signature, sign-submit); /cases/<n>/pay (card-name, card-number, card-expiry, card-cvc, card-submit; bank-name, bank-routing, bank-account, bank-submit); /cases/<n>/confirmation (confirmation-number, case-number, issued-number); /cases/<n> (case-status, comment-<i>, edit-page-<k>, edit-attachments, resubmit-submit); /records/<number> (file-<obligation>, team-member, team-submit, inspect-date-<k>, inspect-submit-<k>); /letters; /status?case=; /search?q=, /register/<number>, /name-check?name=; /staff. JSON: /api/records/<number> (public: number, name, kind, status), /api/cases/<n>, /api/me.

Procedures#

gov- procedures in worlds/company-2026/procedures (written by scripts/procedures/gov_procedures.py) perform the founder's path and the sign permit through pointer and keyboard:

ProcedureWhoWhat they doGUI actionsTool calls
gov-business-registrationAlice (founder), Bob (bookkeeper)Alice opens accounts at three offices, checks the name, files the LLC and pays, gets the EIN, applies for the sales tax license (verified against both other offices) and pays, and authorises Bob; Bob opens his account and files the first month's return, paying by ACH226124
gov-sign-permitCarol (sign contractor)an account, the two-page application, the plan sheet, signature and fee; the plan check's correction read, a revised sheet uploaded and resubmitted; the issued permit's final inspection booked8742
gov-late-sales-taxAlice, Bobthe registration above, then 66 days pass with October unfiled: the license goes delinquent and the non-filing notice is mailed to Alice; Bob files October late and pays the tax with the $15.00 minimum penalty, restoring the license251139
gov-building-permitCarol (general contractor)applies with the plan set summary and pays by ACH; 19 days pass (ten business days in the review queue, two in the post); she reads the permit letter in her mailbox and books the final inspection, which passes six days later7937

The counts include the wait steps (two in the building permit, one in the late return). They are measured with scripts/procedures/debug.py at 1280×800 and are the same for every seed; all four verify on seeds 1-3 on screen and through tools, and CW_PROCEDURE_FILTER=gov- cargo test -p computerworld --features render --test procedures holds them to the suite's four properties. A wait gesture (a clock advance call on the tool path) lets the queue, the post, the deadline and the inspector run on the world clock. The longer paths (a case withdrawn after silence, an entity dissolved, a license revoked) are covered by crates/services/gov/tests/gov.rs, which runs the offices with their shipped seeds and fires their timers in world-clock order.