fix(compat): pointers resolve to the object that MOVED, not a same-named stranger; stdin checker binds stdin= to the splatted definition

Review findings on #102117 (independent reviewer + itsflownium):

* hermes_cli.kanban_db.connect / connect_closing pointed at hermes_cli.projects_db (different DB, no
  board= parameter). The compat generator ranked candidate homes by path proximity when a name is
  defined in several modules. Now it requires shape compatibility with the BASE definition (same
  literal for constants, superset of parameter names for defs) and prefers the facade's own
  <stem>_* sibling. Same class fixed for tools.tts_tool.DEFAULT_XAI_BASE_URL (-> tts_tool_providers),
  and 17 constants/defs that had been pointed at same-named strangers (Matrix MAX_MESSAGE_LENGTH ->
  Signal's 8000, tts MAX_TEXT_LENGTH -> BlueBubbles', honcho/retaindb/supermemory *_SCHEMA -> another
  plugin's schema, ...) are now restored from BASE verbatim instead.
* send_yuanbao_direct (restored-def): body called adapter._outbound.send_direct, which HEAD moved to
  the sender; rewritten to adapter._outbound.sender.send_direct.
* COMPAT_MANIFEST.md states the scope explicitly: public top-level names only; private names and
  test monkeypatch seams are not preserved.
* scripts/check_subprocess_stdin.py: _splat_carries_stdin looked 30 lines ahead in the file text
  and was satisfied by an unrelated later stdin=; it now finds the splatted name's definition via AST
  and requires stdin inside that expression/body.

Tests: tests/test_compat_manifest_targets.py (pointer identity vs the facade's sibling; kanban
connect(board=) opens a Kanban DB, not projects.db; both FAIL on the previous layer),
test_subprocess_stdin_guard gains the false-negative probe, and the MoA -Q quiet-output contract
tests are back (tests/agent/test_moa_quiet_reference_output.py) against build_moa_facade.
This commit is contained in:
Teknium
2026-09-03 22:00:01 -07:00
parent ba030bc0db
commit a0be177aac
24 changed files with 676 additions and 236 deletions

View File

@@ -719,8 +719,8 @@
{
"facade": "agent.credential_sources",
"name": "register",
"kind": "moved-lazy",
"target": "tools.slash_confirm"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "agent.display",
@@ -809,8 +809,8 @@
{
"facade": "agent.learning_graph_render",
"name": "Run",
"kind": "moved-lazy",
"target": "hermes_cli.kanban_db"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "agent.lsp.eventlog",
@@ -1391,14 +1391,14 @@
{
"facade": "cli",
"name": "AIAgent",
"kind": "moved-lazy",
"target": "run_agent"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "cli",
"name": "CanonicalUsage",
"kind": "moved-lazy",
"target": "agent.usage_pricing"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "cli",
@@ -2008,13 +2008,13 @@
},
{
"facade": "gateway.platforms.qqbot.keyboards",
"name": "Awaitable",
"name": "Callable",
"kind": "restored-import",
"target": "typing"
},
{
"facade": "gateway.platforms.qqbot.keyboards",
"name": "Callable",
"name": "Awaitable",
"kind": "restored-import",
"target": "typing"
},
@@ -3510,13 +3510,13 @@
"facade": "hermes_cli.kanban_db",
"name": "connect",
"kind": "moved-lazy",
"target": "hermes_cli.projects_db"
"target": "hermes_cli.kanban_db_connect"
},
{
"facade": "hermes_cli.kanban_db",
"name": "connect_closing",
"kind": "moved-lazy",
"target": "hermes_cli.projects_db"
"target": "hermes_cli.kanban_db_connect"
},
{
"facade": "hermes_cli.kanban_db",
@@ -4667,8 +4667,8 @@
{
"facade": "hermes_cli.telegram_managed_bot",
"name": "poll_for_token",
"kind": "moved-lazy",
"target": "plugins.platforms.photon.auth"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "hermes_cli.telegram_managed_bot",
@@ -6738,7 +6738,7 @@
"facade": "hermes_cli.web_server",
"name": "run_backup",
"kind": "moved-lazy",
"target": "hermes_cli.backup"
"target": "hermes_cli.web_routers.ops"
},
{
"facade": "hermes_cli.web_server",
@@ -6774,7 +6774,7 @@
"facade": "hermes_cli.web_server",
"name": "run_import",
"kind": "moved-lazy",
"target": "hermes_cli.backup"
"target": "hermes_cli.web_routers.ops"
},
{
"facade": "hermes_cli.web_server",
@@ -6948,7 +6948,7 @@
"facade": "hermes_cli.web_server",
"name": "speak_text",
"kind": "moved-lazy",
"target": "hermes_cli.voice"
"target": "hermes_cli.web_routers.audio"
},
{
"facade": "hermes_cli.web_server",
@@ -7949,32 +7949,32 @@
{
"facade": "plugins.memory.honcho",
"name": "CONCLUDE_SCHEMA",
"kind": "moved-lazy",
"target": "plugins.memory.honcho.tool_schemas"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "plugins.memory.honcho",
"name": "CONTEXT_SCHEMA",
"kind": "moved-lazy",
"target": "plugins.memory.honcho.tool_schemas"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "plugins.memory.honcho",
"name": "PROFILE_SCHEMA",
"kind": "moved-lazy",
"target": "plugins.memory.honcho.tool_schemas"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "plugins.memory.honcho",
"name": "REASONING_SCHEMA",
"kind": "moved-lazy",
"target": "plugins.memory.honcho.tool_schemas"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "plugins.memory.honcho",
"name": "SEARCH_SCHEMA",
"kind": "moved-lazy",
"target": "plugins.memory.honcho.tool_schemas"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "plugins.memory.honcho",
@@ -8033,8 +8033,8 @@
{
"facade": "plugins.memory.mem0",
"name": "SEARCH_SCHEMA",
"kind": "moved-lazy",
"target": "plugins.memory.honcho.tool_schemas"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "plugins.memory.mem0",
@@ -8051,8 +8051,8 @@
{
"facade": "plugins.memory.retaindb",
"name": "CONTEXT_SCHEMA",
"kind": "moved-lazy",
"target": "plugins.memory.honcho.tool_schemas"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "plugins.memory.retaindb",
@@ -8093,8 +8093,8 @@
{
"facade": "plugins.memory.retaindb",
"name": "FORGET_SCHEMA",
"kind": "moved-lazy",
"target": "plugins.memory.openviking"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "plugins.memory.retaindb",
@@ -8105,38 +8105,38 @@
{
"facade": "plugins.memory.retaindb",
"name": "PROFILE_SCHEMA",
"kind": "moved-lazy",
"target": "plugins.memory.honcho.tool_schemas"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "plugins.memory.retaindb",
"name": "REMEMBER_SCHEMA",
"kind": "moved-lazy",
"target": "plugins.memory.openviking"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "plugins.memory.retaindb",
"name": "SEARCH_SCHEMA",
"kind": "moved-lazy",
"target": "plugins.memory.honcho.tool_schemas"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "plugins.memory.supermemory",
"name": "FORGET_SCHEMA",
"kind": "moved-lazy",
"target": "plugins.memory.openviking"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "plugins.memory.supermemory",
"name": "PROFILE_SCHEMA",
"kind": "moved-lazy",
"target": "plugins.memory.honcho.tool_schemas"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "plugins.memory.supermemory",
"name": "SEARCH_SCHEMA",
"kind": "moved-lazy",
"target": "plugins.memory.honcho.tool_schemas"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "plugins.memory.supermemory",
@@ -8255,8 +8255,8 @@
{
"facade": "plugins.platforms.dingtalk.adapter",
"name": "EXT_MAP",
"kind": "moved-lazy",
"target": "plugins.platforms.dingtalk.inbound"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "plugins.platforms.dingtalk.adapter",
@@ -8315,8 +8315,8 @@
{
"facade": "plugins.platforms.matrix.adapter",
"name": "MAX_MESSAGE_LENGTH",
"kind": "moved-lazy",
"target": "gateway.platforms.signal"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "plugins.platforms.matrix.adapter",
@@ -8630,11 +8630,17 @@
"kind": "moved-lazy",
"target": "plugins.spotify.tools"
},
{
"facade": "plugins.spotify.client",
"name": "json",
"kind": "restored-import",
"target": "json"
},
{
"facade": "plugins.spotify.client",
"name": "compact_json",
"kind": "moved-lazy",
"target": "gateway.hosted_rooms_common"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "plugins.spotify.client",
@@ -10724,18 +10730,18 @@
"kind": "moved-lazy",
"target": "tools.skill_manager_guards"
},
{
"facade": "tools.skill_usage",
"name": "tempfile",
"kind": "restored-import",
"target": "tempfile"
},
{
"facade": "tools.skill_usage",
"name": "os",
"kind": "restored-import",
"target": "os"
},
{
"facade": "tools.skill_usage",
"name": "tempfile",
"kind": "restored-import",
"target": "tempfile"
},
{
"facade": "tools.skill_usage",
"name": "_suppressed_file",
@@ -11874,7 +11880,7 @@
"facade": "tools.tts_tool",
"name": "DEFAULT_XAI_BASE_URL",
"kind": "moved-lazy",
"target": "tools.xai_http"
"target": "tools.tts_tool_providers"
},
{
"facade": "tools.tts_tool",
@@ -11984,11 +11990,17 @@
"kind": "moved-lazy",
"target": "tools.tts_tool_openai"
},
{
"facade": "tools.tts_tool",
"name": "FALLBACK_MAX_TEXT_LENGTH",
"kind": "restored-helper",
"target": "(deleted; restored as a dependency of MAX_TEXT_LENGTH)"
},
{
"facade": "tools.tts_tool",
"name": "MAX_TEXT_LENGTH",
"kind": "moved-lazy",
"target": "gateway.platforms.bluebubbles"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "tools.tts_tool",
@@ -12245,8 +12257,8 @@
{
"facade": "tools.voice_mode",
"name": "WHISPER_HALLUCINATIONS",
"kind": "moved-lazy",
"target": "tools.voice_mode_transcript"
"kind": "restored-def",
"target": "(deleted; BASE body restored)"
},
{
"facade": "tools.voice_mode",
@@ -12412,13 +12424,13 @@
},
{
"facade": "tui_gateway.compute_host",
"name": "field",
"name": "dataclass",
"kind": "restored-import",
"target": "dataclasses"
},
{
"facade": "tui_gateway.compute_host",
"name": "dataclass",
"name": "field",
"kind": "restored-import",
"target": "dataclasses"
},