triage
Status tracker for items logged in MCP Agent Feedback+log (append-only; do not edit that card). Maintained by AI triage. Created 2026-06-08. Angle brackets escaped as </> per the Decko span-stripping bug (T1). Items are shared across both wikis (hyperon-* forked from magi-archive-*); this mirrors the Magi Archive triage card.
Open items
| ID | Tool(s) | Cat | Summary | Component | Sev | Status |
|---|---|---|---|---|---|---|
| T1 | create_card / update_card / batch_cards / find_and_replace | bug | Decko deletes everything between a literal < and the next > on Markdown-typed cards — silent multi-KB data loss | Wiki app (Decko content processor) | Critical | fixed — mod/markdown_fixes (clean_html?=false + sanitize Kramdown output) deployed MA+HW prod 2026-06-08, branch fix/markdown-clean-html; verified zero data loss + render XSS-safe |
| T2 | batch_cards | bug | Returns generic Card::Error / internal_error but the create actually committed | MCP wrapper + post-create hook | High | fixed (dev) — handle_error now returns exception_message (no more bare Card::Error); branch fix/create-error-handling. Dev-verified both wikis; deployed MA+HW prod 2026-06-08 |
| T3 | create_card | bug | Spurious "Name must be unique; already exists" returned after a successful create | Wiki app / MCP | High | fixed (dev) — create returns success (already_existed:true) when a live card holds the intended content; real different-content collision still errors; branch fix/create-error-handling. Dev-verified; deployed MA+HW prod 2026-06-08 |
| T4 | restore_card | bug | Cannot restore +tag Pointer subcards from trash though list_trash shows them | MCP / wiki trash lookup | Medium | investigated 2026-06-08 — ROOT CAUSE: Decko clears name/key columns when a junction (+tag) card is trashed (name recomputed live from left_id+right_id), so set_card's name lookups and Card.fetch(look_in_trash) miss it; restore also needs name/key repopulated (trash=false alone is insufficient — verified). Needs a careful fix to the trash/restore path (resolve trashed junctions by left_id+right_id + repopulate name on restore). Workaround: recreate via create_card (now idempotent, T3). DECISION 2026-06-08: keep documented + create_card workaround; defer the deeper trash/restore fix. NOTE 2026-06-08: the existing fix/restore-from-trash branch is STALE (pre-Decko-0.20, fully behind main, even removes the restore route) — not a usable base; T4 must be implemented fresh. ✅ FIXED 2026-06-09 — deployed MA+HW prod (branch fix/restore-trashed-junction): set_card resolves trashed junctions by left_id+right_id (find_trashed_junction helper); restore_from_trash calls @card.expire after un-trash. Verified end-to-end on BOTH wikis (create→delete→restore_card of a +tag now succeeds, content intact). |
| T5 | create_weekly_summary | bug | Reports "0 commits / 0 repositories" — does not recurse into sibling .git dirs under base_path | MCP server | High | fixed — branch fix/weekly-summary-windows-path pushed to both MCP repos 2026-06-08 (root cause: Dir.glob escapes backslashes in Windows base_path); pending merge/deploy. ✅ VERIFIED + MERGED to main 2026-06-21 (PRs magi#7 / hyperon#4): fix confirmed — raw Windows base_path scanned 0 repos, normalized scanned 67. The 2026-06-15 re-report was non-deployment only, not a fix defect. DEPLOY: create_weekly_summary runs on the LOCAL machine, so local stdio gems pick this up on MCP-client relaunch; prod hosted pull+restart pending user say-so. |
| T6 | search_by_tags / get_tags | bug | search_by_tags crashes "no implicit conversion of String into Integer"; get_tags returns empty registry | MCP / wiki | Med-High | search_by_tags fixed — branch fix/search-by-tags (both MCP repos): returns a result hash (crash gone) + matches the +tags Pointer model; verified vs prod 2026-06-08. NOTE: get_tags all-tags registry still empty (needs server-side enumeration of +tags cards; tied to T7 name-search). get_tags(card_name) works. |
| T7 | search_cards / run_query / list_children | bug | New-card full-text index lag; CQL name~ filter ignored; order_by/sort ignored; list_children rejects sort | Wiki CQL/index + MCP | Medium | PARTIAL — (2) filterless-query footgun FIXED: run_query now rejects queries with no recognized filter (or raw CQL strings) instead of returning all ~15k cards; branch fix/run-query-filter-guard; dev-verified; deployed MA+HW prod 2026-06-08. REMAINING: (1) new-card full-text index lag = Decko-internal indexing timing; (3) run_query sort/order_by and (4) list_children sort = IMPLEMENTED (sort=name|created|updated, dir=asc|desc); deployed MA+HW prod 2026-06-08 (branches fix/run-query-sort [Decko] + fix/mcp-sort-params [MCP gems]); verified. REMAINING: (1) new-card full-text index lag = Decko-internal indexing timing, not addressed. |
| T8 | admin_backup | feature_request | Guarantee off-cloud landing: gzip, chunked/resumable or scp fallback, fetch existing backup by filename, verify checksum | MCP server | Medium | PARTIAL — fetch-existing-by-filename IMPLEMENTED: admin_backup 'download' now accepts a filename to pull an existing server-side backup off-cloud (routes to the pre-existing /admin/database/backup/download/:filename endpoint; omit filename to create a fresh dump). Branch fix/admin-backup-fetch (both MCP repos); pushed. SPEC for remaining off-cloud-guarantee gaps: (a) gzip the dump before transfer (pg_dump | gzip → .sql.gz, ~half size); (b) return+verify a sha256 checksum so 'success' means bytes landed intact; (c) large-dump reliability — chunked/resumable download or scp fallback when the inline stream times out; (d) one-call op that dumps-or-selects + compresses + transfers + verifies + only-then-reports-success, optionally cleaning up the server copy. (a)/(b) tractable server+client additions; (c) needs transfer-layer work. ✅ UPDATE 2026-06-09: gzip (a) + checksum (b) IMPLEMENTED + deployed MA+HW prod (branch fix/backup-gzip-checksum, Decko + MCP gems). Backups are now .sql.gz (~3x smaller) with an X-Backup-SHA256 header; MCP verify_and_save checks it + uses File.binwrite. Verified end-to-end on HW (create + download-by-filename: gzip valid, header sha256 == file sha256). Remaining: (c) resumable/scp transfer + (d) one-call dump→compress→transfer→verify→cleanup orchestration are still spec-only. |
| T10 | create_weekly_summary | bug + feature_request | Wiki card-update count silently capped at 500 (days=5 → 228 accurate; days=6/7 → flat 500); no pagination/offset; run_query updated_at is exact/IN only (not range/"since") so cannot substitute for date-window counts | MCP server | Medium | NEW — logged 2026-06-15 (MA +log). Asks: (1) surface a truncation flag + true total ("500+" / "showing 500 of N"); (2) add an offset/page param; (3) related — run_query updated_at range/since support. ✅ RESOLVED 2026-06-22 (gem PRs magi#8 / hyperon#5, merged to main; reaches prod hosted on its next restart — not force-restarted, since the weekly summary runs from the LOCAL client, not the hosted server): create_weekly_summary now reports the TRUE total (Decko SQL count) + a truncation note ("Showing the N most recent of M") and adds a card_limit param to raise the 500 display cap; preview hash gains card_updates_total/_shown/_truncated. Gem-only (Decko date-range endpoint already returns the true count). Local working trees patched + tested (relaunch local MCP client to use). Sub-item (3) run_query updated_at/created_at range/since support ✅ RESOLVED 2026-06-24: Decko CQL only honors the keyword operators "gt"/"lt" with STRING date values — a raw [">=", date] was parsed as an IN-list (the bug) and a Time value is rejected ("Invalid value type: Time"). add_date_condition now maps >, >=, <, <= onto gt/lt with normalized date strings and expresses "between" via an :and of two bounds; the run_query tool schema now advertises updated_at/created_at with operator docs. Deployed + verified LIVE on MA + HW (since/before/between filter correctly + combine with name/type/content). Decko-app PRs magi-archive#11 / hyperon-wiki#26 (open for review — fix already live on prod); gem PRs magi-archive-mcp#26 / hyperon-wiki-mcp#23 merged (relaunch local client / next hosted restart to use the new schema docs). |
| T11 | create_weekly_summary | bug | Repo scan reports a silent "0 commits / 0 repositories" when base_path is unreadable (e.g. run via the hosted connector, whose server-side process cannot see the client's local Windows filesystem) | MCP server | Medium | NEW — logged 2026-06-22. Fix: warn when base_path is missing/unreadable (or 0 repos found) instead of a silent 0/0 that reads as "no work this week". Relates to T5 (local backslash bug, fixed 2026-06-21). ✅ RESOLVED 2026-06-22 (gem PRs magi#9 / hyperon#6, merged to main + local trees patched): create_weekly_summary now warns (executive line + a Repository note + a repo_scan_warning field) when base_path is unreadable or no repos are found, instead of a silent 0/0. |
| T12 | create_weekly_summary | bug | Repo discovery should handle git worktrees + submodules (their .git is a FILE with a gitdir: pointer, not a dir) and DEDUPE commits by hash across worktrees (they share one object store); repos may also live outside base_path | MCP server | Medium | NEW — logged 2026-06-22. Note: current Dir.glob already matches entries named .git as files too, so worktrees may already be found — the reported omission was likely the T11 0/0; the dedupe gap + base-path-as-worktree are the solid valid parts. ✅ RESOLVED 2026-06-22 (gem PRs magi#25 / hyperon#22, merged to main + local trees patched): find_git_repos now accepts a .git FILE (worktree/submodule gitdir pointer), not just a .git dir; scan_git_repos dedupes commits by hash across trees sharing an object store. Regression specs added. ("Repos outside base_path" = out of scope — would need an explicit repo-list param.) |
| T13 | (all tools) | feature_request | Declare/document each tool's OUTPUT format so agents can anticipate the response shape (currently only input schemas are declared) | MCP server | Medium | NEW — relayed via Codex/ChatGPT 2026-06-22. Options: (A) outputSchema per tool (MCP-native, machine-readable); (B) document output shape in each tool description; (C) single reference card. INVESTIGATED 2026-06-22: mcp gem 0.11.0 DOES support output_schema (Tool.output_schema, advertised in tools/list as outputSchema; Response supports structured_content; no forced validation). Tools currently return JSON-as-TEXT, not structuredContent. Approach pending user decision: (A) author output_schema + emit structured_content per tool (~37 tools x2 gems; durable + machine-readable, the proper MCP-native answer); (B) append an "Output:" blurb to each tool description (lighter, prose); (C) one reference card. Sizable either way; to be scoped as its own pass. ✅ PILOT DONE 2026-06-22 (gem PRs magi#10 / hyperon#7, merged to main + local trees patched): chose option (A) — output_schema (advertised in tools/list) + structured_content (machine-parseable result) added to the 3 highest-traffic read tools: get_card, search_cards, list_children. Pattern validated (schema is advisory — the mcp gem does not validate results against it; structured_content is additive; fully backward-compatible). ✅ COMPLETE 2026-06-22 (14 batches, gem PRs magi #10–24 / hyperon #7–21): ALL 40 standard MCP tools now advertise outputSchema in tools/list + return structuredContent (machine-parseable) — both gems, merged to main + local trees patched. (hyperon atomspace/* Lane-C tools excluded — separate unmerged feature.) One mid-rollout syntax slip (batch 4) was hotfixed the same day; every batch now gates ruby -c + load BEFORE commit. |
Already resolved (no action)
- list_children truncation / compound-name search — fixed & deployed 2026-04-09 (developer reply in +log)
- append_content separator escape sequences — fixed & deployed 2026-04-10 (developer reply in +log)
Out of scope / dropped
- zekel-mcp__apply_move (Dragonwood wound-discard, landscape-refill) — different MCP server / game project, not this codebase. Pending user direction on whether to pursue in the zekel repo.
- integration_test entries and the manual "test of submit_feedback" entry — noise, dropped.
T9 — auto_link nested-anchor / filename bug (logged 2026-06-09, HW)
✅ FIXED 2026-06-09 — deployed MA+HW prod (branch fix/autolink-nesting-guard). Root cause: Decko's URI/Host/Email chunks (card-mod-content) (1) re-linkified URL/email text already inside an <a> on every render — context_ok? only checked 2 preceding chars — so anchors nested ~13 deep in STORED content as the WYSIWYG editor round-tripped them; (2) HostUri linkified schemeless bare source-filenames (nace.py, airis_stable.py) into http://nace.pybecause its ccTLD list overlaps code extensions (.py/.rs/.sh/.js/...). Fix: new ChunkAutolinkGuards prepended to Card::Content::Chunk::Uri.singleton_class (inherited by EmailUri/HostUri) adds two context_ok? rejections — skip matches inside an open <a>; skip schemeless matches whose final segment is a known source-file extension. Real URLs, real bare domains (docs.asichain.io), and emails still link. Verified by render test on both wikis. NOTE: this stops NEW accumulation; already-mangled stored cards still need the one-shot cleanup (scripts/clean_autolinker_artifacts.py).