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.
- package/LICENSING.md +5 -3
- package/README.md +57 -19
- package/bin/segreant-statusline.mjs +20 -0
- package/bin/segreant.mjs +19 -8
- package/dist/alerts/detect.js +13 -0
- package/dist/billing/epistemic.js +4 -0
- package/dist/billing/importer.js +29 -10
- package/dist/billing/reconcile.js +122 -32
- package/dist/billing/scope.js +7 -0
- package/dist/budget/guard.js +33 -4
- package/dist/cli/allocCmd.js +73 -4
- package/dist/cli/askModelPrices.js +59 -0
- package/dist/cli/backupCmd.js +2 -1
- package/dist/cli/basisLines.js +45 -0
- package/dist/cli/billingCmd.js +68 -9
- package/dist/cli/capitalCmd.js +2 -1
- package/dist/cli/connectCmd.js +50 -9
- package/dist/cli/egressCmd.js +15 -3
- package/dist/cli/evidenceCmd.js +6 -3
- package/dist/cli/flags.js +68 -0
- package/dist/cli/homeCmd.js +117 -0
- package/dist/cli/importCmd.js +210 -54
- package/dist/cli/launchCmd.js +2 -1
- package/dist/cli/opsCmd.js +49 -2
- package/dist/cli/planCmd.js +181 -0
- package/dist/cli/pricingDeclareCmd.js +178 -0
- package/dist/cli/quotaCmd.js +190 -0
- package/dist/cli/runCmd.js +203 -51
- package/dist/cli/showCmd.js +37 -11
- package/dist/cli/teamCmd.js +5 -5
- package/dist/cli/ui.js +24 -8
- package/dist/cli/valueCmd.js +189 -14
- package/dist/cli.js +102 -21
- package/dist/config.js +95 -6
- package/dist/connect/antigravity.js +310 -0
- package/dist/connect/claudeCode.js +43 -3
- package/dist/connect/codex.js +38 -1
- package/dist/connect/importShared.js +58 -5
- package/dist/connect/opencode.js +37 -9
- package/dist/connect/protobuf.js +126 -0
- package/dist/connect/registry.js +46 -0
- package/dist/connect/repoRoot.js +112 -0
- package/dist/cost/basis.js +168 -0
- package/dist/cost/declarations.js +37 -0
- package/dist/cost/exactPricing.js +4 -1
- package/dist/cost/firstSight.js +98 -0
- package/dist/cost/overrides.js +230 -0
- package/dist/cost/pricing.js +228 -15
- package/dist/cost/reprice.js +130 -0
- package/dist/dashboard/claim-support.js +11 -8
- package/dist/dashboard/contracts.js +23 -3
- package/dist/dashboard/routes.js +980 -112
- package/dist/dashboard/sessions.js +345 -0
- package/dist/dashboard/settings.js +2 -1
- package/dist/dashboard/value-cache.js +105 -0
- package/dist/dashboard/web/app/components/claimInspector.js +6 -5
- package/dist/dashboard/web/app/components/drawer.js +105 -35
- package/dist/dashboard/web/app/components/ruleFields.js +144 -0
- package/dist/dashboard/web/app/components/spine.js +54 -24
- package/dist/dashboard/web/app/components/workflow.js +82 -0
- package/dist/dashboard/web/app/core/actions.js +734 -23
- package/dist/dashboard/web/app/core/api.js +37 -1
- package/dist/dashboard/web/app/core/chain.js +11 -4
- package/dist/dashboard/web/app/core/claimLayers.js +179 -51
- package/dist/dashboard/web/app/core/claimTypes.js +30 -0
- package/dist/dashboard/web/app/core/fmt.js +19 -2
- package/dist/dashboard/web/app/core/generated-contract.js +23 -3
- package/dist/dashboard/web/app/core/generated-payload-contract.js +1944 -465
- package/dist/dashboard/web/app/core/generated-types.js +1 -1
- package/dist/dashboard/web/app/core/griffin.js +10 -0
- package/dist/dashboard/web/app/core/jobs.js +12 -0
- package/dist/dashboard/web/app/core/period.js +35 -0
- package/dist/dashboard/web/app/core/periodWords.js +10 -0
- package/dist/dashboard/web/app/core/periods.js +32 -0
- package/dist/dashboard/web/app/core/pricingActions.js +264 -0
- package/dist/dashboard/web/app/core/privacyText.js +78 -0
- package/dist/dashboard/web/app/core/reconcileWords.js +63 -0
- package/dist/dashboard/web/app/core/registry.js +79 -46
- package/dist/dashboard/web/app/core/slug.js +9 -0
- package/dist/dashboard/web/app/core/theme.js +48 -0
- package/dist/dashboard/web/app/core/view.js +69 -0
- package/dist/dashboard/web/app/main.js +197 -15
- package/dist/dashboard/web/app/views/allocation.js +249 -61
- package/dist/dashboard/web/app/views/control.js +57 -16
- package/dist/dashboard/web/app/views/data.js +4 -4
- package/dist/dashboard/web/app/views/evidence.js +336 -87
- package/dist/dashboard/web/app/views/privacy.js +13 -0
- package/dist/dashboard/web/app/views/spend.js +30 -15
- package/dist/dashboard/web/app/views/statement.js +189 -0
- package/dist/dashboard/web/app/views/system.js +44 -4
- package/dist/dashboard/web/app/views/value.js +105 -59
- package/dist/dashboard/web/app/views/workbench.js +312 -0
- package/dist/dashboard/web/classic.html +16 -4
- package/dist/dashboard/web/index.html +1 -1
- package/dist/dashboard/web/styles/app.css +536 -23
- package/dist/demo/seed.js +153 -14
- package/dist/economics/ledger.js +1 -1
- package/dist/egress/policy.js +129 -5
- package/dist/export/allocationCsv.js +70 -0
- package/dist/export/billingCsv.js +6 -2
- package/dist/export/csv.js +10 -2
- package/dist/export/economic.js +6 -2
- package/dist/export/statementCsv.js +104 -0
- package/dist/git/correlate.js +86 -9
- package/dist/git/quality.js +107 -24
- package/dist/git/repoScope.js +207 -0
- package/dist/git/survivalStore.js +186 -0
- package/dist/guide.js +9 -4
- package/dist/plans/detect.js +147 -0
- package/dist/proxy/server.js +134 -14
- package/dist/proxy/usage.js +9 -4
- package/dist/quota/limits.js +138 -0
- package/dist/quota/statusline.js +68 -0
- package/dist/quota/view.js +122 -0
- package/dist/scan/knownApps.js +6 -2
- package/dist/scan/scan.js +9 -0
- package/dist/store/allocation.js +14 -0
- package/dist/store/db.js +259 -34
- package/dist/store/realization.js +78 -14
- package/dist/store/schema.js +59 -1
- package/dist/store/scopeEvidence.js +67 -0
- package/dist/util/pool.js +19 -0
- package/dist/util/time.js +7 -0
- package/dist/value/realization.js +321 -30
- package/dist/value/report.js +28 -8
- package/dist/value/selfReported.js +10 -9
- package/docs/ARCHITECTURE.md +8 -4
- package/docs/CAPABILITY-EVIDENCE-CONTRACT.md +33 -11
- package/docs/CLI-JSON-CONTRACT.md +38 -0
- package/docs/DATA-BOUNDARIES.md +66 -6
- package/docs/FAQ.md +43 -9
- package/docs/GETTING-STARTED.md +19 -12
- package/docs/GUIDE.md +81 -18
- package/docs/INTEGRATIONS.md +9 -9
- package/docs/METHODOLOGY.md +3 -2
- package/docs/NEUTRALITY.md +1 -1
- package/docs/PRIVACY.md +51 -0
- package/docs/README.md +1 -0
- package/docs/RELEASE-GATE.md +52 -7
- package/docs/THREAT-MODEL.md +2 -1
- package/package.json +3 -2
- package/pricing/models.json +1366 -60
package/docs/PRIVACY.md
ADDED
|
@@ -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 |
|
package/docs/RELEASE-GATE.md
CHANGED
|
@@ -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 —
|
|
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
|
|
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
|
|
224
|
-
failed — which is the finding.** `segreant import all` produced
|
|
225
|
-
|
|
226
|
-
|
|
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
|
|
package/docs/THREAT-MODEL.md
CHANGED
|
@@ -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
|
|
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.
|
|
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",
|