You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Merge pull request #70 from ScriptKittyOS/docs/openssf-badge
Record the OpenSSF Best Practices passing badge, add the assurance case, and record the intermittent test failure as R26.
Signed-off-by: Ayla Croft <aylacroft@proton.me>
Copy file name to clipboardExpand all lines: README.md
+14Lines changed: 14 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,8 @@
1
1
<!-- SPDX-License-Identifier: Apache-2.0 -->
2
2
# Trinity
3
3
4
+
[](https://www.bestpractices.dev/projects/14772)
5
+
4
6
A personal AI agent that runs on your own machine. It remembers you, learns procedures, acts
5
7
through tools under a permission gate, reaches you on whatever surface you are using, and does
6
8
not lose your work when something crashes.
@@ -16,6 +18,15 @@ authorization), and the first slice of M5b (070, the gateway core): 25 slices, e
16
18
merge commit and tagged `slice/NNN` (`git tag -l 'slice/*' | wc -l` → 25, on 2026-09-23). What
17
19
that means in practice:
18
20
21
+
**Assessed against a recognised baseline.** Trinity holds the
22
+
[OpenSSF Best Practices passing badge](https://www.bestpractices.dev/projects/14772), the Open
23
+
Source Security Foundation's published bar for basics, change control, reporting, quality,
24
+
security and analysis, and the prerequisite the Linux Foundation names for a project entering
25
+
Incubation. Every required criterion is met; three *suggested* ones are recorded as unmet rather
26
+
than stretched, because a sheet with nothing on it survives a spot check less well than one that
27
+
says where the gaps are. The [assurance posture](#assurance-posture) below states what the build
28
+
enforces and what enforces it.
29
+
19
30
-**Talks.** Streaming chat with any provider behind one behaviour (`Trinity.LLM`), switched by
20
31
configuration; the assistant's text is persisted as a draft every 500 ms or 2 KB while it
21
32
streams, so a crash mid-turn loses at most that much. Context compaction with lineage when a conversation outgrows the
@@ -169,6 +180,8 @@ rather than described by it.
169
180
| Approved cryptography | A dedicated CI leg builds from source and runs the cryptographic properties inside a FIPS-mode container, so statements about approved algorithms are measured on that leg rather than asserted. |
170
181
| Supply chain | Dependency and licence audits run on every commit; dependency versions are pinned in `VERSIONS.md` and verified against the lock file by the gate. |
171
182
| Provenance | Every commit carries a Developer Certificate of Origin sign-off, enforced by a hook and independently by CI. |
183
+
| Independent self-certification | The project holds the [OpenSSF Best Practices passing badge](https://www.bestpractices.dev/projects/14772), assessed against the Open Source Security Foundation's published criteria for basics, change control, reporting, quality, security and analysis. Three suggested criteria are recorded as unmet rather than stretched: semantic versioning, which begins at the first supported release, and two concerning dynamic analysis tooling, which the project does not yet run. |
184
+
| Argued, not asserted |`docs/10-assurance-case.md` decomposes the top-level security claim into ten claims, each with its argument, the evidence a reader can check, and the limit on what it covers; the assumptions the case rests on are named rather than implied. |
172
185
| Claim discipline |`docs/09-standards-register.md` records one row per control a regulated deployment might ask about, each with an evidence path and a status. No public claim about a regulation or requirement is made without a row there saying it is true. |
173
186
174
187
## Milestones
@@ -198,6 +211,7 @@ later without renumbering anything.
198
211
|`docs/`| Vision, architecture, tech stack, conventions, data model, risks, security model, standards register; packaging, the FIPS leg, backup and restore, performance measurements |
199
212
|`docs/mcp-server.md`| Connecting a client to Trinity's MCP server (Claude Code, VS Code, Codex, goose), stdio, approvals over the wire, the headless profile |
200
213
|`docs/adr/`| Architecture decision records. One is added whenever a decision changes |
214
+
|`docs/10-assurance-case.md`| The structured argument that the security claims hold, with the evidence for each and the assumptions and limits named |
201
215
|`docs/09-standards-register.md`| One row per control a regulated deployment may ask about, with its evidence path and status |
Copy file name to clipboardExpand all lines: docs/06-risk-register.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -25,3 +25,4 @@
25
25
| R24 | Fired 2026-09-20, in slice 013: neither precompiled `mdex_native` artifact loads in Burrito's musl ERTS (both need glibc's `libgcc_s`; `_dl_find_object: symbol not found`). Lifted the same day by the owner's decision: the linux package builds the NIF from source for musl with Zig as the linker (`scripts/zig-cc-musl`, config/config.exs, `rustler` at build time), measured on a fresh install of the packaged binary rendering the real provider's answer; the `--smoke` path now prints `TRINITY_SMOKE_MARKDOWN=ok` and exits 3 otherwise, and the `package` workflow reads that line on every target, so a dead NIF cannot pass again. Residual: macOS and Windows use the precompiled artifact, and the `package` workflow has yet to run green there since the slice/011 tag (an older failure at "Serves HTTP 200", now diagnosed by the step's log). The row above stands as written | none | none | none | none | 013 |
26
26
| R23 | EMA / ID-JAG is beta everywhere (vendors label it so); IETF draft still moving | Low (re-scoped 2026-09-22) | Med | Spec revision breaks the exchange at the external authorization server, which is where it happens: Trinity redeems no assertion since the owner's decision of 2026-09-22 (slice 062 NOTES) | The resource server validates whatever audience-bound token that server issues, so a draft revision is that server's upgrade, not Trinity's; the row stays until the deferral lifts | 062 |
27
27
| R25 |`glib` 0.18.5 carries GHSA-wrw7-89jp-8q8g (medium, unsoundness in `Iterator` and `DoubleEndedIterator` impls); first patched in 0.20.0 | Low | Med | The advisory is open against `src-tauri/Cargo.lock`; measured 2026-09-23 | It is transitive through the GTK 0.18 stack (`gtk` 0.18.2, `webkit2gtk` 2.0.2) that Tauri 2.11.5 requires on Linux, so it is fixed by a Tauri release built on gtk-rs 0.20 and not by a direct bump. **Scope:** the desktop shell only. The `headless` release is `steps: [:assemble]` with no Burrito and no `src-tauri`, so a server deployment does not ship this dependency. Owner: the maintainer. Lift condition: a Tauri release whose Linux stack resolves `glib` >= 0.20, adopted by the desktop shell work | 100 |
28
+
| R26 | An intermittent `Exqlite.Error: Database busy` fails the test suite on loaded CI runners, in a different test each time, always on a write to the main repository | Med | Low (test-only; no production path) | Failed the gate on pull requests 67, 70 and again on the commit that attempted to fix it; the same commit passed on its other run, so it is seed- and load-dependent. Not once reproduced locally across repeated runs | Ruled out: `busy_timeout`, raised from the shipped 5 s to 30 s in the suite, did not stop it. SQLite returns BUSY immediately, without the busy handler, when a read transaction upgrades to a write while another connection holds the write lock; no timeout affects that path. The suite runs two connections (one for the sandbox owner, one for Oban's boot check) and deliberately queues fifty concurrent writers at slice 070 AC7, which is the load that provokes it. Candidate fixes, not yet taken: drain the stress test's sessions before the suite continues; give that test its own tag and CI step; or remove the second connection's need. Owner: the maintainer. Lift condition: ten consecutive green CI runs of the full suite with the stress test in the default run | 070 |
Copy file name to clipboardExpand all lines: docs/09-standards-register.md
+14Lines changed: 14 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -50,6 +50,20 @@ document, a PROOF.md line) or `none`; the status; who decides the status. Status
50
50
| Trinity issues no production authority | The production profile validates the external issuer's tokens and mints none; the personal profile's issuer refuses to start under an external authority adapter and its tokens are marked and refused in production |`test/trinity/mcp/auth/embedded_test.exs` (refused at boot; no key material in production), `test/trinity/mcp/auth/token_test.exs` (the mark refused) | tree property, held by tests since 2026-09-22 | owner |
51
51
| Enterprise Managed Authorization (ID-JAG) | Not in this tree: the external authorization server redeems the assertion (owner decision 2026-09-22, slice 062 NOTES "Deferred") | docs/08 row; slice 062 NOTES |`not claimed`; deferred with a lift condition | owner |
52
52
53
+
## Open source assurance
54
+
55
+
| Control | Where Trinity satisfies it | Evidence path | Status | Decider |
56
+
|---|---|---|---|---|
57
+
| Recognised open-source security baseline | The OpenSSF Best Practices criteria at the passing level: basics, change control, reporting, quality, security and analysis |https://www.bestpractices.dev/projects/14772|**passing, self-certified 2026-09-23.** Three suggested criteria are recorded unmet rather than stretched: `version_semver`, `dynamic_analysis`, `dynamic_analysis_enable_assertions`| maintainer |
58
+
| Linux Foundation Incubation prerequisite | The same badge; LF Incubation requires it at passing, alongside documented technical governance and a README per repository |https://www.bestpractices.dev/projects/14772, `GOVERNANCE.md`, `MAINTAINERS.md`| badge held; neutral asset hosting is not yet in place and is a foundation-side step | owner |
59
+
60
+
**Time-bound answers in that self-certification.** Three of the answers were true on the date given
61
+
and are not permanent: `report_responses` and `enhancement_responses` ("no external reports received
62
+
yet"), `vulnerability_report_response` ("none in the last 6 months"), and
63
+
`vulnerabilities_fixed_60_days`, which depends on the age of the open `glib` advisory recorded as R25
64
+
in `docs/06-risk-register.md`. They are re-checked when the badge is revisited rather than assumed to
65
+
still hold.
66
+
53
67
## Supply chain
54
68
55
69
| Control | Where Trinity satisfies it | Evidence path | Status | Decider |
0 commit comments