Skip to content
Closed
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
fdbbc14
docs: add v1 design documents directory
github-actions[bot] Jul 30, 2026
a16399f
docs: link design docs changelog entry to PR
NiveditJain Jul 30, 2026
bda251b
docs: draft failproofaid architecture
NiveditJain Jul 30, 2026
1c8a823
docs: design centralized policy management
NiveditJain Jul 30, 2026
eea0076
docs: split failproofaid design by concern
NiveditJain Jul 30, 2026
30ef934
docs: make policy evaluation location configurable
NiveditJain Jul 30, 2026
18aa936
docs: scope cloud evaluation beyond v1
NiveditJain Jul 30, 2026
95b8e58
docs: preserve standalone OSS policy workflows
NiveditJain Jul 30, 2026
6e94b39
docs: scope failproofaid v1 to linux and macos
NiveditJain Jul 30, 2026
bed7c98
docs: define login and OSS setup choice
NiveditJain Jul 30, 2026
66d938e
docs: harden setup delivery and update contracts
NiveditJain Jul 30, 2026
ef37b44
docs: narrow v1 distribution to npm
NiveditJain Jul 30, 2026
b947a96
docs: close setup and spool crash gaps
NiveditJain Jul 30, 2026
87127f7
docs: design user and system daemon scopes
NiveditJain Jul 30, 2026
e393e43
docs: prefer tamper-resistant enforcement scope
NiveditJain Jul 30, 2026
61ae486
docs: reconcile removed harness hooks
NiveditJain Jul 30, 2026
9a1c1c0
docs: replace binary updater with hook schemas
NiveditJain Jul 30, 2026
ec28e46
docs: make the enforcement boundary a service account, not root
NiveditJain Jul 30, 2026
4171a46
docs: close four holes in the service-account boundary
NiveditJain Jul 30, 2026
5cb4d84
docs: give the local dashboard an access model
NiveditJain Jul 30, 2026
bfb2b2c
docs: ship one service scope and split v1 into two phases
NiveditJain Jul 30, 2026
9799459
docs: move the whole collector into Phase 1
NiveditJain Jul 30, 2026
fe1cd14
docs: add the Phase 1 implementation plan
NiveditJain Jul 30, 2026
9de5c4f
feat: land Phase 1 Stage 0 and Stage 1 of failproofaid
NiveditJain Jul 30, 2026
da0fa55
fix: withdraw the corrupt bench baseline and gate the daemon's defaul…
NiveditJain Jul 30, 2026
47bcd33
fix: four defects an adversarial review found in the Stage 1 daemon
NiveditJain Jul 30, 2026
509e6e6
docs: record the four review fixes in the changelog
NiveditJain Jul 30, 2026
ca4c771
fix: make the bench harness's own integrity gate non-vacuous
NiveditJain Jul 30, 2026
2b3a61d
docs: record the bench-harness gate fix
NiveditJain Jul 30, 2026
a2cb9ee
fix: make two concurrent bench captures impossible
NiveditJain Jul 30, 2026
05ed3bb
docs: record the bench capture lock
NiveditJain Jul 30, 2026
912ff1b
fix(ci): run CI on every pull request, not only those targeting main
NiveditJain Jul 30, 2026
443c681
Revert "fix(ci): run CI on every pull request, not only those targeti…
NiveditJain Jul 30, 2026
9bf1311
fix: two failures CI caught that local runs never would have
NiveditJain Jul 30, 2026
4e00e93
docs: fold the Stage 0 amendments into the design set (in progress)
NiveditJain Jul 30, 2026
2c0f0a3
docs: finish folding the Stage 0 amendments, and record where each la…
NiveditJain Jul 30, 2026
35f890e
docs: record the amendment fold in the changelog
NiveditJain Jul 30, 2026
40a1d11
docs: name the sealed runtime accurately in the tier table
NiveditJain Jul 30, 2026
5dc478e
docs: cross-reference the per-user agent exception where the rule is …
NiveditJain Jul 30, 2026
4535acd
fix: make the remaining hooks-config mocks additive
NiveditJain Jul 30, 2026
d2a7b9e
perf: capture the cold-start latency baseline, cleanly this time
NiveditJain Jul 30, 2026
07f3998
refactor: run entirely in user scope for v1.0.0
NiveditJain Jul 30, 2026
11f211c
docs: record the user-scope simplification in the changelog
NiveditJain Jul 30, 2026
91298cb
docs: rewrite the user experience and harness integration for user sc…
NiveditJain Jul 30, 2026
3b6bed2
docs: state what hook reconciliation can and cannot do in user scope
NiveditJain Jul 30, 2026
e57f40b
refactor: finish the user-scope sweep across code and tests
NiveditJain Jul 30, 2026
d957171
docs: rewrite the daemon, service, collector and release docs for use…
NiveditJain Jul 30, 2026
122034f
refactor: make the client's path resolution pure, mirroring the Rust
NiveditJain Jul 30, 2026
8ce4e45
docs: rewrite the stages and verification layers for user scope
NiveditJain Jul 30, 2026
d67e6e8
docs: replace L3's boundary probes with assertions user scope can act…
NiveditJain Jul 30, 2026
3fe1c0b
fix: resolve the daemon socket after parsing arguments, not before
NiveditJain Jul 30, 2026
038b81d
docs: record which amendments the scope decision superseded
NiveditJain Jul 30, 2026
8209abf
docs: follow the scope decision into Phase 2's enrollment model
NiveditJain Jul 30, 2026
7d4dff9
test: drive the real binary in the path-agreement check
NiveditJain Jul 30, 2026
d71f806
docs: final consistency pass on the user-scope rewrite
NiveditJain Jul 30, 2026
c3f3f12
docs: state that the delivery key is readable by the user's agent
NiveditJain Jul 30, 2026
5f74c5b
fix: actually refuse a peer whose uid is not the daemon's
NiveditJain Jul 30, 2026
14b0b44
fix(ci): build dist/index.js before the unit suite
NiveditJain Jul 30, 2026
72967bb
fix: three defects an adversarial sweep found, all in code from this …
NiveditJain Jul 31, 2026
17192ff
docs: record the three adversarial-sweep fixes
NiveditJain Jul 31, 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
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog

## 0.0.16-beta.0 — 2026-07-30

### Docs
- Replace the root daemon with a dedicated `_failproofai` service account as the recommended `failproofaid` enforcement boundary, and resolve the three problems that follow from it. Setup now offers `managed` (daemon runs as the service account, one sudo at install, no root at runtime), `system` (the same service as root, retained for fleet-managed `/etc` configuration and root-owned agents), and `user` (unchanged, cooperative). Three corrections come with it. Protected artifacts move out of `~/.failproofai` entirely: rename and delete permission derive from the *parent* directory, so a user who owns `~` can rename an unwritable subdirectory aside and substitute their own regardless of its mode — which also means the socket directory must be service-account-owned, closing the substitution attack where an agent unlinks the socket and binds an impostor that answers `allow`. Only *removal* is privileged, not addition: results combine `deny` over `instruct` over `allow`, so a user-added policy can only tighten enforcement and can never shadow a protected one, and convention discovery keeps working without elevation. And since a non-root daemon cannot `setuid` to an enrolled user, evaluation splits into a `sealed` tier (runs as the service account in a pinned runtime, no filesystem/subprocess/network, verdict unforgeable) and a `user-context` tier (runs as the requesting UID, verdict forgeable but additive-only, so a forged `allow` is worthless) — with the tier *derived* from declared capabilities rather than chosen, because it describes what is physically achievable. Payload-only builtins like `block-sudo` land in `sealed`. The release ships its own pinned runtime so the daemon never executes an nvm/fnm interpreter the user can rewrite, and constructs worker environments instead of inheriting `NODE_OPTIONS`/`NODE_PATH` from the agent's process. Promotion into the protected store compiles a policy and its full import graph into one content-addressed artifact, leaving authoring and dependency management unprivileged and unchanged. Enforcement performs no unbounded I/O: policies needing remote state read a cache the collection lane refreshes, rather than making GitHub's uptime a precondition for running a command. (#625)
- Close four holes review found in the service-account boundary above, each one a case of the guarantee being narrower than the sentence claiming it. The protected surface — executables, pinned runtime, policy store, schema catalog, machine configuration — is now root-owned and **read-only to the service account the daemon runs as**, which owns only mutable runtime state; the first draft made `_failproofai` the owner of the store it evaluates, so a compromised daemon could rewrite the sealed policies it was supposed to enforce, exactly the self-rewrite argument already applied to the binaries and not to the store. Tier selection no longer trusts a policy's own capability declaration, since the author controls it and under-declaring would have been a route into `sealed`: admission derives the tier from the resolved import graph, and the `sealed` context is deny-by-default with no filesystem, process, or network bindings, so an under-declared policy fails inside the tier rather than escaping it. Native addons are refused from `sealed` outright — a pinned digest prevents substitution but constrains nothing about what native code does once loaded. And `sealed` is now stated as managed/system-only, because the protected runtime is a property of the privileged install layout, not of the shipped artifact; user scope makes no verdict-integrity claim. Also: `~/.failproofai` sources in a privileged scope are defined as additive non-authoritative inputs that only route to `user-context` and only tighten, resolving a contradiction with the out-of-home rule; "only removal is privileged" is scoped to policy administration so it stops reading as a claim about installation; uninstall unconditionally erases machine credentials rather than preserving them as configuration; catalog version detection gains a closed execution grammar (fixed executable/argument allowlists, no shell, constructed environment, output and time caps) since catalogs refresh remotely and activate automatically; catalog activation gains explicit fsync ordering, transaction metadata, and startup re-reconciliation; the release gate gains a clean-container install run; and the offline claim is qualified to operation-after-installation, since npm bootstrap is the only v1.0.0 distribution path. (#625)
- Add a versioned home for the failproofai v1.0.0 design documents. (#625)
- Draft the Linux/macOS Rust `failproofaid` design, preserving OSS and adding Login, Failproof Cloud, integrated collection, selectable service scopes with a recommended tamper-resistant default, and automatic version-aware hook reconciliation from a signed data-only schema catalog; keep native upgrades explicit through the single npm path, retain the branded Login/OSS setup, and defer Windows. (#625)

## 0.0.15-beta.1 — 2026-07-29

### Features
Expand Down
7 changes: 7 additions & 0 deletions desgin-docs/v1.0.0/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# failproofai v1.0.0 design documents

This directory contains checked-in design documents for the next major version of failproofai.

## Documents

- [`failproofaid` design](./failproofaid/) — user experience, harness integration, daemon architecture, cloud policy management, collector convergence, updates, and delivery plan.
Loading