The operating half of Ink, answering the owner's audit (2026-09-02):「do we have all the design decisions?」— the reader-facing half is decided (the essays · the look); this page proposes the four that weren't: the nightly pipeline, the slate policy (how many · which beats · which formats · who writes how often), where editions live, and the console's Ink tab. Recommendations are marked; the owner's calls are collected at the foot.
| Decision | State | Where |
|---|---|---|
| Feed layout + the day-seeded composer | decided · built | ink-design · lib/ink_compose.py |
| Article ceremony · peg strip + in-app peg card · ⋯ menu | decided · built | ink-design · v1042–v1044 |
| Formats (9, likeliness not assignment) · triggers (8 + the why-now contract) | decided | vibes-essays |
| First-hand boundary · vantage (alive now, remembering then) · anecdote budget + memory bank | decided | vibes-essays |
| Tone gate (both-language antithesis meter) · author = DeepSeek V4 Pro thinking, Gemini failover | decided | specimens · chat 09-02 |
| Hero art: DeepSeek art-directs → flash-image, batch mode | decided · proven | ink-design |
| Language: one essay, frozen renditions, switch in the ⋯ | decided · mocked | ink-design §Language |
| The door = a room seeded by the essay + the essay as a SPECIAL BUBBLE | decided · unbuilt (step 1.5) | vibes-essays |
| The nightly pipeline (stages · timing · failure rules) | open → proposed below | this page |
| The slate policy (count · beats · formats · cadence · language) | open → proposed below | this page |
| Where editions live on the box | open → proposed below | this page |
| The console's Ink tab | open → mocked below | this page |
ink_compose assigns roles by the day seed; the edition is written as edition-YYYY-MM-DD.json with prev chained, then edition.json flips to it (atomic rename) — the threshold archive builds itself./var/lib/mad/ink (beside rooms/ and the built personas), served by the existing /ink mount pointed at MAD_INK_DIR (default lib/ink for dev, which keeps the specimen editions in-repo as fixtures). Retained forever — the archive is the product's memory, and the threshold needs it. A nightly brew writes ~1 MB (8 heroes + JSON); a year is ~400 MB.| Axis | Policy (the validator enforces; the editor is briefed) |
|---|---|
| Count | 8/day (6–12). Commission N+2, ship N. |
| Beats (8 house beats) | World · Science · Tech & AI · Markets · Culture · Sports · China · Life & relationships. A day covers ≥5 beats, no beat more than 2 pieces; the beat least covered over the trailing week gets priority. |
| Formats | The plain essay ≤ 3 of 8; ≥3 distinct other formats a day; fable and notes ≤ 1 each per day; ≥1 dialogue a week, ≥2 advice columns a week once reader letters exist; the response (商榷) whenever a piece has provoked rooms. |
| Triggers | Per 8: ~4 breaking · ~2 calendar · ~1 reply/continuity · ~1 appointment column (the running-title recurring slot). |
| Language | ≥1 zh-original piece a day when a zh-voiced persona fits (the Ink Well's natural tenant); every piece gets its renditions. |
| Cadence | ≤2 pieces per persona per week · every public persona writes ≥1 a month (the whole cast stays exposed) · a new public persona debuts within 7 days · the used-anchor ledger caps repetition. |
| Lead | The editor's #1 by significance + art strength; never the same persona two days running; a zh lead at least weekly. |
The mechanism is the house one: these are constraints in the editor's brief (so it composes toward them) and checks in code (so a miss is caught, not hoped against) — one re-ask, then runner-up swaps. All numbers are console knobs, not constants.
The admin console gains an Ink tab in its own list-row grammar. Six sections down the left; the landing is today's edition with the brew's health strip on top. Everything the pipeline froze is inspectable here, and every policy number above is a knob.
Rows are pieces; the trailing verbs are the owner's hands on the edition: open (the reader, as users see it), regenerate hero (another batch/sync paint), re-translate, hold (unpublish one piece — the composer re-flows), read draft (a gate-dropped piece, with its meter score). The dot is the tone-gate score; the strip is the brew's health and the day's spend.
| Section | What it holds |
|---|---|
| Editions | Every edition by date: pieces, gate scores, art status (batch/sync/missing), renditions, peg ok, rooms spawned; per-piece verbs above; whole-edition hold/re-publish. |
| The brew | Schedule (evening/dawn times, timezone), the kill switch, Brew now, the last run's stage log with timings and the stage that failed, per-stage models (editor · writer · translator · art director · painter · failover) drawn from the Models tab's roster, retry. |
| Slate policy | Every number in §3 as a knob: pieces/day, beat quotas, format quotas, weekly minimums, cadence caps, language minimums, gate threshold, length floors per language. |
| Cast & beats | Persona × beat affinities (editable), last-written date, pieces this month, opt-out (a persona that shouldn't write), debut queue for new personas. |
| Sources | Query recipes per beat, the calendar file (data days · anniversaries), blocked domains, the SERP engine chain — the same engines the dispatch uses. |
| Metrics | The four that matter: engaged reads (30s+), doors opened, rooms spawned per slate (the neutron-bomb number), return rate — per edition, per beat, per format, per persona. Cost per piece beside each. |
/var/lib/mad/ink as the box's edition store? ⑤ the Ink tab as the console's fourth tab (vs a section under Settings)?