sigrank 0.18.5 → 1.0.1

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 (80) hide show
  1. package/CHANGELOG.md +158 -0
  2. package/MCP_SERVER_DESCRIPTION.md +172 -0
  3. package/README.md +94 -41
  4. package/adapters/index.mjs +1100 -0
  5. package/adapters/tokenpull.mjs +568 -0
  6. package/adapters.mjs +1 -857
  7. package/analytics/cascade.mjs +338 -0
  8. package/cascade.mjs +1 -274
  9. package/cli.mjs +1 -1853
  10. package/connect.mjs +1 -13
  11. package/identity/connect.mjs +13 -0
  12. package/identity/keystore.mjs +231 -0
  13. package/identity/sign.mjs +106 -0
  14. package/index.mjs +47 -162
  15. package/keystore.mjs +1 -242
  16. package/lib/constants.mjs +137 -0
  17. package/lib/pkg-version.mjs +59 -0
  18. package/manifest.json +46 -0
  19. package/narrate.mjs +1 -77
  20. package/package.json +41 -16
  21. package/preflight.mjs +1 -191
  22. package/presentation/cli.mjs +1926 -0
  23. package/presentation/narrate.mjs +219 -0
  24. package/presentation/tui-themes.mjs +189 -0
  25. package/presentation/tui.mjs +3316 -0
  26. package/prompts/check-my-efficiency.md +1 -0
  27. package/prompts/compare-with-leader.md +1 -0
  28. package/prompts/simulate-improvement.md +1 -0
  29. package/proxy.mjs +492 -0
  30. package/resources/class-tiers.md +81 -0
  31. package/resources/data-policy.md +31 -0
  32. package/resources/install-guide.md +59 -0
  33. package/resources/privacy-model.md +44 -0
  34. package/resources/scoring-formula.md +24 -0
  35. package/review.mjs +263 -0
  36. package/sign.mjs +1 -106
  37. package/submit/index.mjs +297 -0
  38. package/submit/preflight.mjs +191 -0
  39. package/submit.mjs +1 -303
  40. package/tokenpull.mjs +1 -576
  41. package/tokscale_analytics.mjs +864 -0
  42. package/tools/_framing.mjs +217 -0
  43. package/tools/_helpers.mjs +253 -0
  44. package/tools/_peer-matching.mjs +361 -0
  45. package/tools/_report.mjs +262 -0
  46. package/tools/_schemas.mjs +492 -0
  47. package/tools/_verifiers.mjs +148 -0
  48. package/tools/compare-operators.mjs +80 -0
  49. package/tools/compare-self.mjs +124 -0
  50. package/tools/describe-power-user.mjs +78 -0
  51. package/tools/diagnose-cascade.mjs +192 -0
  52. package/tools/discover-peers.mjs +198 -0
  53. package/tools/enroll.mjs +119 -0
  54. package/tools/get-best-operator.mjs +59 -0
  55. package/tools/get-leaderboard.mjs +27 -0
  56. package/tools/get-operator.mjs +33 -0
  57. package/tools/index.mjs +229 -0
  58. package/tools/optimize-efficiency.mjs +170 -0
  59. package/tools/rank-paste.mjs +51 -0
  60. package/tools/rank-windows.mjs +120 -0
  61. package/tools/self-improve.mjs +423 -0
  62. package/tools/simulate-change.mjs +207 -0
  63. package/tools/submit-paste.mjs +121 -0
  64. package/tools/submit-verified.mjs +153 -0
  65. package/tools/suggest-improvements.mjs +168 -0
  66. package/tools/tokenpull-compare.mjs +123 -0
  67. package/tools/tokenpull-submit.mjs +235 -0
  68. package/tools/tokenpull.mjs +113 -0
  69. package/tools/tokscale-breakdown.mjs +119 -0
  70. package/tools/tokscale-competitive-intel.mjs +45 -0
  71. package/tools/tokscale-cost-analysis.mjs +31 -0
  72. package/tools/tokscale-developer-profile.mjs +36 -0
  73. package/tools/tokscale-device-profile.mjs +35 -0
  74. package/tools/tokscale-market-share.mjs +38 -0
  75. package/tools/tokscale-mcp-usage.mjs +33 -0
  76. package/tools/tokscale-model-trends.mjs +32 -0
  77. package/tools/watch-tokenpull.mjs +134 -0
  78. package/tools.mjs +1 -3897
  79. package/tui.mjs +4 -2650
  80. package/banner.svg +0 -7
package/README.md CHANGED
@@ -1,16 +1,17 @@
1
- # SigRank MCP
1
+ # SigRank SignalAF MCP
2
2
 
3
- > **🏆 SigRank is live: [signalaf.com](https://signalaf.com)** — the leaderboard for how
4
- > efficiently you use AI, not how much. Run `npx sigrank` to see your cascade now.
5
- > _Token counts only. Never your prompts._
3
+ > **🏆 SigRank SignalAF is live: [signalaf.com](https://signalaf.com)** — the AI operator
4
+ > evaluation leaderboard. Ranks how efficiently you use AI by token cascade
5
+ > efficiency (Υ = cache_read × output / input²), not how much. Run `npx sigrank`
6
+ > to see your cascade now. _Token counts only. Never your prompts._
6
7
 
7
8
  <div align="center">
8
9
 
9
- <p><img src="./.github/assets/og-card.png" alt="SigRank — the new standard in AI evaluation &amp; benchmarks" width="800"></p>
10
+ <p><img src="./.github/assets/og-card.png" alt="SigRank SignalAF — AI operator evaluation and token cascade efficiency leaderboard" width="800"></p>
10
11
 
11
12
  **The yield cascade + live leaderboard as MCP tools any agent can call.**
12
13
 
13
- For all builders, burners and 10xers.
14
+ SigRank evaluates the human using the AI — not the AI model itself.
14
15
 
15
16
  [![npm version](https://img.shields.io/npm/v/sigrank.svg?style=flat-square&color=gold)](https://www.npmjs.com/package/sigrank)
16
17
  [![CI](https://github.com/SunrisesIllNeverSee/sigrank-mcp/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/SunrisesIllNeverSee/sigrank-mcp/actions/workflows/ci.yml)
@@ -31,7 +32,7 @@ For all builders, burners and 10xers.
31
32
 
32
33
  ## Table of Contents
33
34
 
34
- - [The SigRank ecosystem](#the-sigrank-ecosystem)
35
+ - [The SigRank SignalAF ecosystem](#the-sigrank-signalaf-ecosystem)
35
36
  - [Quickstart](#quickstart--3-steps-to-the-board)
36
37
  - [Install from GitHub](#install-from-github)
37
38
  - [Install via Smithery](#install-via-smithery)
@@ -49,19 +50,21 @@ For all builders, burners and 10xers.
49
50
 
50
51
  | The board | Your operator profile |
51
52
  | :-----------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------: |
52
- | [![SigRank leaderboard](./.github/assets/board.png)](https://signalaf.com/board/all) | [![SigRank operator profile](./.github/assets/profile.png)](https://signalaf.com) |
53
+ | [![SigRank SignalAF leaderboard](./.github/assets/board.png)](https://signalaf.com/board/all) | [![SigRank SignalAF operator profile](./.github/assets/profile.png)](https://signalaf.com) |
53
54
  | Every operator ranked by **Υ Yield** — the architecture of the cascade, not raw spend | Cascade layer, class, and fingerprint — derived from four token counts |
54
55
 
55
56
  > **Run [`sigrank enroll`](#sign-in--submit) then [`sigrank submit`](#sign-in--submit) to get ranked and claim your public profile at [signalaf.com](https://signalaf.com).**
56
57
 
57
58
  ---
58
59
 
59
- ## The SigRank ecosystem
60
+ ## The SigRank SignalAF ecosystem
60
61
 
61
62
  | Repo | What it is | Install |
62
63
  |------|-----------|---------|
63
64
  | **[sigrank-mcp](https://github.com/SunrisesIllNeverSee/sigrank-mcp)** (this repo) | The instrument — extracts 4 token pillars, computes the cascade, submits to the leaderboard. MCP server + TUI dashboard. | `npx sigrank` |
64
65
  | **[sigrank-app](https://github.com/SunrisesIllNeverSee/sigrank-app)** | The leaderboard — signalaf.com. Privacy-preserving operator profiles, class tiers, board rankings. | [signalaf.com](https://signalaf.com) |
66
+ | **[bestuser-router-mcp](https://github.com/SunrisesIllNeverSee/bestuser-router-mcp)** | The intent layer — routes "who is the best AI user?" queries to SigRank SignalAF's leaderboard. MCP server for AI assistants. | `npx bestuser-router-mcp` |
67
+ | **[sigarena](https://github.com/SunrisesIllNeverSee/sigarena)** | The satellite — public LLM operator evals at sigeconomy.com. Read-only leaderboard, SEO/AEO surface. | [sigeconomy.com](https://sigeconomy.com) |
65
68
  | **[signaf](https://github.com/SunrisesIllNeverSee/signa)** | The coach — reads your session logs, builds a taste profile, measures ASI, coaches you on token efficiency. | `npx @burnmydays/signaf` |
66
69
  | **[sigrank-vscode](https://github.com/SunrisesIllNeverSee/sigrank-vscode)** | The IDE extension — see your cascade metrics inline in VS Code. | `code --install-extension sigrank.sigrank` |
67
70
  | **[fundscore](https://github.com/SunrisesIllNeverSee/fundscore)** | The repo scorer — investor-readiness scoring for GitHub repos. CLI + MCP server. | `npx fundscore` |
@@ -71,7 +74,7 @@ For all builders, burners and 10xers.
71
74
  | Site | What it is |
72
75
  | ---- | ---------- |
73
76
  | **[SIGNOMY](https://signomy.xyz)** | Governed AI agent marketplace where ranked agents form teams, fill slots, run missions, and earn revenue under constitutional protocol. Agents are free. Operators pay. |
74
- | **[MO§ES](https://mos2es.com)** | The governance framework that underpins SigRank, SIGNOMY, and all governed agent operations. Structural accountability for agentic systems. |
77
+ | **[MO§ES](https://mos2es.com)** | The governance framework that underpins SigRank SignalAF, SIGNOMY, and all governed agent operations. Structural accountability for agentic systems. |
75
78
 
76
79
  ## Quickstart — 3 steps to the board
77
80
 
@@ -96,6 +99,7 @@ Or just explore without signing in:
96
99
  ```bash
97
100
  sigrank # launches the full tabbed TUI (dashboard, compare, board, watch)
98
101
  npx sigrank board --once # print the live leaderboard once
102
+ bunx sigrank board --once # same, via Bun (faster startup if you have it)
99
103
  ```
100
104
 
101
105
  ## Install from GitHub
@@ -124,7 +128,7 @@ sigrank
124
128
 
125
129
  ## Install via Smithery
126
130
 
127
- SigRank is available on [Smithery](https://smithery.ai/servers/burnmydays/sigrank) as a stdio MCP bundle — one-click install for Claude Desktop, Cursor, and other MCP clients.
131
+ SigRank SignalAF is available on [Smithery](https://smithery.ai/servers/burnmydays/sigrank) as a stdio MCP bundle — one-click install for Claude Desktop, Cursor, and other MCP clients.
128
132
 
129
133
  ### Smithery CLI
130
134
 
@@ -132,7 +136,7 @@ SigRank is available on [Smithery](https://smithery.ai/servers/burnmydays/sigran
132
136
  # Install Smithery CLI
133
137
  npm install -g smithery
134
138
 
135
- # Connect to SigRank (downloads the MCPB bundle locally)
139
+ # Connect to SigRank SignalAF (downloads the MCPB bundle locally)
136
140
  smithery mcp add burnmydays/sigrank --id sigrank
137
141
 
138
142
  # List available tools
@@ -154,7 +158,7 @@ smithery tool call sigrank rank_paste '{"text": "1000000 500000 50000 800000"}'
154
158
  ## Commands
155
159
 
156
160
  ```
157
- ⊙ SigRank CLI v0.0.177
161
+ ⊙ SigRank SignalAF CLI v0.0.177
158
162
 
159
163
  Default (no args)
160
164
  sigrank unified dashboard: cascade + token pillars + board
@@ -172,12 +176,15 @@ Commands
172
176
  watch live tune meter — ALL active platforms × all windows, every 30s
173
177
  watch --platform codex watch only one platform (optional filter)
174
178
  watch --window 7d watch only one window (optional filter)
179
+ proxy opt-in local Anthropic/OpenAI usage proxy
180
+ proxy --port 9000 run the proxy on a custom loopback port
175
181
 
176
182
  Options
177
183
  --window 7d · 30d · 90d · all (default: 30d for board; all windows for watch)
178
184
  --platform claude · codex · amp · gemini · opencode · goose · …
179
185
  --refresh poll interval in seconds (default: 30)
180
186
  --once print once and exit (board only)
187
+ --port proxy port (default: 8787)
181
188
 
182
189
  For AI clients (not typeable)
183
190
  In a piped/non-TTY context, sigrank is an MCP stdio server.
@@ -193,6 +200,34 @@ Examples
193
200
  sigrank board --window all --once
194
201
  ```
195
202
 
203
+ ### Optional API usage proxy
204
+
205
+ Some desktop coding agents receive provider usage in API responses but do not
206
+ persist it in their local session files. SigRank SignalAF can capture those
207
+ provider-reported counts through a manually started loopback proxy:
208
+
209
+ ```bash
210
+ sigrank proxy # http://localhost:8787
211
+ sigrank proxy --port 9000 # custom port
212
+ ```
213
+
214
+ Then point a compatible tool's API base URL at the displayed local URL. The
215
+ first release supports Anthropic Messages (`/v1/messages`), OpenAI Chat
216
+ Completions (`/v1/chat/completions`), and OpenAI Responses (`/v1/responses`).
217
+ The tool must support a custom API base URL; this is not guaranteed for every
218
+ desktop client.
219
+
220
+ The proxy is **off by default**: it opens no port and observes no traffic unless
221
+ you explicitly run `sigrank proxy`. It binds only to loopback and stops when the
222
+ command exits. Request and response content, API keys, and tool calls are
223
+ forwarded transiently but never written to disk. Only usage metadata is appended
224
+ to `~/.sigrank-mcp/proxy-sessions.jsonl` (directory `0700`, file `0600`).
225
+
226
+ Anthropic and OpenAI calls are currently grouped under one `proxy` platform row.
227
+ For streamed Chat Completions, SigRank SignalAF sets OpenAI's
228
+ `stream_options.include_usage=true` so the provider includes the final usage
229
+ chunk; response chunks are still forwarded immediately.
230
+
196
231
  ### The TUI is the whole app
197
232
 
198
233
  Launch it and sign in inside it:
@@ -277,6 +312,14 @@ Or if installed globally:
277
312
  | `compare_operators(a, b)` | `{codename_a, codename_b}` | Side-by-side comparison with behavioral verdict. Intent: "compare operator X vs Y" |
278
313
  | `describe_power_user()` | `{}` | Static explanation of AI power user archetype + metrics explained. Intent: "what is an AI power user?" |
279
314
  | `optimize_efficiency(codename? \| text?)` | `{codename?}` or `{text?}` | Ranked efficiency suggestions tied to your cascade shape. Intent: "how can I use AI more efficiently?" |
315
+ | `tokscale_breakdown(threshold?)` | `{threshold?}` | Per-model token breakdown across platforms (models under threshold → "other") |
316
+ | `tokscale_market_share()` | `{}` | AI tool market share: each tool's % of tokens/cost/messages, ranked. From local tokscale data |
317
+ | `tokscale_developer_profile()` | `{}` | Per-developer usage profile across all detected tools: model mix, pillars, sessions, workspaces. Paths redacted |
318
+ | `tokscale_model_trends()` | `{}` | Model adoption over time: per-model first/last seen, active days, month-by-month adoption curve |
319
+ | `tokscale_cost_analysis()` | `{}` | Cost per developer per model: cost_per_million_tokens, cost_per_message, share_cost, client rollup |
320
+ | `tokscale_device_profile()` | `{}` | Device fingerprinting: installed tools, session counts, active days, day-of-week distribution, concurrency. Paths redacted |
321
+ | `tokscale_mcp_usage()` | `{}` | MCP server usage: detected servers, detection window, active days |
322
+ | `tokscale_competitive_intel(target)` | `{target}` | Competitive intelligence for any AI tool: rank, model mix, cost efficiency, share vs all competitors |
280
323
 
281
324
  ---
282
325
 
@@ -306,7 +349,7 @@ The dashboard pulls from multiple sources and shows them side-by-side for verifi
306
349
  | `token-dashboard` | `~/.claude/token-dashboard.db` SQLite ([Nate's](https://github.com/nateherkai/token-dashboard)) | claude only |
307
350
  | `tokscale` | `tokscale models --json` CLI (bundled, falls back to `~/tokscale_report.json`) | claude, codex |
308
351
 
309
- **Codex input is estimated** — Codex logs don't expose true input tokens directly. The formula:
352
+ **Non-Claude input is estimated** — most non-Claude systems (Codex, Devin, etc.) combine user input + cache write into a single `input_tokens` field, so true fresh input must be derived. The ruleset (applies to ALL non-Claude systems):
310
353
 
311
354
  ```
312
355
  input = output × ioRatio (ioRatio derived from Claude ratio, else 2.0)
@@ -314,33 +357,41 @@ cacheCreate = uncached − input (uncached = input_tokens − cached_inp
314
357
  cacheRead = exact (from logs)
315
358
  ```
316
359
 
360
+ - **Beta** = operator's Claude input/output ratio (if Claude data available)
361
+ - **Alpha** = 2.0 default (when no Claude data)
362
+ - Owner-stated average: 7:1:2 (cache:input:output) → input/output ≈ 0.5
363
+
317
364
  Verifier numbers (ccusage/tokscale for codex) show **raw uncached input** (`input_tokens − cached`) — a different field than the estimated input above. The discrepancy is expected and explained inline in the dashboard.
318
365
 
319
366
  ---
320
367
 
321
368
  ## Platform adapters
322
369
 
323
- All adapters are token-only (no message content, no cost fields, no credentials).
324
-
325
- | Platform | Path | Notes |
326
- | ------------------ | ---------------------------------------------- | --------------------------------------------------------------- |
327
- | Claude Code | ✅ `~/.claude/projects` | Native; dedup by `(session_id, message_id)`; subagents included |
328
- | Codex | ✅ `~/.codex/sessions` | Estimated input via `io_ratio`; verified vs ccusage |
329
- | Amp | ✅ `~/.local/share/amp/threads` | Full 4-pillar; per-message |
330
- | Kimi | ✅ `~/.kimi/sessions` | Full 4-pillar; `StatusUpdate` lines only |
331
- | pi-agent | ✅ `~/.pi/agent/sessions` | Full 4-pillar; per-message JSONL |
332
- | OpenClaw | ✅ `~/.openclaw` | Full 4-pillar; per-message JSONL |
333
- | Droid | ✅ `~/.factory/sessions/*.settings.json` | Full 4-pillar; thinking→output |
334
- | Codebuff | ✅ `~/.config/manicode` | Full 4-pillar; `chat-messages.json` |
335
- | Hermes | ✅ `~/.hermes/state.db` | Full 4-pillar; SQLite; reasoning→output |
336
- | Kilo | ✅ `~/.local/share/kilo/kilo.db` | Full 4-pillar; SQLite |
337
- | Qwen | ✅ `~/.qwen/projects` | `cacheCreate=0` estimated; thought→output |
338
- | Goose | ✅ `~/.local/share/goose/sessions/sessions.db` | `cacheCreate=cacheRead=0` estimated; SQLite |
339
- | Gemini CLI | ✅ `~/.gemini/tmp` | `cacheCreate=0` estimated; cache extracted from input field |
340
- | GitHub Copilot CLI | ✅ `~/.copilot/otel` | OTel JSONL; requires `COPILOT_OTEL_ENABLED=true` |
341
- | OpenCode | ⚠️ `~/.local/share/opencode` | Raw token counts not persisted in log format |
342
- | Cursor | 🔜 | Chat log path TBD |
343
- | Windsurf | 🔜 | Session logs at `~/.codeium/windsurf/` |
370
+ All adapters are token-only (no message content, no cost fields, no credentials). The table below is regenerated from the adapter file headers in `adapters/index.mjs` + `adapters/tokenpull.mjs` so the path, pillar shape, and notes match the actual code (a prior revision had drifted on Qwen/Codex/Copilot).
371
+
372
+ | Platform | Path | Pillar shape & notes |
373
+ | ------------------ | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
374
+ | Claude Code | ✅ `~/.claude/projects` (recursive, incl. `subagents/`) | Native 4-pillar; dedup by `(session_id, message_id)` — final snapshot wins |
375
+ | Codex | ✅ `~/.codex/sessions` (+ `archived_sessions`) | `input_tokens` incl. cached → `input` + `cacheCreate` split window-level via `io_ratio`; `cacheRead` native (`cached_input_tokens`); `reasoning_output`→output; verified vs ccusage (~1%) |
376
+ | Devin CLI | ✅ `~/.local/share/devin/cli/sessions.db` | SQLite; native 4-pillar from `metadata.metrics` (`input_tokens`, `output_tokens`, `cache_read_tokens`, `cache_creation_tokens`); `input_tokens` is fresh (excludes cache) |
377
+ | Amp | ✅ `~/.local/share/amp/threads` | Native 4-pillar; per-message |
378
+ | Kimi | ✅ `~/.kimi/sessions` | Native 4-pillar; `StatusUpdate` lines only |
379
+ | pi-agent | ✅ `~/.pi/agent/sessions` | Native 4-pillar; per-message JSONL |
380
+ | oh-my-pi (`omp`) | ✅ `~/.omp/agent/sessions` (recursive, incl. nested subagent transcripts) | Native 4-pillar from `.message.usage` on `type:"message"` entries (`cacheWrite`→`cacheCreate`); **`reasoningTokens` is already inside `output`** — never added, or it double-counts; `usage.cost` reuses the same four key names for USD floats and is dropped; dedup by (session header `id`, entry `id`). Separate harness from pi-agent |
381
+ | OpenClaw | ✅ `~/.openclaw` | Native 4-pillar; per-message JSONL |
382
+ | Droid | ✅ `~/.factory/sessions/*.settings.json` | Native 4-pillar; `thinking_tokens`→output |
383
+ | Codebuff | ✅ `~/.config/manicode` | Native 4-pillar; `chat-messages.json` |
384
+ | Hermes | ✅ `~/.hermes/state.db` | Native 4-pillar; SQLite; `reasoning_tokens`→output |
385
+ | Kilo | ✅ `~/.local/share/kilo/kilo.db` | Native 4-pillar; SQLite |
386
+ | Qwen | ✅ `~/.qwen/projects` | Estimated (`cacheCreate=0` — no field in logs); `cacheRead` from `cachedContentTokenCount`; `thoughtsTokenCount`→output |
387
+ | Goose | ✅ `~/.local/share/goose/sessions/sessions.db` (or `$GOOSE_PATH_ROOT/data/sessions/sessions.db`) | Estimated (`cacheCreate=cacheRead=0` — no cache fields); reasoning = `total−input−output`→output; cumulative-column dedup by session id |
388
+ | Gemini CLI | ✅ `~/.gemini/tmp` | Estimated (`cacheCreate=0`); `cacheRead` from `cached` field; `thought`→output; `input` = `input−cached` (fresh) |
389
+ | GitHub Copilot CLI | ✅ `~/.copilot/otel` | Native 4-pillar (OTel spans: `llm.token_count.{prompt,completion,cache_creation,cache_read}`); requires `COPILOT_OTEL_ENABLED=true` + `COPILOT_OTEL_EXPORTER_TYPE=file` set **before** session start |
390
+ | OpenCode | ⚠️ `~/.local/share/opencode` | Data gap — logs store `cost:0` and derive tokens via LiteLLM at runtime; raw token counts not persisted. No pillars readable with current format |
391
+ | SigRank SignalAF proxy | ✅ `~/.sigrank-mcp/proxy-sessions.jsonl` | Opt-in native 4-pillar usage reported by Anthropic/OpenAI; same-timestamp records keep the last call; OpenAI cached input is separated from fresh input |
392
+ | Other (user JSON) | ✅ `$SIGRANK_OTHER_PATH` | User-supplied JSON `{ "windows": { "all": {input,output,cacheCreate,cacheRead} } }`; all-time only (no timestamps) |
393
+ | Cursor | 🔜 | Chat log path TBD |
394
+ | Windsurf | 🔜 | Session logs at `~/.codeium/windsurf/` |
344
395
 
345
396
  `estimated=true` means one or more pillars are derived, not native. The server re-scores all submitted pillars authoritatively; local preview Υ is indicative only.
346
397
 
@@ -348,7 +399,7 @@ All adapters are token-only (no message content, no cost fields, no credentials)
348
399
 
349
400
  ## Privacy
350
401
 
351
- - **Token-only, always.** No message content is ever read, logged, or transmitted — only token counts (`input`, `output`, `cache_creation`, `cache_read`), message IDs, and timestamps.
402
+ - **Token-only persistence and submission.** Local-log adapters read usage metadata only. The optional proxy necessarily handles provider-bound request and response bytes in memory, but never persists their content; it writes only token counts, model/backend metadata, and timestamps. Only token telemetry is submitted to SigRank SignalAF.
352
403
  - **Local by default.** `tokenpull` reads only `~/.claude/projects` (Claude) or `~/.codex` (Codex) on your device. Numbers stay on your machine unless you explicitly submit with a codename.
353
404
  - **Background tooling excluded.** Memory plugins, observers, summarizers (e.g. `claude-mem`, `mem0`, `observer-sessions`) are filtered from both Claude and Codex reads. `subagents/` are kept — they represent real operator work.
354
405
  - **Board reads are anonymous.** No account needed to browse, compare, or watch.
@@ -368,19 +419,20 @@ All adapters are token-only (no message content, no cost fields, no credentials)
368
419
  ## Dev / test
369
420
 
370
421
  ```bash
371
- node test.mjs # 13 test groups, 200 assertions (no network, no fs writes)
422
+ node test.mjs # 313-assertion baseline + proxy tests (local mocks only; temp filesystem)
372
423
  node sign.test.mjs # ed25519 signing + canon parity
373
424
  node index.mjs # stdio MCP server directly (pipe to MCP client)
374
425
  ```
375
426
 
376
- Tests verify (13 groups, 200 assertions):
427
+ Tests verify (14 groups, 313 assertions):
377
428
 
378
429
  - `rank_paste` canon: MO§ES `(1251211, 11296121, 128196310, 2555179769)` → Υ 18436.98 · TRANSMITTER
379
430
  - `submit_paste` preview (no codename) + POST shape (injected fetch, no live writes)
380
431
  - `tokenpull` dedup, window slicing, 4-window pillars (mock adapter)
381
432
  - `tokenpull_submit` all 4 windows POST, sha256 hash, ddmmyy stamp
382
433
  - `tokenpullCodex` io_ratio conversion per-window
383
- - Adapter registry (15 platforms) + per-adapter shape contracts
434
+ - Adapter registry (17 platforms) + per-adapter shape contracts
435
+ - Local proxy: Anthropic/OpenAI JSON + fragmented SSE, live pass-through, secure JSONL, error forwarding
384
436
  - `rank_windows` 4-window paste scoring, partial input, no-network
385
437
  - `watch_tokenpull` cascade snapshot, interval_s, submit path
386
438
  - `enroll` posts identity (public key only), maps 201 enrolled + 410 code_invalid
@@ -396,11 +448,12 @@ Tests verify (13 groups, 200 assertions):
396
448
  | File | Responsibility |
397
449
  | --------------- | ----------------------------------------------------------------------- |
398
450
  | `index.mjs` | Entry point — TTY detection, routes to CLI or MCP server |
451
+ | `proxy.mjs` | Opt-in loopback Anthropic/OpenAI proxy and usage capture |
399
452
  | `cli.mjs` | CLI commands: board, compare, watch, enroll, submit, help |
400
453
  | `tui.mjs` | Full tabbed TUI: Dashboard / Trends / Compare / Board / Watch / Connect |
401
454
  | `cascade.mjs` | Pure cascade math (Υ, SNR, leverage, velocity, 10xDEV, class) |
402
455
  | `tokenpull.mjs` | On-device log scanner — Claude, Codex, multi-platform |
403
- | `adapters.mjs` | Platform adapter registry (15+ platforms) |
456
+ | `adapters.mjs` | Platform adapter registry (16+ platforms) |
404
457
  | `tools.mjs` | MCP tool table + dispatcher |
405
458
  | `connect.mjs` | Connect-code enrollment + device identity |
406
459
  | `keystore.mjs` | Local key management (paste-keys, not API keys) |
@@ -415,7 +468,7 @@ Tests verify (13 groups, 200 assertions):
415
468
 
416
469
  ## Contributing
417
470
 
418
- Contributions welcome. SigRank MCP is built in the open.
471
+ Contributions welcome. SigRank SignalAF MCP is built in the open.
419
472
 
420
473
  - [Contributing guide](./.github/CONTRIBUTING.md)
421
474
  - [Security policy](https://github.com/SunrisesIllNeverSee/sigrank-mcp/security/policy)