Skip to content

chore(specs): gardener checkbox sync - #870

Merged
Dumbris merged 2 commits into
mainfrom
claude/spec-gardener
Jul 29, 2026
Merged

Dumbris merged 2 commits into
mainfrom
claude/spec-gardener

Conversation

@Dumbris

@Dumbris Dumbris commented Jul 20, 2026 •

Copy link
Copy Markdown
Member

Spec-gardener run: 2026-07-20. Applied 15 checkbox ticks, proposing 1 un-tick candidate (NOT applied), across 34 specs with tick/un-tick candidates surfaced by scripts/check-spec-evidence.py.

Applied ticks

Spec / Task File:Line Decisive code
009-proactive-oauth-refresh T055 frontend/src/components/ServerCard.vue:163 + internal/health/calculator.go:211-217 v-if="healthAction === 'login'"; CalculateHealth sets Action:ActionLogin when OAuthStatus=="expired"
009-proactive-oauth-refresh T056 frontend/src/components/ServerCard.vue:156,166,176 Login button uses class="btn btn-sm btn-primary", identical to sibling Enable/Restart buttons
009-proactive-oauth-refresh T061 frontend/src/components/ServerCard.vue:208-215 v-if="canLogout" gates on server.authenticated===true (canLogout, line 575-576) plus sensible UX refinements
009-proactive-oauth-refresh T063 frontend/src/components/ServerCard.vue:708 await serversStore.triggerOAuthLogout(props.server.name)
042-telemetry-tier2 T001 internal/telemetry/telemetry.go:76,290,569,677 Service/HeartbeatPayload/Start() confirmed at cited lines, send() is actually named sendHeartbeat() (the noted drift)
042-telemetry-tier2 T002 internal/httpapi/middleware.go:29, internal/httpapi/server.go:605-606 SurfaceClassifierMiddleware wired into chi router chain
042-telemetry-tier2 T003 internal/server/mcp.go:1254,1701,815,854,914 handleRetrieveTools/call_tool variants/code_execution/upstream_servers/quarantine_security handler entry points confirmed at cited locations
042-telemetry-tier2 T004 internal/cliclient/client.go:55,64 X-MCPProxy-Client header injection site located, matches later T091/T032 usage
042-telemetry-tier2 T091 cmd/mcpproxy/main.go:524 (cliclient.SetClientVersion), frontend/src/services/api.ts:182 ('webui/web' constant with documented rationale) version string genuinely plumbed into CLI/tray/webui headers
044-retention-telemetry-v3 T001 internal/telemetry/telemetry.go:129 "// Spec 044 additions. schema_version stays at 3 (set by spec 042); these"
047-cpu-hotpath-fix T001 internal/server/server.go:2094-2124 mux.Handle("/debug/pprof/", pprofGated)
083-discovery-profiler T009 scripts/gen-corpus-v2.sh; specs/083-discovery-profiler/datasets/corpus_v2.tools.json; datasets/README.md:20 "Tool count: 45 (all 7 servers connected; no reduced-corpus caveat)."
083-discovery-profiler T026 scripts/fetch-toolret.sh pinned-revision uv download of mangopy/ToolRet-Tools + mangopy/ToolRet-Queries, parquet→JSON conversion
083-discovery-profiler T039 .github/workflows/bench.yml:68,74,152 npm ci --prefix bench/tscg; make bench-discovery; uvx --from lap-score==0.8.0 lap lint
083-discovery-profiler T040 bench/README.md:142-260 dashboard shows provenance badge + tokenizer caveat

All 15 were independently re-verified by the gardener session (reading the cited files directly) in addition to the sub-agent that originally proposed each.

Proposed un-ticks (NOT applied)

Spec / Task Why the artifact is absent
044-diagnostics-taxonomy T080 --server flag exists (doctor_cmd.go:79) but no test anywhere exercises it or asserts its formatted output

All other 85 UNRESOLVED/REMOVED/RELOCATED findings from the checker were investigated and found to be RELOCATED-NOT-ABSENT — the cited evidence path was stale (file renamed/consolidated/moved), but the actual behavior exists elsewhere in the current codebase (e.g. internal/contracts/config.go → consolidated into internal/contracts/types.go; cmd/mcpproxy/teams_register.go → renamed to serveredition_register.go as part of a deliberate Teams→Server-Edition rename). These are correctly left ticked and are not proposed as un-ticks.

Dropped by verification

130 possibly_built candidates (unchecked tasks where every cited file happens to exist) were investigated and dropped — the file existed but the specific promised behavior was absent, differently implemented without meeting the task's bar, an unwired component, a stub, or an untested claim. Grouped by spec:

001-code-execution — 12 dropped
  • T020: no test exercises two mock upstream servers
  • T032: mockToolCaller.errors map never populated by any test
  • T033: no test has JS call failing tool then continue to second tool
  • T034: no integration test with failing upstream tool
  • T051: tests only pass flat input, no nested objects/arrays
  • T052: no test asserts complex/nested result serialization
  • T071: zero matches for EnableCodeExecution/code_execution in mcp_test.go
  • T072: no rejection-when-disabled integration test
  • T073: no true-includes-tool integration test
  • T074: no config-defaults-apply-when-omitted test
  • T079: no test asserts uniqueness/format of execution_id
  • T080: no test asserts logs contain execution_id/truncated_code/tools_called/duration_ms
001-oas-endpoint-documentation — 6 dropped
  • T013: handleGetSecretRefs has no swag @Summary/@router comment block
  • T014: handleGetConfigSecrets same absence
  • T015: handleMigrateSecrets same absence
  • T025: code_exec.go has zero swag annotations
  • T026: handleSSEEvents has no swag annotation block
  • T027: same handler, same absence
001-update-version-display — 6 dropped
  • T012: tray_test.go has no test referencing version menu item
  • T019: no test verifies immediate pre-ticker check fires on startup
  • T020: no test exercises periodic 4-hour ticker firing
  • T024: e2e script never asserts .data.update exists
  • T028: no test toggling/asserting visibility of updateMenuItem
  • T029: no test verifies removal of Check for Updates menu item
003-tool-annotations-webui — 3 dropped
  • T046: SessionsTable.vue does not exist and no integration into Dashboard.vue
  • T050: frontend/src/services/api.ts:607 getToolCalls has no sessionId parameter
  • T058: server.go has no SSE emission of sessions.created/updated/closed events
004-management-health-refactor — 9 dropped
  • T022: no restart-related test in cmd/mcpproxy/upstream_cmd_test.go
  • T039: doctor_cmd_test.go has no E2E test running mcpproxy doctor against live daemon
  • T069: no --all/bulk-restart E2E CLI test exists
  • T083: client.go has no logHTTPRequest method or HTTP-request-logging code
  • T085: monitoring.go intentionally does NOT stream container logs (comment confirms opposite of task)
  • T086: no redactToken/sanitizeAuthHeader functions exist anywhere in repo
  • T087: sanitizer_test.go tests pre-existing functions only, not T086's (nonexistent) deliverables
  • T091: cli-management-commands.md table is Command|Daemon|Standalone, not a REST endpoint mapping
  • T092: plan.md has only a checklist sentence claiming a diagram, no actual diagram
006-oauth-extra-params — 8 dropped
  • T039: cmd/mcpproxy/auth_cmd.go:500-523 displays extra params raw with no masking applied; maskExtraParams/maskOAuthSecret unexported, never called from auth_cmd.go
  • T040: scopes and PKCE shown at auth_cmd.go:485-497 but redirect URI never displayed anywhere in the file
  • T042: token expiration shown (auth_cmd.go:549-558) but "last refresh" display does not exist anywhere in codebase
  • T043: runAuthLoginClientMode (auth_cmd.go:624-668) has no configuration preview printed before OAuth call
  • T044: no pre-browser-open summary of provider/scopes/PKCE/extra_params; only generic "Using daemon mode" message
  • T045: no authorization URL is ever printed by the CLI in auth_cmd.go
  • T046: post-success output (auth_cmd.go:663-665) is generic "flow initiated" message, not a verification summary
  • T054: doctor_cmd.go has no example config/JSON snippets; only plain-text resolution string in diagnostics.go:104-106
007-oauth-e2e-testing — 5 dropped
  • T080: neither runAuthLoginClientMode nor runAuthLoginStandalone prints authorization-URL preview before opening browser
  • T082: same as T039 - no secret masking applied to any auth status field in auth_cmd.go
  • T084: internal/upstream/core/connection.go has zero occurrences of grant_type/provider_url/scope logging fields
  • T086: diagnostics.go has no discovery-endpoint reachability check
  • T088: auth_cmd_test.go exists but tests never exercise displayAuthStatusPretty or assert on printed auth-status text
008-oauth-token-refresh — 6 dropped
  • T020: config.go CreateOAuthConfig/CreateOAuthConfigWithExtraParams take no correlation_id-bearing context param
  • T021: handleCallback (config.go:1105) has no correlation_id in its logging
  • T022: internal/oauth/discovery.go has zero references to correlation/CorrelationLogger
  • T023: internal/oauth/persistent_token_store.go has zero references to correlation
  • T026: handleOAuthAuthorization/handleOAuthAuthorizationWithResult contain no correlation_id logging
  • T027: internal/upstream/managed/client.go has zero references to correlation
009-proactive-oauth-refresh — 19 dropped
  • T011: contracts.ts SSEEventType has no oauth.token_refreshed/oauth.refresh_failed variants
  • T031: no TestTriggerOAuthLogout_* test exists in service_test.go
  • T032: no unit test for TriggerOAuthLogout+disable_management
  • T033: no unit test for TriggerOAuthLogout with non-OAuth server
  • T034: no unit test for TriggerOAuthLogout with non-existent server
  • T041: authLogoutCmd has no --all flag (unlike authLoginCmd)
  • T054: no oauthExpired computed property exists; specific named artifact never created (behavior achieved differently via backend health.action, judged too indirect to tick this specific subtask even though the sibling task T055 — which promises the outcome rather than the artifact — was ticked)
  • T060: no isAuthenticated computed property exists; canLogout (line 566) bundles several unrelated conditions beyond simple auth status
  • T062: triggerLogout() (line 705-723) calls store action directly with no window.confirm/modal - no confirmation dialog exists
  • T067: no oauthError computed property exists anywhere in ServerCard.vue
  • T068: no standalone Token Expired badge; overridden to generic Sign-in required text
  • T069: no distinct Auth Error badge; collapses into generic Sign-in required chip
  • T070: no such distinct badges exist to style
  • T071: status_test.go has no relative-time-formatting test
  • T074: status.go has no FormatRelativeTime function
  • T076: no expiration-time display element added to server details
  • T077: no 5-minute warning indicator element
  • T078: no EXPIRED text formatting element
  • T082: verify-oas-coverage.sh sed regex bug (\U without \E) breaks route extraction; script produces false failures, does not verify OAS coverage
010-release-notes-generator — 1 dropped
  • T021: docs has no releases/ directory structure section; actual mechanism is flat RELEASE_NOTES file, not documented as such
011-resource-auto-detect — 1 dropped
  • T033: doctor_cmd.go has zero occurrences of "resource"; no resource-parameter diagnostic added
014-cli-output-formatting — 1 dropped
  • T035: doctor_cmd.go still hand-rolls output; never calls internal/cli/output
016-activity-log-backend — 1 dropped
  • T035: no unit test for handleExportActivity json+csv exists
017-activity-cli-commands — 9 dropped
  • T028: no ULID-format validation exists in activity_cmd.go
  • T029: no test exercises actual show table-formatting code path
  • T035: no client-side invalid-ID-format handling, only not-found case
  • T037: no GetActivitySummary() in internal/storage/activity.go; computed inline in httpapi
  • T041: test only decodes mock JSON, never invokes CLI summary table-formatting output
  • T047: no export file path validation tested, only --format value
  • T055: docs/cli-management-commands.md has zero occurrences of "activity"
  • T059: CI process action, not verifiable statically
  • T060: CI process action, not verifiable statically
019-activity-webui — 1 dropped
  • T046: ActivityWidget.vue exists but never imported/rendered in Dashboard.vue (unwired)
021-request-id-logging — 1 dropped
  • T030: E2E test covers REST API directly, none invoke CLI activity list --request-id
026-pii-detection — 3 dropped
  • T104: no custom-pattern-detection test in e2e_test.go
  • T108: no sensitive/pii/detection scenarios in test-api-e2e.sh
  • T109: no SSE emission test for detection in e2e_test.go
028-agent-tokens — 1 dropped
  • T023: token_cmd_test.go only tests scaffolding, not list/revoke/regenerate behavior
029-mcpproxy-teams — 1 dropped
  • T020: server-edition Linux matrix entries commented out in release.yml
040-server-ux — 4 dropped
  • T016: no import preview step; ImportServerForm goes straight to single Import button, no checkboxes
  • T017: only aggregate "N imported, M skipped" string, no per-server breakdown/failure reasons
  • T018: no NSOpenPanel/Browse button anywhere in AddServerView.swift
  • T019: no timeoutInterval/120 setting in APIClient.swift importFromPath
042-telemetry-tier2 — 12 dropped
  • T009: no TestTelemetryConfigTier2Roundtrip or equivalent roundtrip test in config_test.go
  • T028: no TestMCPRequestCountedAsSurfaceMCP test exists
  • T035: no TestBuiltinToolCounterIncrementsPerCall test exists
  • T036: no TestUpstreamToolCallIncrementsBucket test exists
  • T037: no TestUpstreamToolNameNotInSnapshot privacy test exists
  • T054: no TestOAuthRefreshFailureRecordsErrorCategory test exists
  • T056: no TestToolQuarantineBlockedRecordsErrorCategory test exists
  • T057: coordinator.go has zero RecordError/ErrCat references; ErrCatOAuthTokenExpired never called anywhere; required T054 test also absent
  • T073: no TestDoctorCommandFeedsRegistry test exists
  • T076: no TestShowPayloadPrintsValidJSON test exists
  • T077: no TestShowPayloadMakesNoNetworkCall test exists
  • T083: docs/features/telemetry.md missing DO_NOT_TRACK/CI env docs, first-run notice text, ID rotation policy
044-diagnostics-taxonomy — 10 dropped
  • T004: no go:generate directive in registry.go; no codegen tool exists anywhere in repo
  • T019: no RecordFixAttempt on activity_service.go writing to activity log; same-named function is unrelated in-memory telemetry counter
  • T034: test-diagnostics-e2e.sh only runs go test twice + docs-link checker, no broken-stdio-server E2E scenario
  • T045: check-errors-docs-links.sh exists but never invoked from run-all-tests.sh (unwired)
  • T083: script has no doctor fix dry-run invocation, no dry-run/rate-limit assertions
  • T090: stdio_show_last_logs fixer is an explicit stub string, does not tail logs
  • T162: telemetry_payload_test.go tests never reference diagnostics sub-object despite struct field existing
  • T201: docs/architecture.md has no internal/diagnostics reference
  • T202: rest-api.md doesn't document new server-scoped diagnostics/diagnostics-fix endpoints
  • T203: docs/errors/README.md hand-maintained and stale (33 vs 37 codes), no generator tooling exists
044-retention-telemetry-v3 — 3 dropped
  • T003: docs/features/telemetry.md has no Environment Classification/Activation Tracking/Launch Source sections
  • T063: docs/features/telemetry.md never documents env_kind/env_markers/activation block/autostart_enabled/decision tree/token-bucketing
  • T069: manual quickstart-verification task with no recorded deviations/results artifact
056-output-schema-validation — 1 dropped
  • T019: e2e/stubs/outputschema/main.go exists but never invoked anywhere - unwired
057-in-proxy-profiles — 1 dropped
  • T022: CLAUDE.md and README.md missing profile slug documentation (2 of 3 required doc updates missing)
073-activity-size-retention — 1 dropped
  • T012: docs/configuration.md has no mention of activity_max_size_mb or any Activity* field
076-deterministic-tool-scanner — 1 dropped
  • T023: gofmt -l reports unformatted files still within task's own scope
077-scanner-simplification — 2 dropped
  • T040: no recorded quickstart-scenario results, manual verification task
  • T041: go test -race ./internal/runtime/... ./internal/config/... fails (2 pre-existing tests, unrelated read-only-directory assumptions that don't hold when run as root in the audit sandbox)
083-discovery-profiler — 1 dropped
  • T041: go test ./bench/... -race fails (tiktoken network fetch 403 in sandbox), can't confirm green gate

Methodology note

Given the volume (147 possibly_built candidates + 88 UNRESOLVED/REMOVED/RELOCATED findings across 34 specs), verification was fanned out across 8 parallel research sub-agents (one per group of specs), each applying the tick test from this repo's spec-gardener instructions: state the promised behavior, cite file:line, confirm it's real (not a stub/comment/unwired component/skipped test), and default to not-ticking when uncertain. The gardener session then independently re-verified every candidate the sub-agents recommended ticking by reading the cited source directly before applying any checkbox change, and dropped two of a sub-agent's proposed ticks where the task named a specific artifact (a named computed property) that did not actually exist in the code even though the surrounding behavior worked via a different mechanism (009-proactive-oauth-refresh T054, T060 — dropped despite sibling tasks T055/T056/T061/T063 for the same feature area being ticked, since those name outcomes rather than specific artifacts).

ROADMAP.md was regenerated via scripts/gen-roadmap.py in a separate commit after the checkbox sync, per the pre-commit hook's staleness check.


Note: the branch was rebased onto a newer main after this PR opened; the diff content is unchanged (same 15 checkbox ticks, same files) — verified against the current file list.

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 20, 2026 •

Copy link
Copy Markdown

Deploying mcpproxy-docs with  Cloudflare Pages  Cloudflare Pages

Latest commit: 9be3158
Status: ✅  Deploy successful!
Preview URL: https://e00ac674.mcpproxy-docs.pages.dev
Branch Preview URL: https://claude-spec-gardener.mcpproxy-docs.pages.dev

View logs

Dumbris commented Jul 20, 2026

Copy link
Copy Markdown
Member Author

The failing Analyze (go) (CodeQL) check is unrelated to this PR's diff (which only touches checkbox characters in specs/*/tasks.md and the generated ROADMAP.md). The autobuild step errors with:

We were unable to automatically build your code. Please replace the call to the autobuild action with your custom build steps. Loaded a configuration file for version '4.37.0', but running version '4.37.1'

This looks like a version-skew regression introduced by #863 (chore(ci): bump docker/login-action from 4.2.0 to 4.4.0) or a related recent CodeQL Action bump — main's most recent successful CodeQL run predates that dependabot merge, and this PR is based off current main. Fixing .github/workflows/codeql.yml is out of scope for a checkbox-only spec-gardener PR, so flagging here rather than pushing a workflow change.


Generated by Claude Code

@codecov-commenter

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@github-actions

github-actions Bot commented Jul 20, 2026 •

Copy link
Copy Markdown
Contributor

📦 Build Artifacts

Workflow Run: View Run
Branch: claude/spec-gardener

Available Artifacts

  • archive-darwin-amd64 (28 MB)
  • archive-darwin-arm64 (25 MB)
  • archive-linux-amd64 (16 MB)
  • archive-linux-arm64 (15 MB)
  • archive-windows-amd64 (28 MB)
  • archive-windows-arm64 (25 MB)
  • frontend-dist-pr (0 MB)
  • installer-dmg-darwin-amd64 (22 MB)
  • installer-dmg-darwin-arm64 (20 MB)

How to Download

Option 1: GitHub Web UI (easiest)

  1. Go to the workflow run page linked above
  2. Scroll to the bottom "Artifacts" section
  3. Click on the artifact you want to download

Option 2: GitHub CLI

gh run download 30239412615 --repo smart-mcp-proxy/mcpproxy-go

Note: Artifacts expire in 14 days.

@Dumbris
Dumbris force-pushed the claude/spec-gardener branch from 6e2030a to 9be3158 Compare July 27, 2026 05:18
@Dumbris
Dumbris marked this pull request as ready for review July 29, 2026 03:04
@Dumbris
Dumbris merged commit 8df79eb into main Jul 29, 2026
42 checks passed
@Dumbris Dumbris mentioned this pull request Aug 17, 2026
2 of 3 tasks
Dumbris added a commit that referenced this pull request Aug 31, 2026
…und 3

All four verified against GitHub and the tree before applying.

1. windows-tray: "no Windows-tray PR is open or merged" was false. #74
   ("feature: windows tray support") merged 2025-10-23 and the cross-platform
   Go/systray build still ships on Windows. The claim now scopes to what the
   epic actually tracks — the native WebView2 replacement — for which no PR
   exists and native/windows/ is a README placeholder.

2. analytics-dashboard: "can never tick from code" conflated two things. A
   human can run spec 069's T023 Playwright sweep and tick the box; what can
   never exist is code evidence for it. Reworded so the distinction is explicit.

3. hygiene-spec-gardener: "three gardener runs ... auto-approved by #842" was
   wrong. Only #999 carries a github-actions APPROVED review. #824 has none and
   merged ~24 minutes BEFORE the auto-approve workflow landed; #870 records no
   approving review either.

4. token-bench-public: calling the MCP-specific third "integrated" overstated
   completion. ToolRet and LiveMCPTool are static retrieval/token corpora and
   lap-score is a linter — none is a public agent-loop task suite, which is what
   the task ultimately owes.

Also noted for the record: the linux-arm64 Build Binaries failure on the
previous commit is a flaky test, not a regression from this docs-only change.
TestServiceStartScanDeepOnRunsSourceResolutionAndPass2
(internal/security/scanner) passes locally with -count=3, and two runs of this
same branch four minutes apart — 33360429077 and 33360648947, both docs-only —
disagreed on it.
Dumbris added a commit that referenced this pull request Aug 31, 2026
…ithub warnings (#1136)

* chore(roadmap): truth-sync statuses against code, clear all --check-github warnings

An evidence-based re-derivation of every non-done roadmap.yaml leaf. Each flip
below was verified against the tree, git/gh state and the rendering sites, then
independently re-checked by an adversarial pass; claims that did not survive
that pass were dropped rather than applied.

Statuses that were wrong in the "already shipped" direction:
- upgrade-nudge-delta todo -> done (#1085, closes #1081). The note asserted
  TODO(spec-079/FR-002) markers exist and that the checker calls only
  /releases/latest; both are false. internal/updatecheck/delta.go now computes
  the delta and all six surfaces render it.
- upgrade-nudge epic in_progress -> done (all five tasks now done).
- analytics-dashboard in_progress -> done. Both children shipped; the
  default-landing half is live (router '/' -> Dashboard, guarded by
  dashboard-default-landing.spec.ts). Spec 069's one open task is a local
  Playwright sweep that leaves no artifact and can never tick from code.
- discovery-eval-harness todo -> done. Both halves ship: cmd/scan-eval for
  security recall/FP, and the eval.yml retrieval-d1 gate plus bench/'s own
  RecallAtK/NDCGAtK + recall@5 parity gate for discovery quality.
- hygiene-spec-gardener in_progress -> done (#824, #870, #999, #842). Its
  recorded blocker is cleared: check-spec-evidence.py is on main.

Statuses that were wrong in the "claimed progress it does not have" direction:
- windows-tray and windows-tray-window in_review -> todo. No Windows-tray PR is
  open or merged and native/windows/ is a README placeholder, so "in review"
  pointed at nothing. The section header is renamed to match.
- planning-hygiene todo -> in_progress and action-log-transparency todo ->
  in_progress; both already have done children.

Notes corrected where they would misdirect the next implementer:
- token-bench-harness claimed it absorbs discovery-eval-harness by measuring
  retrieval recall. Recall is already measured, and bench/ already covers token
  counting, encoding arms (incl. direct_deferred), break-even and reporting.
  The note now records what is genuinely open: activity-log session replay,
  measured first-call success/retry rate, and tokens-per-successful-task.
- token-bench-public: the MCP-specific third already ships via spec 083
  (ToolRet, LiveMCPBench snapshot, lap-score); only agent-loop suites remain.

specs/098-tools-preflight/tasks.md: tick T001, T024, T031, each confirmed
against the tree (doc.go states both invariants T001 requires;
toolslist_snapshot_test.go is labelled T024 and green; README carries all three
FR-017 examples). T025/T027/T032/T033 are left unchecked — they are one-time
process acts or did not survive verification.

Deliberately NOT changed: no epics were added for shipped specs (084-100).
roadmap.yaml is the working set by design and ROADMAP.md already renders a
generated per-spec progress table, so absence of an epic is not drift.

scripts/gen-roadmap.py --check-github: 3 warnings -> 0 errors, 0 warnings.

* fix(roadmap): correct six claims flagged by cross-model review

All six findings from the opencode gpt-5.6-sol review were independently
re-verified against the tree before being applied; none were false positives.
(The reviewer's initial claim that spec-gardener-auto-approve.yml is missing
WAS a false positive from its glob tool and it self-corrected — the file exists
at .github/workflows/spec-gardener-auto-approve.yml.)

1. Un-tick specs/098 T024. T024 asks for a golden snapshot test proving
   tools/list is BYTE-IDENTICAL across all three modes. Spec 099 (FR-014/015)
   later converted that test from a no-delta gate into an ENUMERATED-delta gate
   (toolsListAllowedDelta permits describe_tool and quarantine_security to
   move), so at HEAD the test no longer demonstrates the property T024 states.
   It may well have held on 098's own branch, but that is not checkable from
   the tree, and an unverifiable tick is exactly what this PR exists to remove.
   Badge 29/33 -> 28/33.

2. discovery-eval-harness note: drop the "SUPERSEDED — folded into
   token-bench-harness" framing. It contradicted itself once the epic was
   marked done — token-bench-harness is still unbuilt, so nothing could have
   been folded into it. Both halves shipped independently.

3. Same note: the eval.yml retrieval-d1 job is REPORT-ONLY on pull requests
   (continue-on-error, guarding against npx/uvx fetch flake) and blocks only on
   the nightly schedule. Promoting it to PR-blocking is still open (MCP-742).

4. Same note: the SC-003 recall@5 = 0.68 +/- 0.05 parity gate is asserted in
   bench/armindex_test.go, not armindex.go — the latter supplies the production
   index wiring, not the assertion.

5. token-bench-harness note: the literature-derived retry defaults live in
   bench/session.go (armRetryRates, research D8). bench/report.go only renders
   and labels them as estimates. The substantive point stands: retry rates are
   assumed, not observed.

6. token-bench-public note: "CI-wired" overstated the LiveMCPBench snapshot.
   bench.yml's regular job passes only -corpus-v2; the snapshot is runnable via
   -livemcptool but not run in CI, and its loader has no retrieval golden set,
   so it measures token/scale rather than recall. ToolRet does have its own
   bench.yml job.

gen-roadmap.py --check and --check-github both still clean.

* fix(roadmap): tighten two claims from cross-model review round 2

Both findings verified against the tree before applying.

1. The retrieval-D1 blocking scope was stated too narrowly. eval.yml sets
   continue-on-error only for github.event_name == 'pull_request', and the
   workflow triggers on pull_request, workflow_dispatch and schedule — so the
   job is report-only on PRs and BLOCKING on both nightly and manual dispatch
   runs, not "only on the nightly schedule". The note now says so, and records
   that the workflow's own inline comment carries the same omission.

2. discovery-eval-harness is now done but still declared
   depends_on: [token-bench-harness], which is unbuilt — a done node cannot
   depend on an open one, and the edge contradicted the corrected note saying
   both halves shipped independently. Edge removed; the id remains a valid
   depends_on target for anything that needs it.

gen-roadmap.py --check and --check-github both clean.

* fix(roadmap): scope four over-broad claims from cross-model review round 3

All four verified against GitHub and the tree before applying.

1. windows-tray: "no Windows-tray PR is open or merged" was false. #74
   ("feature: windows tray support") merged 2025-10-23 and the cross-platform
   Go/systray build still ships on Windows. The claim now scopes to what the
   epic actually tracks — the native WebView2 replacement — for which no PR
   exists and native/windows/ is a README placeholder.

2. analytics-dashboard: "can never tick from code" conflated two things. A
   human can run spec 069's T023 Playwright sweep and tick the box; what can
   never exist is code evidence for it. Reworded so the distinction is explicit.

3. hygiene-spec-gardener: "three gardener runs ... auto-approved by #842" was
   wrong. Only #999 carries a github-actions APPROVED review. #824 has none and
   merged ~24 minutes BEFORE the auto-approve workflow landed; #870 records no
   approving review either.

4. token-bench-public: calling the MCP-specific third "integrated" overstated
   completion. ToolRet and LiveMCPTool are static retrieval/token corpora and
   lap-score is a linter — none is a public agent-loop task suite, which is what
   the task ultimately owes.

Also noted for the record: the linux-arm64 Build Binaries failure on the
previous commit is a flaky test, not a regression from this docs-only change.
TestServiceStartScanDeepOnRunsSourceResolutionAndPass2
(internal/security/scanner) passes locally with -count=3, and two runs of this
same branch four minutes apart — 33360429077 and 33360648947, both docs-only —
disagreed on it.

* fix(roadmap): ToolRet is not MCP-specific (cross-model review round 4)

Verified: bench/corpusio/toolret.go documents ToolRet as a general
tool-retrieval corpus whose documentation fields are "heterogeneous JSON/text,
NOT MCP input schemas" (Schema stays nil). Grouping it under "the MCP-specific
third" was wrong.

The token-bench-public note now says public corpus/linter groundwork is
integrated while NO public agent-loop task suite is, and names the ToolRet
caveat explicitly so the next implementer does not re-inherit the error.

Round 4 found no other issues; the round-3 windows-tray, analytics T023 and
gardener corrections were all confirmed accurate against GitHub and the tree.

* fix(roadmap): discovery-eval-harness is in_progress, not done (review round 5)

The final review round caught an error in this PR's own flip, and it is the
same failure mode the PR was written to fix: an epic marked done while a
governing FR is unmet.

Spec 065 FR-009 and SC-005 require CI to FAIL on a discovery regression beyond
tolerance. The retrieval-D1 job sets continue-on-error for pull_request (D1
depends on npx/uvx fetches, a known flake source), so on the PR path CI does not
fail — and eval.yml's own comment records the promotion to PR-blocking as still
planned (MCP-742). The HARNESS shipped; the GATE did not.

Reverted to in_progress and added the remaining work as a child task
(discovery-eval-pr-blocking, MCP-742) so the epic's status has something in the
DAG to point at.

The reviewer also read CN-002 (frozen corpus, never live) as violated because D1
boots a live mcpproxy serving seven reference servers. Recorded as a weaker
tension to adjudicate rather than a violation: #931 pinned all seven upstreams
to freeze-era versions and the job gates on the exact corpus ID set, so the
corpus is reproducible in practice. Whether that satisfies CN-002 or a committed
snapshot is required is a judgement for the spec owner.

gen-roadmap.py --check and --check-github both clean (0 errors, 0 warnings).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants