segreant 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/LICENSING.md +5 -3
  2. package/README.md +57 -19
  3. package/bin/segreant-statusline.mjs +20 -0
  4. package/bin/segreant.mjs +19 -8
  5. package/dist/alerts/detect.js +13 -0
  6. package/dist/billing/epistemic.js +4 -0
  7. package/dist/billing/importer.js +29 -10
  8. package/dist/billing/reconcile.js +122 -32
  9. package/dist/billing/scope.js +7 -0
  10. package/dist/budget/guard.js +33 -4
  11. package/dist/cli/allocCmd.js +73 -4
  12. package/dist/cli/askModelPrices.js +59 -0
  13. package/dist/cli/backupCmd.js +2 -1
  14. package/dist/cli/basisLines.js +45 -0
  15. package/dist/cli/billingCmd.js +68 -9
  16. package/dist/cli/capitalCmd.js +2 -1
  17. package/dist/cli/connectCmd.js +50 -9
  18. package/dist/cli/egressCmd.js +15 -3
  19. package/dist/cli/evidenceCmd.js +6 -3
  20. package/dist/cli/flags.js +68 -0
  21. package/dist/cli/homeCmd.js +117 -0
  22. package/dist/cli/importCmd.js +210 -54
  23. package/dist/cli/launchCmd.js +2 -1
  24. package/dist/cli/opsCmd.js +49 -2
  25. package/dist/cli/planCmd.js +181 -0
  26. package/dist/cli/pricingDeclareCmd.js +178 -0
  27. package/dist/cli/quotaCmd.js +190 -0
  28. package/dist/cli/runCmd.js +203 -51
  29. package/dist/cli/showCmd.js +37 -11
  30. package/dist/cli/teamCmd.js +5 -5
  31. package/dist/cli/ui.js +24 -8
  32. package/dist/cli/valueCmd.js +189 -14
  33. package/dist/cli.js +102 -21
  34. package/dist/config.js +95 -6
  35. package/dist/connect/antigravity.js +310 -0
  36. package/dist/connect/claudeCode.js +43 -3
  37. package/dist/connect/codex.js +38 -1
  38. package/dist/connect/importShared.js +58 -5
  39. package/dist/connect/opencode.js +37 -9
  40. package/dist/connect/protobuf.js +126 -0
  41. package/dist/connect/registry.js +46 -0
  42. package/dist/connect/repoRoot.js +112 -0
  43. package/dist/cost/basis.js +168 -0
  44. package/dist/cost/declarations.js +37 -0
  45. package/dist/cost/exactPricing.js +4 -1
  46. package/dist/cost/firstSight.js +98 -0
  47. package/dist/cost/overrides.js +230 -0
  48. package/dist/cost/pricing.js +228 -15
  49. package/dist/cost/reprice.js +130 -0
  50. package/dist/dashboard/claim-support.js +11 -8
  51. package/dist/dashboard/contracts.js +23 -3
  52. package/dist/dashboard/routes.js +980 -112
  53. package/dist/dashboard/sessions.js +345 -0
  54. package/dist/dashboard/settings.js +2 -1
  55. package/dist/dashboard/value-cache.js +105 -0
  56. package/dist/dashboard/web/app/components/claimInspector.js +6 -5
  57. package/dist/dashboard/web/app/components/drawer.js +105 -35
  58. package/dist/dashboard/web/app/components/ruleFields.js +144 -0
  59. package/dist/dashboard/web/app/components/spine.js +54 -24
  60. package/dist/dashboard/web/app/components/workflow.js +82 -0
  61. package/dist/dashboard/web/app/core/actions.js +734 -23
  62. package/dist/dashboard/web/app/core/api.js +37 -1
  63. package/dist/dashboard/web/app/core/chain.js +11 -4
  64. package/dist/dashboard/web/app/core/claimLayers.js +179 -51
  65. package/dist/dashboard/web/app/core/claimTypes.js +30 -0
  66. package/dist/dashboard/web/app/core/fmt.js +19 -2
  67. package/dist/dashboard/web/app/core/generated-contract.js +23 -3
  68. package/dist/dashboard/web/app/core/generated-payload-contract.js +1944 -465
  69. package/dist/dashboard/web/app/core/generated-types.js +1 -1
  70. package/dist/dashboard/web/app/core/griffin.js +10 -0
  71. package/dist/dashboard/web/app/core/jobs.js +12 -0
  72. package/dist/dashboard/web/app/core/period.js +35 -0
  73. package/dist/dashboard/web/app/core/periodWords.js +10 -0
  74. package/dist/dashboard/web/app/core/periods.js +32 -0
  75. package/dist/dashboard/web/app/core/pricingActions.js +264 -0
  76. package/dist/dashboard/web/app/core/privacyText.js +78 -0
  77. package/dist/dashboard/web/app/core/reconcileWords.js +63 -0
  78. package/dist/dashboard/web/app/core/registry.js +79 -46
  79. package/dist/dashboard/web/app/core/slug.js +9 -0
  80. package/dist/dashboard/web/app/core/theme.js +48 -0
  81. package/dist/dashboard/web/app/core/view.js +69 -0
  82. package/dist/dashboard/web/app/main.js +197 -15
  83. package/dist/dashboard/web/app/views/allocation.js +249 -61
  84. package/dist/dashboard/web/app/views/control.js +57 -16
  85. package/dist/dashboard/web/app/views/data.js +4 -4
  86. package/dist/dashboard/web/app/views/evidence.js +336 -87
  87. package/dist/dashboard/web/app/views/privacy.js +13 -0
  88. package/dist/dashboard/web/app/views/spend.js +30 -15
  89. package/dist/dashboard/web/app/views/statement.js +189 -0
  90. package/dist/dashboard/web/app/views/system.js +44 -4
  91. package/dist/dashboard/web/app/views/value.js +105 -59
  92. package/dist/dashboard/web/app/views/workbench.js +312 -0
  93. package/dist/dashboard/web/classic.html +16 -4
  94. package/dist/dashboard/web/index.html +1 -1
  95. package/dist/dashboard/web/styles/app.css +536 -23
  96. package/dist/demo/seed.js +153 -14
  97. package/dist/economics/ledger.js +1 -1
  98. package/dist/egress/policy.js +129 -5
  99. package/dist/export/allocationCsv.js +70 -0
  100. package/dist/export/billingCsv.js +6 -2
  101. package/dist/export/csv.js +10 -2
  102. package/dist/export/economic.js +6 -2
  103. package/dist/export/statementCsv.js +104 -0
  104. package/dist/git/correlate.js +86 -9
  105. package/dist/git/quality.js +107 -24
  106. package/dist/git/repoScope.js +207 -0
  107. package/dist/git/survivalStore.js +186 -0
  108. package/dist/guide.js +9 -4
  109. package/dist/plans/detect.js +147 -0
  110. package/dist/proxy/server.js +134 -14
  111. package/dist/proxy/usage.js +9 -4
  112. package/dist/quota/limits.js +138 -0
  113. package/dist/quota/statusline.js +68 -0
  114. package/dist/quota/view.js +122 -0
  115. package/dist/scan/knownApps.js +6 -2
  116. package/dist/scan/scan.js +9 -0
  117. package/dist/store/allocation.js +14 -0
  118. package/dist/store/db.js +259 -34
  119. package/dist/store/realization.js +78 -14
  120. package/dist/store/schema.js +59 -1
  121. package/dist/store/scopeEvidence.js +67 -0
  122. package/dist/util/pool.js +19 -0
  123. package/dist/util/time.js +7 -0
  124. package/dist/value/realization.js +321 -30
  125. package/dist/value/report.js +28 -8
  126. package/dist/value/selfReported.js +10 -9
  127. package/docs/ARCHITECTURE.md +8 -4
  128. package/docs/CAPABILITY-EVIDENCE-CONTRACT.md +33 -11
  129. package/docs/CLI-JSON-CONTRACT.md +38 -0
  130. package/docs/DATA-BOUNDARIES.md +66 -6
  131. package/docs/FAQ.md +43 -9
  132. package/docs/GETTING-STARTED.md +19 -12
  133. package/docs/GUIDE.md +81 -18
  134. package/docs/INTEGRATIONS.md +9 -9
  135. package/docs/METHODOLOGY.md +3 -2
  136. package/docs/NEUTRALITY.md +1 -1
  137. package/docs/PRIVACY.md +51 -0
  138. package/docs/README.md +1 -0
  139. package/docs/RELEASE-GATE.md +52 -7
  140. package/docs/THREAT-MODEL.md +2 -1
  141. package/package.json +3 -2
  142. package/pricing/models.json +1366 -60
@@ -0,0 +1,51 @@
1
+ # Privacy
2
+
3
+ Segreant runs on your computer. There is no Segreant account, no analytics and no telemetry. Your ledger, prompts, code and usage are never sent to us, because nothing in Segreant sends them anywhere you did not choose.
4
+
5
+ ## What Segreant keeps on this machine
6
+
7
+ The ledger records each AI request: when it happened, the provider and model, token counts, the estimated cost, and the project and session it belongs to. It also keeps the outcome signals you set up, so it can show what the spend produced.
8
+
9
+ Some of what it keeps is your own material rather than a measurement, and it stays on this machine with everything else:
10
+
11
+ - the working folder a request came from, which is how spend is matched to a project;
12
+ - the user label a tool reports;
13
+ - the first line of each commit message it matches to spend;
14
+ - proposed code lines, used to check whether AI suggestions were kept. Turning on `metadataOnly` stops new ones being kept; Clear proposals in Settings deletes the ones already kept.
15
+
16
+ ## Your provider keys
17
+
18
+ When a tool sends a request through Segreant, the request and its API key go to the provider you configured, exactly as they would without Segreant. Segreant does not store your provider keys.
19
+
20
+ ## What leaves this machine
21
+
22
+ Your AI requests go to the provider you configured.
23
+
24
+ Segreant keeps its own price list current by itself. The first time it prices a request for a model its rate card does not know, a running Segreant downloads the public price list (LiteLLM's `model_prices_and_context_window.json` on GitHub), at most once an hour. It is a plain download of a public file: it sends nothing about you, your requests or your usage, and nothing is stored anywhere but on this machine. GitHub, which hosts the file, sees the download as it would any other. `segreant pricing --auto off` stops it, and the start banner says when it is on.
25
+
26
+ Everything else is off until you turn it on, and `segreant egress status` lists what is allowed:
27
+
28
+ - refreshing market data, which sends nothing about you;
29
+ - downloading a baseline from an address you give;
30
+ - alert summaries to a webhook you set, never prompts, code or keys;
31
+ - pulling your costs from OpenAI with an admin key, read from your environment for that one request and never stored;
32
+ - a numeric spending summary sent to a team server you run;
33
+ - a session excerpt sent to a hosted judge, only if you configure one.
34
+
35
+ ## Keeping and deleting
36
+
37
+ Captured suggestions older than 30 days are deleted each time Segreant starts. Request records are not deleted on their own: after 180 days they are due for deletion, and `segreant prune --apply` deletes them along with any expired suggestions. You can change both periods in Settings.
38
+
39
+ To remove everything, delete the folder Segreant keeps its data in. That is `.segreant` in your home directory unless you set `SEGREANT_HOME` or `SEGREANT_DB`, in which case delete what those point to as well; `segreant doctor` prints the database path in use.
40
+
41
+ To take your records with you, `segreant pack export --out <file>` writes them to a file on this machine.
42
+
43
+ ## Your providers have their own terms
44
+
45
+ Segreant decides what it sends. How your AI provider, or any webhook or server you add, stores what it receives is governed by their terms, so read those before sending sensitive work.
46
+
47
+ ## Questions
48
+
49
+ Ask on the project’s GitHub issues. Report a security problem privately, as `SECURITY.md` describes. The full technical account of every path is in `docs/DATA-BOUNDARIES.md`.
50
+
51
+ This file is generated from `src/dashboard/web/app/core/privacyText.ts`, which the dashboard also renders at `#/privacy`. Change the words there.
package/docs/README.md CHANGED
@@ -31,6 +31,7 @@ Four groups, by who they are for. If you are new, read the first group in order.
31
31
 
32
32
  | Document | What it covers |
33
33
  |---|---|
34
+ | [PRIVACY.md](PRIVACY.md) | The privacy statement in plain words: what stays here, what leaves, how to delete it |
34
35
  | [DATA-BOUNDARIES.md](DATA-BOUNDARIES.md) | Everything that can leave your machine, and what triggers it |
35
36
  | [CAPABILITY-EVIDENCE-CONTRACT.md](CAPABILITY-EVIDENCE-CONTRACT.md) | What is supported, what is intended, what is not offered |
36
37
  | [THREAT-MODEL.md](THREAT-MODEL.md) | What Segreant defends against, and its integrity guarantees |
@@ -75,7 +75,52 @@ the existing `dist/cli.js`/deep-import and package-surface contract. The
75
75
  historical candidate rows below do not cover these later sources and must not
76
76
  be reused as exact-head release evidence.
77
77
 
78
- ### Current local candidate record — source commit `12add59`, 2026-08-29
78
+ ### Current local candidate record — commit `81ffa49`, 0.2.0, 2026-10-09
79
+
80
+ This record supersedes the `12add59` record below without rewriting it. It is
81
+ the first record since the package was renamed and published. **0.1.0 was
82
+ published to npm on 2026-10-08 (from `dbe0f18`) with no gate record.** That gap
83
+ is why 0.2.0 gets the full checklist on its exact commit.
84
+
85
+ The exact candidate is `81ffa496ba8060caa00a781edd33ba74b8d467d3`, the merge of
86
+ #63 on `main`. The first candidate, `698c027` (the merge of #62, version and
87
+ changelog), passed every row below. Its visual check then found that sample
88
+ dollar figures filled a phone's first screen while the demo label sat 1,039 px
89
+ lower. #63 fixed that, and the whole checklist was re-run on `81ffa49`. The
90
+ `698c027` → `81ffa49` delta is 5 files, +54/−8, all in the dashboard shell and
91
+ its test. Every row was run in a fresh detached worktree at the candidate, with
92
+ an isolated `SEGREANT_HOME`. The tree was clean (0 lines of `git status --short`)
93
+ before and after.
94
+
95
+ | Requirement | Result |
96
+ | --- | --- |
97
+ | Candidate identity | **Pass.** `git rev-parse HEAD` → `81ffa496ba8060caa00a781edd33ba74b8d467d3` before and after; `git status --short` empty both times. `git ls-remote origin refs/heads/main` returns the same SHA. |
98
+ | Capability/evidence contract | **Pass.** The capability contract (last revised at `2448885`, 2026-09-27) was reviewed against the 0.2.0 surfaces it does not yet name. Plan prices are operator-set only, and the dated public prices are offered as a suggestion when asking, never used as a figure. Quota shows the vendors' own meters; its pace projection is labelled an estimate, and the meter check carries its band. Kept / Not kept / Unknown / Maturing answers keep the Realization gates. Antigravity rows are list-priced from the dated rate card. No new figure is promoted to billed, allocated, or causal. `test/public-claims-contract.test.ts` together with the four causal suites → **156 pass, 0 fail**. |
99
+ | Source validation | **Pass.** Root `npm ci --ignore-scripts` → 8 packages, 0 vulnerabilities. `team-server` `npm ci --ignore-scripts` → 20 packages, 0 vulnerabilities. Root, browser-app and team-server typechecks exit 0. `npm run build` exit 0. `npm test` → **2332 tests, 2328 pass, 0 fail, 0 cancelled, 4 intentional platform skips**. `team-server` `npm test` → **131 pass, 0 fail**. The same totals less the one test #63 added (2331/2327) held on `698c027`. |
100
+ | Budget fail-closed integrity | **Pass.** On the candidate source: `test/budget-fail-closed.test.ts` (ledger-read failure refused before upstream dial; an unpersisted request opens the accounting circuit), `test/config-budget-fail-closed.test.ts` and `test/dashboard-settings.test.ts` (malformed and oversized settings rejected before persistence), and `test/budget-control-lock.test.ts`. All pass inside the full suite and again in a separate run (18 + 55 tests across the gate files, 0 fail). |
101
+ | Packed artifact | **Pass.** `npm pack --ignore-scripts` → `segreant-0.2.0.tgz`, **314 entries, 1,276,599 bytes**, SHA-256 `56e3461d89220df1f680c34b153fbe46af6ec2df0071b8d5359633001b963eae`. Present: both launchers (`bin/segreant.mjs`, `bin/segreant-statusline.mjs`), `dist/cli.js`, the 0.2.0 modules (`connect/antigravity`, `quota/statusline`, `plans/detect`, `cli/homeCmd`), `pricing/models.json`, and the browser app including `core/chain.js`. No `.codex`, private, or research-only `causalExperiment` path. |
102
+ | Clean installed CLI | **Pass.** Installed with `--ignore-scripts` into a fresh directory (1 package, 0 vulnerabilities); the package reports `0.2.0`. `segreant --help` prints the usage. `segreant-statusline` with no ledger printed `5h 12%` from a stdin reading and created no file. `demo --json` exit 0. Bare `segreant` printed the home view, `plan` printed the detected plans with "price not set", and `quota` printed the vendors' meters. |
103
+ | Packaged dashboard/API | **Pass.** `start --demo --port 18640 --dashboard-port 18641` from the installed package returned HTTP 200 for `/api/health`, `/api/overview?range=all`, `/api/value?range=all`, `/api/causal`, `/api/billing` (each API payload self-labelled `demo: true`), `/` (carries `id="app"`), `/classic`, and `/app/main.js` (`text/javascript`). The process was stopped and the port closed afterwards. |
104
+ | Model-trial truthfulness | **Pass.** The packaged `/api/value` is `demo: true`, carries one model switch, labelled `trial`, and no switch labelled `observational_separation`. `/classic` carries the labelled demo renderer (4 `demobar` hits). `/` is proven separately by `id="app"` and its entry resolving as JavaScript. |
105
+ | Causal-evidence integrity | **Pass for the local boundary, not a causal result.** Causal core/store/CLI/dashboard suites pass (inside the 156 above). The installed `causal status --json` reports `"studies": []` and no causal result. Nothing in 0.2.0 touches the causal substrate. |
106
+ | Billing-boundary truthfulness | **Pass.** Installed `billing scope set --account-ref gate_ref_020 --json` → `"applied": false`, `"trust": "operator_declared_unverified"`, `"reconciliationStatus": "not_reconciled"`. Packaged `/api/billing` is demo-labelled. |
107
+ | Direct-Costs connector boundary | **Pass for preview only**, by the suite's preview tests (`networkAttempted: false`, `credentialRead: false`). No provider account, credential, or amount was touched. |
108
+ | Egress disclosure | **Pass for the local process boundary.** 0.2.0 adds local readers (Claude Code, Codex, opencode and Antigravity logs; plan fields of `~/.claude.json`; status-line stdin) and no outbound path. `src/plans`, `src/quota`, `src/connect/antigravity.ts` and `src/connect/protobuf.ts` contain no `fetch` or `http(s).request`. DATA-BOUNDARIES.md now states these reads. `test/egress-boundary.test.ts` passes. The scope stays Segreant-process transport, not a machine-wide firewall. |
109
+ | Launcher/publication integrity | **Pass.** `test/build-race.test.ts` and `test/publication-lock-race.test.ts` pass. The new `segreant-statusline` launcher is a lean path that never opens or creates the ledger when it is absent (`test/statusline.test.ts`). The unmanaged `dist/*` and `npm pack` boundary is unchanged. |
110
+ | Backup and recovery integrity | **Pass.** The installed CLI: `backup --out` → `ok: true`, `integrity: ok`, manifest present. `restore` preview → `applied: false` and no file written. `--apply` into a new path → `ok: true`, `integrity: ok`. A second `--apply` onto the now-existing path is refused (exit 1). `test/backup-restore.test.ts` passes. |
111
+ | Reliability/performance observations | **Recorded as measurement, not an SLA.** `npm run benchmark` (`sourceRevision 81ffa49`, isolated home, no network, no credential; Node v24.18.0, win32/x64, 12 CPUs, 32 GiB) at 100/1,000/10,000 rows × 3 samples and 100,000 rows × 1 (`--stress`). Medians: ingest 22.9/122.9/1,273.7/15,094.5 ms; overview assembly 6.3/12.1/99.1/1,449.3 ms; frontier 0.8/2.7/22.4/404.9 ms; API overview p95 7.9/16.4/110.6/1,503.2 ms; RSS delta 1.2/1.3/50.9/218.4 MiB; compiled dist 3,920,627 bytes. **Open:** ingest is about 2.1× the `12add59` record at 10× rows (1,274 against 605 ms) and 2.2× at 100× rows, while overview and API latency improved. The cause has not been isolated. The first suspects are the 0.2.0 per-row quota and scope-evidence work and the load on this machine; the next step is a profiled ingest at the 10× scale. |
112
+ | Redacted diagnostics | **Pass.** Installed `diagnostics --json` exit 0 with zero absolute-user-path hits. `--out <new-file>` exit 0, and a second export to the same path is refused (exit 1). `test/diagnostics.test.ts` passes. |
113
+ | Intended CI | **Pass.** The push of `81ffa49` to `main` ran CI [37957923911](https://github.com/GamingDragonwastaken/Segreant/actions/runs/37957923911) → **success**. `test` passed on ubuntu, macos and windows; `team-server-test` passed on all three; `team-server-postgres`, `browser-accessibility`, `package-smoke` and `security` passed; `candidate-head` was skipped by design on a push. PR #63's checks passed 11/11 before the merge. The first candidate's own run, 37956026338 on `698c027`, also succeeded. A later commit that changes only this document does not need its own run. |
114
+ | Visual check | **Pass for the inspected surfaces.** The installed dashboard was opened in the desktop app's built-in browser at 1366×768 and 375×812. The **SAMPLE DATA** pill sits in the sticky top bar (top 16–22 px) at both widths, with `role="status"`, above four claims that read demo figures. The spine and the per-view demo banner render. `scrollWidth` equals the viewport at 375 px. Keyboard Tab order runs skip link → brand → first operation, with a visible 1.6 px solid focus outline. CI `browser-accessibility` passed on this commit. **Not covered here:** the dashboard has no light theme (it ignores `prefers-color-scheme: light`; that is the open dashboard item), a screen-reader pass, and a contrast measurement beyond CI's automated check. |
115
+
116
+ **What this candidate establishes.** 0.2.0 is a clean, locally verified build
117
+ of the first-run value answer: newest-first import, the month view, Kept and
118
+ Not-kept commits measured from git, plan and quota views, the Claude status
119
+ line, and the Antigravity reader. The package and the installed CLI were
120
+ exercised. CI passed on all three operating systems. Publishing to npm, tagging,
121
+ and a GitHub release are the owner's steps and are not recorded here.
122
+
123
+ ### Superseded record — source commit `12add59`, 2026-08-29
79
124
 
80
125
  This record supersedes the `a5d1121` record above without rewriting it. The
81
126
  exact candidate head is
@@ -187,7 +232,7 @@ surface could not. It does **not** make any reconciliation succeed.
187
232
  **Still true, and unchanged by any of this:** no reconciliation has completed
188
233
  against a real provider bill on this machine, and the negative real-data result
189
234
  recorded under `205fbcc` was re-confirmed at this candidate rather than
190
- softened. On the owner's real ledger all 9,499 OpenAI rows arrived by native
235
+ softened. On the maintainer's real ledger every OpenAI row arrived by native
191
236
  import; **all 115 Codex rollout logs were scanned and carry no OpenAI account,
192
237
  project, or organization identifier at all** — the 18 files that matched such a
193
238
  pattern contain MCP tool-schema definitions quoted inside conversation text, not
@@ -220,10 +265,10 @@ retained for history.
220
265
  | Intended CI | **Pass, with the delta stated** (per the rule in the checklist above). Run **CI #34** (`.../actions/runs/32091103510`): status **Success**, 1m 3s, 7 jobs — `package-smoke` plus the 3-job `test` and 3-job `team-server-test` matrices. The run is for the pushed tip `c1912f5`; `git diff --stat 205fbcc c1912f5` is `docs/RELEASE-GATE.md` alone, 1 file changed — no source, no test, no packaged code. |
221
266
  | Visual check | **Pass, and the previously stated gap is closed.** Packaged dashboard at 375×812: Overview, Billing, Allocation, Value and Settings all report `scrollWidth 375` on a `clientWidth 375` document — **no view overflows**, including Value, which was 483px at `916e1c3`. Desktop 1280 re-checked on the same packaged artifact: `.ihelp` still computes `position: relative`, the popover is 270px with its `::after` arrow shown, `.grid` is still two-column (`1.5fr 1fr`), and the allocation view renders its 3 cards. No console errors. Screenshots remain unavailable in this environment — the browser pane is not displayed, so the page composites no frames and `computer{action:"screenshot"}` times out — so this row rests on DOM and computed-style inspection and says so rather than implying a picture was reviewed. |
222
267
 
223
- **The reconciliation was run against this machine's real ledger, and it
224
- failed — which is the finding.** `segreant import all` produced 18,422 real
225
- requests totalling `$1,574.42`, of which `$832.33` across 9,499 requests is
226
- OpenAI. None of it can reconcile. Every OpenAI row arrived by **native import**,
268
+ **The reconciliation was run against a maintainer's real ledger, and it
269
+ failed — which is the finding.** `segreant import all` produced several
270
+ thousand real requests, about half of their list cost OpenAI (figures from a
271
+ personal ledger are not published). None of it can reconcile. Every OpenAI row arrived by **native import**,
227
272
  and reconciliation counts only proxy traffic carrying the declared scope. It has
228
273
  to: an imported row records the model and the cost but nothing that ties it to
229
274
  the declared provider project, so counting it would invent exactly the
@@ -576,7 +621,7 @@ Use the following precise language:
576
621
 
577
622
  Do not call it a general AI-financial-services product, financial advice,
578
623
  compliance certification, a Vanta replacement, “zero egress,” a verified
579
- production deployment, or a published npm package.
624
+ production deployment, or a published npm package for 0.2.0 (0.1.0 is on npm; 0.2.0 is not).
580
625
 
581
626
  ## Required before public npm/GitHub release
582
627
 
@@ -43,7 +43,8 @@ machine-wide isolation guarantee.
43
43
  2. **A network attacker between the proxy and the configured upstream**,
44
44
  attempting to redirect traffic to a different destination or read a
45
45
  credential in transit. Mitigated by DNS-pinned egress, refusing
46
- non-loopback targets in `local_locked` mode, and stripping `Location` from
46
+ non-loopback targets other than the exact built-in provider and price-list
47
+ origins in `local_locked` mode, and stripping `Location` from
47
48
  upstream redirects before returning the response.
48
49
  3. **A malformed or adversarial configuration/settings payload**, attempting to
49
50
  disable budget enforcement or the egress policy by making persistence fail
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "segreant",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Local-first ledger and spend guard for AI coding agents: metering, budgets, provider-bill reconciliation, cost allocation and outcome evidence.",
5
5
  "type": "module",
6
6
  "engines": {
@@ -8,6 +8,7 @@
8
8
  },
9
9
  "bin": {
10
10
  "segreant": "bin/segreant.mjs",
11
+ "segreant-statusline": "bin/segreant-statusline.mjs",
11
12
  "segreantpack-verify": "standalone/segreantpack-verifier.mjs"
12
13
  },
13
14
  "exports": {
@@ -33,7 +34,7 @@
33
34
  "benchmark": "node --disable-warning=ExperimentalWarning scripts/benchmark.mjs",
34
35
  "benchmark:contribution": "node --disable-warning=ExperimentalWarning scripts/contribution-benchmark.mjs",
35
36
  "proxy-load": "node --disable-warning=ExperimentalWarning scripts/proxy-load.mjs",
36
- "test:browser": "npm run build && node --test test/dashboard-runtime-accessibility.browser.mjs",
37
+ "test:browser": "npm run build && node --test --test-force-exit --test-concurrency=4 test/dashboard-runtime-accessibility.browser.mjs test/dashboard-outage-stale.browser.mjs test/dashboard-jobs.browser.mjs test/dashboard-basis-copy.browser.mjs test/dashboard-statement-evidence.browser.mjs test/dashboard-workflow-focus.browser.mjs test/dashboard-sentinels.browser.mjs test/dashboard-theme.browser.mjs test/dashboard-classic-errors.browser.mjs test/dashboard-long-content.browser.mjs test/dashboard-allocation-rules.browser.mjs test/dashboard-announcements.browser.mjs test/dashboard-view-prefs.browser.mjs test/dashboard-drawer-runners.browser.mjs test/dashboard-workbench.browser.mjs test/dashboard-focus-race.browser.mjs",
37
38
  "predemo": "npm run build",
38
39
  "demo": "node --disable-warning=ExperimentalWarning bin/segreant.mjs demo --serve",
39
40
  "prepack": "npm run build",