{"server":"io.github.ajc3xc/meridian","count":10,"changes":[{"tool":"transfer_sprint_item_claim","kind":"changed","observed_at":"2026-09-27T13:14:06.578Z","fields":["description"],"description_before":"[MAINTENANCE] W1-I — hand a LIVE in_progress claim on a sprint item off to a different actor/session directly, without a reset-to-pending-then-reclaim cycle. The item's status never leaves in_progress, so there is no window where a third session could see it as pending and race to claim it out from under the intended recipient — only actor/claimed_at (and, best-effort, the underlying file/symbol resource locks) move to the new owner. Only the session recorded as the item's current actor may transfer its own claim away — a mismatch is refused (NOT_CLAIM_OWNER) unless force=true is explicitly passed. When to_session_id is given and the item declares touches_resources, each declared file:/symbol: lock is released under session_id and re-acquired under to_session_id via the same claim_file/claim_symbol machinery claim_sprint_item itself uses (a symbol: resource is released but not auto-reclaimed — re-acquiring a real AST-resolved range needs the file's current content, which this call doesn't have; the receiving session should claim_file(symbol=..., content=...) itself for those). Returns a structured {blocked: true, error: ...} dict (NOT_IN_PROGRESS / NOT_CLAIM_OWNER / SAME_ACTOR / RACE_LOST) rather than raising when it can't proceed; on success returns {item_id, prior_actor, prior_claimed_at, new_actor, transferred_resources, released_only_resources, item}. Persistent-state disclosure: on hosted Meridian, supplied text and project/session metadata -- including task log entries, pinned decisions, sprint items, notes, handoff/goal state, and HITL queue items -- are sent to and stored in Meridian's service, in an isolated per-tenant Postgres database (Neon); self-hosted deployments keep the same categories in the configured local SQLite/Postgres database. This data is visible in the dashboard and API, and may resurface in later project context or handoffs. Notes and pinned decisions can be deleted individually; task log entries and sprint items can be deleted via the dashboard/API (not exposed as an agent-facing tool); HITL queue items and handoff state have no per-record delete. Full removal of any of this data is available via project or account deletion, using the documented controls. Do not include secrets.","description_after":"[MAINTENANCE] W1-I — hand a LIVE in_progress claim on a sprint item off to a different actor/session directly, without a reset-to-pending-then-reclaim cycle. The item's status never leaves in_progress, so there is no window where a third session could see it as pending and race to claim it out from under the intended recipient — only actor/claimed_at (and, best-effort, the underlying file/symbol resource locks) move to the new owner. Only the session recorded as the item's current actor may transfer its own claim away — a mismatch is refused (NOT_CLAIM_OWNER) unless force=true is explicitly passed. When to_session_id is given and the item declares touches_resources, each declared file:/symbol: lock is released under session_id and re-acquired under to_session_id via the same claim_file/claim_symbol machinery claim_sprint_item itself uses (a symbol: resource's real AST-range claim is released but not auto-reclaimed — that needs the file's current content, which this call doesn't have; the receiving session should claim_file(symbol=..., content=...) itself for those — while a whole-file lock the claim took for it moves like a file: lock). When to_session_id is the session already holding the locks, only the actor changes and no lock moves. Returns a structured {blocked: true, error: ...} dict (NOT_IN_PROGRESS / NOT_CLAIM_OWNER / SAME_ACTOR / RACE_LOST) rather than raising when it can't proceed; on success returns {item_id, prior_actor, prior_claimed_at, new_actor, transferred_resources, released_only_resources, item}, plus kept_for_sibling_items for locks left with the current session because another of its in_progress items still needs them (never moved out from under it). Persistent-state disclosure: on hosted Meridian, supplied text and project/session metadata -- including task log entries, pinned decisions, sprint items, notes, handoff/goal state, and HITL queue items -- are sent to and stored in Meridian's service, in an isolated per-tenant Postgres database (Neon); self-hosted deployments keep the same categories in the configured local SQLite/Postgres database. This data is visible in the dashboard and API, and may resurface in later project context or handoffs. Notes and pinned decisions can be deleted individually; task log entries and sprint items can be deleted via the dashboard/API (not exposed as an agent-facing tool); HITL queue items and handoff state have no per-record delete. Full removal of any of this data is available via project or account deletion, using the documented controls. Do not include secrets.","description_similarity":0.902,"before_hash":"d2de4c553ae7c60c4c47f7bd69a68a41","after_hash":"b6543535509dc6261e8e5dae90b529fb"},{"tool":"release_sprint_item_claim","kind":"changed","observed_at":"2026-09-27T13:14:06.578Z","fields":["description"],"description_before":"[MAINTENANCE] W1-I — voluntarily release a LIVE in_progress claim on a sprint item back to pending. Distinct from reconcile_stale_claims: that tool is for a claim whose owning session is dead/abandoned (multi-signal liveness classification); this is for a session that is still alive and has simply decided not to work the item after all (wrong scope, superseded, claimed by mistake) and wants to hand it back to the board cleanly instead of going silent and letting it eventually get swept as stale. Only the session recorded as the item's current actor may release its own claim — a mismatch is refused (NOT_CLAIM_OWNER) unless force=true is explicitly passed. Also clears the item's claimed_at/actor columns (not just status) and releases any file/symbol resource locks the claim held. Returns a structured {blocked: true, error: ...} dict (NOT_IN_PROGRESS / NOT_CLAIM_OWNER / RACE_LOST) rather than raising when it can't proceed; on success returns {item_id, prior_actor, prior_claimed_at, released_resources, item}. Persistent-state disclosure: on hosted Meridian, supplied text and project/session metadata -- including task log entries, pinned decisions, sprint items, notes, handoff/goal state, and HITL queue items -- are sent to and stored in Meridian's service, in an isolated per-tenant Postgres database (Neon); self-hosted deployments keep the same categories in the configured local SQLite/Postgres database. This data is visible in the dashboard and API, and may resurface in later project context or handoffs. Notes and pinned decisions can be deleted individually; task log entries and sprint items can be deleted via the dashboard/API (not exposed as an agent-facing tool); HITL queue items and handoff state have no per-record delete. Full removal of any of this data is available via project or account deletion, using the documented controls. Do not include secrets.","description_after":"[MAINTENANCE] W1-I — voluntarily release a LIVE in_progress claim on a sprint item back to pending. Distinct from reconcile_stale_claims: that tool is for a claim whose owning session is dead/abandoned (multi-signal liveness classification); this is for a session that is still alive and has simply decided not to work the item after all (wrong scope, superseded, claimed by mistake) and wants to hand it back to the board cleanly instead of going silent and letting it eventually get swept as stale. Only the session recorded as the item's current actor may release its own claim — a mismatch is refused (NOT_CLAIM_OWNER) unless force=true is explicitly passed. Also clears the item's claimed_at/actor columns (not just status) and releases any file/symbol resource locks the claim held. Returns a structured {blocked: true, error: ...} dict (NOT_IN_PROGRESS / NOT_CLAIM_OWNER / RACE_LOST) rather than raising when it can't proceed; on success returns {item_id, prior_actor, prior_claimed_at, released_resources, item}, plus kept_for_sibling_items when a lock was deliberately kept because another in_progress item held by the same session still declares that file/symbol. Persistent-state disclosure: on hosted Meridian, supplied text and project/session metadata -- including task log entries, pinned decisions, sprint items, notes, handoff/goal state, and HITL queue items -- are sent to and stored in Meridian's service, in an isolated per-tenant Postgres database (Neon); self-hosted deployments keep the same categories in the configured local SQLite/Postgres database. This data is visible in the dashboard and API, and may resurface in later project context or handoffs. Notes and pinned decisions can be deleted individually; task log entries and sprint items can be deleted via the dashboard/API (not exposed as an agent-facing tool); HITL queue items and handoff state have no per-record delete. Full removal of any of this data is available via project or account deletion, using the documented controls. Do not include secrets.","description_similarity":0.954,"before_hash":"2949d142735920412d6ec82c0c2927e6","after_hash":"1aae234c6057a398be31c5439afa9926"},{"tool":"update_sprint_item","kind":"changed","observed_at":"2026-09-27T13:14:06.578Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"6f179c91208ec0c2aa2bdc18b3fd1731","after_hash":"0c418580f2fc4f4ce76cae972949105d"},{"tool":"fan_out_sprint_items","kind":"changed","observed_at":"2026-09-27T13:14:06.578Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"19001142e84ae78a40df8278361c058b","after_hash":"da789e48a4917ffd5c1ab6d8642436eb"},{"tool":"add_sprint_item","kind":"changed","observed_at":"2026-09-27T13:14:06.578Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"ec9b2e4f486b1742a6916bc91c7d2ce6","after_hash":"df19b9fd548f6db1a03a31802a3f4c42"},{"tool":"run_watchlist_query","kind":"changed","observed_at":"2026-09-27T01:26:36.757Z","fields":["description"],"description_before":"[SUPPORT] b924fd7c — re-run a saved watchlist query and diff its results against everything already captured for it. Every newly-seen result (matched by a per-source stable id — arxiv_id/openalex_id/s2_id/pmid/sha/repo/hn_id, falling back to url) is auto-captured via the same durable path as capture_research_finding/save_finding, tagged so the NEXT run recognizes it as already-seen. Returns {new_count, already_seen_count, new_results, captured, total_results}. Never raises — an unresolvable watchlist_id or a network/parse failure from the underlying search both degrade to {error}. Persistent-state disclosure: on hosted Meridian, supplied text and project/session metadata -- including task log entries, pinned decisions, sprint items, notes, handoff/goal state, and HITL queue items -- are sent to and stored in Meridian's service, in an isolated per-tenant Postgres database (Neon); self-hosted deployments keep the same categories in the configured local SQLite/Postgres database. This data is visible in the dashboard and API, and may resurface in later project context or handoffs. Notes and pinned decisions can be deleted individually; task log entries and sprint items can be deleted via the dashboard/API (not exposed as an agent-facing tool); HITL queue items and handoff state have no per-record delete. Full removal of any of this data is available via project or account deletion, using the documented controls. Do not include secrets.","description_after":"[SUPPORT] b924fd7c — re-run a saved watchlist query and diff its results against everything already captured for it. Every newly-seen result (matched by a per-source stable id — arxiv_id/openalex_id/s2_id/pmid/doi/core_id/sha/repo/hn_id, falling back to url) is auto-captured via the same durable path as capture_research_finding/save_finding, tagged so the NEXT run recognizes it as already-seen. Returns {new_count, already_seen_count, new_results, captured, total_results}. Never raises — an unresolvable watchlist_id or a network/parse failure from the underlying search both degrade to {error}. Persistent-state disclosure: on hosted Meridian, supplied text and project/session metadata -- including task log entries, pinned decisions, sprint items, notes, handoff/goal state, and HITL queue items -- are sent to and stored in Meridian's service, in an isolated per-tenant Postgres database (Neon); self-hosted deployments keep the same categories in the configured local SQLite/Postgres database. This data is visible in the dashboard and API, and may resurface in later project context or handoffs. Notes and pinned decisions can be deleted individually; task log entries and sprint items can be deleted via the dashboard/API (not exposed as an agent-facing tool); HITL queue items and handoff state have no per-record delete. Full removal of any of this data is available via project or account deletion, using the documented controls. Do not include secrets.","description_similarity":0.987,"before_hash":"2d9e027dcf526b649223a7d3f7c2b7a5","after_hash":"e72a1654aaab091f1af8193f326e5690"},{"tool":"list_watchlist_queries","kind":"changed","observed_at":"2026-09-27T01:26:36.757Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"02ec4fba7266c3d74601100ac18489c8","after_hash":"48812c8991c56278c84f005af36f36f2"},{"tool":"save_watchlist_query","kind":"changed","observed_at":"2026-09-27T01:26:36.757Z","fields":["description","inputSchema"],"description_before":"[SUPPORT] b924fd7c — save a recurring research query so it can be re-run and diffed over time via run_watchlist_query. Persisted as a project note (no separate table); the returned watchlist_id addresses it. Sources beyond paper_search's own 'arxiv'/'openalex' are reachable here by calling the underlying search function directly: 'semantic_scholar' and 'pubmed' (meridian.paper_search), 'github_code'/'github_repo' (meridian.github_search), and 'hn' (meridian.social_search). Persistent-state disclosure: on hosted Meridian, supplied text and project/session metadata -- including task log entries, pinned decisions, sprint items, notes, handoff/goal state, and HITL queue items -- are sent to and stored in Meridian's service, in an isolated per-tenant Postgres database (Neon); self-hosted deployments keep the same categories in the configured local SQLite/Postgres database. This data is visible in the dashboard and API, and may resurface in later project context or handoffs. Notes and pinned decisions can be deleted individually; task log entries and sprint items can be deleted via the dashboard/API (not exposed as an agent-facing tool); HITL queue items and handoff state have no per-record delete. Full removal of any of this data is available via project or account deletion, using the documented controls. Do not include secrets.","description_after":"[SUPPORT] b924fd7c — save a recurring research query so it can be re-run and diffed over time via run_watchlist_query. Persisted as a project note (no separate table); the returned watchlist_id addresses it. Every paper_search source ('arxiv', 'openalex', 'semantic_scholar', 'pubmed', 'crossref', 'core' — core needs CORE_API_KEY) is available, plus 'github_code'/'github_repo' (meridian.github_search) and 'hn' (meridian.social_search). Persistent-state disclosure: on hosted Meridian, supplied text and project/session metadata -- including task log entries, pinned decisions, sprint items, notes, handoff/goal state, and HITL queue items -- are sent to and stored in Meridian's service, in an isolated per-tenant Postgres database (Neon); self-hosted deployments keep the same categories in the configured local SQLite/Postgres database. This data is visible in the dashboard and API, and may resurface in later project context or handoffs. Notes and pinned decisions can be deleted individually; task log entries and sprint items can be deleted via the dashboard/API (not exposed as an agent-facing tool); HITL queue items and handoff state have no per-record delete. Full removal of any of this data is available via project or account deletion, using the documented controls. Do not include secrets.","description_similarity":0.878,"before_hash":"e383f5de2ecfcea2ede1da214b8e306b","after_hash":"4043cd9cf4dd5e5087b293b0d2527fc4"},{"tool":"paper_search","kind":"changed","observed_at":"2026-09-27T01:26:36.757Z","fields":["description","inputSchema"],"description_before":"[SUPPORT] Search academic papers — a REAL external lookup (keyless). Per the research-routing protocol, use this FIRST for academic/paper questions (cite the paper itself, not a secondary write-up), then capture_research_finding to save what you cite. Two keyless sources via the 'source' param: 'arxiv' (default; preprints, physics/CS/math) and 'openalex' (published journal/conference works across every discipline). Both return the same shape: {query, count, results:[{title, authors, summary, published, url, pdf_url, ...}]} — arxiv rows carry arxiv_id, openalex rows carry openalex_id + doi.","description_after":"[SUPPORT] Search academic papers — a REAL external lookup. Per the research-routing protocol, use this FIRST for academic/paper questions (cite the paper itself, not a secondary write-up), then capture_research_finding to save what you cite. Sources via the 'source' param: 'arxiv' (default; preprints, physics/CS/math), 'openalex' (broadest journal/conference coverage across every discipline), 'semantic_scholar' (citation counts + TL;DRs), 'pubmed' (biomedical/agricultural), 'crossref' (the DOI registry: best for DOI resolution and venue metadata — journal name, ISSN, publisher — weaker for topical discovery), and 'core' (open-access full-text aggregator; needs CORE_API_KEY on the server and returns an explicit error without it). All keyless except 'core'. Every source returns the same base shape: {query, count, results:[{title, authors, summary, published, url, pdf_url, ...}]} plus a per-source id — arxiv_id, openalex_id (+doi), s2_id (+doi, citation_count, tldr), pmid (+doi), doi (crossref: +venue, issn, publisher, type, citation_count), or core_id (+doi, venue, has_full_text). An unknown source returns {error}.","description_similarity":0.525,"before_hash":"e282518d75b9e4466ba7682622922e95","after_hash":"24809b249bdc9076fe65ddb5df5ccc2f"},{"tool":"get_tunnel_diagnostics","kind":"changed","observed_at":"2026-09-25T12:44:16.655Z","fields":["description"],"description_before":"[MAINTENANCE] f1e0df55 — Read-only: ONE layered diagnostic snapshot of your tunnel/connectors, separating what's SAVED in the dashboard from what's ACTUALLY running so a saved-but-not-yet-applied setting is never reported as active. Per slot (fs/code/extract/ppt/word/dc/docs/zotero/outputs/debug): dashboard_configured (persisted), process_active (live server-side socket), external_child_state (last client-reported lifecycle state), last_error, and exact remediation text — plus one of five distinct states: healthy, stale, degraded, quarantined, or restart_required (persisted config and observed runtime disagree). Also reports the server-side tool routing cache size, a config generation + manifest_hash fingerprint for drift detection, and whether a tools/list re-discovery is pending. Includes a run_id + timestamp for correlating with support requests. Tokens/credentials are redacted. Requires an authenticated hosted tenant (tunnel mode) — self-hosted callers with no tenant get an empty, unauthenticated-shaped snapshot.","description_after":"[MAINTENANCE] f1e0df55 — Read-only: ONE layered diagnostic snapshot of your tunnel/connectors, separating what's SAVED in the dashboard from what's ACTUALLY running so a saved-but-not-yet-applied setting is never reported as active. Per slot (fs/code/extract/ppt/word/dc/docs/zotero/outputs/debug): dashboard_configured (persisted), process_active (live server-side socket), external_child_state (last client-reported lifecycle state), last_error, and exact remediation text — plus one of five distinct states: healthy, stale, degraded, quarantined, or restart_required (persisted config and observed runtime disagree). 43fcdf9f — HONESTY CONTRACT: healthy_reported/state are a CACHED last-known-state flag from the last plugin_status message the server received (or the default when none ever arrived), NEVER a live, request-level probe of that slot right now — a slot can read 'healthy' here while real calls through it are actively failing (e.g. an edge/Cloudflare error the client never self-reports). Use health_basis ('client_reported' vs 'default_assumed'), health_reported_at, and health_age_seconds on each slot to see how stale that flag actually is before trusting a green status. Also reports the server-side tool routing cache size, a config generation + manifest_hash fingerprint for drift detection, and whether a tools/list re-discovery is pending. Includes a run_id + timestamp for correlating with support requests. Tokens/credentials are redacted. Requires an authenticated hosted tenant (tunnel mode) — self-hosted callers with no tenant get an empty, unauthenticated-shaped snapshot.","description_similarity":0.711,"before_hash":"61df78a37cd9674b4b0662ae8fc05a2d","after_hash":"d36b99b0a63d4204a9b663e6ff9dbc6b"}],"next_before":null,"next_actions":[]}