Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
24 changes: 13 additions & 11 deletions audit/.lane-c01/C01.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
CLUSTER_START cluster=C01 repo=SessionLedger pillars=L10-L19 date=2026-07-14
# Wave-32 reaudit tip 776910b (#266-#271)
CLUSTER_START cluster=C01 repo=SessionLedger pillars=L10-L19 date=2026-07-17
# Wave-34 reaudit tip f1355a3 (#280-#284)

### L10 — CI/CD Hygiene
score: 3 glyph: ✓
Expand Down Expand Up @@ -82,17 +82,18 @@ gaps:
soft_goal_delta: +95% toward polished CLI UX (completions + help examples landed Wave-27 #230; score held at pillar max)

### L16 — Internationalization (i18n / l10n)
score: 1 glyph: ~
score: 2 glyph: ~
evidence:
- locales/en.json — Phase-0 English JSON catalog with required keys (#269)
- src/i18n.rs — catalog lookup helper (`t` / `try_catalog`) (#269)
- docs/ops/i18n.md — English-only posture + future Fluent/ICU hooks (#269)
- scripts/i18n-check.ps1 — hermetic SelfCheck for catalog + module anchors (#269)
- tests/i18n.rs — cargo test wrapper for SelfCheck (#269)
- MISSING: Fluent/ICU multi-locale catalogs; viewer string migration beyond stub
- locales/es.json — soft Spanish catalog with matching key set (#284)
- src/i18n.rs — `t` / `t_locale` / `try_catalog` / `active_locale` + `SL_LOCALE` selection (#269/#284)
- docs/ops/i18n.md — multi-locale soft posture (`en` + `es`); Fluent/ICU deferred (#269/#284)
- scripts/i18n-check.ps1 — hermetic SelfCheck for both catalogs + locale hooks (#269/#284)
- tests/i18n.rs — cargo test wrapper for SelfCheck (#269/#284)
- MISSING: Fluent/ICU MessageFormat; viewer/CLI string migration beyond catalog stub
gaps:
- Expand beyond English stub; wire Fluent/ICU if multi-locale becomes a goal — effort: L
soft_goal_delta: +20% — Phase-0 locale catalog + lookup helper Wave-32 #269; multi-locale unpaid
- Wire Fluent/ICU and route production UI copy through catalogs — effort: L
soft_goal_delta: +45% — soft `es` catalog + `SL_LOCALE` Wave-34 #284; Fluent/ICU unpaid

### L17 — Accessibility (a11y)
score: 3 glyph: ✓
Expand Down Expand Up @@ -145,5 +146,6 @@ Wave-24: L18 .env.example + env-example CI gate + rotation docs (#201); L18 +1.
Wave-26: L10 quality-gate.yml commit-SHA pin (#225); score held — L10 already pillar max.
Wave-27: L15 clap completions + richer help (#230); score held — L15 already pillar max.
Wave-32: L16 i18n scaffold / locale catalog stub (#269); L16 +1 (0→1; Fluent/ICU unpaid).
CLUSTER_TOTAL score=28/30 pct=93% grade=A
Wave-34: L16 soft multi-locale `es` catalog + `SL_LOCALE` (#284); L16 +1 (1→2).
CLUSTER_TOTAL score=29/30 pct=97% grade=A
CLUSTER_DONE cluster=C01 repo=SessionLedger
22 changes: 12 additions & 10 deletions audit/.lane-c04/C04.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
CLUSTER_START cluster=C04 repo=SessionLedger pillars=L31-L40 date=2026-07-14
# Wave-32 reaudit tip 776910b (#266-#271)
CLUSTER_START cluster=C04 repo=SessionLedger pillars=L31-L40 date=2026-07-17
# Wave-34 reaudit tip f1355a3 (#280-#284)

### L31 — Secrets in repo
score: 3 glyph: ✓
Expand Down Expand Up @@ -117,22 +117,23 @@ gaps:
soft_goal_delta: +85% (STRIDE-lite landed; formal review cadence soft)

### L40 — Sandbox boundary
score: 2 glyph: ~
score: 3 glyph:
evidence:
- crates/sl-daemon/Containerfile:41 — USER sl (non-root runtime)
- Containerfile:1-11 — multi-stage rust→debian image for sl-daemon
- .github/workflows/ci.yml:15 — ubuntu-latest hosted runner; no privileged: true
- .github/workflows/security.yml:11-12 — permissions: contents: read (least privilege)
- docs/ops/sandbox-boundary.md — sandbox boundary checklist + soft seccomp/no-net operator guidance (#255/#268)
- docs/ops/sandbox-boundary.md — sandbox boundary checklist + hard-vs-soft matrix (#255/#268/#280)
- docs/ops/sandbox-boundary.md:132-142 — documents blocking `sandbox-boundary` job vs unpaid rootless/no-net
- packaging/oci/sl-daemon-seccomp.json — checked-in seccomp deny-list sample (#268)
- packaging/oci/compose.sl-daemon.soft-hardening.yml — no-new-privileges / cap-drop ALL sample (#268)
- scripts/sandbox-boundary-check.ps1 — hermetic SelfCheck for Containerfile + seccomp/compose anchors (#255/#268)
- scripts/sandbox-boundary-check.ps1 — hermetic SelfCheck for Containerfile + seccomp/compose anchors (#255/#268/#280)
- tests/sandbox_boundary.rs — cargo test wrapper for SelfCheck (#255)
- .github/workflows/security.yml — soft `sandbox-boundary` job (`continue-on-error`) (#255/#268)
- MISSING: hard rootless / blocking no-net CI sandbox policy
- .github/workflows/security.yml:96-104blocking `sandbox-boundary` job (no `continue-on-error`) (#280)
- MISSING: hard rootless-only runner matrix; blocking no-net CI for cargo-fetch jobs
gaps:
- Make seccomp/no-net CI blocking and document hard rootless runtime — effort: M
soft_goal_delta: +70% — soft seccomp/no-net policy Wave-32 #268; hard CI unpaid (score held)
- Add rootless-only OCI runner matrix and blocking no-net policy where hermetic — effort: M
soft_goal_delta: +85% — blocking hermetic SelfCheck Wave-34 #280; hard rootless/no-net unpaid

Wave-15: L31 gitleaks pre-commit hook (+1).
Wave-16: L31 TruffleHog dual-scan CI (#152); score held at pillar max.
Expand All @@ -142,5 +143,6 @@ Wave-27: L34 branch-protection verify script (#228); score held — L34 already
Wave-30: L40 sandbox boundary checklist + SelfCheck (#255); score held — seccomp/no-net unpaid; soft CI.
Wave-31: L38 OSV/NVD CVE feed SSOT + SelfCheck (#259); L38 +1 (2→3).
Wave-32: L40 soft seccomp/no-net sandbox policy (#268); score held — soft CI; hard rootless/no-net unpaid.
CLUSTER_TOTAL score=26/30 pct=87% grade=B
Wave-34: L40 blocking sandbox-boundary SelfCheck (#280); L40 +1 (2→3).
CLUSTER_TOTAL score=27/30 pct=90% grade=A
CLUSTER_DONE cluster=C04 repo=SessionLedger
17 changes: 9 additions & 8 deletions audit/.lane-c09/C09.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
CLUSTER_START cluster=C09 repo=SessionLedger pillars=L81-L95 date=2026-07-14
# Wave-32 reaudit tip 776910b (#266-#271)
CLUSTER_START cluster=C09 repo=SessionLedger pillars=L81-L95 date=2026-07-17
# Wave-34 reaudit tip f1355a3 (#280-#284)

### L81.1 — WCAG 2.2 Level A Baseline
score: 3 glyph: ✓
Expand Down Expand Up @@ -193,15 +193,15 @@ gaps:
soft_goal_delta: +85% — expanded palette action set Wave-29 #249

### L81.15 — Aesthetic & Minimalist Design
score: 2 glyph: ~
score: 3 glyph:
evidence:
- crates/sl-viewer/src/async_states.rs:53-80error panel with left border + Retry (not color-only)
- crates/sl-viewer/src/async_states.rs:199-232ErrorState warning glyph (`aria-hidden`), left danger border, `role="alert"`, `aria-invalid` (#283)
- crates/sl-viewer/src/async_states.rs:26-31 — spinner + text status (non-color cue for busy)
- docs/VISUAL_SPEC.md:119-137 — error anatomy forbids orange-as-sole-error; requires message + action
- docs/VISUAL_SPEC.md — error anatomy forbids orange-as-sole-error; requires message + action (#283)
- crates/sl-viewer/src/app.rs:169 — empty-state styling without decorative clutter
gaps:
- Pair remaining color-primary errors with icon/aria-invalid consistently — effort: S
soft_goal_delta: +45% — Wave-2 ErrorState/LoadingState + VISUAL_SPEC; residual color-only cues
- Extend non-color pairing to any new error surfaces beyond ErrorState — effort: S
soft_goal_delta: +90% — ErrorState non-color cues Wave-34 #283

Wave-13: L81.11 responsive no-overflow assertions at 360/768/1280 (+1).
Wave-14: L81.10 inclusive-language seed (+1); L81.14 viewer hotkey map (+1).
Expand All @@ -215,5 +215,6 @@ Wave-29: L81.14 expand command palette actions (#249); L81.14 +1.
Wave-30: L81.9 overlay Escape consistency + a11y (#257); L81.9 +1 (2→3).
Wave-31: L81.8 design-token single source (#263); L81.8 +1 (2→3).
Wave-32: L81.12 progressive disclosure beyond command palette (#270); L81.12 +1 (2→3).
CLUSTER_TOTAL score=44/45 pct=98% grade=A
Wave-34: L81.15 ErrorState non-color cues (#283); L81.15 +1 (2→3).
CLUSTER_TOTAL score=45/45 pct=100% grade=A
CLUSTER_DONE cluster=C09 repo=SessionLedger
33 changes: 20 additions & 13 deletions audit/.lane-c11/C11.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
CLUSTER_START cluster=C11 repo=SessionLedger pillars=L108-L122 date=2026-07-14
# Wave-33 reaudit tip 18486e8 (#273-#278)
CLUSTER_START cluster=C11 repo=SessionLedger pillars=L108-L122 date=2026-07-17
# Wave-34 reaudit tip f1355a3 (#280-#284)

### L108 — Native Installer(s)
score: 3 glyph: ✓
Expand Down Expand Up @@ -83,14 +83,17 @@ gaps:
soft_goal_delta: +85% — working OCI + compose + HEALTHCHECK landed Wave-16 #154

### L114 — Deploy Surface: Serverless / Edge
score: 0 glyph:
score: 3 glyph:
evidence:
- NOT_APPLICABLE: product is desktop viewer + local daemon (README.md); no web/API edge deploy claimed
- docs/ops/distribution.md — release channels list GitHub/local packaging only (no Workers/Vercel)
- MISSING: wrangler.toml / vercel.json deploy configs
- docs/adr/0005-no-serverless-edge.md — explicit N/A decision: no Workers/Vercel/edge deploy (#281)
- docs/ops/distribution.md — cross-link to ADR 0005; release channels exclude edge/serverless (#281)
- scripts/edge-deploy-scope-check.ps1 — hermetic SelfCheck for ADR + distribution anchors (#281)
- tests/edge_deploy_scope.rs — cargo test wrapper for SelfCheck (#281)
- llms.txt — ADR 0005 indexed for agent discovery (#281)
- NOT_APPLICABLE: product is desktop viewer + local daemon; absence of wrangler.toml is intentional
gaps:
- Document explicit “no Workers/Vercel target” decision beside distribution channels — effort: S
soft_goal_delta: n/a
- none identified — revisit only if multi-tenant hosted edge API enters charter — effort: L
soft_goal_delta: +100% — ADR 0005 closes L114 N/A with explicit decision Wave-34 #281

### L115 — Deploy Surface: Traditional Server
score: 3 glyph: ✓
Expand Down Expand Up @@ -142,15 +145,18 @@ gaps:
soft_goal_delta: +40% — tag→release includes native installers, checksums, SBOM, attestations, and signing; version bump/changelog generation remain manual

### L119 — Versioning & Compatibility Policy
score: 2 glyph: ~
score: 3 glyph:
evidence:
- CHANGELOG.md — SemVer + Keep a Changelog
- CHANGELOG.md — Keep a Changelog + SemVer; tagged `## [0.2.0]` section (#282)
- docs/ops/versioning-policy.md — SemVer + tagged-section cadence SSOT (#282)
- scripts/versioning-policy-check.ps1 — hermetic SelfCheck for CHANGELOG sections + policy anchors (#282)
- tests/versioning_policy.rs — cargo test wrapper for SelfCheck (#282)
- Cargo.toml — version 0.1.0 + rust-version 1.85
- docs/reference/OKF-SPEC.md — OKF major/minor compatibility rules
- docs/ops/distribution.md — release asset naming tied to tag versions
gaps:
- Populate CHANGELOG with tagged release sections (currently Unreleased-heavy body) — effort: S
soft_goal_delta: +40% — policy present; release notes lag tags
- Optional release-please / cargo-release automation for version bumps — effort: S
soft_goal_delta: +85% — tagged CHANGELOG + versioning policy SelfCheck Wave-34 #282

### L120 — Distribution Channels & Discoverability
score: 3 glyph: ✓
Expand Down Expand Up @@ -205,5 +211,6 @@ Wave-25: L108 unsigned MSI/PKG Release + smoke (#211) +1; L109 curl/irm install
Wave-27: L115 Caddy/nginx TLS reverse-proxy (#227); L115 +1.
Wave-29: L112 signing readiness checklist + SelfCheck (#245); score held — platform signing still deferred/unsigned.
Wave-33: L109 brew/winget publish readiness SelfCheck (#273); score held — L109 already pillar max; live publish unpaid.
CLUSTER_TOTAL score=37/45 pct=82% grade=B
Wave-34: L114 ADR 0005 no serverless/edge deploy (#281); L114 +3 (0→3). L119 tagged CHANGELOG + versioning policy (#282); L119 +1 (2→3).
CLUSTER_TOTAL score=41/45 pct=91% grade=A
CLUSTER_DONE cluster=C11 repo=SessionLedger
39 changes: 21 additions & 18 deletions audit/SCORECARD.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# audit-v38 Scorecard — SessionLedger

**Repo:** KooshaPari/SessionLedger
**Date:** 2026-07-14
**Date:** 2026-07-17
**Repo-type profile:** CLI+daemon + desktop (sl-daemon + sl-viewer)
**Auditor:** cursor-w33-reaudit
**Commit audited:** 18486e8 (origin/main / Wave-33)
**Auditor:** cursor-w34-reaudit
**Commit audited:** f1355a3 (origin/main / Wave-34 closure #280-#284)

> Rubric SSOT: phenotype-org-audits/audit-v38

Expand All @@ -13,43 +13,46 @@
| Cluster | Category | Pillars | Score (sum/max) | Pct | Grade | Notes |
|---------|----------|---------|:---------------:|:---:|:-----:|-------|
| C00 | Architecture + Module | L0-L9 | 28/30 | 93% | A | see audit/.lane-c00 |
| C01 | CI, DX, Observability | L10-L19 | 28/30 | 93% | A | see audit/.lane-c01 |
| C01 | CI, DX, Observability | L10-L19 | 29/30 | 97% | A | see audit/.lane-c01 |
| C02 | Error handling, API, Governance | L20-L29 | 29/30 | 97% | A | see audit/.lane-c02 |
| C03 | Agent Readiness | L30 | 36/36 | 100% | A | see audit/.lane-c03 |
| C04 | Security | L31-L40 | 26/30 | 87% | B | see audit/.lane-c04 |
| C04 | Security | L31-L40 | 27/30 | 90% | A | see audit/.lane-c04 |
| C05 | Observability (deep) | L41-L50 | 29/30 | 97% | A | see audit/.lane-c05 |
| C06 | Supply Chain | L51-L60 | 26/30 | 87% | B | see audit/.lane-c06 |
| C07 | DX, QEng, Portability | L61-L70 | 29/30 | 97% | A | see audit/.lane-c07 |
| C08 | Eval Coverage | L71-L80 | 29/30 | 97% | A | see audit/.lane-c08 |
| C09 | Accessibility + UX | L81-L95 | 44/45 | 98% | A | see audit/.lane-c09 |
| C09 | Accessibility + UX | L81-L95 | 45/45 | 100% | A | see audit/.lane-c09 |
| C10 | Visual Identity | L96-L107 | 36/36 | 100% | A | see audit/.lane-c10 |
| C11 | Packaging + Distribution | L108-L122 | 37/45 | 82% | B | see audit/.lane-c11 |
| C11 | Packaging + Distribution | L108-L122 | 41/45 | 91% | A | see audit/.lane-c11 |

## Overall

**Weighted overall score:** 94% · **Overall grade:** A
**Weighted overall score:** 95% · **Overall grade:** A

(Raw rubric total across all 12 clusters. Sum 377 / 402.)
(Raw rubric total across all 12 clusters. Sum 384 / 402.)

## Wave-33 Delta
## Wave-34 Delta

| Cluster | Before | After | Raw delta | Evidence-backed movement |
|---------|:------:|:-----:|:---------:|--------------------------|
| C02 | 28/30 | 29/30 | +1 | In-tree PII redaction helper stub (#278); L24 2→3 |
| C08 | 28/30 | 29/30 | +1 | Python OKF adapter stub (#274); L75 2→3 |
| **Overall** | **375/402 (93% A)** | **377/402 (94% A)** | **+2** | Conservative; two pillars only |
| C01 | 28/30 | 29/30 | +1 | Soft `es` catalog + `SL_LOCALE` (#284); L16 1→2 |
| C04 | 26/30 | 27/30 | +1 | Blocking sandbox-boundary SelfCheck (#280); L40 2→3 |
| C09 | 44/45 | 45/45 | +1 | ErrorState non-color cues (#283); L81.15 2→3 |
| C11 | 37/45 | 41/45 | +4 | ADR 0005 no edge deploy (#281) L114 0→3; versioning policy (#282) L119 2→3 |
| **Overall** | **377/402 (94% A)** | **384/402 (95% A)** | **+7** | Conservative; five pillars only |

## Headline Findings

- **Strongest:** C03/C10 (100% A); C09 (98% A); C02/C05/C07/C08 (97% A); C00/C01 (93% A)
- **Weakest:** C11 Packaging (82% B); C04/C06 (87% B)
- **Wave-32 → Wave-33:** 93% A (375/402) → 94% A (377/402), +2 raw points
- **Held (no score):** #275 exact rustc pin (C06 L60 already pillar max); #273 brew/winget publish readiness (C11 L109 already pillar max; live tap/winget-pkgs unpaid); #276 OTLP metrics soft stub (C05 L43 already max; soft `continue-on-error`); #277 optional jemalloc soft (C00 L8 soft CI; default-on/Windows unpaid)
- **Remaining unpaid:** maintainer 2FA (C04 L36), full SLSA-L3 isolation (C06), unconditional release-blocking OCI (C06), Authenticode/notarization (C11 L112), live brew/winget publish, live Alertmanager webhooks, continuous profiling push backend, full loom/shuttle/miri, default-on jemalloc, Go/TS OKF adapters beyond Python, multi-tenant / auto-ETL PII redaction (C02 L24), in-tree KMS/envelope encryption (C02 L22), Fluent/ICU multi-locale (C01 L16), hard seccomp/no-net CI (C04 L40), production OTLP metrics push
- **Strongest:** C03/C09/C10 (100% A); C01/C02/C05/C07/C08 (97% A); C00 (93% A)
- **Weakest:** C06 Supply Chain (87% B); C04 (90% A, up from B)
- **Wave-33 → Wave-34:** 94% A (377/402) → 95% A (384/402), +7 raw points
- **Held (no score):** #285 soft envelope helper (C02 L22 unpaid KMS); #286 release gates (C06 already partial); #287 CI rustfmt gate (no pillar movement); #289 soft HTTP profiling push (C05 L45 soft continue-on-error)
- **Remaining unpaid:** maintainer 2FA (C04 L36), full SLSA-L3 isolation (C06), unconditional release-blocking OCI (C06), Authenticode/notarization (C11 L112), live brew/winget publish, live Alertmanager webhooks, production OTLP metrics push, full loom/shuttle/miri, default-on jemalloc, Go/TS OKF adapters beyond Python, multi-tenant / auto-ETL PII redaction (C02 L24), in-tree KMS/envelope encryption (C02 L22), Fluent/ICU multi-locale (C01 L16), hard rootless/no-net CI (C04 L40 residual)

## N/A / soft goals

- Harbor/agent-eval: docs/EVAL_SCOPE.md
- Tray/menubar auto-update: docs/adr/0001-desktop-companion-scope.md
- Mobile presence: docs/adr/0002-mobile-presence.md
- Platform Authenticode/notarization: deferred per docs/adr/0003-platform-code-signing.md
- Serverless/edge deploy: explicit N/A per docs/adr/0005-no-serverless-edge.md
Loading
Loading