{
  "markdown": "# seven-dpt-mcp\n\nA tiny, local MCP server that gives Claude (in any project) a persistent set of\n**long-running problems** and a loop for cracking them — Feynman's *twelve favorite\nproblems* method, driven by the tripartite model of inspiration.\n\n- **Feynman's method** (via Gian-Carlo Rota): keep ~a dozen problems dormant in mind;\n  every time you meet a new *trick*, test it against all of them.\n- **Inspiration = evocation + transcendence + approach motivation** (Thrash & Elliot):\n  a stimulus *evokes* a possibility, you *transcend* the problem's current framing, then\n  you're *motivated* to act on it.\n\nThe server holds state and scaffolding; the connected model does the thinking — no LLM\nruns inside the server, no API key.\n\n## Tools\n\n| Tool | Purpose |\n|------|---------|\n| `add_problem` | Add a long-running problem to your set (refused past the ~12 cap until you retire/merge something — or pass `overCap`) |\n| `update_problem` | Edit, **retire**, **solve**, or reopen a problem. Closing takes a `resolution` — why, plus the re-open trigger; a merge is a retirement whose resolution names the absorber |\n| `list_problems` | See your open problems |\n| `get_problem` | One problem + every spark (idea, next step, outcome) — the memory |\n| `evoke` | **The loop.** Feed it a trick; returns your problems + a scaffold walking evocation → transcendence → approach |\n| `capture_spark` | Persist a candidate idea + concrete next step against a problem (+ optional `costToOpen` — the forward effort estimate — `prior` — your stated p(works), immutable, for later calibration — and the claim-typing trio: `claimType` universal/existential-bounded, `forbids` — one observation the spark rules out — and `exhaustion` — when to abandon rather than re-park. All write-once) |\n| `update_spark` | Record a spark's outcome — status (tried/worked/failed), `cost` (actual effort spent), `value` (graded payoff, `0` for a miss). **Log failures too**; the zero-value outcomes are the signal a background-effort policy is learned from. Can backfill `claimType`/`forbids`/`exhaustion` while unset (write-once: never revises) |\n| `wake_status` | Evaluate every parked problem/spark's `wakeCondition` right now — ripeness, progress, per-atom current/target echoes |\n\nStorage: `~/.local/share/seven-dpt/store.json` (override with `SEVEN_DPT_DB`). One store,\nshared by every project = one brain.\n\n## Wake conditions (0.1.4)\n\nRetiring a problem parks it with a re-open trigger — but a trigger written in prose is a\nwait owned by \"someone will remember.\" A **`wakeCondition`** makes it computable: a small\npredicate (`all`/`any` over atoms like `sparkCount`, a `date` gate, `fileMatches` /\n`fileLines` / `fileCount` on a path, or an explicit `manual` note) attached when you\nretire/solve a problem (`update_problem`), park a spark (`update_spark`), or capture one\nborn gated (`capture_spark`). The ambient digest evaluates every condition at session\nstart and surfaces what's ripe (with an act/re-park pointer), what's ripening (with\n`current/target` progress), and — loudly — any condition whose source became unreadable:\na wake source that vanished must scream, not sit at 0% forever. Everything echoes its aim\n(`prior-ledger.jsonl 12/20`), so a wrong path or unit is visible when you arm it, not\nmonths later. No auto-reopen: ripeness is surfaced, you decide. `--wake` prints the full\nledger from the CLI.\n\n## Claim typing (0.1.5)\n\nA parked spark with a wake condition can *revive* — but nothing says when it may *die*, so\nan unfalsifiable hope can ride the digest forever. 0.1.5 gives every spark an optional\nclaim-typing trio, all **write-once** on the same anti-hindsight model as `prior`:\n\n- **`claimType`** — `universal` (\"this always holds\") vs `existential-bounded` (\"this holds\n  somewhere, within a stated frame\"). A frame-bounded null is not a claim-failure; typing the\n  claim keeps a frame-kill from being read as a lever-kill.\n- **`forbids`** — one concrete observation the spark rules out. If nothing is forbidden,\n  nothing can refute it, and the spark is a mood, not a claim.\n- **`exhaustion`** — the retirement predicate, the dual of `wakeCondition`: the condition\n  under which the spark is abandoned rather than re-parked.\n\nSet them at capture, or backfill later *while unset* (`update_spark`); revision after the\nfact is refused with a visible notice — rewriting what a claim forbids after seeing results\nis the conventionalist stratagem the fields exist to block. `ledger_invariants.py` flags\n**ORPHANED-EXISTENTIAL** sparks (parked with a wake, no exhaustion — can revive but never\ndie), and `calibration.py` stamps the claimType mix of every scored cohort.\n\n## How it bootstraps\n\nOn first run (no store file yet), the store **seeds itself with seven-dpt's own five open\nproduct problems** — auto-detection of recurring issues, the background-spend policy,\nproactive surfacing, keeping the set near twelve, and storage scaling. Design decision,\nmade deliberately: the seeds are **tool-generic** (identical for every install, about the\ntool rather than about you), so the server dogfoods its own method from minute one and the\nambient digest has something to show before you add your own problems. They are ordinary\nrows in *your* store — edit, replace, or clear them freely; an existing store is never\ntouched. So the moment it runs it is already \"taking care of its own problems\": while you\nwork on anything else, those sit in context and can be sparked by unrelated discoveries.\nThe *policy* for how/when/how-much to chase background problems is deliberately **not**\ncoded — it's meant to be learned later from the accumulated `spark → outcome` history,\nwhich is why `update_spark` exists.\n\nThat history is the **reward channel**: each spark carries a `prior` (your stated probability-it-works\nat capture — immutable afterwards, so stated credences can be calibrated against realized outcomes\nonce enough sparks resolve), a `costToOpen` (the forward effort estimate, set at capture and\npreserved), a `cost` (the actual effort, once chased to a verdict), and a `value`\n(graded payoff, `0` for a miss). `analysis/reservation_value.py` turns it into a Pandora's-Box / Gittins\nreservation-value ranking — but it **gates on data sufficiency** and refuses to emit numbers until enough\nresolved sparks (with cost + value, *including failures*) accrue, so the policy is never fit on false\nprecision. A companion, `analysis/reservation_value_bayes.py`, adds a posterior-predictive prior (so it\ncan rank under sparse data) and models the one-time `costToOpen` against a compounding-but-saturating\nbenefit stream — ranking by profitability index, which is invariant to the value↔cost exchange rate.\n`analysis/calibration.py` is the audit half of the `prior` loop: it scores stated priors against realized\noutcomes (reliability table, Brier/skill, drift check) from any two-line JSONL ledger of\npre-registered priors + resolutions, and `--json` persists a de-bias map that\n`reservation_value_bayes.py` reads *when run* — so the index can rank on *calibrated* stated credences\ninstead of a deemed hit-rate. The loop is not closed by machinery: `calibration.py --json` runs inside\n`analysis/sweep_composite.sh`, but nothing invokes `reservation_value_bayes.py` and it ends in `print`;\nthe last hop is a human choosing to run it and act on the ranking. `--split YYYY-MM-DD` partitions the curve at a changepoint (a model upgrade re-prices\nestimates — don't pool across one untested), and a scope stamp reports the claimType mix of scored pairs,\nsince a frame-bounded null scored as a claim-failure is the one bias the audit can't see from numbers\nalone. `analysis/ledger_invariants.py` audits the *program* the same ledger records, not any\nsingle probe: deterministic invariants for the failure class where every result is locally sound and the\nproject is still wrong — a park-streak check (K straddles-zero verdicts in a row on the primary metric\nmeans the instrument, not the ideas, is the suspect), power-at-preregistration (a gate below the banked\nMDE is unresolvable *before* it runs), channel-liveness stamps, and ORPHANED-EXISTENTIAL (a parked spark\nwith a wake but no `exhaustion` can revive but never die — unfalsifiable-in-practice spend). It reports\nits own note-classification coverage, exits 1 on alerts, supports `--asof` retrodiction, and `--json`\nemits ALERT markers a hook or `wakeCondition` (`fileMatches` on the output) can gate on.\n\n## Install (turn on for all projects)\n\n### Via npm (recommended)\n\nPublished on npm — no build step. Register it for every project (user scope):\n\n```bash\nclaude mcp add --scope user seven-dpt -- npx -y seven-dpt-mcp\n```\n\n### From source (alternative)\n\n```bash\nnpm install && npm run build\n# Register for every project (user scope). Use an ABSOLUTE node path — hooks and MCP\n# servers don't source your shell profile, so nvm-style setups need one:\nclaude mcp add --scope user seven-dpt -- \"$(command -v node)\" \"$(pwd)/dist/index.js\"\n```\n\nThen make the problems **ambient** — merge into `~/.claude/settings.json` so every\nsession opens with your dormant problems in context:\n\n```jsonc\n{\n  \"hooks\": {\n    \"SessionStart\": [\n      { \"matcher\": \"startup\", \"hooks\": [{ \"type\": \"command\", \"command\": \"npx -y seven-dpt-mcp --digest\", \"timeout\": 10 }] },\n      { \"matcher\": \"resume\",  \"hooks\": [{ \"type\": \"command\", \"command\": \"npx -y seven-dpt-mcp --digest\", \"timeout\": 10 }] },\n      { \"matcher\": \"clear\",   \"hooks\": [{ \"type\": \"command\", \"command\": \"npx -y seven-dpt-mcp --digest\", \"timeout\": 10 }] }\n    ]\n  }\n}\n```\n\n(Installed from source instead? Replace each command with an absolute node path +\n`/absolute/path/to/seven-dpt-mcp/dist/index.js --digest` — hooks don't source your shell\nprofile, so nvm-style setups need the absolute path.)\n\n(`--digest` prints nothing when no problems are open; a fresh install prints the five\nseeded ones — that's the bootstrap working, not noise.)\n\n## Validate the idea\n\n1. Add a few of your own long-running problems — `add_problem`.\n2. When you hit an interesting technique in any repo, `evoke` it; watch Claude test it\n   against every problem and reframe the ones that light up.\n3. Let it `capture_spark` the hits, then `update_spark` once you've tried them.\n4. Days later, `get_problem` — if that accumulated trail feels useful, the idea's proven.\n\n## Known MVP limits (intentional)\n\n- JSON file, last-write-wins (fine for one user).\n- `evoke` matching is done by the connected model, not pre-ranked by embeddings.\n\n## License\n\nApache-2.0 — see [LICENSE](LICENSE).\n",
  "bytes": 10549,
  "sha": "663ee1068b4bcc194e0ba6156d0646071f8287484c2b7ab96b7f142e4c35b81e",
  "repo_slug": "pierreb4/seven-dpt-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_pierreb4_seven_dpt_mcp_e90839f3/readme"
}