Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
4b9eb7d
integration(web): stage guided SPOOL site alongside industrial candidate
dharan1007 Sep 27, 2026
37241a1
fix(web): make all guided product routes first-class SPA pages withou…
dharan1007 Sep 27, 2026
fbb8b39
fix(ci): refuse skipped or empty PostgreSQL suites on standalone runner
dharan1007 Sep 27, 2026
9cf8fe0
fix(qualify): make concurrent PostgreSQL CDC writer mutations truly a…
dharan1007 Sep 27, 2026
90807ef
fix(qualify): bound seven-day CDC soak and refuse swallowed no-op dri…
dharan1007 Sep 27, 2026
5005570
fix(qualify): test genuine exported MVCC snapshot across all declared…
dharan1007 Sep 27, 2026
cf83f29
fix(cdc): serialize bounded pgoutput callbacks and acknowledge only d…
dharan1007 Sep 27, 2026
7e4f4cf
feat(preview): isolated static-only Node server with SPA fallbacks an…
dharan1007 Sep 27, 2026
2220afe
fix(cdc): honor upstream async flow-control and reject mid-transactio…
dharan1007 Sep 27, 2026
3979447
fix(preview): reject static symlink escapes after HTTP red-team repro…
dharan1007 Sep 27, 2026
35b21f7
docs(cdc): accurately describe library-level async flow control
dharan1007 Sep 27, 2026
e6270be
fix(qualification): count actual insert/update/delete pgoutput events…
dharan1007 Sep 27, 2026
2a77527
fix(cdc): surface bounded capture truncation and reject incomplete so…
dharan1007 Sep 27, 2026
f6c8b18
fix(cdc): complete-transaction LSN audit and idle-waterline termination
dharan1007 Sep 27, 2026
43f6bc2
feat(auth): opt-in fail-closed loopback migration scope authorization
dharan1007 Sep 27, 2026
a8cff65
fix(recovery): fsync+atomic checkpoint, fail-closed corrupted state, …
dharan1007 Sep 27, 2026
edd07f8
docs(auth): show viable single-principal local approval; disclose SoD…
dharan1007 Sep 27, 2026
76eb819
fix(qualification): exercise genuine multi-row CDC transactions and r…
dharan1007 Sep 27, 2026
32337b0
fix(cdc): disable unsafe driver auto-feedback and acknowledge complet…
dharan1007 Sep 27, 2026
47849fe
fix(cdc): enforce mutation effect budgets during hash and target stre…
dharan1007 Sep 27, 2026
53773ba
fix(cdc): serialize safe standby heartbeat feedback behind durable co…
dharan1007 Sep 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/EXTERNAL_QUALIFICATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,5 @@ For account-quota facts, consult the [official GitHub Actions billing documentat
## Qualification-soak duration is not optional

The named workloads are immutable inputs: CI = 100K rows / 30 seconds of CDC, SMALL = 1M / 1 hour, MEDIUM = 10M / 24 hours, LARGE = 100M / 72 hours, INDUSTRIAL = 1B / 7 days. The separate production qualification class also requires the complete cumulative identity, authority, crash, content-verification and HA gates in the readiness plan. Overrides receive a CUSTOM label and **never** inherit an immutable workload claim. The direct `external-ci.sh` command only executes the CI workload by default; its success cannot certify any higher class. Long-duration workloads require real isolated infrastructure and independent attestation; if no environment can execute them, the claim remains NOT_QUALIFIED.

A test-process exit status alone is insufficient: standalone PostgreSQL conformance and red-team runners emit Node TAP and must have nonzero executed passing tests with exactly zero skips, TODO, failed or cancelled cases. The fail-closed `assert-test-execution.js` rejects empty, truncated or contradictory output. Both the transcripts and verification logs are checksummed in the external evidence bundle. This rule is mandatory even when PostgreSQL tests contain environment-based `skip` branches.
58 changes: 58 additions & 0 deletions docs/strict-local-authorization.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# Strict local migration scopes

SPOOL's loopback daemon supports `requireMigrationScopes: true` for a
fail-closed *local* operator deployment. It does not turn the daemon into a
public network service or provide enterprise identity federation.

```js
import { createSpoolDaemon } from '../src/daemon/spoold.js';

const daemon = createSpoolDaemon({
service, // your initialized SpoolCommandService
host: '127.0.0.1',
requireMigrationScopes: true,
localIdentities: [
{
token: process.env.SPOOL_OPERATOR_A_TOKEN,
principal: 'operator:alice',
commands: ['inspect', 'plan', 'status', 'approve', 'run', 'receipt'],
migrationIds: ['preprovisioned-migration-A']
},
{
token: process.env.SPOOL_OPERATOR_B_TOKEN,
principal: 'operator:bob',
commands: ['inspect', 'plan', 'status', 'receipt'],
migrationIds: ['preprovisioned-migration-A']
}
]
});
```

Each token must be a separate high-entropy secret at least 32 UTF-8 bytes long;
do not embed it in a repository, URL, browser, or client-side bundle. Never
configure the legacy shared `token` simultaneously with `localIdentities`.
Startup fails if any strict identity has no explicit, nonempty migration
allowlist. A matching bearer cannot execute ungranted commands, impersonate
another `request.principal`, inspect another migration ID, or invoke a
top-level cutover/status endpoint with a different migration ID. Mismatched
`request.migrationId` and `migrationId` fail before dispatch. The API
responds 403, with no corresponding command-service invocation.

**Security boundary:** This is exact migration-ID authorization for one
loopback process, *not* tenant data-source isolation. SPOOL's migration IDs and
plan connection references may be supplied by callers; protecting customer
data requires a separately trusted binding from each identity to immutable
source and target resource identities. This setting does not implement
OIDC/JWT verification, mTLS, global session revocation, approval separation
between distinct humans, audit log export, or distributed role administration.
The signed plan/repair approval record still binds to one request principal.
For now a working local approve-and-run path needs that same bound principal,
so the example grants Alice both commands. Bob's read-only identity illustrates
migration-scoped visibility; it is **not** a second approving authority.
Do **not** interpret separate `approve` and `run` grants as a completed
two-person authorization workflow.

Legacy single-token mode is retained for backwards compatibility and remains
**unsuitable as proof of enterprise authorization**. Enable strict mode for
scoped local operation only; production enterprise release remains gated on
independent identity, policy, and separation-of-duties validation.
4 changes: 3 additions & 1 deletion product.css

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading