Status: second internal paper, follow-on to BAZI AGI — Architecture & Roadmap Memo (docs/BAZI-AGI.md). Same rule as the first: every capability claim is tied to an artifact that exists in this repository, and measured numbers are stated exactly, including the ugly ones.
Abstract
The first memo established that the engine's predictive skill is not demonstrated: blind contest accuracy sits at chance, grounding fixes removed hallucinations without improving accuracy, and the one claimed timing lift failed to replicate out-of-sample. None of that has changed, and this paper does not soften it. What has changed is the character of the remaining distance. As of this week the learning loop's mechanism is complete and verified to fire: the negative-space capture contract (20260720_negative_space_capture.sql) lets the loop record reviewed silence, and a live test demoted a false marker family to abstention for the first time; the blind window (20260720_reveal_discloses.sql) now survives its own logging, with disclosure defined as reveal, not compose. This eliminates one of the two possible explanations for "the loop has not learned" — absent mechanism — leaving only absent data. We formalize the loop as a shrinkage estimator, define a four-gate distance function to "Bazi AGI" with pre-registered falsification criteria, and state plainly that the null hypothesis remains fully live and consistent with all evidence to date.
1. Introduction: what this paper is and is not
The first memo answered the question "what is this system, honestly?" Its answer — a deterministic calculation substrate (L1), a grounded but at-chance essayist (L2), a subject-memory layer with a known leak (L3), and a learning loop that existed "as plumbing, not as a loop" (L4) — remains the correct architectural map. This paper does not restate that map. It answers a narrower and, we will argue, now better-posed question: what is the remaining distance to the system the first memo called "Bazi AGI," and in what units is that distance measured?
The claim we defend is this: before this week, the distance was measured in unbuilt machinery; after this week, it is measured in data-collection time plus a falsifiable statistical test. That is a genuine reduction in the dimensionality of the problem, and it deserves precise treatment. It is also, and we will not let the reader forget this, a necessary-not-sufficient advance. A loop that can demote is not a loop that has learned. A scale that finally reads zero correctly has not yet weighed anything.
The paper proceeds as follows. Section 2 restates the evidentiary status quo, because any paper that buries the chance-level accuracy number in a footnote is marketing. Section 3 formalizes the loop as an estimator and explains why the absence of quiet years made the previous version incapable of learning — not merely slow, but structurally incapable. Section 4 documents what changed this week and what was verified live. Section 5 gives the mechanism-versus-data reframing. Section 6 defines the distance function: four gates, each with a metric and a failure mode. Section 7 takes the null hypothesis seriously. Section 8 states what would change our assessment in either direction, and Section 9 concludes with what the system is today with certainty.
2. The evidentiary status quo, unimproved
Nothing in this paper's news changes the headline finding, so we state it first and without qualification.
On the hardened blind contest (n ≈ 38, four-option questions, chance = 25%), the engine scored 34.2% before the grounding fixes and 23.7% after them. Both figures are statistically indistinguishable from chance at this sample size. The grounding work was real and successful at what it targeted: phantom-age errors went from 6 to 0, gender-star inversions and fabricated branch relations went to approximately zero. But eliminating hallucination did not produce prediction. The errors migrated from scaffolding into judgment — the engine now says correct things about the chart and wrong things about the life. The first memo's verdict stands verbatim: a fluent essayist with correct arithmetic and honesty, not a demonstrated predictor.
The one previously claimed predictive result — a 1.6× strong-marker timing lift — collapsed to 1.10× out-of-sample (95% CI 0.98–1.22), and to 0.91× on the small subset of charts with real rather than placeholder birth times. The "有訊號" year flag fires on ~91% of years and carries a lift of 1.00×, a result that replicated exactly, which is the statistical way of saying it predicts nothing twice.
Every claim in the remainder of this paper should be read against this backdrop. What follows is an argument that the question has become answerable, not that the answer has become yes.
3. The loop as an estimator, and why it could not previously fail
3.1 The estimator
The learning loop's core computation, now implemented in recompute_flywheel_live_demote() (20260720_negative_space_capture.sql, rewriting the version from 20260718_n4_flywheel_live_loop.sql), is per marker family a shrinkage estimate of event precision:
p̂ = (n_event + α · base) / (n_live + α)
where n_live counts blind, non-rectification outcome rows joined to years the family fired on; n_event counts the subset that were actual events; base is the base rate of eventfulness in reviewed years; and α (currently 40) shrinks small samples toward the base rate so that no family can look impressive on six data points. The demotion rule is: when n_live ≥ n_demote (currently 20) and p̂ ≤ base, the family's promotion_state drops to abstention — the engine stops asserting on it. Promotion to assertive grammar remains hard-gated off (promote_enabled = 0) until a control battery exists. The loop is demote-only by construction: in its current form it can only make the engine quieter, never bolder.
This is a deliberately conservative estimator, and its statistics are unremarkable. What matters is the denominator.
3.2 The censoring defect
Until this week, every row that had ever reached flywheel_outcomes was an event the user narrated: the event indicator was literally coded_valence is not null, and there existed no write path by which the database could record that a year was reviewed and nothing happened. The consequence is worth stating carefully, because it is the crux of the whole paper.
If the only observable outcomes are events, then for every marker family, n_event ≈ n_live. The estimator's numerator and denominator move together; p̂ stays pinned near 1 regardless of the family's true precision; lift never falls below base rate; the demote condition is unsatisfiable. This is not a data-scarcity problem that more users would have cured — it is a censoring problem that more users would have made worse, because every additional narrated event would have further confirmed every family that happened to fire that year. A marker that fires on all 22 years of a span and coincides with three real events would have been scored on exactly those three rows and looked perfect.
The information-theoretic framing is the honest one: the quiet years are the negative space that carries the discriminating signal. "Marker fired, event happened" and "marker fired, nothing happened" are the two cells of the contingency table that separate a predictor from a noise generator, and the schema could only populate one of them. A loop that cannot record a non-event cannot be wrong, and a loop that cannot be wrong cannot learn. The first memo's discipline — base-rate honesty, out-of-sample-or-it-didn't-happen, pre-registration — was being enforced everywhere except in the loop's own denominator.
There is a second, subtler property of this defect: it was expensive-to-add-later. Silence must be captured blind, at the moment of judgment. Retrofitting quiet years six months from now would mean inferring which past years were uneventful — reconstructing absence with hindsight, which is precisely the contamination the blind firewall exists to prevent. You cannot reconstruct honest absence. This is why the negative-space contract was prioritized over other L4 work (including L4A; see §4.5): most missing features are recoverable later from the deterministic substrate and the immutable birth_charts registry; this one was not.
4. What changed this week: mechanism completion
4.1 The negative-space capture contract
Migration 20260720_negative_space_capture.sql adds the missing half of the contingency table. flywheel_outcomes gains event_kind ∈ {event, quiet} (historical rows backfilled as event); ingest_blind_quiet() is a blind quiet-year write path that reuses the existing firewall — captured_blind is computed server-side from is_prediction_disclosed() and the caller can only ever downgrade it, never assert it; and attest_flywheel_coverage() implements the scaled gesture: a user reviews a span of years, names the eventful ones, and the system mints an idempotent blind quiet row for each year in the complement, with the attestation recorded for provenance so that any future demotion can be traced to genuine reviewed silence rather than unreported years. recompute_flywheel_live_demote() now scores on event_kind: n_live counts reviewed years of both kinds, n_event counts events only, and the base rate itself becomes P(event | reviewed year) rather than an artifact of censoring.
Crucially, this is not merely written but verified to fire. The eval evals/flywheel/demote_can_fire.sql runs two sentinels in a rolled-back transaction against the live schema. Sentinel A is a marker family that fires every year of a 22-year span whose reviewed years were all quiet: it scored p̂ = 0.323 against base 0.500, lift 0.645, and was demoted to abstention. Sentinel B, the control, is a family whose flagged years were all real events: lift 1.355, state locked. This is the first time in the system's history that the demote gate has fired at all. The loop can now be wrong, on the record, mechanically.
4.2 The blind window: disclosure means reveal, not compose
The second fix (20260720_reveal_discloses.sql) repairs a pair of defects that had quietly collapsed the blind window — the interval between "the engine computed a prediction" and "the customer saw it," inside which the judgment shell must elicit outcomes for capture to count as blind.
First, compose was stamping disclosure at computation time, closing the window before any elicitation could occur. Disclosure now happens at an explicit reveal endpoint, disclose_reading(), which sets reading_results.revealed_at and, where a canonical chart is unambiguously resolvable, stamps the precise per-year ledger.
Second — and this failure mode deserves attention as a class — the firewall predicate is_prediction_disclosed() treated the mere existence of a logged prediction as disclosure. But the judgment shell must read those logged predictions to know which years to ask about, so the act of logging tripped the firewall against the shell itself: the system's own bookkeeping was contaminating its own blindness. The predicate was narrowed: a logged prediction counts as disclosure only if its reading has been revealed (revealed_at set) or is legacy (pre-cutoff, from before a reveal step existed). The fail-safe direction is preserved: if the cutoff config is missing, everything is treated as disclosed and blind capture becomes impossible — the system can err toward discarding good data but can never manufacture false blindness.
This too was verified live (evals/flywheel/blind_window.md): a fresh reading logged 26 predictions at compose, yet is_prediction_disclosed returned FALSE and a quiet capture returned captured_blind = TRUE; after disclose_reading(), the same capture returned captured_blind = FALSE. The invariant — logging ≠ disclosure; only reveal closes the window — now holds by construction and by test.
4.3 Phase 0 closed; the capture surface built
Two further items from the first memo's roadmap are done. The isolation inversion (Phase 0) shipped: subject context is resolved source-first (job → additional_person | birth_chart | self), every cross-source ?? fallback is deleted, and an adversarial leak harness passes — a registry chart with null gender returns its own age and hedges on gender rather than inheriting the operator's fields. The first memo listed subject isolation as a known leak poisoning every downstream outcome row; it is now closed and guarded by an eval, which matters because a blind outcome attributed to the wrong chart is worse than no outcome at all.
The judgment-shell capture UX also now exists as a built React component with a calibration route, wired to the four live RPCs (ingest_blind_outcome, ingest_blind_quiet, attest_flywheel_coverage, disclose_reading), with ordering enforced: reveal happens only after elicitation, and "don't remember / skip" writes nothing — a quiet row must mean reviewed and empty, never unanswered. That last distinction is load-bearing: conflating "no answer" with "no event" would reintroduce the censoring defect through the front door.
4.4 Grounding continues its pattern
One more free-hand surface was closed this week. The free-tier "生命之光" arc had been letting the LLM decide which decade of life is brightest; it disagreed with the paid reading's own deterministic curves and displayed a wrong peak band. It now computes the arc with the same deterministic engine (deriveYongShen → xi/ji → buildReadingStructure curves in _shared/reading-structure-v2.ts; see life-light/index.ts), and the LLM writes prose only. This is the general L1/L2 contract — the substrate computes, the model narrates — applied to one more surface, and it is worth logging as a pattern: every such fix removes a place where the two tiers of the product could contradict each other, and none of them, on the evidence of §2, should be expected to move accuracy.
4.5 What was deliberately not built
L4A — contrastive discovery, i.e., generating candidate markers beyond the fixed classical vocabulary — was analyzed and deferred. The reasoning bears recording. L4 already computes contrast: lift = p̂/base is the contrastive statistic. L4A's genuine delta is feature generation outside the hard-coded vocabulary, and doing that before a disciplined nominate-then-confirm protocol exists is a p-hacking machine: an open-ended feature generator scored against a small outcome set will find "significant" markers by construction. Unlike negative space, L4A is recoverable post-hoc — L1 is deterministic and birth_charts preserves every raw input, so any future candidate marker can be computed retroactively over the full outcome history. Deferral costs nothing; premature execution costs credibility. The one thing that could not wait was the capture contract, and it is the thing that was built.
5. The reframing: from machinery to data
The first memo's diagnosis of L4 was "the loop exists as plumbing, not as a loop," and it attributed the binding constraint to verified outcomes at scale. That was correct but incomplete, because at the time "the loop has not learned anything" had two candidate explanations that the evidence could not separate:
| Data absent | Data present | |
|---|---|---|
| Mechanism incomplete | Loop silent; cause indeterminate (status at first memo) | Loop silent even with data; effort wasted on capture |
| Mechanism complete | Loop silent; cause is now known to be data (status today) | Loop learns — or returns an honest null |
Before this week the system sat in the top-left cell, and that cell is epistemically the worst one: had we invested a quarter in outcome capture first, the censoring defect would have silently wasted the entire harvest — every captured event would have flowed into a scorer that could not use it to falsify anything, and the quiet years would have been unrecoverable. The week's work moved the system down a row, and the verified sentinel firings are what license the claim that it actually moved rather than merely appearing to.
The consequence for the "distance to Bazi AGI" question is a change of units. The remaining distance no longer contains an unbuilt-machinery term of unknown size. It is now, to first order: (a) elapsed time at a given blind-capture rate, until per-family sample sizes cross the demotion and estimation thresholds; plus (b) one pre-registered statistical test whose outcome is not under our control. Both are measurable. Neither is guaranteed to come out in the system's favor — and (b), we emphasize again, may well come out against it.
To keep this honest, the limits of the advance in one paragraph: the loop can demote, but nothing yet feeds promotion_state back into the composer and Q&A prompts, so an abstention family is not yet actually silenced in production output — that wire remains unbuilt, exactly as the first memo noted. The blind outcome set remains approximately empty. The sentinel firings used synthetic rows in rolled-back transactions; no real marker family has 20 live blind outcomes. And demotion-at-scale, if the nulls come in, produces a quieter engine, not a smarter one. The mechanism's completion makes learning possible; it constitutes no evidence that there is anything to learn.
6. A distance function: the gate ladder
"How far is this system from Bazi AGI?" is only a respectable question if distance is defined. We define it as a ladder of four pre-registered, falsifiable gates, to be passed in order, each with a metric that can come out negative. This refines the first memo's Phases 3–5 into pass/fail form.
| Gate | Criterion | Metric | Depends on |
|---|---|---|---|
| G1 | Capture at rate | ≥ 50 blind, dated, domain-coded outcomes/week, sustained ≥ 4 weeks, through the judgment shell (quiet rows counted only via attested spans) | Shell in production |
| G2 | First live demotion | First marker family reaches n_live ≥ 20 on real data and recompute_flywheel_live_demote() demotes or retains it on the record | G1 volume |
| G3 | Out-of-sample signal + calibration | On a frozen held-out blind set: ≥ 1 family with lift whose 95% CI excludes 1.0, and the weights-informed engine beats the frozen engine on calibration (abstains where it has no signal) | G2; weights→prompt wire |
| G4 | Powered blind contest | Pre-registered, n ≥ 150 (≈ 30 charts × 5 questions), accuracy above chance with 95% CI excluding 25% | G3 |
Three comments on the ladder's semantics.
G2 is already possible mechanically — the sentinel eval proves the gate fires — so G2 is purely a data milestone. Its value is not the demotion itself but the precedent: the first time the system retracts an assertion class because reality, captured blind, said no. Note that G2 is passed either way the statistics fall; what it tests is that the pipeline runs end-to-end on real rows.
G3 is the first gate that can produce a positive scientific claim, and it is deliberately conjunctive. Lift with a CI excluding 1.0 on a frozen holdout is the signal condition; the calibration condition exists because a system could in principle find one real family and still be a worse product if it keeps asserting everywhere else. An engine that has learned where it is ignorant is the minimum viable form of learned interpretation.
G4 is the line. We state this as policy: the moment G4 passes is the first moment "Bazi AGI" is a measured claim rather than a slogan, and no output of this system should use the phrase affirmatively before then. Conversely — and this must be said with equal weight — a published null at any gate is a real result, not a failure of the program. The pre-registration discipline from X9/X10 (both null, both published, one public claim retracted) is the precedent; it continues.
The ladder also yields an honest order-of-magnitude time estimate, which we give with wide error bars: G1 is a product and incentive problem (a quarter, per the first memo); G2 follows G1 by however long the first family takes to accumulate 20 blind rows, which depends on marker density and cannot be shortened honestly; G3 requires roughly 10³ blind outcomes across families plus the weights→prompt wire; G4 sits beyond G3. Nothing on this list is machinery. All of it is data, time, and one wire.
7. What could kill it
The null hypothesis must be stated in its strongest form: classical bazi structural markers carry no out-of-sample signal for dated life events. This hypothesis is fully live. It is consistent with every measured result the system has produced — chance-level contest accuracy twice, a timing lift that shrank to its confidence interval's floor out-of-sample and below 1.0 on the clean-birth-time subset, and a year-signal flag with exactly zero discriminative power on two independent sets. No result in this repository contradicts it. A reader who assigns it a majority of the probability mass is not being unreasonable; the authors' own posterior is not far from there.
What distinguishes this system is not a belief that the null is false but the fact that the architecture now metabolizes the null rather than deflecting it. If the null is true, the observable trajectory is specific and predictable: as blind coverage accumulates, family after family will cross n_live ≥ 20 with p̂ ≤ base and demote to abstention; the weights-informed engine will assert on progressively less; and the system will converge on an honest, calibrated, mostly-silent predictor that computes charts exactly, narrates them fluently, and declines to predict. That terminal state has real value — a reflective instrument with verified arithmetic and enforced honesty is a defensible product — but it is not "Bazi AGI," and this paper will not pretend otherwise. The architecture's actual achievement, on the null branch, is that it reaches that state measurably, in public, with the receipts stored in flywheel_coverage_attestations and the weights table, instead of drifting there while the marketing says otherwise.
Beyond the null, the sober risk register: capture volume may simply not materialize (G1 is a behavioral ask of users, and it is the long pole); quiet-row quality depends on users' recall and honesty, and attested silence over a 20-year-old span is noisier than attested silence over last year — the provenance table lets us stratify by recency, and we should; birth-time noise remains unresolved (41/45 audit charts used a 12:00 placeholder, so hour-pillar families may demote for reasons of measurement rather than merit — an identified confound to be handled by stratification, not excuse-making); and selection effects in who volunteers outcomes could bias base rates in either direction. None of these is fatal to the measurement program; all of them cap how much any single positive result should be believed, which is exactly why G3 and G4 are conjunctive and pre-registered.
8. What would change our minds
Toward optimism. A G3 pass as specified — one family, frozen holdout, CI excluding 1.0, calibration win — would move predictive skill from "conjectural" to "preliminary evidence" and would justify building the promotion control battery. Earlier and weaker: if, once real data flows, the distribution of family lifts is visibly overdispersed relative to the null (most families near 1.0 but a right tail that survives shrinkage at α = 40), that would be reason to accelerate capture before any single family clears its gate. A replication of any positive family on the real-birth-time subset would count double.
Toward pessimism. If sustained capture at G1 rates produces, after ~10³ blind outcomes, a lift distribution indistinguishable from the null across all families — including on real-birth-time charts — the honest move is to publish that null, stop investing in marker learning, and reposition the product permanently as a computed reflective instrument. If the judgment shell cannot reach G1 volume within two quarters of production launch, the measurement program is starved regardless of the underlying truth, and continuing to describe the system as "on a path to Bazi AGI" would be dishonest; the roadmap should be rewritten around what can actually be measured. And if any future audit finds a single row where captured_blind = TRUE was reachable after disclosure, every downstream statistic is void until the breach is dated and the contaminated rows downgraded — the firewall's value is exactly its exceptionlessness.
9. Conclusion
What this system is today, with certainty: a deterministic chart-arithmetic substrate whose computations are shared, unit-consistent, and now extended to every surface including the free tier; a fluent interpretive layer constrained to cite that substrate, with the major hallucination classes measured at zero; and — as of this week — a complete, live-verified measurement loop that can capture outcomes blind, record honest silence, keep its own bookkeeping from contaminating its blindness, and demote a false marker on the record. What remains conjectural, with all measured evidence to date sitting at chance: any predictive edge whatsoever.
The distance to "Bazi AGI" is therefore no longer architectural. It is four gates long, denominated in blind outcomes and pre-registered tests, and its length is not ours to choose — only its honesty is. The system built this week is one that can be wrong in public and record it. Whether it turns out to be right about anything is now, finally, an empirical question. That is the most that engineering alone was ever going to deliver, and as of this week it has been delivered.