313 Commits

Author SHA1 Message Date
Matthew Toussain 823a80f663 feat(server): add principal authorization and tRPC extension seams (#151)
* refactor(ui): share neutral capability contracts across editions

Move SiriusCapability, SiriusPrincipal, the capability snapshot/provider types,
and the Community catalog into a React-free contracts module so the browser
registry and the incoming server registry cannot hold divergent catalogs. The UI
extension modules re-export the same names, so consumers are unchanged.

Pin the Community catalog to documentation/product/edition-boundary.yaml with a
contract test, since that file is the source of truth for the edition boundary.

Co-authored-by: mtoussain <mtoussain@gmail.com>

* feat(ui): add server principal resolver and tRPC extension seam

Mirror the browser extension registry on the server. A SiriusServerExtension
declares tRPC namespaces with their required capabilities, at most one principal
resolver, and optional session enrichers; registered.ts is the build-time
overlay a private build replaces.

protectedProcedure now enforces the capabilities declared for the procedure's
namespace, so a contributed namespace is authorized without patching Core
procedures. Principal resolution fails closed: a resolver that throws yields no
principal instead of inheriting another edition's capability set. Community
resolves any authenticated session to its static catalog, leaving Community
behavior unchanged.

root.ts cross-checks declared namespaces against the composed router in both
directions, so an overlay that ships a router without declaring it (or declares
a namespace it never serves) fails at startup rather than at request time. The
routers stay object literals so tRPC keeps inferring client types.

Co-authored-by: mtoussain <mtoussain@gmail.com>

* test(ui): run extension contract tests in CI

Add the server and capability suites alongside the UI registry suite behind a
single test:extensions script, and make it a blocking CI step so the contracts
private builds overlay are actually guarded.

Co-authored-by: mtoussain <mtoussain@gmail.com>

* docs: record the server-side extension seam in ADR-004 and the task board

Co-authored-by: mtoussain <mtoussain@gmail.com>

* fix(server): allow private principal resolver to replace Community fallback

* test(server): prove private resolver can replace Community fallback

* docs: record resolver replacement semantics and freeze server contracts at v1

Co-authored-by: mtoussain <mtoussain@gmail.com>

* fix(server): split overlay router slot out of the declaration slot

Contributing routers from registered.ts cycles: trpc.ts imports the registry to
enforce capabilities, so an overlay router module importing createTRPCRouter
loads while trpc.ts is still initializing and dies with 'Cannot access
createTRPCRouter before initialization'. This was found by composing a private
extension against the seam.

Routers now come from registered-routers.ts, which only root.ts imports, so they
load after trpc.ts is ready. root.ts still cross-checks declared namespaces
against composed ones, and a contract test keeps the declaration modules free of
tRPC imports.

Co-authored-by: mtoussain <mtoussain@gmail.com>

* docs: document the overlay module split and cycle constraint

Co-authored-by: mtoussain <mtoussain@gmail.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-18 07:57:14 -07:00
Matthew Toussain 0b206ee346 test(ui): exercise API capability-provider failure path
Follow up #149 by routing capability loads through a directly testable helper and proving network, HTTP, and malformed-payload failures retain the fail-closed snapshot and deny gated capabilities.
2026-08-18 06:23:27 -07:00
Matthew Toussain b34831f726 feat(ui): add build-time extension and neutral capability registry (#149)
Implement the public build-time UI extension registry and neutral principal/capability provider for Core Phase 3.4.

Includes deterministic extension ordering and collision validation, Community route/sidebar migration, capability-gated rendering, and fail-closed defaults for API-backed capability providers.

Part of #147 and #148; server-side auth/tRPC extension seams remain follow-on work.
2026-08-18 05:57:50 -07:00
Matthew Toussain 33f8915089 docs: class-ready cut is private Pro compose root (#143)
* docs(program): adopt class-ready Pro-dev cutover track

Stop blocking range readiness on unfinished Phase 3–6 contracts; document a companion Pro-dev stack that preserves Community independence.

* docs(program): reframe class-ready cut as private build root

Success is sirius-pro as the sole mutable Compose/build root on the range
with locked Community digests on :3000/:9001; companion sidecars alone do not
satisfy the cutoff.
2026-07-31 15:33:26 -07:00
Matthew Toussain a279198a39 Merge pull request #142 from SiriusScan/feature/openapi-contract
feat(api): publish versioned OpenAPI contract
2026-07-31 10:25:52 -07:00
0sm0s1z b36af6cafd docs(program): accept OpenAPI contract task
Record green live CI for task 3.2 and advance both durable programs to the public event contract.
2026-07-31 10:11:52 -07:00
0sm0s1z d7da4709fc fix(api): close second OpenAPI contract review gaps
Compare candidates against the protected merge-base/PR-base OpenAPI via
oasdiff, harden Fiber shadow detection and middleware test isolation, and
align /api/v1 input and status claims with handlers.
2026-07-31 09:29:10 -07:00
0sm0s1z 48643b912d fix(api): harden OpenAPI contract review findings
Reorder shadowed Fiber routes, add semantic OpenAPI baseline breaking
checks, share production middleware in tests, tighten health auth skip,
and align request/response contract details with live handlers.
2026-07-31 09:12:03 -07:00
0sm0s1z 8e7bdd90d4 feat(api): publish OpenAPI contract and route classification
Add a machine-readable classification for every live Community route, a
versioned /api/v1 OpenAPI document with reserved Pro/internal namespaces,
and blocking CI coverage checks that preserve the task 3.1 route inventory.
2026-07-31 08:55:44 -07:00
0sm0s1z 80a1b79498 docs(program): complete API module contract task
Record merged main evidence and advance the split programs to route classification and OpenAPI publication.
2026-07-31 08:49:00 -07:00
Matthew Toussain f24a67bd67 Merge pull request #141 from SiriusScan/feature/complete-split-module-seam
feat(api): add compile-time module composition seam
2026-07-31 07:58:45 -07:00
0sm0s1z 01f694c184 docs(pins): record API module contract bump
Keep the immutable go-api provenance ledger aligned with the Module seam shipped by API and engine images.
2026-07-31 07:41:51 -07:00
0sm0s1z 2e780db748 feat(api): add compile-time module composition seam
Let Pro extend the public API without forking Community startup while locking existing route behavior and immutable go-api pins.
2026-07-31 07:26:51 -07:00
0sm0s1z a53ba7ad40 docs(program): frame complete Pro range deployment
Coordinate the remaining bifurcation, private release, and reversible range deployment under one evidence-driven contract.
2026-07-30 23:20:54 -07:00
0sm0s1z 194c000b15 docs(program): close private supply-chain foundation
Record the green live Community scan, complete Phase 2, and open the API module contract task.
2026-07-30 22:01:39 -07:00
Matthew Toussain e7232f8a2a Merge pull request #140 from SiriusScan/fix/community-independence-system-fixtures
fix(ci): distinguish public system key fixtures
2026-07-30 21:27:58 -07:00
0sm0s1z 1dee75abbd fix(ci): distinguish public system key fixtures 2026-07-30 21:26:31 -07:00
Matthew Toussain 895b91a23b Merge pull request #139 from SiriusScan/fix/community-independence-pem-structure
fix(ci): validate PEM key structure
2026-07-30 20:57:36 -07:00
0sm0s1z ac0905d31d fix(ci): validate PEM key structure 2026-07-30 20:56:07 -07:00
Matthew Toussain e55a7824db Merge pull request #138 from SiriusScan/fix/community-independence-pem-detection
fix(ci): detect complete PEM key material
2026-07-30 20:32:07 -07:00
0sm0s1z 98616da237 fix(ci): detect complete PEM key material 2026-07-30 20:30:42 -07:00
Matthew Toussain 9248ddd6a5 Merge pull request #137 from SiriusScan/fix/community-independence-image-links
fix(ci): allow safe links in image layers
2026-07-30 20:21:15 -07:00
0sm0s1z 796d3fb15d fix(ci): ignore BusyBox image-layer links safely
Image-layer nested tar no longer rejects absolute in-container symlink
targets; links are skipped without following while regular path checks
and source-release link rejection remain fail-closed.
2026-07-30 20:19:16 -07:00
Matthew Toussain 29138e195e Merge pull request #136 from SiriusScan/feature/bifurcation-cycle-8
ci: add Community independence and leakage checks
2026-07-30 20:14:04 -07:00
0sm0s1z c89828c6ff docs(program): wait for Community leakage CI 2026-07-30 16:56:19 -07:00
0sm0s1z 9e7d227c89 fix(ci): single-count scan budget; nest large archive members
Charge each representation once so raw pre-scans do not triple-count
when gzip/tar/zip nesting succeeds. Large members still stream-recurse
into nested archives with spooling and safety caps.
2026-07-30 16:52:02 -07:00
0sm0s1z 5022836354 fix(ci): stream OCI/archive scans; keep source nest fail-open
Avoid full-buffer gzip/layer decompression and hard-failing large
members; chunk-scan with overlap and budgets. Opportunistic source
nesting skips malformed magic without losing raw findings; explicit
archive/image modes stay fail-closed.
2026-07-30 16:43:41 -07:00
0sm0s1z cd48276e8c fix(ci): harden community-independence scanner review findings
Correct path normalization, secret/boundary allowlist split, nested
archive/binary scanning, SBOM digest checks, multi-arch image pulls, and
behavioral canaries; keep task 2.3 pending CI proof.
2026-07-30 16:33:45 -07:00
0sm0s1z 5d8f9bbd7d chore(ci): drop community-independence Python bytecode cache
Keep the leakage scanner source-only; bytecode was accidentally committed.
2026-07-30 16:19:25 -07:00
0sm0s1z 1ee1a35d86 feat(ci): add standing Community independence leakage checks
Prove public Community needs no private credentials or packages by scanning
source, release archives, SBOMs, and digest images with path-scoped allowlists
and synthetic canaries (task 2.3 / bifurcation.s3.t008).
2026-07-30 16:19:17 -07:00
0sm0s1z ea6bfe42ff docs(program): start Community leakage checks 2026-07-30 16:12:27 -07:00
0sm0s1z 0bff00f73f docs(program): record private image supply chain 2026-07-30 15:06:01 -07:00
0sm0s1z e1163cbc8d docs(program): start private image supply chain 2026-07-30 14:42:29 -07:00
Matthew Toussain 8cf757984e Merge pull request #135 from SiriusScan/feature/bifurcation-cycle-7
docs: record private Pro foundation
2026-07-30 14:41:35 -07:00
0sm0s1z 3aebf664c5 docs(program): record private governance waiver 2026-07-30 14:39:39 -07:00
0sm0s1z c8f7b6a392 docs(program): record private governance blocker 2026-07-30 14:37:59 -07:00
0sm0s1z 479f42026b docs(program): start private supply-chain stage 2026-07-30 14:17:26 -07:00
Matthew Toussain 9c78e5e9dd Merge pull request #134 from SiriusScan/feature/bifurcation-cycle-6
docs: close Community release stage
2026-07-30 14:14:17 -07:00
0sm0s1z 9071757246 docs(program): close Community release stage 2026-07-30 13:24:39 -07:00
Matthew Toussain b61b47b468 Merge pull request #133 from SiriusScan/feature/bifurcation-cycle-4
feat: gate releases on SBOMs and image signatures
v1.1.0
2026-07-30 12:21:42 -07:00
0sm0s1z ef2c147a55 docs(program): record signed release gate cycle 2026-07-30 12:07:11 -07:00
0sm0s1z 9e336ef39c fix(release): harden Cosign trust root and platform SBOMs
Require SiriusScan/Sirius@refs/heads/main, pin the exact canonical
Cosign identity, emit 12 platform-scoped CycloneDX assets, re-verify
signatures before publish, and remove the 1.4↔1.5 task dependency cycle.
2026-07-30 12:00:15 -07:00
0sm0s1z a8460de25b feat(release): gate v1.1.0 on Syft SBOMs and Cosign signatures
Add fail-closed attest-release-images to the Community release train so
all six inventory digests get CycloneDX SBOMs and keyless Cosign verify
before a GitHub Release can publish. Contract tests lock the ordering,
digest-only inputs, asset names, and OIDC permissions.
2026-07-30 11:47:09 -07:00
0sm0s1z 81c157ae88 docs(program): record release inventory human gate
Accept the merged core release-train evidence and pause bifurcation before the separately approved v1.1.0 publication step.
2026-07-30 10:30:39 -07:00
Matthew Toussain 2ed5a1f412 Merge pull request #132 from SiriusScan/feature/pro-bifurcation
Harden Community core for Pro bifurcation
2026-07-30 08:35:40 -07:00
0sm0s1z abd3bd7ee4 fix(ci): require commit-built release inventory
Reject skipped release-bearing builds and rebuild both API and engine when their shared monitoring components dispatch updates.
2026-07-30 08:29:04 -07:00
0sm0s1z 0f733cbaaf fix(db): repair fresh-install vulnerability migration
Pin the go-api migration hotfix that indexes the persisted v_id column so clean databases can complete the deterministic migration ledger in integration CI.
2026-07-30 08:17:21 -07:00
0sm0s1z 4bf81f6ede docs(program): record bifurcation pull request handoff
Persist the approved PR, conflict resolution evidence, and the remaining review and merge gates.
2026-07-30 08:07:24 -07:00
0sm0s1z 4fa822499b chore: merge main into Pro bifurcation branch
Preserve the required go-api v0.0.19 migration pin while incorporating current main so the release-train pull request can run cleanly.
2026-07-30 08:06:50 -07:00
0sm0s1z 25b4cce9f7 docs(program): record bifurcation cycle one evidence
Accept the local release-train validation and advance the durable handoff to the human-gated pull request step.
2026-07-30 08:04:35 -07:00