feat(STATE-WP-0079): retire the suggestion-backlog surface (slice E1)
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Build and Publish Multi-Context Image / build-and-push (push) Successful in 37s

History is archived fleet-side, so the read surface has no remaining job.

- api/routers/suggestions.py: whole prefix 410s with a pointer to intake and
  to the archive; the router drops from 176 lines to a stub
- mcp_server: the 6 suggestion tools removed outright rather than stubbed --
  a retired tool that still appears in the tool list costs every agent
  session context on every call, which is the opposite of retiring it
- write_idempotency: 5 /suggestions rules dropped
- dashboard: suggestions.md deleted, nav entry removed, reference.md and
  wsjf-triage.md updated; docs/suggestions.md rewritten as archive pointer
- tests: two tests pinned the old read-live behaviour and now pin the
  retirement contract instead

Tables stay: they are retire/archive in SHR-INV-0001 and are captured by the
final dump at T06.

Untouched, and worth knowing during cutover: ui-feedback.md / todo.md
'suggestions' are Shift+click dashboard feedback backed by technical_debt, a
different entity that shares the word. E3 (dashboard-meta) is that page; its
owner is state-hub-until-cutover so it retires at the T06 window, not now.

Full suite 612 passed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-08-20 08:11:14 +02:00
parent 98af485cd5
commit fb363b37d3
13 changed files with 148 additions and 447 deletions

View file

@ -1222,108 +1222,20 @@ def get_next_steps() -> str:
# ---------------------------------------------------------------------------
# Demand-weighted suggestion backlog (STATE-WP-0061)
# Suggestion backlog — RETIRED (STATE-WP-0079-T05, slice E1)
# ---------------------------------------------------------------------------
@mcp.tool()
def list_suggestions(
domain: str | None = None,
stage: str | None = None,
rank: str | None = None,
limit: int = 50,
) -> str:
"""List persisted suggestions, optionally ranked by WSJF."""
return json.dumps(
_get("/suggestions", {
"domain": domain,
"stage": stage,
"rank": rank,
"limit": limit,
}),
indent=2,
)
@mcp.tool()
def create_suggestion(
domain: str,
title: str,
description: str | None = None,
origin_ref: str | None = None,
workplan_id: str | None = None,
base_value: float = 3.0,
job_size: float = 3.0,
) -> str:
"""Retired (CUST-WP-0061-T06, 2026-07-21): suggestions are read-only
legacy. Use create_intake instead (kind: intake per canon/standards/
work-record-types_v0.1.md). This call now 410s server-side; kept only
so old callers get a clear error instead of a missing tool."""
return json.dumps(_post("/suggestions", {
"domain": domain,
"title": title,
"description": description,
"origin_ref": origin_ref,
"workplan_id": workplan_id,
"base_value": base_value,
"job_size": job_size,
}), indent=2)
@mcp.tool()
def vet_suggestion(suggestion_id: str, note: str, author: str | None = None) -> str:
"""Retired (CUST-WP-0061-T06, 2026-07-21): suggestions are read-only
legacy. There is no vet/route equivalent needed for intake use
route_intake directly. This call now 410s server-side."""
return json.dumps(_post(f"/suggestions/{suggestion_id}/vet", {
"note": note,
"author": author,
}), indent=2)
@mcp.tool()
def decline_suggestion(suggestion_id: str, note: str, author: str | None = None) -> str:
"""Retired (CUST-WP-0061-T06, 2026-07-21): suggestions are read-only
legacy. Use close_intake(outcome="declined") instead. This call now
410s server-side."""
return json.dumps(_post(f"/suggestions/{suggestion_id}/decline", {
"note": note,
"author": author,
}), indent=2)
@mcp.tool()
def promote_suggestion_to_task(
suggestion_id: str,
note: str | None = None,
task_title: str | None = None,
author: str | None = None,
) -> str:
"""Retired (CUST-WP-0061-T06, 2026-07-21): suggestions are read-only
legacy. Use route_intake then the promote-intake CLI
(scripts/promote_intake.py --to task) instead. This call now 410s
server-side."""
return json.dumps(_post(f"/suggestions/{suggestion_id}/promote", {
"note": note,
"task_title": task_title,
"author": author,
}), indent=2)
@mcp.tool()
def bump_suggestion_relevance(
suggestion_id: str,
reason: str | None = None,
author: str | None = None,
) -> str:
"""Retired (CUST-WP-0061-T06, 2026-07-21): suggestions are read-only
legacy relevance/WSJF scoring has no intake equivalent yet (ordering
is lane+priority+age per the founder-reviewed architecture draft).
This call now 410s server-side."""
return json.dumps(_post(f"/suggestions/{suggestion_id}/bump-relevance", {
"reason": reason,
"author": author,
}), indent=2)
# The six suggestion tools (list/create/vet/decline/promote/bump) were removed
# on 2026-08-20. Mutations had 410'd since CUST-WP-0061-T06; the reads existed
# only to keep the historical backlog reachable, and that history is now
# archived at the-custodian/docs/archived-suggestion-backlog.md.
#
# Successor: the intake work-record entity — create_intake / route_intake /
# close_intake, and scripts/promote_intake.py --to task. See
# canon/standards/work-record-types_v0.1.md.
#
# Kept as a comment rather than as 410 stubs: a retired tool that still appears
# in the tool list costs every agent session context on every call, which is the
# opposite of retiring it.
# ---------------------------------------------------------------------------
# Dependency graph tools (S1.4)