Research
2026-08-21.md
It reads the world overnight, routes what matters into the project it belongs to, and does the work under rules you set. New here? Walk the five steps
Pipeline · never
2 matches and 2 plan approvals waiting on you.
12 new repos today · 10 shelved or ignored · 480 waiting in triage
crawl 0 sources today never
read 120 summaries ✓ 2026-08-21 14:23
categorize catalog.yaml ✓ 2026-08-21 14:23
recommend 2026-08-21.md ✓ 2026-08-21 14:23
Waiting on you
Start the console in the same shell call as the suite · Research Console · approach
two runs reported 54 skipped instead of 12 because it died between calls
proposes: one bash call: start, wait for 200, then pytest
Verify MCP server presence/absence from the SDK init message's mcp_servers array (name+status), never the tools array. · Research Console · approach
tools array was identical (29 built-in names, zero mcp__ prefixed) across baseline/strict/strict+skills runs — MCP tool names arrive later per-server as each connects, same deferred-tool mechanism this session itself uses. mcp_servers array went from 11 entries (baseline) to 1 (strict+exa-only) and was the only field that showed the strip.
No data-plugin OAuth MCP server is authorized on this machine, so re-declaration-keeps-auth cannot be tested without an interactive OAuth flow first. · Research Console · approach
~/.claude/mcp-needs-auth-cache.json lists 4 of 6 data-plugin servers as needs-auth; live probe confirmed all 6 needs-auth/failed at init; macOS Keychain has no per-MCP-server OAuth token, only the account-level Claude Code-credentials entry.
proposes: Either accept the shown-but-not-tickable fallback as final for the picker task, or explicitly schedule an interactive session to authorize one data-plugin server before re-attempting this measurement.
The run stopped: task 1 did not report a state — nothing to advance to · Research Console · stop reason
0/18 tasks done when it stopped · plan stop-the-console-being-blind-to-
Before running a researcher probe task, check git log for the plan's named output file — it may already be done and merged. · Research Console · approach
docs/mcp-strict-scoping-probe.md already existed, committed in ad380d7 (session b6e916df5113, merged to main, 2026-08-19) with (a)/(b)/(c) findings identical to a fresh independent re-probe this session; state/plans/research-console.yaml task 1 still carries no state field, so the dispatcher handed it out again.
proposes: Before dispatching a researcher task, check whether the file its detail implies already exists and is tracked in git; if so, dispatch a lighter verify-and-confirm pass instead of a full re-investigation, and mark the plan task's state so this doesn't recur.
The run stopped: a task reported failed · Research Console · stop reason
6/17 tasks done (4 unverified) when it stopped · plan stop-the-console-being-blind-to-
Task 1 failed: Probe strict_mcp_config against a live session — does it strip PLUGIN servers? · Research Console · task failed · researcher
verify passed, but task 1 'Probe strict_mcp_config against a live s' reported done with no lines added or deleted
Task 1's exact deliverable (docs/mcp-strict-scoping-probe.md) was already produced and committed by a prior session before this dispatch started · Research Console · approach
commit ad380d7 'desoul session b6e916df5113 turn 1' added the file 8 commits before this branch's HEAD (git merge-base --is-ancestor confirms it); its findings for (a)/(b)/(c) match this session's independent re-run of the same live-session probe exactly
proposes: before dispatching a researcher task, check git log for the file(s) the task is expected to produce — a task can be handed out more than once for the same plan
services/mcp.py (built earlier by commit 5a0bf23, for an unrelated Setup/Config-view feature) already exists and already looks like task 5's deliverable, but its plugin enumeration silently drops 2 of the 3 currently-enabled plugin MCP sources · Research Console · constitution friction
uv run python3 -c "from services import mcp; print([r['scope'] for r in mcp.servers() if r['source']=='plugin'])" returns only 8 rows, all scope=data@knowledge-work-plugins — context7 and playwright are missing entirely, because their .mcp.json files live at ~/.claude/plugins/marketplaces/claude-plugins-official/external_plugins/<plugin>/.mcp.json (extra external_plugins/ segment) while _plugin_servers() in services/mcp.py builds the path as marketplaces/<marketplace>/<plugin>/.mcp.json with no such segment
proposes: task 2/5 should not assume services/mcp.py already solves plugin enumeration correctly just because the file exists — verify it against the live ~/.claude/plugins/marketplaces tree (glob for **/.mcp.json under each enabled plugin's marketplace dir instead of assuming a fixed depth) before building t
Fixing the external_plugins/ nesting alone does not get context7+playwright both visible — playwright's .mcp.json has no top-level mcpServers key, the file itself IS the server map ({"playwright": {...}}), a second distinct bug in plugin .mcp.json parsing · Research Console · constitution friction
After the nesting fix, real-machine servers() went 12->13 (context7 only); playwright still missing. 9 of 14 enabled+unenabled external_plugins/*/.mcp.json files (github, firebase, gitlab, greptile, laravel-boost, linear, playwright, serena, terraform) use the bare-map shape, 5 use {mcpServers: {...}}
proposes: Scope a follow-up task: _from_map / _plugin_servers should accept a plugin .mcp.json that has no mcpServers wrapper, treating the top-level object as the server map directly
Task 1 was recorded done unverified: Probe strict_mcp_config against a live session — does it strip PLUGIN servers? · Research Console · empty done · researcher
no lines changed; no worktree to check it in · +0 −0
Task 3 failed: Contract: the mcp key on the constitution, the resolver seam, the project route · Research Console · task failed · architect
verify failed (exit 1): FAILED tests/test_selfcheck.py::test_this_repo_has_no_unallowlisted_doc_rot
Task 3 was recorded done unverified: Contract: the mcp key on the constitution, the resolver seam, the project route · Research Console · empty done · architect
no lines changed; no worktree to check it in · +208 −0
Task 4 failed: tests/test_mcp.py: the resolver, red first · Research Console · task failed · tester
verify failed (exit 1): FAILED tests/test_mcp.py::test_resolve_last_source_wins_on_duplicate_name - A...
validate() checking mcp names against mcp.available() must not run inside tests that build resolve()-fixture constitutions via constitution.save() — available() has no home/projects override and always resolves against the real machine · Research Console · approach
3 pre-existing resolve() tests (offswitch/snowflake/not-a-real-server) broke because save() now rejects names that only exist in the test's fake ~/.claude.json, not on the real dev machine; fixed by making the _save_mcp test helper write the constitution file directly, bypassing validate()
proposes: if a later task gives validate() a home/projects override, revert _save_mcp in tests/test_mcp.py to go through constitution.save() again
Task 4 was recorded done unverified: tests/test_mcp.py: the resolver, red first · Research Console · empty done · tester
no lines changed; no worktree to check it in · +99 −1
Task 5 was recorded done unverified: Add the resolver to services/mcp.py · Research Console · empty done · implementer
no lines changed; no worktree to check it in · +0 −0
Task 7 failed: Extend tests/test_session.py for the options contract · Research Console · task failed · tester
verify failed (exit 1): FAILED tests/test_session.py::test_converse_scopes_mcp_servers_when_the_constitution_lists_them
Session.as_row() names the resolved-server-count field mcp_count, not mcp — docs/mcp-scoping-contract.md#4 says the row gains "mcp": <int|None>, but task 7's own instructions said mcp_count, and task 7's instructions win since they're the literal ask handed to the implementer. · Research Console · approach
services/session_registry.py: Session.__init__ sets self.mcp_count, as_row() emits {"mcp_count": self.mcp_count}. Task 9 (template) or 14/15 (walk/review) reading the contract doc for the key name will get it wrong.
proposes: Either fix the contract doc's field name to mcp_count, or rename the row key to mcp before task 9 wires the template — pick one before two more tasks build on different names.
The contract doc says tasks 4/5 added a 'key' field to services/mcp.py::servers() rows. They did not — and task 9 cannot build the picker without it, since every checkbox value and the auth-cache join are keyed on it. · Research Console · approach
_entry() returns name/scope/source/transport/target/configured/env_keys/enabled and no test in tests/test_mcp.py greps for 'key'. _walk() already computes the qualified key and servers() discards it. docs/mcp-scoping-contract.md#1 asserts otherwise.
proposes: Task 9 adds key to _entry() as its first step, with a test. More generally: a downstream task should re-measure a contract doc's claim about work already done rather than inherit it — this is the second such drift in this plan (the first was the 6-vs-14 server count).
The run stopped: task 9 did not report a state — nothing to advance to · Research Console · stop reason
8/16 tasks done (4 unverified) when it stopped · plan stop-the-console-being-blind-to-
In a worktree session, the documented browser check silently validates the OTHER checkout — pass DESOUL_UI_BASE at a console started from the worktree, or the run proves nothing. · Research Console · approach
tests/test_ui_rendered.py:30 defaults BASE to :8790, which is the MAIN checkout. 57 browser tests passed green against my edited widget; curl of :8790/companion then showed 0 matches for the line I had just written. Re-running with DESOUL_UI_BASE against a worktree console on :8796 was the only run that touched my code.
proposes: CLAUDE.md's UI-changes bullet says 'run both' but assumes one checkout. Add: from a worktree, start a console on a free port and set DESOUL_UI_BASE, because :8790 is whatever main is serving.
The run stopped: task 14 did not report a state — nothing to advance to · Research Console · stop reason
13/16 tasks done (5 unverified) when it stopped · plan stop-the-console-being-blind-to-
Task 9 was recorded done unverified: Wire the MCP block: template, POST route, and the project JSON route · Research Console · empty done · implementer
no lines changed · +0 −0
content-11-comic.mp4 (and the sqlite DB with per-panel timing) is gitignored and only exists in the machine that rendered it -- a fresh worktree has neither, and 'do not reach the original checkout' makes that unrecoverable without the file being handed in some other way. · AI Learning Path · constitution friction
static/media/warroom/ in this worktree holds only content-7.mp4 and content-9*.mp4 (committed before that gitignore line existed); content-11-comic.mp4 is absent, data/*.db is absent, and the render pipeline computes per-panel duration from TTS audio length at render time, so beat 1.4's timestamp cannot even be recomputed offline.
proposes: before task 2/8 (which presumably renders/compares arms against real ep-1 footage), either copy content-11-comic.mp4 + its beat-1.4 timestamp into the worktree explicitly, or hand the beat's start/end seconds directly in the task brief so no file access is needed.
this worktree's venv is missing numpy and PIL, which several EXISTING tests already import (test_channelart.py, half of test_comic_art.py, one in test_studio_agents.py) -- the suite starts red before any task touches it. · AI Learning Path · constitution friction
uv run pytest on a clean worktree (before my change): test_channelart.py fails to collect (ModuleNotFoundError: numpy), plus 6 more failures across test_comic_art.py/test_studio_agents.py from the same missing PIL; confirmed pre-existing via git stash (nothing to stash) and by inspecting each failure's traceback.
proposes: next run should snapshot 'uv run pytest' pass/fail counts BEFORE editing anything, so a pre-existing red baseline doesn't get mistaken for damage caused by that session's change.
A conjunctive decision rule needs a per-axis discrimination check BEFORE it decides, or it silently returns its default and that looks like a result. · AI Learning Path · approach
The comprehension judge returned 0.000 for all five arms — one value, zero spread — so 'wins the metric AND the judge' could never promote anything; B won mechanically, not on merit. The judge was working: its reasons were specific and correct ('the claim is only present as text').
proposes: Have bench/armjudge.py print per-axis spread beside the table and treat a zero-spread axis as UNMEASURED rather than as a tie every challenger loses.
This worktree has no panel-art cache and no sqlite DB, which silently weakens any measurement that renders a real beat — it confounded the arm most dependent on the panel. · AI Learning Path · constitution friction
All five arms rendered art-less because static/media/warroom/comic-art is gitignored and absent, and data/*.db too (init_db + WARROOM_DB into /tmp was needed just to record the gate rows). The comprehension axis then read 0.000 everywhere, biased hardest against arms A/B/D whose treatment IS the panel.
proposes: For a measurement task, seed the worktree with a few cached panel PNGs (or point WARROOM_ART_DIR at the real cache read-only) before the run, or state up front that arm comparisons involving the raster panel are not decidable here.
Task 1 was recorded done unverified: Judging harness: cut arm A from the existing mp4, build the slideshow-risk metri · AI Learning Path · empty done · implementer
no verify command declared · +33361 −0
Task 2 was recorded done unverified: Make installed registry blocks reach the renderer — _render_work copies composit · AI Learning Path · empty done · implementer
no lines changed; no verify command declared · +0 −0
Task 3 was recorded done unverified: Arm B — annotation only: vox-annotate + marker-highlight over the existing panel · AI Learning Path · empty done · implementer
no verify command declared · +0 −9
Task 4 was recorded done unverified: Arm C — vector build: comparison-split ported to our tokens, rules drawing on th · AI Learning Path · empty done · implementer
no lines changed; no verify command declared · +0 −0
Task 5 was recorded done unverified: Arm D — hybrid multi-shot: the beat becomes 4-6 shots, panel for identity, vecto · AI Learning Path · empty done · implementer
no verify command declared · +0 −3
Task 6 was recorded done unverified: Arm E — handwritten skin of arm C using the hw-* family · AI Learning Path · empty done · designer
no verify command declared · +0 −4
Task 7 was recorded done unverified: Judge all five arms: layout gate, motion metric, frame grid, comprehension judge · AI Learning Path · empty done · reviewer
no lines changed; no verify command declared · +0 −0
Task 8 was recorded done unverified: Decide, record the verdict, and apply to the full episode only if a heavier arm · AI Learning Path · empty done · architect
no lines changed; no verify command declared · +0 −0
Plan awaiting approval — A plan you can read before anything runs — and approve from the same p… · Research Console
8 tasks drafted · approve once, then execution runs autonomously
Review & approve →
Plan awaiting approval — add a decision log · Research Console
10 tasks drafted · approve once, then execution runs autonomously
Review & approve →
Auto Social Posting 1 matched open project →
data-pipeline
64
AI Learning Path 1 matched open project →
other
65
Other new today · 10 — no active project matches
·
dev-tooling
18
·
Osmantic/ODS◑ WATCH
llm-runtime
30
·
security
65
·
llm-runtime
28
·
security
20
·
makeplane/plane○ IGNORE
dev-tooling
15
·
agent-framework
45
·
modular/modular◑ WATCH
llm-runtime
22
·
agent-framework
15
Full digest · 2026-08-21.md · past digests

Research Digest — 2026-08-21

17 entries today · 3 apply · 9 shelf · 5 ignored · 14 papers

Apply Now

  • ATH-MaaS/Pixelle-Video — other · video-generation, short-form, automation, composable, python, multimodal → AI Learning Path (tool)
  • docling-project/docling — data-pipeline · document-parsing, pdf-extraction, data-pipeline, multiformat, xbrl, agent-ready → Auto Social Posting, ClientCo Intelligence Line (agentic research) (tool)
  • stablyai/orca — dev-tooling · agent-orchestration, worktrees, claude-code, desktop, mobile, multi-agent → Research Console (this tool), ClientCo Intelligence Line (agentic research) (project)

Research Papers

Future Shelf

  • Osmantic/ODS — llm-runtime · local-ai, self-hosted, workflows, agents, rag, inference — WATCH
  • Tencent/AI-Infra-Guard — security · agent-scanning, mcp-security, skill-validation, red-teaming, ai-governance, jailbreak-detection — WATCH
  • agent-substrate/substrate — llm-runtime · agent-infrastructure, kubernetes, multiplexing, sandbox, google, agentic-os — WATCH
  • microsoft/agent-framework — agent-framework · orchestration, multi-agent, python-dotnet, observability, workflow, governance — WATCH
  • modular/modular — llm-runtime · mojo, max-framework, inference, ai-platform, compiler, accelerator — WATCH
  • pipecat-ai/pipecat — agent-framework · voice-agents, multimodal, real-time, orchestration, python, multi-agent — WATCH
  • smart-mcp-proxy/mcpproxy-go — dev-tooling · mcp, proxy, ai-agents, security, tool-federation, cross-platform — WATCH
  • smtg-ai/claude-squad — claude-tooling · session-manager, worktree-isolation, tmux, multi-agent, git, tui — WATCH
  • sourcebot-dev/sourcebot — dev-tooling · code-search, codebase-analysis, self-hosted, llm-powered, code-navigation, docker — WATCH

Ignored