Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
255 commits
Select commit Hold shift + click to select a range
e72454b
feat(build): AC-35 v6 slice 3 -- capability gate wired in front of di…
RCSnyder Apr 21, 2026
162cbe2
feat(build): AC-36 v6 slice 4 -- ToolExecutor trait + ProcessExecutor…
RCSnyder Apr 21, 2026
ac828ed
docs(build): v6 post-BUILD gate PASS + cargo audit observation
RCSnyder Apr 21, 2026
c0215b8
fix(build): AC-37 -- allow RUSTSEC-2023-0071 as a single documented e…
RCSnyder Apr 21, 2026
fb98e8c
fix(build): close v6 review R1/R2 — widen sudo check + add AppState.e…
RCSnyder Apr 21, 2026
fd39759
docs(reconcile): v6 seven-axis audit — align design.md + readiness.md…
RCSnyder Apr 21, 2026
e227ae3
docs(verify): v6 post-VERIFY gate PASS
RCSnyder Apr 21, 2026
e7c9144
docs(deploy): v6 DELIVERY.md refresh + post-DEPLOY gate PASS
RCSnyder Apr 21, 2026
a532996
docs(expand): scope v7 — credential vault & reasoner-secret refusal
RCSnyder Apr 21, 2026
a370731
docs(design): v7 design addendum + readiness READY
RCSnyder Apr 21, 2026
e5df233
feat(build): AC-38 v7 slice 1 -- AES-256-GCM credential vault
RCSnyder Apr 21, 2026
7a0b146
feat(build): AC-39 v7 slice 2 -- credentials REST API
RCSnyder Apr 21, 2026
8fd7475
feat(build): AC-40 v7 slice 3 -- pcy credential CLI
RCSnyder Apr 21, 2026
b2c323c
feat(build): AC-41 v7 slice 4 -- list_credentials tool
RCSnyder Apr 21, 2026
34add0c
feat(build): AC-42 v7 slice 5 -- hardened wake_system_prompt v2
RCSnyder Apr 21, 2026
7a89cbb
feat(build): AC-43 v7 slice 6 -- PLACEHOLDER credential resolution
RCSnyder Apr 21, 2026
d954333
fix(build): clippy -- allow too_many_arguments on dispatch_tool and p…
RCSnyder Apr 21, 2026
4b75c86
docs(v7): RECONCILE + DEPLOY -- log and DELIVERY for v7
RCSnyder Apr 21, 2026
22ac12a
docs(v7): RECONCILE + DEPLOY -- log and DELIVERY for v7
RCSnyder Apr 21, 2026
18c868b
docs(expand): v8 scope — Unified API Surface (schema-driven CLI, MCP,…
RCSnyder Apr 21, 2026
ab5c8d7
chore(v8-prep): v8 exploration artifacts — CLI distribution + release…
RCSnyder Apr 21, 2026
26e317c
docs(design): v8 — Unified API Surface architecture
RCSnyder Apr 21, 2026
05f5432
chore(scope): normalize v8 stack table whitespace
RCSnyder Apr 21, 2026
9b440ca
docs(analyze): v8 readiness — READY
RCSnyder Apr 21, 2026
f65c808
feat(build): AC-44 slice 1a — OpenAPI 3.1 spec endpoint
RCSnyder Apr 21, 2026
7f24367
feat(build): AC-44 slice 1b -- full handler OpenAPI coverage
RCSnyder Apr 21, 2026
6cf053a
docs(build): log BUILD v8 Slice 1 (AC-44 OpenAPI coverage)
RCSnyder Apr 21, 2026
eefbf8a
feat(build): AC-47 slice 2a -- CLI output renderer foundation
RCSnyder Apr 21, 2026
f28af48
feat(build): AC-46 slice 2b -- name-or-UUID resolver
RCSnyder Apr 21, 2026
316bb79
docs(build): log BUILD v8 Slice 2 (partial - sub-slices 2a+2b)
RCSnyder Apr 21, 2026
b64271d
feat(build): AC-48 slice 2c -- named contexts + v4 to v8 migration
RCSnyder Apr 21, 2026
0a5d990
docs(build): log slice 2c -- named contexts + v4 to v8 migration
RCSnyder Apr 21, 2026
2a99236
feat(build): AC-46/AC-48 slice 2d-i -- context noun
RCSnyder Apr 21, 2026
7028a10
docs(build): log slice 2d-i -- context noun
RCSnyder Apr 21, 2026
5b12f43
feat(build): AC-47 slice 2e-a -- root Cli --output/--no-color flags
RCSnyder Apr 21, 2026
5d57c30
docs(build): log AC-47 slice 2e-a -- root Cli output/no-color flags
RCSnyder Apr 21, 2026
5ef6666
feat(build): AC-45/AC-48 v8.0 -- idempotent pcy login + pcy whoami
RCSnyder Apr 21, 2026
da2c637
feat(build): AC-47 v8.0 -- credential list honours --output
RCSnyder Apr 21, 2026
253dffe
feat(build): AC-51 v8.0 -- pcy completion via clap_complete
RCSnyder Apr 21, 2026
d700346
feat(build): AC-52b v8.0 -- cli_naming_test + about docstrings
RCSnyder Apr 21, 2026
d0c1227
docs(build): log v8.0 landing + DELIVERY.md v8.0 section
RCSnyder Apr 21, 2026
fdefca5
fix(build): allowlist v8.0 env-var additions in env_example_test
RCSnyder Apr 21, 2026
66d0900
feat(cli): remove pcy bootstrap subcommand; login is sole auth verb (…
RCSnyder Apr 21, 2026
25027df
docs(expand): v9 scope -- solo-founder trust gate (AC-53..AC-70)
RCSnyder Apr 22, 2026
0dc7bab
docs(expand): v9 scope revision — clarifications resolved; AC-53/65 u…
RCSnyder Apr 22, 2026
bbf9907
docs(design,analyze): v9 trust-gate architecture + readiness map
RCSnyder Apr 22, 2026
fe46a9e
docs(audit): v9 audit addendum — 3 new ACs (AC-73/74/75) + 15 in-slic…
RCSnyder Apr 22, 2026
036eed0
docs(audit): fix post-audit plan inconsistencies
RCSnyder Apr 22, 2026
15de1be
feat(build): AC-75 cross-platform devshell (Slice A0)
RCSnyder Apr 22, 2026
b91c777
docs(build): log Slice A0 PASS
RCSnyder Apr 22, 2026
964b1cf
feat(build): AC-54 SECURITY.md threat model (Slice A1)
RCSnyder Apr 22, 2026
45c763b
docs(build): log Slice A1 PASS
RCSnyder Apr 22, 2026
c980a28
docs(build): verify AC-75 Linux parity + relax Docker floor
RCSnyder Apr 22, 2026
4f48016
feat(build): AC-73 sandbox mode config flag (Slice A2a)
RCSnyder Apr 22, 2026
ffbe6f0
docs(build): log Slice A2a PASS
RCSnyder Apr 22, 2026
756d336
chore(clippy): fix Rust 1.94 lints (derivable_impls, doc_lazy_continu…
RCSnyder Apr 22, 2026
d71dc0d
feat(build): AC-53 prep -- Linux sandbox crate gate (Slice A2b.1)
RCSnyder Apr 22, 2026
b93c527
refactor(runtime): split sandbox.rs into sandbox/ module (Slice A2b.2)
RCSnyder Apr 22, 2026
3cdcee6
docs(build): log Slice A2b.1 + A2b.2 checkpoint
RCSnyder Apr 22, 2026
b145b0e
feat(runtime): AC-53 RealSandbox via bwrap + build_executor factory (…
RCSnyder Apr 22, 2026
b3e63c4
docs(build): log Slice A2b.3 checkpoint
RCSnyder Apr 22, 2026
b54bd9b
feat(scripts): allow relocating cargo and devshell caches off system …
RCSnyder Apr 22, 2026
ccae5da
ci: install bwrap userland + dedicated sandbox-smoke job (AC-53 evide…
RCSnyder Apr 22, 2026
8ff23ae
merge: keep v8 DELIVERY over v7 reconcile docs from origin
RCSnyder Apr 22, 2026
11f1a3a
fix(ci): close AC-53 evidence gate — patch rustls-webpki, allow unpri…
RCSnyder Apr 22, 2026
aafee74
fix(devshell): MSYS path + TTY auto-detect for Windows git-bash; log …
RCSnyder Apr 22, 2026
fc97157
docs(log): record Slice A2b.3 second-channel evidence (local devshell…
RCSnyder Apr 22, 2026
4a857f3
feat(sandbox): Slice A2b.4a cgroup v2 resource caps (layer 2 of 6)
RCSnyder Apr 22, 2026
cc354ad
fix(sandbox): clippy manual-range-contains in A2b.4a pids test
RCSnyder Apr 22, 2026
1f63ed8
docs(log): record Slice A2b.4a CI evidence (4/4 cgroup tests green on…
RCSnyder Apr 22, 2026
7040c34
feat(sandbox): Slice A2b.4b seccomp-bpf denylist (layer 3 of 6)
RCSnyder Apr 22, 2026
e5e893c
fix(sandbox): clippy doc-list-overindent + manual-c-str-literal in se…
RCSnyder Apr 22, 2026
882f436
docs(log): record Slice A2b.4b CI evidence (10/10 seccomp tests + 72 …
RCSnyder Apr 22, 2026
94886d8
feat(build): add landlock LSM filter (AC-53 layer 4 of 6, slice A2b.4c)
RCSnyder Apr 22, 2026
9bdb1f0
fix(build): remove unused CommandExt import (tokio's pre_exec is inhe…
RCSnyder Apr 22, 2026
263d9e1
fix(build): landlock must grant rwx on /proc for bwrap uid-map writes
RCSnyder Apr 22, 2026
02204a5
docs(spec): v3.3 TLC-driven correctness pass (B5-B10)
RCSnyder Apr 23, 2026
df51ea7
ci(tla): add SANY parse + TLC simulation CI for canonical spec
RCSnyder Apr 23, 2026
1a599f9
chore(ci): remove extra lines
RCSnyder Apr 23, 2026
ebc6398
fix(tla): repair side-spec parse, include in CI, keep path filter
RCSnyder Apr 23, 2026
5cb1c9b
docs(scope): add AC-76..AC-82 as v9 release blockers from TLA+ + secu…
RCSnyder Apr 23, 2026
5124098
test(sandbox): surface bwrap stderr in smoke test panics
RCSnyder Apr 23, 2026
ad4c3b0
ci(sandbox): make / private before bwrap to unblock MS_SLAVE on hoste…
RCSnyder Apr 23, 2026
c98edd9
ci(sandbox): grant bwrap cap_sys_admin+cap_sys_chroot file caps
RCSnyder Apr 23, 2026
b8c5812
ci(sandbox): run smoke binary under sudo, skip in unprivileged test job
RCSnyder Apr 23, 2026
f9009c2
ci(sandbox): run AC-53 real-bwrap tests inside --privileged container
RCSnyder Apr 23, 2026
072f531
test(sandbox): accept dash 'Cannot fork' message as pids.max evidence
RCSnyder Apr 23, 2026
9ece253
ci(sandbox): --no-fail-fast so every real-bwrap binary runs
RCSnyder Apr 23, 2026
85b0bd7
fix(sandbox): add / to landlock rx allowlist so bwrap setup succeeds
RCSnyder Apr 23, 2026
4f82cc9
docs(expand): v9 sandbox architecture rework — AC-83..AC-88, Phase G0
RCSnyder Apr 23, 2026
4cf7bc9
fix(sandbox): interim — disable landlock by default per AC-53 amendment
RCSnyder Apr 23, 2026
c459d53
docs(analyze): readiness addendum for Slice G0a (AC-83 pincery-init)
RCSnyder Apr 23, 2026
20c3454
feat(sandbox): Slice G0a.1 — SandboxInitPolicy IPC module (AC-83)
RCSnyder Apr 23, 2026
71bbec9
docs(build): log Slice G0a.1 SandboxInitPolicy
RCSnyder Apr 23, 2026
fb8c4d9
fix(sandbox): swap bincode -> serde_json in SandboxInitPolicy (deny f…
RCSnyder Apr 23, 2026
bdb38ca
feat(sandbox): Slice G0a.2 -- pincery-init binary skeleton (AC-83)
RCSnyder Apr 23, 2026
c4e0f0f
fix(sandbox): allow dead_code on ParsedArgs.user_argv (G0a.2 clippy fix)
RCSnyder Apr 23, 2026
d0dc226
fix(sandbox): derive Debug on ParsedArgs (unwrap_err needs T: Debug)
RCSnyder Apr 23, 2026
9638f23
feat(sandbox): Slice G0a.3a -- prctl(NO_NEW_PRIVS) inside pincery-ini…
RCSnyder Apr 23, 2026
01c84d8
feat(sandbox): Slice G0a.3b -- drop uid/gid inside pincery-init (AC-83)
RCSnyder Apr 23, 2026
fc01535
feat(sandbox): Slice G0a.3c -- seccomp filter install inside pincery-…
RCSnyder Apr 23, 2026
049c8e2
fix(sandbox): satisfy clippy::manual_is_multiple_of in apply_seccomp
RCSnyder Apr 23, 2026
e54df67
feat(build): install landlock inside pincery-init (G0a.3d)
RCSnyder Apr 23, 2026
cec6a46
fix(build): clippy doc_lazy_continuation in G0a.3d test docstring
RCSnyder Apr 23, 2026
88b2da8
fix(build): expand sample_policy landlock paths for G0a.3d enforcement
RCSnyder Apr 23, 2026
77c2f20
feat(build): FullyEnforced verification inside pincery-init (G0a.3e)
RCSnyder Apr 23, 2026
48a68e8
fix(build): allowlist OPEN_PINCERY_INIT_FORCE_PARTIAL for AC-29
RCSnyder Apr 23, 2026
e3d0dc8
feat(build): JSON error channel on --error-fd for pincery-init (G0a.3f)
RCSnyder Apr 23, 2026
a238b84
fix(build): make write_error_channel pub so main can call it (G0a.3f)
RCSnyder Apr 23, 2026
1848806
feat(build): G0a.3g wire pincery-init into bwrap for landlock
RCSnyder Apr 23, 2026
f69afe7
fix(build): G0a.3g populate policy.user_argv with sh -c <cmd>
RCSnyder Apr 23, 2026
292958b
fix(build): G0a.3g add /dev to default landlock rwx paths
RCSnyder Apr 23, 2026
34f7bcd
feat(build): G0a.3h flip SandboxProfile::default to landlock=true
RCSnyder Apr 23, 2026
9c04329
chore: remove stale one-shot landlock debug probe
RCSnyder Apr 23, 2026
2b92357
fix(build): set PINCERY_INIT_BIN_PATH in sandbox_real_smoke preflight
RCSnyder Apr 23, 2026
b5939e8
feat(build): G0b.1 kernel ABI floor preflight module (AC-84)
RCSnyder Apr 24, 2026
ca7e43d
fix(build): register OPEN_PINCERY_SANDBOX_FLOOR in env contract (AC-29)
RCSnyder Apr 24, 2026
5fd7a99
feat(build): wire AC-84 startup preflight + exit-4 contract
RCSnyder Apr 24, 2026
a28f591
fix(test): accept AC-84 event on stdout or stderr in CI
RCSnyder Apr 24, 2026
7a8f97c
fix(sandbox): enforce AC-84 userns quota evidence
RCSnyder Apr 27, 2026
d23b0e0
fix(test): locate server binary in AC-84 integration tests
RCSnyder Apr 27, 2026
ad19903
docs(verify): close AC-84 with CI evidence
RCSnyder Apr 27, 2026
20afb3e
fix(sandbox): require full Landlock enforcement in production
RCSnyder Apr 27, 2026
8a8f001
fix(sandbox): avoid constructing landlock restriction status
RCSnyder Apr 27, 2026
f28039c
fix(sandbox): simplify landlock status validation
RCSnyder Apr 27, 2026
068ee99
docs(verify): close AC-85 with CI evidence
RCSnyder Apr 27, 2026
0985f93
docs(verify): close AC-85 with CI evidence
RCSnyder Apr 27, 2026
9958b2f
chore(git): reconcile amended AC-85 docs checkpoint
RCSnyder Apr 27, 2026
35d2c25
fix(sandbox): drop bwrap uid and capabilities
RCSnyder Apr 27, 2026
3861edc
fix(sandbox): keep AC-86 test helpers test-only
RCSnyder Apr 27, 2026
caf110d
fix(sandbox): block nested user namespaces
RCSnyder Apr 27, 2026
a3c877a
docs(verify): record AC-86 sandbox proof
RCSnyder Apr 27, 2026
9c63faa
feat(build): enforce landlock IPC scopes
RCSnyder Apr 28, 2026
a65e305
test(build): pin landlock scope fallback event
RCSnyder Apr 28, 2026
5fb1786
docs(verify): close AC-87 with CI evidence
RCSnyder Apr 28, 2026
185f59d
feat(build): implement ac-88 landlock audit integration
RCSnyder Apr 28, 2026
f14d9c0
fix(verify): repair ac-88 linux ci failures
RCSnyder Apr 28, 2026
37e4771
docs(verify): record ac-88 ci evidence
RCSnyder Apr 28, 2026
41e1ac3
docs(windows): default local target dirs to repo-local paths
RCSnyder Apr 29, 2026
800ae94
docs(analyze): open AC-76 / Slice G1a sandbox escape suite readiness
RCSnyder Apr 29, 2026
1129941
feat(build): AC-76 G1a sandbox escape suite — FS category
RCSnyder Apr 29, 2026
53a5f8d
ci(sandbox): include sandbox_escape_test in privileged smoke job
RCSnyder Apr 29, 2026
24ac973
fix(sandbox): narrow /etc bind+landlock to public allowlist (closes G…
RCSnyder Apr 30, 2026
dd10a8b
fix(sandbox): per-path Landlock access mask; correct bwrap /etc guard…
RCSnyder Apr 30, 2026
4913c6e
docs(verify): G1a / AC-76 FS category green on CI dd10a8b
RCSnyder Apr 30, 2026
cb8521b
feat(build): AC-76 / Slice G1b — privesc payloads (setuid, CAP_SYS_AD…
RCSnyder Apr 30, 2026
800ddf2
fix(build): G1b round 1 — privesc test correctness (CI cb8521b failures)
RCSnyder Apr 30, 2026
8935fd7
fix(build): G1b round 1 - privesc test correctness (CI cb8521b failures)
RCSnyder Apr 30, 2026
32dc75c
docs(verify): G1b green on CI 25141721367 (8935fd7)
RCSnyder Apr 30, 2026
926f53d
feat(build): AC-76 / Slice G1c - resource payloads (fork-bomb, memory…
RCSnyder Apr 30, 2026
9396f81
fix(build): AC-76 / Slice G1c round 1 - reshape resource payloads aft…
RCSnyder Apr 30, 2026
2d7e0bd
fix(build): AC-76 / Slice G1c round 2 - dd buffer + SURVIVORS pattern
RCSnyder Apr 30, 2026
91bc07f
fix(build): AC-76 / Slice G1c round 3 - memory controller delegation …
RCSnyder Apr 30, 2026
3a8d6da
fix(build): AC-76 / Slice G1c cleanup - clippy + memory-balloon uncon…
RCSnyder Apr 30, 2026
c032dd3
feat(build): AC-76 / Slice G1c.x - empirical memory.max enforcement p…
RCSnyder Apr 30, 2026
cd2f403
docs(verify): G1c.x green on CI 25193943507
RCSnyder Apr 30, 2026
5163604
feat(build): G1c.x.2 wire memory.max probe into startup gate
RCSnyder May 1, 2026
e9df9d9
docs(verify): G1c.x.2 green on CI 25196202744
RCSnyder May 1, 2026
e653ff6
docs(scope): document strategic security gaps + close G1c memory-ball…
RCSnyder May 1, 2026
9db7525
feat(build): G1d network-category escape payloads (AC-76 12/12)
RCSnyder May 1, 2026
75a7760
chore(ci): install iputils-ping in sandbox-smoke runner
RCSnyder May 1, 2026
eb70659
docs(verify): G1d CI-green at 25197562247 - AC-76 closes 12/12
RCSnyder May 1, 2026
0b02558
docs(analyze): AC-77 readiness — seccomp default-deny allowlist
RCSnyder May 1, 2026
fe01c9c
docs(analyze): log post-analyze PASS for AC-77
RCSnyder May 1, 2026
e08a15b
feat(build): AC-77 / Slice G2a - empirical seccomp syscall corpus
RCSnyder May 1, 2026
a89d4a5
feat(build): AC-77 / Slice G2b - default-deny allowlist + clone arg-f…
RCSnyder May 1, 2026
da9fd57
docs(build): log AC-77 / G2b PASS at a89d4a5
RCSnyder May 1, 2026
a96499e
feat(build): AC-77 / Slice G2c - sandbox_syscall_denied event on SIGSYS
RCSnyder May 1, 2026
6b6de9f
docs(build): log AC-77 / G2c PASS at a96499e
RCSnyder May 1, 2026
81571db
test(build): AC-77 / Slice G2d - seccomp allowlist integration tests
RCSnyder May 1, 2026
5982ab3
feat(build): AC-77 / Slices G2e+G2f - corpus-subset guard + CHANGELOG
RCSnyder May 1, 2026
7dcfbd7
docs(build): log AC-77 / G2d+G2e+G2f PASS at 81571db / 5982ab3
RCSnyder May 1, 2026
c440489
fix(build): AC-77 review fixes - R1 SIGSYS event test, R2 audit-mode …
RCSnyder May 1, 2026
512f3f5
fix(build): AC-77 review re-fix - cfg-gate sigsys_event_test to linux…
RCSnyder May 1, 2026
100e24c
docs(reconcile): align design.md and audit doc with AC-77 shipped state
RCSnyder May 1, 2026
8770751
fix(verify): widen AC-77 allowlist for Rust runtime + glibc-2.39 resi…
RCSnyder May 1, 2026
0b7f466
docs(reconcile): align design.md and audit doc counts with verify-fix
RCSnyder May 1, 2026
7dd654b
docs(verify): log AC-77 verify-fix attempt 1 PARTIAL + BLOCKED post-m…
RCSnyder May 1, 2026
762c24b
ci(sandbox-smoke): capture kernel seccomp/audit log for AC-77 diagnosis
RCSnyder May 1, 2026
a31da38
fix(verify): allow setresgid in AC-77 seccomp filter (kernel-evidence)
RCSnyder May 1, 2026
964db5a
fix(verify): correct AC-77 syscall identification - 118=getresuid not…
RCSnyder May 1, 2026
c792f76
fix(verify): add AC-77 getresgid (syscall 120) per kernel dmesg evidence
RCSnyder May 1, 2026
9b7714c
fix(verify): add AC-77 capget+capset (syscall 126) per kernel dmesg
RCSnyder May 1, 2026
20e8794
fix(verify): add AC-77 Landlock syscalls (444/445/446) per kernel dmesg
RCSnyder May 1, 2026
2984538
fix(verify): AC-77 escape-test scaffolding accepts SIGSYS denials
RCSnyder May 1, 2026
e3e3a58
fix(verify): relax AC-77 audit_mode test to negative-only assertion
RCSnyder May 1, 2026
047d148
fix(verify): accept Timeout as fork-bomb denial outcome (AC-77)
RCSnyder May 1, 2026
00822db
docs(verify): log AC-77 verify-fix-2 PASS entry
RCSnyder May 1, 2026
0fca3e7
docs(reconcile): align design.md AC-77 allowlist counts with shipped …
RCSnyder May 1, 2026
4d4fff9
docs(reconcile): align AC-77 audit-mode coverage row with shipped test
RCSnyder May 1, 2026
a546c8d
docs(reconcile): log AC-77 verify-fix-2 reconcile pass (REPAIRED)
RCSnyder May 1, 2026
1743aa7
docs(design): add v9 G3 AC-78 event-log hash chain design slice
RCSnyder May 1, 2026
985731d
docs(analyze): readiness for AC-78 event-log hash chain
RCSnyder May 1, 2026
36cabd6
feat(build): G3a AC-78 event-log hash chain migration + Rust verifier
RCSnyder May 1, 2026
bf9c6b5
feat(build): G3a AC-78 event hash chain migration + Rust verifier sca…
RCSnyder May 2, 2026
ae533df
docs(build): log AC-78 G3a PASS at bf9c6b5
RCSnyder May 2, 2026
c7b2f1a
feat(build): G3b AC-78 verifier + workspace pass + audit_chain events
RCSnyder May 2, 2026
2ed942b
fix(build): G3b verify-fix-1 — advisory lock + payload arg-order
RCSnyder May 2, 2026
b961955
fix(build): G3b verify-fix-2 — enforce monotonic created_at in chain …
RCSnyder May 2, 2026
26d4838
docs(build): log AC-78 G3b CLOSED at b961955
RCSnyder May 2, 2026
2c2e416
feat(build): G3c — pcy audit verify CLI + POST /api/audit/chain/verify
RCSnyder May 2, 2026
e6e7722
fix(test): G3c — bootstrap returns 201 CREATED in audit_api_test
RCSnyder May 2, 2026
217869f
docs(build): G3c CLOSED — log entry for pcy audit verify CLI + HTTP
RCSnyder May 2, 2026
f96c2e3
feat(build): G3d audit-chain startup gate refuses to boot on broken c…
RCSnyder May 2, 2026
6bb5658
fix(build): G3d add OPEN_PINCERY_AUDIT_CHAIN_FLOOR to .env.example
RCSnyder May 2, 2026
f0d7337
docs(build): G3d log entry — audit-chain startup gate CI 25241912717 …
RCSnyder May 2, 2026
ac47c26
docs(build): G3e AC-78 audit-chain recovery runbook + CHANGELOG
RCSnyder May 2, 2026
ac3e91b
docs(build): G3e log entry — AC-78 BUILD complete (G3a..G3e all green)
RCSnyder May 2, 2026
b412025
fix(build): G3-review address REVIEW Required findings on AC-78
RCSnyder May 2, 2026
6d52b2d
docs(log): G3-review entry; memory: AC-78 review-fix state @b412025
RCSnyder May 2, 2026
972f23b
docs(reconcile): AC-78 7-axis drift sweep — REPAIRED
RCSnyder May 2, 2026
e070280
docs(deliver): document AC-78 event-log hash chain in DELIVERY.md
RCSnyder May 2, 2026
77763ed
docs(analyze): AC-79 Prompt-Injection Defense Floor admission
RCSnyder May 2, 2026
6487e3a
feat(build): AC-79 G4a wake_system_prompt v3 + per-wake nonce/canary …
RCSnyder May 2, 2026
715cb99
feat(build): AC-79 G4b+G4c canary emission + echo scan + injection te…
RCSnyder May 3, 2026
2e37cb2
feat(build): AC-79 G4d jsonschema validation + retry cap + FailureAud…
RCSnyder May 3, 2026
e0b814e
feat(build): AC-79 G4e per-wake tool-call rate limit + adversarial in…
RCSnyder May 3, 2026
91ecfb8
fix(build): AC-79 review-fix-1 — structured event payloads, OsRng, v3…
RCSnyder May 3, 2026
b6044fd
docs(review): AC-79 REVIEW PASS @ 91ecfb8 — fix-cycle 1 closed all Cr…
RCSnyder May 3, 2026
fc1883f
docs(reconcile): AC-79 7-axis drift sweep — REPAIRED
RCSnyder May 3, 2026
6862d58
fix(verify): AC-79 verify-fix-1 — allowlist new env keys in AC-29 orp…
RCSnyder May 3, 2026
a998b31
docs(deploy): AC-79 closed — Prompt-Injection Defense Floor delivered
RCSnyder May 3, 2026
5751f9b
docs(input): tool-landscape audit 2026-05 — OpenShell, Sandcastle, pi…
RCSnyder May 3, 2026
f31e0da
docs(analyze): AC-80 capability nonce/freshness — READY
RCSnyder May 3, 2026
5d86330
feat(build): AC-80 G5a — capability_nonce module + migration + unit t…
RCSnyder May 3, 2026
43fb456
feat(build): AC-80 G5b+G5c — wake_loop mints, dispatch_tool consumes
RCSnyder May 3, 2026
3bc4593
test(build): AC-80 G5d — capability nonce adversarial integration tests
RCSnyder May 3, 2026
4416118
docs(build): AC-80 G5e — CHANGELOG and DELIVERY entries for capabilit…
RCSnyder May 3, 2026
1442390
fix(build): AC-80 G5d type alias for classify_rejection row tuple
RCSnyder May 3, 2026
3bc16a7
fix(build): AC-80 REVIEW-fix-1 — concurrent test + AC-78 chain walk +…
RCSnyder May 3, 2026
6d5a092
docs(review): AC-80 REVIEW round 2 PASS
RCSnyder May 3, 2026
718a499
docs(reconcile): AC-80 7-axis drift sweep — REPAIRED
RCSnyder May 3, 2026
d635698
feat(verify): AC-80 closed — capability nonce admission gate verified
RCSnyder May 3, 2026
85f7b39
docs(analyze): AC-81 readiness — Binding Commitments (spec_coverage +…
RCSnyder May 4, 2026
e6364f6
feat(build): AC-81 binding commitments — spec_coverage table + commit…
RCSnyder May 4, 2026
727a341
fix(build): AC-81 clippy for_kv_map — iterate keys() in spec_coverage…
RCSnyder May 8, 2026
f8da9f2
docs(reconcile): AC-81 7-axis drift sweep — REPAIRED
RCSnyder May 8, 2026
67983d8
docs(deploy): AC-81 closed — Binding Commitments delivered
RCSnyder May 8, 2026
4e2a1d9
docs(analyze): AC-82 readiness — Fire Reserved Lifecycle States READY
RCSnyder May 8, 2026
ac2d00e
feat(build): AC-82 G7a — fine-grained lifecycle CAS helpers + migration
RCSnyder May 8, 2026
926200f
docs(build): log AC-82 G7a checkpoint
RCSnyder May 8, 2026
c9674e2
fix(build): AC-82 G7a clippy doc_overindented_list_items
RCSnyder May 8, 2026
ba9f9f8
feat(build): AC-82 G7b — wake-loop entry chain emits lifecycle_transi…
RCSnyder May 8, 2026
af636bb
docs(build): log AC-82 G7b checkpoint
RCSnyder May 8, 2026
fa3d243
feat(build): AC-82 G7c+G7d — tool-loop transitions + terminal CAS chain
RCSnyder May 8, 2026
d7dad7c
feat(build): AC-82 G7f+G7g — status-write CAS lint + spec_coverage In…
RCSnyder May 8, 2026
57c0a4d
docs(build): log G7c..G7g AC-82 BUILD-complete checkpoint
RCSnyder May 8, 2026
56c8209
fix(build): AC-82 review-fixes (1 Critical + 3 Required + 1 Consider)
RCSnyder May 8, 2026
b57ba8f
docs(reconcile): AC-82 7-axis drift sweep — REPAIRED
RCSnyder May 8, 2026
9015e84
docs(deploy): DELIVERY.md AC-82 close + v9.0 ship-gate clear
RCSnyder May 8, 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
78 changes: 78 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,67 @@ OPEN_PINCERY_PORT=8080
# Windows PS: -join ((48..57)+(97..102) | Get-Random -Count 64 | % {[char]$_})
OPEN_PINCERY_BOOTSTRAP_TOKEN=change-me-to-a-random-secret

# --- Credential vault master key (REQUIRED, v7) ----------------------------
# Base64-encoded 32-byte key used by the AES-256-GCM credential vault. Every
# workspace-scoped credential is sealed under this key. Generate once per
# deployment and NEVER rotate in place (v7) — v8 adds a re-wrap path.
# Linux/macOS: openssl rand -base64 32
# Windows PS: [Convert]::ToBase64String((1..32 | % {Get-Random -Max 256}))
# Losing this value makes all stored credentials unrecoverable.
OPEN_PINCERY_VAULT_KEY=replace-with-openssl-rand-base64-32-output

# --- Sandbox enforcement mode (optional, v9 / AC-73) -----------------------
# Controls the Zerobox tool sandbox (AC-53). Default: enforce.
# enforce — full sandbox; policy violations block the tool call (SAFE).
# audit — policy engine runs but emits `sandbox_would_block` events
# instead of blocking. Use for one week during v9 upgrade to
# surface allowlist gaps, then flip back to `enforce`.
# disabled — sandbox is bypassed entirely. REQUIRES the paired
# OPEN_PINCERY_ALLOW_UNSAFE=true below. Never use in
# production; a stderr warning is emitted every 60s while
# disabled. The sandbox is the primary boundary between
# agent-emitted shell commands and your host.
# OPEN_PINCERY_SANDBOX_MODE=enforce

# --- Unsafe sandbox bypass opt-in (v9 / AC-73) -----------------------------
# Required companion to OPEN_PINCERY_SANDBOX_MODE=disabled. Must be the
# literal string `true`. Any other value (including unset, `false`, `1`,
# `yes`) refuses the bypass and fails startup. Also required companion to
# OPEN_PINCERY_SANDBOX_FLOOR=relaxed below.
# OPEN_PINCERY_ALLOW_UNSAFE=true

# --- Kernel ABI floor opt-out (optional, v9 / AC-84) -----------------------
# Controls the startup preflight that asserts the host kernel meets the v9
# sandbox floor (Landlock ABI >= 6 on Linux >= 6.7, seccomp-bpf, cgroup v2,
# unprivileged userns or root, bubblewrap >= 0.8.0). Default: strict.
# strict — enforce the full floor. Older kernels fail startup (SAFE).
# relaxed — downgrade the Landlock requirement from ABI 6 to ABI 1
# (Linux >= 5.13). All other preflight checks stay mandatory.
# REQUIRES the paired OPEN_PINCERY_ALLOW_UNSAFE=true above.
# Emits a `sandbox_floor_relaxed` warning at startup.
# OPEN_PINCERY_SANDBOX_FLOOR=strict

# --- Audit-chain integrity floor (optional, v9 / AC-78) --------------------
# Controls the startup preflight that walks every agent's per-agent SHA-256
# event hash chain. Default: strict.
# strict — refuse to boot (exit code 5) if any agent's chain is broken.
# Operators must investigate via `pcy audit verify --agent <id>`
# before restarting. SAFE.
# relaxed — log the broken chain, emit one `audit_chain_floor_relaxed`
# event per affected agent, then continue boot. REQUIRES the
# paired OPEN_PINCERY_ALLOW_UNSAFE=true above. Use only during
# forensic recovery; switch back to strict after restoring
# integrity.
# OPEN_PINCERY_AUDIT_CHAIN_FLOOR=strict

# --- Sandbox process identity (optional, v9 / AC-86) -----------------------
# Every bwrap sandbox process runs as nobody:nogroup by default and drops all
# Linux capabilities. Override only when your deployment requires a different
# non-root identity inside the sandbox. UID/GID 0 require
# OPEN_PINCERY_ALLOW_UNSAFE=true and are refused by default.
# OPEN_PINCERY_SANDBOX_UID=65534
# OPEN_PINCERY_SANDBOX_GID=65534

# ============================================================================
# LLM provider (REQUIRED)
# ============================================================================
Expand Down Expand Up @@ -58,6 +119,12 @@ LLM_MAINTENANCE_PRICE_OUTPUT_PER_MTOK=15.0
# Prometheus /metrics endpoint on its own port. Unset = metrics disabled.
# METRICS_ADDR=127.0.0.1:9090

# Optional Landlock audit-log fallback path for AC-88. When unset, Open Pincery
# checks /var/log/audit/audit.log after shell tool calls and emits a one-time
# audit_log_unavailable warning if the source cannot be read. Set this when
# auditd/journald writes Landlock denial records somewhere else.
# OPEN_PINCERY_LANDLOCK_AUDIT_LOG=/var/log/audit/audit.log

# Standard Rust log filter.
RUST_LOG=open_pincery=info

Expand All @@ -66,6 +133,17 @@ RUST_LOG=open_pincery=info
# ============================================================================
# MAX_PROMPT_CHARS=100000
# ITERATION_CAP=50
# AC-79: per-wake cap on consecutive schema-invalid LLM tool-call
# responses before the wake terminates with FailureAuditPending.
# Operators may tighten but not silently disable; 0 is rejected.
# OPEN_PINCERY_SCHEMA_INVALID_RETRY_CAP=3
# AC-79: per-wake cap on the number of tool calls that may be
# dispatched within a single wake. Independent of ITERATION_CAP
# (different quantities). On exhaustion the wake emits
# tool_call_rate_limit_exceeded once and terminates with
# FailureAuditPending. Operators may tighten but not silently
# disable; 0 is rejected.
# OPEN_PINCERY_TOOL_CALL_RATE_LIMIT_PER_WAKE=32
# STALE_WAKE_HOURS=2
# WAKE_SUMMARY_LIMIT=20
# EVENT_WINDOW_LIMIT=200
Expand Down
160 changes: 160 additions & 0 deletions .github/hooks/commit-msg-spec-ref
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
#!/usr/bin/env bash
# AC-81 — commit-msg hook: spec-ref trailer enforcement.
#
# Rejects any commit whose staged diff touches src/runtime/** or
# src/api/** unless the commit message body contains at least one
#
# canonical_action=<Name>
#
# trailer where <Name> appears verbatim in the canonical_action column
# of scaffolding/spec_coverage.md. Commits that touch neither path are
# accepted with no trailer requirement.
#
# Argument: $1 — path to the commit message file (Git default).
#
# Exit codes:
# 0 — accept commit
# 1 — reject commit (path-gated and trailer missing or invalid)

set -u

MSG_FILE="${1:-}"
if [[ -z "$MSG_FILE" || ! -f "$MSG_FILE" ]]; then
echo "commit-msg-spec-ref: missing message file argument" >&2
exit 1
fi

# Path-conditional gate: only enforce on runtime / api edits.
GATED_REGEX='^src/(runtime|api)/'
STAGED="$(git diff --cached --name-only 2>/dev/null || true)"

needs_trailer=0
if [[ -n "$STAGED" ]]; then
while IFS= read -r path; do
if [[ "$path" =~ $GATED_REGEX ]]; then
needs_trailer=1
break
fi
done <<< "$STAGED"
fi

if [[ "$needs_trailer" -eq 0 ]]; then
exit 0
fi

# Locate scaffolding/spec_coverage.md (relative to repo root).
REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || echo .)"
COVERAGE="$REPO_ROOT/scaffolding/spec_coverage.md"
if [[ ! -f "$COVERAGE" ]]; then
echo "commit-msg-spec-ref: $COVERAGE not found; cannot validate canonical_action trailer" >&2
exit 1
fi

# Build the set of valid canonical action names from spec_coverage.md.
# Each table row looks like:
# | AC-80 | AuthorizeExecution \| IssueToolCall | ... |
# The escaped `\|` characters belong inside cell 2 (canonical_action).
# We extract cell 2 as everything between the first and second
# *unescaped* `|` after the `AC-` token, then split that cell on `\|`
# (the escaped pipe) to recover individual action names.
mapfile -t VALID_ACTIONS < <(
python_helper() {
# Pure-bash, no python — do it with sed + while.
:
}
while IFS= read -r line; do
case "$line" in
"| AC-"*) ;;
*) continue ;;
esac
# Replace every escaped pipe `\|` with NUL placeholder, then
# split on `|`, then restore.
protected="${line//\\|/$'\x1f'}"
IFS='|' read -r -a cells <<< "$protected"
# cells[0]="" (before leading |), cells[1]=" AC-NN ", cells[2]=" actions "
if [[ "${#cells[@]}" -lt 4 ]]; then
continue
fi
cell="${cells[2]}"
# Restore escaped pipes back to literal `|` separators.
cell="${cell//$'\x1f'/|}"
# Trim outer whitespace.
cell="${cell#"${cell%%[![:space:]]*}"}"
cell="${cell%"${cell##*[![:space:]]}"}"
if [[ "$cell" == "—" || -z "$cell" ]]; then
continue
fi
# Split on `|` (unescaped — these are now real separators).
IFS='|' read -r -a parts <<< "$cell"
for p in "${parts[@]}"; do
p="${p#"${p%%[![:space:]]*}"}"
p="${p%"${p##*[![:space:]]}"}"
if [[ -n "$p" && "$p" != "—" ]]; then
printf '%s\n' "$p"
fi
done
done < "$COVERAGE" | sort -u
)

if [[ "${#VALID_ACTIONS[@]}" -eq 0 ]]; then
echo "commit-msg-spec-ref: no canonical actions found in $COVERAGE" >&2
exit 1
fi

# Extract canonical_action=<Name> trailers from the message.
mapfile -t CITED < <(
grep -E '^canonical_action=[A-Za-z][A-Za-z0-9]+$' "$MSG_FILE" \
| sed -E 's/^canonical_action=//' \
| sort -u
)

if [[ "${#CITED[@]}" -eq 0 ]]; then
cat >&2 <<EOF
commit-msg-spec-ref: REJECTED.

This commit modifies src/runtime/** or src/api/** but the message body
contains no \`canonical_action=<Name>\` trailer.

Add at least one trailer line referencing the canonical TLA+ action(s)
this change implements, e.g.:

canonical_action=AuthorizeExecution

Valid action names are listed in scaffolding/spec_coverage.md.
EOF
exit 1
fi

# Validate every cited action against the canonical set.
unknown=()
for c in "${CITED[@]}"; do
found=0
for v in "${VALID_ACTIONS[@]}"; do
if [[ "$c" == "$v" ]]; then
found=1
break
fi
done
if [[ "$found" -eq 0 ]]; then
unknown+=("$c")
fi
done

if [[ "${#unknown[@]}" -gt 0 ]]; then
{
echo "commit-msg-spec-ref: REJECTED."
echo
echo "The following canonical_action trailers reference names that"
echo "are NOT in scaffolding/spec_coverage.md:"
for u in "${unknown[@]}"; do
echo " - $u"
done
echo
echo "Either fix the typo or add the action to the coverage table"
echo "(and confirm it appears in docs/input/OpenPinceryCanonical.tla"
echo "Next disjunction)."
} >&2
exit 1
fi

exit 0
96 changes: 96 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,103 @@ jobs:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
# The real-bwrap tests are skipped here via env gate (see below)
# and run in the sandbox-smoke job's privileged container instead.
# This job stays unprivileged so postgres/sqlx and socket tests
# match the real devshell posture.
- run: cargo test --all -- --test-threads=1
env:
OPEN_PINCERY_SKIP_REAL_BWRAP: "1"

# Dedicated gate for AC-53 RealSandbox evidence.
#
# Runs inside a `--privileged` Docker container because hosted
# GitHub runners block bwrap's MS_SLAVE|MS_REC on the inherited
# root mount even for root callers (the mounts are locked with
# respect to the init user namespace's ability to change
# propagation on a shared-propagation systemd-managed /).
# Workarounds attempted and rejected:
# - `mount --make-rprivate /` on host: locked mounts unaffected.
# - `setcap cap_sys_admin+ep bwrap`: modern bwrap refuses.
# - `sudo -E <test-binary>`: still hits the locked-mount
# check; userns-propagation
# rules key on mount owner.
#
# A privileged container lifts AppArmor + seccomp restrictions and
# runs its own mount namespace from first principles, so bwrap's
# internal MS_SLAVE on / succeeds. This is the same posture the
# local devshell uses (`docker run --privileged --cgroupns=host`).
# The sandboxed child still unshares into an unprivileged userns
# for every tool invocation — isolation posture is unchanged.
sandbox-smoke:
name: sandbox real-bwrap smoke
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: run AC-53 sandbox tests in privileged container
run: |
set -euo pipefail
# Use a minimal Ubuntu 24.04 image and install the exact
# userland the devshell uses. This is the shortest path to
# a working bwrap on a hosted GitHub runner. If test timings
# become a concern we can pre-publish ghcr.io/open-pincery/devshell.
OUT=$(mktemp)
docker run --rm --privileged --cgroupns=host \
-v "$PWD:/work" -w /work \
-e CARGO_HOME=/tmp/cargo \
-e CARGO_TERM_COLOR=always \
-e RUSTFLAGS="-D warnings" \
ubuntu:24.04 \
bash -c '
set -euo pipefail
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get install -y --no-install-recommends \
bubblewrap slirp4netns uidmap libseccomp-dev libseccomp2 \
pkg-config build-essential ca-certificates curl git libssl-dev libpq-dev socat \
iputils-ping
curl --proto "=https" --tlsv1.2 -sSf https://sh.rustup.rs \
| sh -s -- -y --default-toolchain 1.88.0 --profile minimal
export PATH=/tmp/cargo/bin:$PATH
export OPEN_PINCERY_RUN_AC84_POSITIVE=1
bwrap --version
# Sanity-check: bwrap actually creates a user+pid ns.
bwrap --unshare-user --unshare-pid --dev-bind / / /bin/true
# AC-77 verify-fix-2 diagnostic: clear the kernel ring
# buffer before tests so any seccomp KILL_PROCESS audit
# records the kernel emits during the run are easy to
# locate. SECCOMP_RET_KILL_PROCESS produces
# audit: type=1326 ... syscall=NN compat=0 ip=0x... code=0x80000000
# in dmesg even without auditd; that NN is the missing
# entry the empirical capture script did not see.
dmesg -C 2>/dev/null || true
# Run every real-bwrap suite as a single cargo invocation
# so target/ is shared. --test-threads=1 matches production
# because tempdirs + procfs probes are not thread-safe.
set +e
cargo test --test sandbox_real_smoke --test sandbox_landlock_test \
--test sandbox_uid_drop_test \
--test landlock_scope_test \
--test sandbox_seccomp_test --test sandbox_cgroup_test \
--test sandbox_preflight_test \
--test sandbox_escape_test \
--test seccomp_allowlist_test \
--no-fail-fast \
-- --nocapture --test-threads=1
TEST_EXIT=$?
set -e
echo "=== AC-77 KERNEL SECCOMP/AUDIT LOG (post-test dmesg) ==="
dmesg 2>/dev/null | grep -iE "seccomp|audit:|type=1326|type=SECCOMP" \
|| echo "(no kernel seccomp/audit lines captured)"
echo "=== END AC-77 KERNEL LOG ==="
exit $TEST_EXIT
' | tee "$OUT"
# Fail if the suite ran zero tests -- would mean the
# bwrap probe or Linux gate silently skipped our evidence.
if grep -qE '^test result:.*0 passed' "$OUT" && ! grep -qE '^test result:.*[1-9][0-9]* passed' "$OUT"; then
echo "::error::sandbox smoke produced 0 passed tests -- evidence gate failed" >&2
exit 1
fi

deny:
name: cargo deny
Expand Down
Loading
Loading