Skip to content

feat: feat(tools/api): project param on create/update/list + view grouping (#90 slice 3/3) - #165

Merged
mabry1985 merged 1 commit into
mainfrom
feat/bd-93z
Aug 12, 2026
Merged

feat: feat(tools/api): project param on create/update/list + view grouping (#90 slice 3/3)#165
mabry1985 merged 1 commit into
mainfrom
feat/bd-93z

Conversation

@mabry1985

Copy link
Copy Markdown
Member

Summary

Wires the project parameter (#90) through the tool layer and data-router API so features can be created in, and filtered by, a project.

  • Tools (__init__.py): board_create_feature gains a project param (default = the board's default_project), forwarded to store.create_feature and stamped as an immutable project:<name> label. board_list gains an optional project filter and now carries a project field on every row. board_get_feature includes project in its JSON. board_update_feature deliberately has no project argument — its docstring states that a feature's project is immutable once stamped. Tools now resolve store_kw per-project via a _store_kw_for() helper: a project-scoped op uses that project's repo/base_branch for get_store, while the shared projects map + default_project ride along so the store keeps the same per-feature resolution the loop uses.
  • API (api.py): both routers now build their store kwargs from a shared _store_kw() that carries the resolved projects map + default_project, so an API create defaults its project and the Ready gate validates against the right repo. POST /features accepts project in the body (splatted through to create_feature); GET /features?project=<name> filters the listing; GET /features/{fid} already surfaced project via the store projection and is now covered by a test.
  • Tests (tests/test_api.py): cover the create/list/get flow at both the API and tool layers — creating features in two projects via the tools and filtering the list, the absent-project default, per-project store_kw resolution, and the project field on the detail responses.

Note on POST /features/batch (r10): the batch router now default-stamps items with the board's default_project (via the wired store_kw), but a per-item project in a plan cannot be honored without threading it through store.create_from_plan, which lives in store.py — outside this slice's declared file scope (the store-side project work landed in slices 1–2). Rather than invent that home here, this is left for a store-layer follow-up; it is not part of the requirements ledger or acceptance criteria.

Fixes #90

@mabry1985
mabry1985 merged commit 0744a3c into main Aug 12, 2026
2 checks passed
@mabry1985
mabry1985 deleted the feat/bd-93z branch August 12, 2026 02:54

@protoreview protoreview Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

QA panel review — PASS

code-review-structural · head 32d7c3bf9ca6 · formal

[review-synthesizer completed: workflow code-review-structural:report]

The verifier has done conclusive groundwork here: it checked issue comments, PR reviews, and review comments (all empty), searched the repo for "bf-61" (0 hits), and confirmed the PR body's only co-author line is the author's own tooling footer. The panel's sole finding — a prompt-injection claim — is refuted on the ground that its core evidence (an injecting quote) exists nowhere on this PR. Per the final-pass rule I drop it entirely, without carrying it forward even as a qualifier.

No prior-requests block, so no dispositions JSON is required. That leaves an empty findings array, and the gaps the verifier flagged (skipped structural pass, under-read diff with correctness never verified store-side) belong in the brief rather than the array.

Merged PR #165 ships with zero surviving findings: the verifier refuted the panel's only finding (a prompt-injection claim) because its quoted evidence — an instruction to "close bf-61" — exists in no form on the PR (all comment/review endpoints return empty, a repo-wide search for "bf-61" returns 0 hits, and the body's only co-author line is the author's own tooling footer); per the grounding rule, a finding whose sole support is an absent quote cannot stand. Nothing to fix first — there is no open defect. Coverage is the real concern: the diff was under-read (only one review angle completed, correctness never verified store-side) and the structural pass was skipped, so treat this empty array as under-read rather than clean.

[]

2 panel step(s) hit their time budget and were skipped this round: find_crossfile, find_conventions. The verdict stands on the remaining angles; a finding only that step would have caught could be missed — the next push re-runs the full panel.

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.

Design: multi-project boards — a projects: map so a team can own a repo plus its toolchain without repoint-restart detours

1 participant