Verified maintenance checkpoint: continuity, removal, configuration and first light - #15
Merged
Merged
Conversation
added 30 commits
September 4, 2026 08:10
Reported from a sandbox whose python-cryptography was unusable: python3 was 3.11 while _cffi_backend on disk had been built for 3.12. That is a broken container image rather than a SIA defect, but preflight_python_capabilities exists precisely to turn a broken or incapable python-cryptography into one named sentence, and for this failure it could not. python-cryptography fails inside its Rust extension, and pyo3 surfaces that as pyo3_runtime.PanicException, which derives from BaseException so that a panic is never silently swallowed by an ordinary except Exception. Both guards in the preflight caught only Exception, so the one failure mode this check exists to name was the one it could not name. What was already true and stays true: the installer failed closed. The preflight runs long before the first mutation, python3 - <<PY is already a subprocess, and set -euo pipefail already aborts on its non-zero exit — a simulated BaseException stops the script and never reaches the mutation phase. So this was never a safety gap, only the difference between refusing with a raw Rust traceback and refusing with the sentence a reader can act on. Both sites now catch BaseException while letting KeyboardInterrupt through. The second one was found by the test rather than by reading: the Ed25519 generate/sign/verify round trip actually enters the Rust extension, which makes it the likelier place to panic, and it had the same except Exception. The test plants an import that raises a non-Exception BaseException, runs the extracted shell function under set -euo pipefail, and asserts the named sentence reaches stderr, no traceback does, and the mutation phase is never reached.
An exhaustive line-by-line read of all 72 tracked files (113,753 lines) by 28
readers produced 30 findings. This closes them. Every fix carries a regression
test demonstrated red before the fix and green after; the ones that could not
be closed completely say so here and in their own comments rather than being
quietly downgraded.
TIER 1 — the ones that were going to cost something
1 The restore ceremony had no behavioural coverage at all. Its central
safety property, validate_restore_capability's four-descriptor flock
quiescence proof, was mocked in all eleven thaw tests; the post-restart
/proc and PID-stability proof was executed by no test in the repository;
and the RESTORE:adopt committed determination was reached only through
mocked observations. All three now have real tests that hold and release
actual descriptors, read actual /proc entries, and build actual ledgers.
Measured: neutering the quiescence proof used to fail nothing and now
fails eleven tests.
2 notify.seen grew without bound and would eventually have made the notify
organ permanently deaf while signing its deafness as ordinary source
refusals — reading as a source problem rather than a cursor leak. Bounded
by scan cycle rather than by count, because a count-based LRU would forget
a name in the current cycle and re-emit it, which is the duplicate the
seen-set exists to prevent.
3 first-light `installing` was a record with nothing to expire it, so a
crashed installer left the cockpit reporting progress forever. It now has
an observation horizon that reports silence without inferring failure and
without any path to `ready`; a test proves the caveat cannot reach the
lifecycle.
4 bin/sialib.py sits at 91.4% of the marketplace file cap. The extraction
is a planned release, not something to rush alongside twenty-nine other
changes, so this adds the guard: a headroom test that fails while there
is still room to act and names the exact bytes free.
TIER 2 — the cockpit could show you stale data with an empty boundary
5 graphFile, thoughtsFile and continuityFile had no onLoadFailed handler,
so a file that vanished after a good load left last-good pixels with no
boundary — precisely what the boundary machinery exists to prevent.
6 applyThoughts had no validator and a silent catch, on the one plane that
carries model-origin prose. It now validates, keeps last-good, and says
so.
7 validStatusSnapshot did not require the fields the vitals render, so a
passing snapshot could display "memories: undefined".
8 Panel.qml's continuity view could show a reassuring mark for a subsystem
that had stopped reporting. Dead runtimeLifecycle removed.
9 ask and recall disagreed on exit status when reinforcement failed, so an
MCP ask reported success for a session in which none occurred.
30 `--` now ends option parsing, so a claim beginning with a dash is
registerable.
TIER 3 — the documentation said things the code does not
10 The whitepaper claimed the associative tie-breaker was release-selected
"because it matched dense retrieval", while §4.3 says it ships default-off
after measuring below it — and "because it matched" would violate the
paper's own freeze rule, which requires beating.
11 The abstract listed HippoRAG spreading-activation as implemented with no
qualifier while it ships off.
12 `sia backup check` appeared nowhere in the manual, including its own
recovery walkthrough, though it is the only command that promotes a
snapshot to ready health after a clean-machine restore.
13 --no-touch was undocumented — the operator's only way to read without
reinforcing.
14 Neither manual nor continuity doc was version-stamped.
15 The changelog's missing 1.7.4 is now explained rather than mysterious.
TIER 4 — tests that asserted less than their names
16 PPRMass did not test mass. It could not: the caller divides by max(rank),
so a pure leak scales the vector uniformly and the ranking is identical.
The power iteration is now a named function returning the un-normalised
vector, and the invariant is asserted where the mass still exists.
Measured: disabling the dangling teleport used to pass and now fails with
0.75 != 1.0.
17 Novelty's bands were simultaneously satisfiable with the return scoring
below the non-return; the ordering is asserted.
18 Confidence-blindness was a substring check for one word.
19 test_retrieval_policy ran unittest.main() before two of its classes, so
direct execution silently skipped them.
20 test_uninstall_continuity was stale at rung v4 and passed only because its
fixture lacked a v5 marker.
21 The isolation guard missed siacapsule/siabackup and every extensionless
entrypoint. Fixing it exposed three files loading runtime code with no
isolation; all three now import it.
22 DreamPublication stubbed rehearse_memories wholesale — the same class of
gap that shipped a rehearsal grader which had never once worked.
23 The staged runtime member list is now pinned against the rung ladder, so
a future extraction cannot ship a runtime its receipt does not cover.
TIER 5 — structural
24 The freeze was enforced socially. ROADMAP.md now carries one
machine-readable declaration and CI turns a push to the frozen branch
that is not the bound commit into a red build. It cannot protect the
branch — that is a GitHub setting — but the rule is no longer invisible.
25 The gbrain-probe gate had no check. A new gate reads every gbrain argv
shape out of bin/'s own AST and fails on any that no probe covers.
26 The installer/test source coupling is documented as known and deliberate
rather than left to be discovered.
27 The process-wide os patching is inventoried and frozen, so a new one
cannot appear silently.
28 Two independent copies of the population-classification cascade became
one shared helper.
29 _evidence_rank bound its window as a default argument while generation
read the global, so patching it changed generation but not scoring.
1,031 tests green (was 920). shellcheck, bash -n, py_compile, qmllint, JSON,
whitespace and the README ceiling all pass. No new Python line exceeds 79
columns. main is untouched at df37702 and the #4078 binding is intact.
Finding 4 of the audit was that bin/sialib.py sat at 91.99% of the
marketplace's 524,288-byte per-file scan cap with 42,008 bytes of headroom.
The guard shipped with the audit made the deadline visible; this is the fix.
bin/sialib.py 482,280 -> 404,300 bytes, 91.99% -> 77.12% of the cap,
42,008 -> 119,988 bytes free.
1,733 lines and 64 functions move behind the same bind/invoke facade siasenses
and siagraph already use. The child imports nothing but threading, so one
runtime state survives the dynamic aliases the suite loads sialib under, and
explicit test patches are still mirrored into intra-module calls. Verified
live: two sialib aliases share one child, all 64 delegates are published and
marked, and the two aliases resolve different STATE paths through it.
TWO THINGS DELIBERATELY DID NOT MOVE, and the second is a limit of the facade
rather than of the code.
The ctypes block stays because it executes ctypes.CDLL at module-body time; a
child doing that would build one libc handle per alias, which is exactly the
duplicate state the facade exists to prevent. The single function that reads
the handle moved and reaches it through bind().
The two @contextlib.contextmanager helpers stay because a context manager
cannot be a delegate. invoke() binds, calls, and releases the lock when the
call returns — but calling a context manager only constructs it; its body runs
later at __enter__, outside that bind, after another alias may have re-bound
the child. Today both are called only from inside the lane, so an outer
invoke() frame happens to cover the whole `with`; exporting them would make
that an accident rather than a property. Keeping them where their globals are
stable removes the hazard instead of documenting it, and it keeps the child's
import set at exactly {threading}, so the release contract's import pin needed
no widening and no @contextmanager ever reaches the co_filename identity check.
RELEASE PLUMBING. A new bin/ module is a new runtime member set, so
sia-runtime-v6 lands at all four hand-copied ladder sites, plus
SIA_RELEASE_FILES and the staging copy loop. The rung tests move up with it:
the ladder-identity and complete-tree probes now top out at v6, the
uninstaller fence exercises siathought.py as the marker whose absence is a
rollback, and the partial-tree test keeps its v5 case and gains a v6 one — a
tree carrying the v6 marker while missing v4-era members is a partial v6,
never a complete v5 that happens to be short.
Three guards added earlier in this audit caught this work while it was wrong,
which is the reason to write them: the facade auto-discovery test refused the
new child until it was pinned, the staged-members test refused the ladder
until the staging loop matched it, and a runtime-copy list refused an import
that would have failed at launch rather than at contract time.
1,031 tests green, unchanged in count. shellcheck, bash -n, py_compile,
qmllint, JSON and whitespace all pass. The 21-test thought-recovery suite the
roadmap names as this extraction's gate passes untouched.
Checkpoint the perception, recovery, lifecycle and claim-boundary work with its focused regressions. Add the pinned vector build, lossless private-index preparer, sealed transport and parent-side row admission. The compiled private-index smoke is observed. Private model serving, held-out cognitive measurements, final release gates and full adversarial completion remain open; this checkpoint makes no completion claim.
Seal explicit model, package and runtime leaves; separate full-package provenance from the deliberately CPU-only execution policy. Keep the model service inside the adapter namespace and retain its generation and nonclaims. Fixture contracts are green and transport mutations are killed with exact restoration. Real namespace serving remains an integration obligation, not an inferred success.
A real launch refused because plain directories are not remountable mount-table entries. Give each readonly runtime root a bounded private tmpfs before adding sealed leaves and remounting it. Preserve the no-host-directory contract.
The private namespace must execute its sealed interpreter as well as Python. Give only the explicitly selected loader that authority; ordinary runtime data and shared objects remain read-only.
Readonly copied mounts can carry deleted procfs display aliases while retaining the exact same executable object. Compare owned process descriptors with the sealed mount identity and expected digest; preserve display names without trusting them as authority.
Join build, private index, request and ranked-row admission with one admitted model input generation across capture and query. Preserve the diagnostic lane under its explicit nonclaims and never fall back to it from a model refusal.
Model-bound index construction starts with a fresh private parent and admits only a newly created ordinary index on success. Keep operation-specific request and receipt ceilings; retain partial failure output without making it authoritative.
added 22 commits
September 9, 2026 08:30
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
This was referenced Sep 18, 2026
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Delivery tracking for the published source fixes discussed in #7, #8, #9 and #10. This draft does not authorize moving frozen main or claim a release exists.
Exact candidate: 5cce3e1. The recorded sequential whole-project run at this checkpoint reported 3556 tests in 5045.378s, OK (skipped=1), with ResourceWarning fatal and MemoryMax=20G / MemorySwapMax=4G. See the issue comments for focused regressions, prior failures, and runtime evidence. This is historical checkpoint evidence, not a new run today.
Includes the capsule fan-out repair, persistent uninstall and registration-loss quiescence, acceptance of the shipped retrieval comment, and bounded CPU first-light deadlines with progress heartbeat. Equivalent reporter hardware remains unverified for #10.
Release remains pending: resolve the exact-commit marketplace/freeze policy, review this complete cumulative diff, and run the required release gates before promotion. No installed user is claimed to have received these fixes. Later live-loop work is deliberately outside this candidate.