The audit trail is git history. Four static pages and one open ledger, assets/jobs-data.js (a plain script), so every page in this section still opens over file://. This page documents its schema, the nine-state lifecycle a job moves through, the money seam gated on a fiscal host that doesn't exist yet, and exactly what runs today versus what is only designed. The plain-words board is for everyone else.
Four pages share one record. Each loads assets/jobs-data.js with a plain <script> tag, reads window.JOBS_DATA, and renders whatever it finds, defensively, so a missing file yields one plain sentence. The page never goes blank. Nothing here fetches anything: the ledger is loaded the way a page loads its own code.
Four page-squares (the board, name a job, the steward's desk, and this technical page) each read and write down to one shared amber line, the ledger. A job sits astride that line as a half-filled hexagon: the record the line carries. Past the ledger's right edge, a gray arrow reaches explore.html, where every fund, build, and propose action is actually sent.
Scrolls sideways on narrow screens — nothing here forces the page itself to scroll.
| Page | P-# | File | Role |
|---|---|---|---|
| The board | P-048 | jobs-board.html | Every job, its state, its money, its history — filterable, searchable, with a #/job/J-0xx detail route for the whole record |
| Name a job | P-049 | jobs-board-create.html | The intake form: live preview, copyable ledger-entry JSON, printable proposal sheet |
| The steward's desk | P-050 | jobs-board-admin.html | Administer, close out, and (once a fiscal host exists) pay; edits a working copy in one browser, nothing real until it's committed |
| This page | P-051 | jobs-board-technical.html | The schema, the state machine, the seams, and the table of what runs versus what's designed |
assets/jobs-data.js declares one global, window.JOBS_DATA, and nothing else. It changes only by commit — that's what makes git history the audit trail. The file's own header comment says as much: "This file IS the board. It changes only by commit; git history is the audit trail."
Reading the ledger…
| Field | Shape | What it means, and why |
|---|---|---|
schema | integer | The shape's version. A change to what fields mean bumps this. A change to their values leaves it alone. |
updated | "YYYY-MM-DD" | The date the published file last changed. The desk bumps it on every commit it prepares. It shows the date of that last change, and nothing about this moment. |
fiscalHost | null | object | The open fiscal host every dollar must move through. null today. This one field gates every payment-shaped control on all four pages — see §4. |
nextId | "J-0NN" | The next unassigned id. Ids are permanent, like page numbers: never reused, never reassigned, even for a withdrawn job. |
jobs | array | The whole board, one file, in the order jobs were added; pages that render a list do their own sorting (§7.1's sort order, for instance; since September 8, 2026 the board lists the newest job first within each state). |
| Per job | ||
id | "J-001" … | Permanent. The steward's desk assigns it from nextId on arrival and never touches it again. One id carries letters: J-LR, the umbrella job for the Legal & Regulatory Commons (September 11, 2026, the founder's specification); nextId keeps counting from J-026. |
legacy | "j1" … | absent | The explore.html string key a job migrated from — only the first twelve carry it. Provenance: the original i18n row still exists, untouched, and nothing reads through this field. |
kind | enum · 12 values | translation · tool · code · verification · lawpage · capability · print · center · data · security · legal (added September 8, 2026: a licensed lawyer's written review) · regulatory (added September 11, 2026: an open body of legal and regulatory knowledge, built and kept current by a stewardship group) |
en / es | {title, sub, why?} | Words, verbatim from source. A builder agent never paraphrases them. es is null until a translation exists; why only ever appears on en. |
status | enum · 9 values | The lifecycle state — see §3. |
opened | "YYYY-MM" | "YYYY-MM-DD" | Uses month precision when the exact day is unknown; the field does not invent a day. |
steward | name | Who answers for this job's record. Never blank. |
page | "file.html" | absent | Optional (September 11, 2026). A job with its own page on the site names it here; the board links to it. |
workModel | text | absent | Optional. How the work runs when the four-step loop is not the whole story, e.g. "Initial build + continuing maintenance". |
lifecycle | [step, …] | absent | Optional. A job's own lifecycle when it differs from the board's four steps. J-LR carries seven: Named, Funded, Built, Verified, Published, Monitored, Updated, because legal and regulatory knowledge can go stale after publication. status still uses the board's nine words; the lifecycle is shown, not enforced. |
packages | [{id, group, name, what}] | absent | Optional. Work packages inside one umbrella job (J-LR-001 …). They are not separate jobs and never get their own ledger id; the desk writes them back in order, unchanged. |
budget | null | {amount, currency, covers} | Posted openly before funding opens; that ordering is the point. |
pledges | [{date, name, amount, note}] | A pledge records interest. Nothing in this array has moved money, however large it grows. |
builder | null | {name, since} | Set once a paid builder is assigned — the guard for building. |
milestones | [{date, what, done}] | Public by construction: the array a reviewer reads is the same array the page renders. |
payments | [{date, to, amount, what}] | Can only be non-empty once fiscalHost is non-null. An empty array here means "nothing could happen yet." |
released | null | {date, where, license} | The close-out proof: what everyone got, and where to find it, forever. |
history | [{date, event}] | Append-only. Every transition lands here, and the desk never edits or removes an entry. A correction is a new entry. |
Every transition appends {date, event} to history. History is append-only — the desk never edits or removes an entry.
The seven states a job passes through in order, each a hexagon in its fill state, joined by gray arrows. A small amber mark crosses each arrow: a guard, spelled out below. The funding-to-funded arrow is dashed and its gate is a solid amber block: that guard is closed today, for everyone, because no fiscal host exists yet. Below the chain, a dashed gray hexagon (paused or withdrawn) connects back with a two-way dashed arrow: reachable from any state before closed, and able to return to wherever it paused.
Scrolls sideways on narrow screens — nothing here forces the page itself to scroll.
Status marks (the hexagon grammar): proposed = outlined hexagon (mid indigo #7280BD) · funding = half-filled (wash #B8C4EE — held/pledged) · funded = filled wash with solid outline · building/review = filled mid indigo · delivered/closed = filled deep indigo #2B3572 · paused/withdrawn = dashed gray outline #888780. Each of the other three pages implements this as its own small inline-SVG helper — pages here are self-contained, so a little duplication is the site's way. Status words also appear as text pills next to every mark: color never carries meaning alone.
| State | Plain meaning | Guard to ENTER (steward's desk enforces; this page documents) |
|---|---|---|
| proposed | named, on the board | a title, a sub, a kind, a steward |
| funding | budget posted, pledges open | budget non-null with covers — open books before the first dollar |
| funded | the money has been assembled | fiscalHost non-null AND pledges convertible ≥ budget. Today impossible — the desk shows the gate closed and says why in one plain sentence |
| building | a paid builder is at work | builder non-null |
| review | work submitted; tests/reviews public | ≥ 1 milestone recorded |
| delivered | released to everyone, forever | released non-null (date + where + license) |
| closed | final accounting published | delivered AND payments reconciled: Σpayments ≤ budget, remainder disposition noted in history |
| paused | stopped, may resume | reason, logged |
| withdrawn | ended; the record stays | reason, logged. Jobs are never deleted — ids are permanent like page numbers |
One field gates every payment-shaped control across all four jobs-board pages: fiscalHost. It is null today, and nothing here says otherwise.
fiscalHost goes from null to a real object.
The payments recorder on the steward's desk becomes available. It is currently disabled with an explanation.
funded becomes reachable: its guard (fiscalHost non-null AND pledges convertible ≥ budget) can finally be satisfied.
payments can hold real entries instead of staying permanently empty.
Pledges never become payment retroactively. Every pledge display says that money has not moved, host or no host.
Budgets are still posted before funding opens — always, in public, amount plus what it covers.
Close-out arithmetic (budget vs. payments vs. remainder) is always published in the ledger. A fiscal host changes how money moves. The math stays open either way.
Fundraising stays "gathering pledges + sharing the job." Pledge buttons route to Write to us; no payment form, processor link, or QR code appears on any of these four pages, ever — a fiscal host is a financial and legal integration.
explore.html carries a single switch, commented in its own source: set INTAKE.url to the live intake service URL and every door on the site activates at once. It reads const INTAKE = { url: '' }; today — empty, on purpose. This section's create page and every "I'd fund/build this" control are exactly one more Apply button.
Two functions do the whole job. applyHref(kind, ctx) builds the in-page route (#/apply/<kind>/<encodeURIComponent(ctx)>) that every fund, build, and propose control on these pages uses; it's pure client-side hash routing and needs nothing live. intakeLink(kind, ctx) builds the real, outbound submission URL from INTAKE.url; while that's empty, it returns null.
On that page, a null link replaces the primary action with the sentence already live on the site today: "Applications open soon. This site stores nothing, so the application system runs on a server we run ourselves. It's being built now; watch “New in this place.”"
The propose kind that "Name a job" submits through already sits in explore.html's kind map alongside fund, build, security, and feedback. Naming a job reuses an existing intake category. And what the intake asks for (and refuses to ask for) is the same list every applicant sees: name, verified email, area, what you want to do, one sentence why, who sent you, your languages; never a Social Security number, a date of birth, a street address, or a document.
INTAKE.url and fiscalHost are the same pattern twice: one field, empty today, checked defensively, replaced by a sentence. Neither this page nor any of its three siblings touches either field; they flip once, elsewhere, on someone else's schedule.
assets/jobs-data.js is a plain-text file in the open repository — every job's full history is readable, alongside its current state.steward field — a named person who answers for that record.Community Guidelines §4, "Money and honesty," governs this section: nobody sells to members here; disclose any interest in something you recommend; funded work uses open budgets; nobody pays for better treatment, and having no money does not reduce anyone's standing.
The dedicated pair on this posture, site-wide: Preventing fraud, waste, and abuse (P-021) and its technical page (P-022).
| Capability | Standing | Detail |
|---|---|---|
| The board, job detail route, create form, steward's desk | RUNS TODAY | entirely client-side; no server, no accounts; every page opens over file://; the ledger loads by a script tag, never a fetch |
| Live intake — the real submission behind every door | DESIGNED | Kurt's Django seam; INTAKE.url stays empty until it lands, and the door says so meanwhile — §5 |
| The open fiscal host — the account job money would move through | DESIGNED | counsel and the funding spine land first; fiscalHost stays null until an actual host exists — §4 |
| ES editions of these four pages | PENDING | tracked, not started; chrome stays EN meanwhile — job titles and subs already switch to their es text when kisop-lang is es and a translation exists |
No build step. These are plain HTML files with an inline stylesheet and a couple of <script src> tags — open any of them directly.
Where the files live: the four pages sit in site-v3/ beside every other page on the site; the one record they share is site-v3/assets/jobs-data.js. Nothing here calls out to a server, a CDN, or an analytics script — that's true of this page too.
To propose a change, use Apply: kind build to build something on the board, or Write to us, kind security, to report a problem with how the ledger or these pages behave. Both routes already exist. The public repository, where a change would actually land as a commit, opens later; today, those two doors are it.
What exists today: all four jobs-board pages run client-side, against the seeded ledger of twelve jobs migrated verbatim from explore.html's first board — see §7 for the full table.
What's designed, not live: the intake service behind every door, and the open fiscal host every dollar would move through. Both are named, dated, and gated on a single field each — see §§4–5.
Reviews still pending: Carmen has not yet reviewed this draft, and its interface text has not been translated into Spanish. Written August 4, 2026.