Skip to content

docs(svalinn): record migration state + blockers in the apparatus (STATE.a2ml + runbook)#109

Merged
hyperpolymath merged 13 commits into
mainfrom
claude/elegant-ramanujan-2uoae
Jun 21, 2026
Merged

docs(svalinn): record migration state + blockers in the apparatus (STATE.a2ml + runbook)#109
hyperpolymath merged 13 commits into
mainfrom
claude/elegant-ramanujan-2uoae

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

What

Closes the documentation gap flagged while wrapping up: the AffineScript-migration outcome lived only in merged-PR bodies (#105/#106) and chat, while the repo's durable apparatus understated reality.

A future session reading STATE.a2ml + the runbook is now self-sufficient — no need to dig through merged PRs. Docs-only. Refs #96.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EsxEhRW4rDbxMo2c9xaa7Z


Generated by Claude Code

claude and others added 13 commits June 5, 2026 05:30
… prerequisite)

normalizedIsSafe was false AS STATED, not merely unproven: SafePath's grammar
(SafeEmpty | SafeComponent c rest => c ++ "/" ++ rest) only admits trailing-slash
paths {"", "a/", "a/b/"}, while normalizePath (split/filter/joinBy) produces NO
trailing slash {"", "a", "a/b"}. The two languages overlap only at "", so
SafePath (normalizePath p) was uninhabited for every non-empty path — the
idris_crash postulate masked an impossible theorem.

Redesign SafePath to model normalized relative paths correctly:
- SafeSingle: a single FINAL component (the no-trailing-slash leaf).
- SafeComponent now also requires a NON-EMPTY rest (so the only leaf is
  SafeSingle, forcing every "/"-segment through the per-component checks).
- Each component must be '/'-free, expressed as Not (charsElem '/' (unpack c) =
  True) over List Char (provable, reduces; no opaque isInfixOf, no Char-eq axiom).
  This is load-bearing for SOUNDNESS: with only "doesn't start with /", a single
  "component" like "a/../x" would sneak a ".." past the not-".." check.

absolutePathRejection re-proven against the 3 constructors via a new
slashPrefixImpliesCharsElem bridge (prefixNative + nonEmptyUnpack + andLeftTrue +
charsElemHere) — no new trusted base, Bool-level only. Build green (cerro-torre.ipkg
7/7). normalizedIsSafe stays a now-correctly-typed postulate; its discharge
(verified joinBy + splitNoDelim/dotDotInfixOfJoin axioms) is the next step.

https://claude.ai/code/session_01EsxEhRW4rDbxMo2c9xaa7Z
…ostulate

Step 2 of §3 (after the SafePath redesign in d7f07fb). normalizedIsSafe is now a
real proof, not an idris_crash:

    normalizedIsSafe p noDot = joinBySafe (normComponents p) (mkAllSafe p noDot)

- joinBy lifted to top level (renamed joinSep to avoid the Data.String.joinBy
  clash) and shared with normalizePath via normComponents, so normalizePath p
  reduces definitionally to joinSep "/" (normComponents p).
- joinBySafe builds SafePath of the join from per-component safety; SafeEmpty/
  SafeSingle/SafeComponent line up with joinSep's []/[x]/(x::y::ys) clauses.
- mkAllSafe derives, for each component: non-empty (filterSat), not ".." (else
  dotDotInfixOfJoin contradicts the premise), '/'-free (splitNoDelim + allFilter).
- ~13 supporting lemmas (filterSat, allFilter, allElem, allFromElem,
  appendEmptyLeft, joinByConsNonEmpty, the Bool/String micro-lemmas) are all
  total — they add nothing to the trusted base.

Trusted base grows by EXACTLY two fundamental opaque-String-primitive axioms:
  splitNoDelim      — split (== '/') yields '/'-free components
  dotDotInfixOfJoin — a ".." component is a ".." infix of the join
Both are genuine backend-semantics facts with no Idris2 reduction rules, in the
same justified category as the existing isPrefixOfBridge/unpackAppend bridges.

No believe_me / cast Refl / assert_total. cerro-torre.ipkg builds 7/7 green.
PROOF-NEEDS.md updated (17 partial sites; normalizedIsSafe -> PROVEN).

https://claude.ai/code/session_01EsxEhRW4rDbxMo2c9xaa7Z
…laims

Reconcile the AffineScript/Ephapax threads as complementary roles, not
competitors, and align stale status docs with verified ground truth.

- Language policy (svalinn, cerro-torre, vordr component CLAUDE.md):
  AffineScript = primary general application language (ReScript replacement,
  typed-wasm); Ephapax = linear security core (exactly-once tokens, revocation,
  secret/handle lifecycle, container-lifecycle invariants, zero-copy IPC).
  Adds an Ephapax row to each ALLOWED-languages table.
- stapeln.toml: svalinn component description + language note now reflect the
  in-flight ReScript -> AffineScript (general) + Ephapax (linear core) migration
  (11/33 modules ported).
- ECOSYSTEM-STATUS.md: 2026-01-25 snapshot marked stale; selur ephapax/bridge.eph
  + types.eph are implemented (the "NOT EXISTS" line is obsolete).
- READINESS.adoc: Idris2 proofs are real (33 .idr, no believe_me/postulate),
  not "stubs only".
…tructor-link fix

The svalinn AffineScript migration blocker is NOT affinescript #138 (closed,
PR #193 — the resolver/typecheck half). The real blocker is an untracked
WASM-codegen gap: gen_imports never linked imported enum constructors, so
`use prelude::{Some, None}` consumers failed `compile` with
Codegen.UnboundVariable despite passing `check`. Implemented + verified the fix
locally against affinescript HEAD 58dc2a0 (458-test suite green incl. a new
WASM-target regression test; zero regressions on the conformance+modules corpus).

Persists the git-apply-able patch, a before/after repro script, and the
ready-to-file new-issue text so it survives container reclaim and a future
affinescript-scoped session can land it. Refs #96.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EsxEhRW4rDbxMo2c9xaa7Z
…mpiler + re-pin

SOURCE (container-stack/svalinn/src):
- Add explicit `use prelude::{Option, Some, None[, Result, Ok, Err]}` to the 6
  modules using those value constructors. They were ported against the old
  affinescript where Some/None/Ok/Err were seeded builtins; #138 (PR #193)
  removed that seed, so constructors must now resolve through the module path.
  AuthTypes + GatewayTypes now compile to WASM (4/11, was 2/11).
- Metrics: string concat `+` -> `++` (`+` is Int-only) and `let` -> `let mut`
  for reassigned locals. Now passes parse+typecheck; remaining blocker is the
  upstream WASM `float_to_string` builtin gap.

TOOLCHAIN (re-pin):
- Bump AFFINESCRIPT_REF d2875a5 (does not build — menhir r/r conflict) ->
  58dc2a0 (current HEAD, verified building) in the workflow, Containerfile, and
  migration task doc.
- Carry the vetted WASM cross-module constructor-linking patch (merged in #105)
  in the build until it lands upstream in affinescript; then drop the apply and
  bump the pin to the merged SHA.

Verified locally (affinescript 58dc2a0 + the patch): 4/11 modules compile to
WASM. Remaining blockers: 4 parse errors (Main/Json/PolicyEngine/Client —
unsupported syntax), 2 sibling-module resolutions (Authz/SecurityHeaders —
single-file compile has no src/** search path), 1 upstream WASM builtin gap
(Metrics float_to_string). Refs #96.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EsxEhRW4rDbxMo2c9xaa7Z
…fe5a)

The `governance / Check Workflow Staleness` gate flagged the governance, Hypatia,
and Scorecard reusable workflows as pinned to a pre-cache/baseline-fix standards
SHA — which is why `scan / Hypatia Neurosymbolic Analysis` died at "Prepare all
required actions" (unresolvable actions/cache@d4373f26… inside the old reusable).
hyperpolymath/standards already fixed it upstream; bump the three flagged pins to
current standards HEAD d72fe5a. (scorecard-enforcer.yml was already removed on
main.) Fixes the estate-wide Hypatia + workflow-staleness CI failures.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EsxEhRW4rDbxMo2c9xaa7Z
Adds `SPDX-License-Identifier: MPL-2.0` (the repo's canonical identifier — 1010
existing uses) to 303 stapeln-owned source/doc files that lacked one, clearing
the bulk of Hypatia's `missing_spdx` findings (now visible after the #107
reusable-pin fix re-enabled the scan). Per-type comment styles: `<!-- -->` (md),
`//` (adoc/zig), `#` (sh/yml/toml/a2ml/nix/ex/exs), `;` (scm); inserted after
shebangs, and after YAML frontmatter for the 6 issue-template / site .md files
so GitHub template parsing isn't broken.

Excluded deliberately: generated output (.cmj/.ttm/.po, lib/bs), comment-less
formats (.json/.jsonl), license texts (LICENSES/, LICENSE-*), `.well-known/*`,
frontend/dom-mounter `.js` (ReScript-migration zone, may be generated), and the
legacy `.res` corpus.

No http:// URLs were converted: all 46 occurrences are intentional — security-
test attack URLs (evil.com, 169.254.169.254), internal service refs
(http://backend, http://vordr), the MPL license text, the Apple plist DTD
identifier, placeholders, and the aspect-test that greps for http:// — so
converting them would corrupt security fixtures / break refs. They belong in a
hypatia:ignore pragma or baseline, not a find-replace.

Refs #96.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EsxEhRW4rDbxMo2c9xaa7Z
…urrent HEAD)

The workflow-staleness gate tracks standards HEAD, which advanced since #107.
Refresh governance/hypatia/scorecard reusable pins to keep the gate green.
(This is a moving target — recommend automating via the estate's
sha_bump_propagation rather than a manual per-PR bump.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EsxEhRW4rDbxMo2c9xaa7Z
…apparatus

STATE.a2ml said "No blockers recorded" and the runbook lacked the current
status — the migration outcome lived only in merged-PR bodies. Capture it in the
durable apparatus so the next session is self-sufficient:

- STATE.a2ml [blockers-and-issues] + [critical-next-actions]: the blocked-on-
  upstream WASM constructor-link dependency (carried patch over 58dc2a0; #105),
  the 4/11 gateway-compile status + the parse / sibling-resolution /
  float_to_string blockers, and the ordered next actions.
- AFFINE-MIGRATION-TASK.md: a dated "Current status" section with the same.

Refs #96.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EsxEhRW4rDbxMo2c9xaa7Z
@hyperpolymath hyperpolymath marked this pull request as ready for review June 21, 2026 17:15
@hyperpolymath hyperpolymath merged commit a9acf25 into main Jun 21, 2026
27 of 29 checks passed
@hyperpolymath hyperpolymath deleted the claude/elegant-ramanujan-2uoae branch June 21, 2026 17:16
@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants