Ready / LGTM — PR #239
Fix T-1824: Milestone Query Project ID Resolution
Verdict
READY / LGTM
No actionable correctness, regression, or scope findings.
Review threads
0 review threads returned by the PR GraphQL review-thread query; therefore zero unresolved threads.
Sentinel
The existing review at b1016e0 contains the required <!-- claude-local-review --> sentinel.
Scope and commit identity
- PR #239 is open, targets
mainate33519ea7952a2464d178cce59ab93430644b4d4, and has headb1016e039e4c4dd4af6d42db59292fbc92ac3eef. - The clean precreated T-1824 worktree contains exactly one reviewed commit:
T-1824: Resolve milestone query project IDs. - The diff is scoped to the two query surfaces, paired regression tests, changelog, and bugfix report. No unrelated behavior or schema changes are included.
Cross-surface projectId verification
| Contract | MCP query_milestones | QueryMilestonesIntent |
|---|---|---|
Well-formed, existing projectId | resolveProjectFilter calls ProjectService.findProject(id:) and filters with the returned live project ID. | The validated resolver makes the same service call and uses the returned live project ID. |
Well-formed, missing projectId | Returns the established tool error hint No project with ID …. | Returns PROJECT_NOT_FOUND with the identical hint. |
| Project-store failure | Returns the existing Failed to fetch project: … tool error. | Maps the same hint to INTERNAL_ERROR. |
displayId and full-list paths | Both resolve the project filter before selecting either query path, so neither can turn a missing project into a false successful []. | |
| Existing filter rules | Malformed UUID rejection and valid projectId-over-name precedence remain intact and are asserted in the new cross-surface suite. | |
Sentinel and zero-value checks
- Review sentinel / threads: verified the existing local-review sentinel and queried all PR review threads; the result is an empty node list.
- Zero display ID: the shared
IntentHelpers.parseIntValuerejects CFBoolean values, preventing JSONfalsefrom coercing to display ID0(ortrueto1). Existing MCP and App Intent milestone-query tests cover this. The T-1824 resolver runs before, not around, that guarded display-ID parsing, so it does not reopen the M-0 bypass. - Test sentinel: the new suite explicitly exercises both the no-
displayIdand supplied-displayIdbranches for missing project IDs and storage failures across both public surfaces.
Validation
| Check | Result |
|---|---|
git diff --check e33519e b1016e0 | Passed — no whitespace errors. |
make test-quick in the exact T-1824 worktree | Passed. |
make lint in the exact T-1824 worktree | Passed. |
| Working tree / review identity | Passed — clean worktree, exact requested base/head, and PR #239 identity confirmed. |
Decision
Ready / LGTM. The patch correctly distinguishes UUID syntax from project existence, preserves the established cross-surface error mapping, and covers both query branch shapes without weakening malformed-input or zero-ID protections.
No source edits, commit, push, review comment, status change, or merge was performed. This canonical artifact replaces the generic PR #239 artifact only.