The Support Loop.
Two product lines shipped ten releases in one week. Behind the installers sits a five-stage chain β release β upgrade β diagnose β analyze β answer β and then, one step further: a public board where classification is the decision, and an unattended implementer that proposes tested patches on an isolated branch while main never moves.
This is a release note with the scenery left in. Two product lines β MRRC (the universal Hamlib-based remote station, Windows line, v6.1.x) and MRRC Modern (its modernized sibling for FT-710 and IC-7300-class radios, Windows + macOS, v1.18.x) β shipped ten releases in the 48 hours of Sep 17β18, 2026. The installers are the visible half. The other half is the support chain that produced them: one-click upgrade and rollback on the user's side, a redacted diagnostics bundle, a machine first-reading on a ten-minute cron, and a public answers page where every verdict cites raw log lines β and, since Sep 19, a public board with an unattended implementer behind it. This page records what shipped, what the first days of triage taught, and what the chain says about agentic engineering β the discipline of separating judgment from execution β applied outside the repository, where the users are.
TL;DR β the loop in six findings
- FactTwo lines, one week, ten releases. MRRC shipped three installers (v6.1.15 / v6.1.16 / v6.1.18) and five hotfixes; MRRC Modern shipped v1.18.0 (macOS DMG + live update channel) and v1.18.1 (signing and mic-permission fixes, Windows rebuilt in sync).
- FactThe chain is a loop with self-service at both ends. Users upgrade, roll back, bundle diagnostics, and read answers without filing a ticket; the maintainer's side triages on a ten-minute cron. Four days of machine triage: 7 published replies on MRRC (6 answered, 1 returned for more evidence) plus 1 known-issue card (fixed in 6.1.13); 2 replies on Modern within 48 hours of its first bundles.
- InferenceOne report is a case; a repeated signature is a requirement. Two users hit the identical rigctld wall within two hours on Sep 17; the auto-start fix shipped the same day. The NR2 water-sound answer became a level-table change, then exposed knobs, then a third denoising engine.
- InferenceThe verdict ontology is the requirements sieve. Environment β defect is not bureaucracy: misclassify environment as defect and the roadmap fills with phantom requirements; misclassify defect as environment and users strand. Every published card carries raw evidence lines so the reader can check the reasoning.
- InferenceThe loop now reaches the code. MRRC Modern's fourth loop practice (Sep 19): every analysis lands classified on a public board β noise closes, bug auto-schedules, feature waits β and a cron implementer proposes a guarded unified-diff patch on an isolated
fde/<id>branch, committed only when the full test suite is green.mainis never touched; the merge stays human. - ThesisSupport is the outermost loop of agentic engineering. The unit of iteration is not the commit β it is the unanswered user symptom. A loop that closes inside the repository can stay open to the field for months; this chain closes it.
One week, two lines, ten releases
What a user actually gets β not a changelog, the experience.
| Artifact | Day | What the user gets |
|---|---|---|
| MRRC V6.1.15 (installer) | Sep 17 | The Windows install auto-starts rigctld β the radio's CAT daemon ships inside the package (vendor rigctld.exe + DLLs), with model-name β number resolution so a config that says FT-891 works, not just -m 1036. |
| MRRC V6.1.16 (installer) | Sep 17 | Hardening: the bundled rigctld path is manager-primary and the fallback yields instead of ever blocking startup β a self-start must never cost a boot. |
| MRRC V6.1.18 (installer) | Sep 18 | A third noise-reduction engine: NR3 β RNNoise (Xiph's neural denoiser, v0.2, BSD-3) with [WDSP] nr3 = plus|only|off; libwdsp rebuilt with new EMNR alpha/npMax knobs; the NR2 level table moved down (β6/β9/β12/β16); and a gating fix β denoise off now means true bypass. |
| MRRC hotfixes 6.1.14 β 6.1.18 | Sep 17β18 | Same fixes, hotfix channel: no reinstall β restart MRRC and they apply. Auto-start (6.1.14), nameβnumber (6.1.15), fallback-yields (6.1.16), NR2 table (6.1.17), NR3 + gating (6.1.18). |
| MRRC Modern v1.18.0 | Sep 17 | First-class macOS (Apple Silicon DMG, macOS 11+) alongside the Windows installer, plus a live update channel (latest.json with SHA-256 taken from the artifacts) and the full support chain: π bundle, answers page, packaged builds that keep logs. |
| MRRC Modern v1.18.1 | Sep 18 | Two macOS fixes: the app is signed (no more "damaged and can't be opened"), and the bundle requests microphone permission (no more silent RX). The Windows package was rebuilt in sync from the same source. |
Alongside the releases, the same week carried performance work now in Modern's line: the TXβRX capture reopen after a transmission dropped from ~270 ms to ~200 ms, muted RX frames stopped being broadcast while the radio is keyed, and PTT release latency got its own SDD version row (V2.55). None of it is glamorous. All of it is measurable.
And the loop itself shipped that week too: on Sep 19, MRRC Modern deployed the FDE board β the lineage's fourth loop practice β a public kanban where every analysis lands classified (bug / feature / noise), plus an unattended implementer that turns scheduled entries into test-gated patches on isolated branches. It is not an installer, so it is not in the table. It is the subject of Β§05.
Every installer keeps its previous on the server β git-tracked, because the deploy is rsync --delete and an untracked server file gets deleted (a rollback button once went 404 in exactly this way). Hotfix-channel versions must stay below the installer version; a rollback target must exist and must not be a known-bad build; and the manifest's SHA-256 is verified server-side, because the local download path is not trusted. The comparable cross-project numbers (tests, constraints, versions per family) live in one place: the evidence ledger β sub-sites and blog posts link to it rather than re-stating them.
What "self-service" and "self-diagnosis" actually mean
Five stages β release β upgrade β diagnose β analyze β answer β with the round-trips engineered out.
Most support chains are an email alias with hope. This one is a pipeline with an instrument on each end. On the user's side, the app is built so that the four things a user needs never require a ticket:
β¬οΈ Upgrade without a download page
One button in the web UI (or U in the launcher). The server enforces a PTT gate first β an upgrade is refused with HTTP 423 while the radio is transmitting. The download stages to a .part file, verifies SHA-256, renames atomically, installs, and the launcher hands over cleanly.
β©οΈ Success that can't be faked
"Installing" is not success. The only success verdict is state.json β lastResult.status == "ok", attested by the new version at its own startup. Until the new build says so, the upgrade did not happen. One-click rollback runs the same silent path against the previous installer.
π Diagnose without reading logs
One menu entry builds a redacted bundle: log tails, a whitelist-redacted config, an environment snapshot (version, platform, audio device table, active hotfix layers), and an auto health summary β diagnostics/summary.txt β that distinguishes restarts from crashes by launch count and time span. Passwords, keys, tokens, recordings, memory channels and tuner learning data never leave the machine.
π Answers without an email
The public answers page is searchable and deep-linkable by report ID. Every card has the same anatomy: ID / symptom / diagnosis with raw evidence / verdict / your move / status. Fixed cards flip to "fixed Β· version" when the release lands.
On the maintainer's side, the same chain runs on a ten-minute cron: fetch new bundles β summarize (reusing the exact summarizer the client ran, so both ends agree on what the summary means) β model analysis under a written discipline β a structured JSON verdict β a rendered card β publish. Publishing is default-deny, runs are idempotent per bundle ID, half-packages are skipped, and each pass caps at two bundles.
Support used to be an interview: one email = one question, with hours of latency per exchange, and the user answering from memory. The bundle converts the interview into a measurement: one upload = one scene, with capture-health percentages, device tables, and restart-versus-crash discrimination. That conversion is not a UX nicety β it is what makes machine triage possible at all. You cannot delegate the first reading of an interview; you can delegate the first reading of a measurement.
Both product families now run this identical chain. Modern inherited it whole with v1.18.0 β bundle format, summarizer, answers page, update check β and its first two auto-triaged replies went out on Sep 19, within a day of its first bundles arriving.
Three incidents that became shipped product
How solved problems mine new requirements β the mechanism, not the slogan.
The same wall, twice in one morning
On Sep 17, two FT-891 reports arrived within two hours β 20260917-073700-14ef at 07:36, 20260917-085736-ebd2 at 08:53. Same symptom ("can't connect to the radio; audio syncs fine"), same verdict from the bundles: the CAT daemon rigctld wasn't running, the config was correct, three logged timeouts, no crash. Per the verdict table, both cases were environment, and both answer cards taught the user the same PowerShell incantation.
Individually closed. Together, a product gap: a "universal remote" that requires every new user to hand-launch a daemon is making the same ask of everyone. The repetition converted it. The same day: hotfix 6.1.14 shipped auto-start (rigctld_supervisor.py); hotfix 6.1.15 fixed model-nameβnumber resolution (rigctld --list) and vendored rigctld.exe into the installer (V6.1.15); V6.1.16 made the fallback yield instead of ever blocking a boot. A public answer card now tells FT-891 owners to just update.
The verdict "environment" answers the user. The co-occurrence of two environment verdicts within hours answers the roadmap. The interesting engineering quantity was never any single verdict β it is the signature across reports, and the time from signature to shipped fix: here, under a day.
An answer became a default; a default became an engine
Report 20260917-132643-020a: "water flowing, distortion after denoising" on NR2 level 2. The bundle's own numbers made the verdict provable rather than plausible β audio capture health 99.9%, no Traceback, no double-denoise stack β so the card diagnosed the classic spectral-subtraction musical noise artifact and taught the moves: level 2β1, AGC mode, bandwidth.
Then the product absorbed the lesson in three steps over three days. Default changed: the NR2 level table moved down a notch (hotfix 6.1.17), then to β6/β9/β12/β16. Knobs exposed: C-layer alpha/npMax setters in a rebuilt libwdsp, with new defaults closed-loop measured (npmax 0.98, AE 20/0.50). Engine added: NR3 β RNNoise, a neural denoiser from Xiph β selectable as plus|only|off, shipped in V6.1.18 together with the gating fix that makes "off" a true bypass (users had reported distortion persisting after turning denoise off β itself a report worth mining).
An answer card fixes one station in minutes. A changed default fixes every future station silently. A new engine changes what is possible. Support that stops at step one is a cost center; the arc that runs answer β default β engine is how a support queue becomes a requirements pipeline.
Two silent failures, and the regression protocol
Modern's first macOS release hit two silent failures, and both fixes are lessons in observability. "Damaged": every macOS build so far had shipped unsigned β the signing step had been failing silently in the build β so Gatekeeper refused the app with a dialog no right-click bypasses. The fix is twofold: lay the bundle out the way codesign requires, and make a failed signature abort the build. The silent failure was the defect; the dialog was only the symptom. Silent RX: the bundle declared no audio-input permission, and macOS answered by opening the capture stream and filling it with zeros β the log said "check the radio" while CoreAudio reported no error. The fix requests the permission properly and points the warning at System Settings, not the radio.
The third case is the triage system biting its own tail, productively. Bundle 20260918-114118-9ad3 carried a "Recording dropped / queue full" signature matching a defect fixed in V2.44/V2.45 β but every matching log line was dated Sep 12, before the fix shipped. The published verdict refused both easy answers ("already fixed" / "regression!") and ran a protocol instead: the user records one new QSO and reports back; the follow-up bundle (20260919-085517-b3aa) closed it, with Sep-19 logs healthy and the old lines identified as pre-fix residue. The harness change that made this possible is one line of process, committed as ecb2652: the model reads the project's own incident history before writing verdicts β SDD version history, CHANGELOG, and exact code positions are inputs, not afterthoughts.
Both Modern verdicts cite evidence line by line: server.py:348 _ensure_rec_writer() (the fix, present in shipped code), the SDD V2.44/V2.45 rows, timestamped summary lines, and the healthy Sep-19 session logs. Where material was insufficient, the card says so instead of guessing β one of MRRC's first seven replies is still standing at "need more info", which is the honest rung, not a failure state.
The machine's first reading, the human's verdict
Triage is a contract, not a vibe: a structured output, a verdict ontology, and guardrails that fail closed.
The analyzer's output is a fixed JSON contract β verdict, status (answered | needs_fix | need_more_info), category, diagnosis[], solution[], evidence[], keys[], needs_code_change, code_hint β rendered into the answer card verbatim, evidence lines included. The verdict ontology is written down as a table, not a feeling: Traceback or a repeating exception β defect; many launches without a Traceback β not a crash; -9996 with an empty device table β environment (a VM without a sound card); rigctld not running β environment; capture health below threshold β performance; certificate warnings β normal noise.
The ontology is the sieve
Environment β defect is a requirements decision, not pedantry. Misclassify environment as defect and the roadmap fills with phantom requirements ("auto-launch things users never asked for"). Misclassify defect as environment and users strand with a workaround that never becomes a fix. The table keeps both errors expensive.
Conservative by rule
Insufficient material β need_more_info. No Traceback β never call it a crash. Environment β never a defect. Conclusions must land on a user action β "go to Settings and re-select the audio device", never "wait for the maintainer". And the answers page is public: only publishable conclusions, no user data.
Guardrails that fail closed
Default-deny publishing (an explicit flag publishes). Idempotent per bundle ID. Half-packages and non-zip payloads skip without retry. Two bundles per pass, a nine-minute model timeout, cron with absolute venv paths. The automation is allowed to do nothing; it is not allowed to do something wrong.
The division of labor
The machine does the first reading β cheap, consistent, tireless, on a ten-minute cadence, with every claim tied to a log line. The human owns needs_code_change: the code change, the release decision, and the call that an answer is safe to publish as written. The products are built by the maintainer; the agent triages, drafts, and renders.
MRRC's answers page: 7 triage replies β 6 answered with actionable steps (4 environment, 1 audio tuning, 1 no-fix-needed), 1 returned for more evidence β plus 1 known-issue card written to the user-visible symptom ("buttons dead"), whose cause (an inline JS syntax error in 6.1.12) became tests/test_web_inline_js.py: every inline script now passes node --check on every release. MRRC Modern: 2 replies in its first 48 hours, both citing code positions and version history. Zero replies ended in "wait for the maintainer".
From answered to implemented
On Sep 19 the chain grew a public board and an unattended implementer β the loop now reaches the code.
Classification is the decision
Until Sep 19 the loop could read and answer, but the bug/feature split it produced had nowhere to go β a human still had to pick what to fix, fix it, and close the case by hand. The board (vlsc.net/mrrc_modern/board) supplies the missing halves, and its rule is one sentence: classification is the decision. The analysis contract gained three optional fields (kind: bug / feature / noise, plus severity and title), and the taxonomy became a dispatcher:
| Classification | Automatic action | Why |
|---|---|---|
| noise β environment / false alarm / already-fixed signature | Answer the user; board column answered β terminal, no code work | The answer is already on the answers page |
| bug β a locatable product defect | Answer the user and auto-schedule into the unattended implementation queue | Fixing it is a verification problem, not a product choice |
| feature β new capability / new parameter | Answer the user; board column backlog β waits for the operator | Scheduling a feature is a product decision; it does not automate |
| need_more_info | Never closes β stays in the backlog for follow-up | An un-answered report must not pretend the loop closed |
The board and the answers page share one privacy filter (redact_public) and link to each other. A user's report becomes a card with a status column β feedback stops being a mailbox and becomes a queue with a visible position, which is also a public promise: what got closed, what got scheduled, what is still waiting, and why.
A tested patch on a branch, while main sleeps
The same cron that triages now carries --implement. For each scheduled entry, single-flight β one entry per run, and only from a clean main worktree β the pipeline runs the model with read-only tools (read,grep,find,ls) and asks for a JSON contract: understanding, a unified-diff patch, a test plan, a risk level, a commit message β or no_action, which lands on the board as Rejected with the reason. The model has no write permission; the patch is text until the pipeline decides otherwise.
What the pipeline does with that text is where the safety lives:
- Guards first β the two cross-file tooling-guard scripts,
certs/,win/,packaging/and the installer manifests (.iss) are refused outright; a single patch may touch at most eight files. git apply --checkbefore anything moves; a failed check ends the attempt with the reason recorded on the board.- An isolated branch β the patch is applied only on a fresh
fde/<id>branch, never onmain. - The full test suite is the gate β green commits to the branch (the board records
branch@hashplus the test line); red deletes the branch, restores the worktree, and records failed with the tail. mainnever moves. An unattended process cannot reach it; merging the branch is a human act.
The design view is the same one behind the PTT gate: the machine may propose, evidence decides, the human accepts. Nothing about the radio is automated away, and nothing about the code lands unreviewed β what changes is that a scheduled bug no longer waits for a human to be at a keyboard to even begin.
Two failures of the loop itself β and what they prove
An unattended loop has failure modes of its own, and two of them surfaced within the first day β each worth more than the feature it delayed.
The model runner that couldn't run. The cron triage pi had been dying with SIGABRT two days running. Root cause: a Homebrew upgrade had broken the bottled Node's dylib linkage (llhttp) β the model runner, not the model. The fix was not a retry but a diagnosis: run_pi now names signal death and its likely cause in the log. A loop that fails wordlessly is indistinguishable from a loop with nothing to do; an unattended loop must be able to explain its own silence.
The test fixture that reached production. Test runs patched the local page paths but still shipped their fixture answers/board pages to the live server β discovered because the production board suddenly displayed a test bundle ID. The fix made page shipping one patchable seam (_ship_page()), and the verification is the point: a full 1,299-test run now leaves both the local board state and the live board page byte-identical. The loop's own release path is under test.
Both incidents were caught because the loop's artifacts are public and byte-checked. Private automation can fail silently for weeks; a public loop leaks its own failures into the same evidence surface as the product's. The board showing a test ID was ugly β and exactly why the seam was fixed the same day.
The human's job compresses to two verbs
Read against Β§04, the board changes what the automation is allowed to decide. Before: the machine read and classified, and a human chose, fixed, and released. After: classification dispatches β noise closes itself, bugs enqueue themselves β and the human's intervention collapses to decide (one scheduling note per feature) and merge (accept a tested branch). That is the same division of labor as the rest of the engineering system β judgment human, execution delegated, evidence gates β now applied to the product's own backlog rather than its source tree.
The loop's boundary moved again. It used to end at an answered ticket; then at a shipped fix; now it ends at a reviewed branch β a tested, reversible patch produced while no human was awake, waiting for a human to say yes. The last word stays human not because the machine cannot merge, but because "does it count" is the one act this project refuses to delegate.
As of this writing the live board holds two classified entries, both noise β answered; the first real bug is still waiting for its first real scheduling, and the first unattended patch for its first human merge. The end-to-end path β report β schedule β unattended implement β merge β is verified by tests, not yet by a real case, and the SDD entry (V2.56) writes the same boundary down: the implementation model's exploration budget and diff quality await calibration on real samples. The gate count of that week's pipeline: 1,299 tests in the Sep 19 commits; the maintained comparable counts live in the evidence ledger.
What this chain says about agentic engineering
Agentic engineering separates judgment from execution. The support chain is that separation applied where the users are.
Loops have boundaries β and the repo is the wrong one
The ledger article (Seven Billion Tokens, Dissected) measured the inner loop: contract tests go red first, agents deliver to green, median 19 minutes. That loop closes inside the repository. But a green suite is a loop closed around the wrong boundary if the unit of iteration for a product is not the commit β it is the unanswered user symptom. A product can ship for months with every test green and every third user stuck on the same wall, because nothing inside the repository boundary can see the wall. The support chain extends the loop: field β bundle β verdict β product change β release β user self-service. The loop only counts as closed when the user's next click succeeds without a human in the path.
Self-service is bandwidth, not courtesy
Every step moved to the user's side removes a round-trip from the loop: upgrade without a download page, rollback without a reinstall, a diagnosis without reading logs, an answer without an email. The design test for each is the same sentence: can the user complete the move without understanding the log? This is why "self-diagnosis" is not a marketing word β the bundle is an instrument placed on the user's side, designed for the receiver rather than the sender: redaction by whitelist, a summary written to be read at a glance, restarts discriminated from crashes, device tables attached. And it is why the answers page publishes raw evidence lines: a user who can check the reasoning can trust the next answer before reading it.
Self-service is the loop's bandwidth. A support chain that requires a human to relay every message caps the product's total iteration speed at one human's attention. A chain where the user's side can complete upgrade, rollback, measurement, and answer-lookup alone lets the loop run at the cadence of the slowest automated stage instead.
Signatures, not verdicts, promote into the roadmap
One report is a case. A repeated signature is a requirement. The verdict ontology is what keeps this honest β it is the sieve that protects the roadmap from phantom requirements (environment misread as defect) and protects users from abandonment (defect misread as environment). But the quantity that actually drives iteration is the signature across reports, plus the time from signature to shipped fix. Sep 17: two environment verdicts, two hours apart β same-day hotfix. Sep 17β18: one tuning answer β level table β knobs β third engine. The support queue and the roadmap are the same ledger, read at different periods.
A cadence stack, not a single loop
| Loop | Period (measured) | Captures |
|---|---|---|
| Triage | 10 min (cron) | Every bundle gets a first reading; nothing waits in a mailbox |
| Answer | same day | User-side resolution for environment / usage / tuning classes |
| Implement | minutesβhours per entry (single-flight, test-gated) | Scheduled bugs become tested patches on an isolated branch; the merge stays human |
| Hotfix | hours (6.1.14 β 6.1.16 within a day) | Defects and gaps inside the hotfix-able surface (www/**, app modules, vendor) |
| Release | days (V6.1.15 β V6.1.18; v1.18.0 β v1.18.1) | Installer-level changes: bundled engines, signing, permissions |
| Immunity | incident β guard, permanent | Each incident leaves a guard behind: the inline-JS guard, the site's test-count and bilingual-pair checks, the signature-aborts-build rule |
A system's learning rate is set by the fastest loop able to capture each class of incident. The support chain adds the outermost period to the stack β the only one that can capture classes that never appear inside a repository: virtual machines without sound cards, USB re-enumeration, macOS permission dialogs, Gatekeeper. The ledger's incident chains (13 days, then 7 days, from incident to machine-enforced constraint) and this week's same-day support arcs are the same principle measured at different radii.
The ledgers apply to answers, too
"Answered" is process evidence: it says the case was read, classified, and given an actionable move. "Fixed Β· 6.1.13" is a product claim bound to a shipped artifact. The answers page keeps the two apart, and need_more_info exists as the honest rung β one of the first seven replies stands there. Nothing in a support card promotes a product claim; the version row in the release ledger does. This is the same discipline as the main evidence ledger (/agentic.html#evidence): a process badge never promotes a product claim, and the boundaries stay written down.
What stays human, on purpose
Three things in this chain are deliberately human-only. RF safety: the upgrade path refuses to touch a transmitting radio (the 423 gate) β no automation overrides the PTT gate, and no automated verdict touches transmit behavior. Privacy anchors: keys, passwords, recordings, and memory channels never leave the user's machine; redaction is a whitelist, not a promise. The verdict on code: needs_code_change, the change itself, and the release are maintainer-owned β the machine's reach ends where the diff begins. Deep hardware bring-up (marginal USB power, CI-V quirks) also remains manual, and the lifecycle documentation writes its limits down explicitly β summary-based triage reads summaries, not whole environments β instead of implying automation it doesn't have. The umbrella page names this retained half β intent, boundaries and judgment β and its rule is why this section exists: agents carry execution, not accountability (roles).
In the lineage on the thesis page, FDE β εζ²Ώι¨η½²ε·₯η¨ β was the first loop to carry field evidence back into design: Echo β Delta β Product, staffed by an engineer in the field. The support chain changes nothing about that loop's shape and everything about its staffing: it now runs on a cron, with instruments on both ends, and the deployment engineer in the path is a pipeline. Same topology, new economics β which is what it means for a practice to graduate from heroics to engineering.
What I claim β and what I don't
Claimed: the chain converts field symptoms into shipped product changes with cited evidence at every step; users resolve the majority of issue classes without a human round-trip; every published verdict is checkable against raw log lines; the failure modes of the triage automation itself are bounded and written down. Not claimed: autonomy over the roadmap β a human reads the answers page and decides what a signature is worth; safety automation β nothing in the pipeline touches transmit; completeness β summary-based triage cannot see everything a full environment shows, which is exactly why need_more_info is a first-class outcome. The products were built by the maintainer's hands and pipeline; the agent's role is triage, first reading, and the mechanics of publishing β and the products are better this week because of what the loop carried back, not because of who did the typing.
Close the loop that touches the user
One week, two releases, and a sentence to keep.
Self-service is not a cost optimization; it is the sensor network of the product. A support chain that only answers mail is a cost center. A support chain that turns repeated signatures into shipped features β same-day hotfixes, changed defaults, new engines β is a requirements engine. The loop that touches the user decides whether the product evolves, so close it deliberately: instrument the failure before fixing it, make the answer self-service before scaling the queue, and let the repeated signature promote itself into the roadmap while the verdict stays human. And when the loop grows an implementer, the same discipline scales: classification decides, the machine proposes, the tests gate, and the merge stays human.
First make the failure observable. Then make the answer self-service. Then let the repeated signature promote itself into the roadmap β and keep the verdict human.
Try the endpoints: MRRC answers Β· MRRC Modern answers Β· MRRC download Β· MRRC Modern download. Comparable cross-project numbers (tests, constraints, versions) live in one place: the evidence ledger.