fix(allocator): exclude vision/roadmap/umbrella coordination containers (Closes #854) #883

Merged
sysadmin merged 3 commits from fix/issue-854-semantic-container-exclusion into master 2026-07-24 22:27:58 -05:00
Owner

Summary

Fixes the live allocator regression where gitea_allocate_next_work still selected non-implementable coordination containers after #844:

  • Product vision (#652-shaped): Do not implement features on this issue.
  • Phased roadmap (#653-shaped): Implementing features on this roadmap issue.
  • Umbrella (#655-shaped): Implementation is via linked children only.
  • Epic (#631) remains excluded as before.

Changes

  • Extend body markers and container labels in allocator_service.py for vision/roadmap/umbrella scope evidence.
  • Title prefixes (Epic:, Roadmap:, Product vision:, Umbrella:) only corroborate when body/label evidence is present; title alone never excludes.
  • Ordinary issues that merely mention those words stay eligible.
  • Add regression canary tests in tests/test_issue_854_semantic_container_exclusion.py covering #631/#652/#653/#655-shaped inventory.

Test plan

  • pytest tests/test_issue_854_semantic_container_exclusion.py tests/test_allocator_epic_container_exclusion.py -q → 23 passed
  • Manual classification smoke for #631/#652/#653/#655 vs incidental mention

Closes #854
Predecessor: #844
Pre-rank infrastructure: #776

## Summary Fixes the live allocator regression where `gitea_allocate_next_work` still selected non-implementable coordination containers after #844: - Product vision (#652-shaped): Do not implement features on this issue. - Phased roadmap (#653-shaped): Implementing features on this roadmap issue. - Umbrella (#655-shaped): Implementation is via linked children only. - Epic (#631) remains excluded as before. ## Changes - Extend body markers and container labels in `allocator_service.py` for vision/roadmap/umbrella scope evidence. - Title prefixes (`Epic:`, `Roadmap:`, `Product vision:`, `Umbrella:`) only corroborate when body/label evidence is present; title alone never excludes. - Ordinary issues that merely mention those words stay eligible. - Add regression canary tests in `tests/test_issue_854_semantic_container_exclusion.py` covering #631/#652/#653/#655-shaped inventory. ## Test plan - [x] `pytest tests/test_issue_854_semantic_container_exclusion.py tests/test_allocator_epic_container_exclusion.py -q` → 23 passed - [x] Manual classification smoke for #631/#652/#653/#655 vs incidental mention Closes #854 Predecessor: #844 Pre-rank infrastructure: #776
jcwalker3 added 1 commit 2026-07-24 16:19:46 -05:00
#844 only caught epic-shaped child-only records. Live allocation still
selected product vision (#652), phased roadmap (#653), and umbrella (#655)
as implement targets. Extend pre-rank semantic classification with body
markers and container labels for those coordination records, keep title-
only and incidental mentions eligible, and add a live-equivalent canary.

Closes #854
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #883
issue: none
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 58244-81762e5b6332
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr883-854-container
phase: claimed
candidate_head: 0a78da39e5
target_branch: master
target_branch_sha: 870843f999
last_activity: 2026-07-24T21:28:13Z
expires_at: 2026-07-24T21:38:13Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #883 issue: none reviewer_identity: sysadmin profile: prgs-reviewer session_id: 58244-81762e5b6332 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr883-854-container phase: claimed candidate_head: 0a78da39e578e5a05b5dc2fbd4b6eab8aa13511a target_branch: master target_branch_sha: 870843f999fb4bb8fc8c15ff7ede730448cdb3d4 last_activity: 2026-07-24T21:28:13Z expires_at: 2026-07-24T21:38:13Z blocker: none
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #883
issue: none
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 58244-81762e5b6332
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr883-854-container
phase: claimed
candidate_head: 0a78da39e5
target_branch: master
target_branch_sha: 870843f999
last_activity: 2026-07-24T21:30:41Z
expires_at: 2026-07-24T21:40:41Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #883 issue: none reviewer_identity: sysadmin profile: prgs-reviewer session_id: 58244-81762e5b6332 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr883-854-container phase: claimed candidate_head: 0a78da39e578e5a05b5dc2fbd4b6eab8aa13511a target_branch: master target_branch_sha: 870843f999fb4bb8fc8c15ff7ede730448cdb3d4 last_activity: 2026-07-24T21:30:41Z expires_at: 2026-07-24T21:40:41Z blocker: none
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #883
issue: #854
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 81690-c44c62139020
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr883-formal-20260724-185037
phase: claimed
candidate_head: 0a78da39e5
target_branch: master
target_branch_sha: 870843f999
last_activity: 2026-07-24T22:50:46Z
expires_at: 2026-07-24T23:00:46Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #883 issue: #854 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 81690-c44c62139020 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr883-formal-20260724-185037 phase: claimed candidate_head: 0a78da39e578e5a05b5dc2fbd4b6eab8aa13511a target_branch: master target_branch_sha: 870843f999fb4bb8fc8c15ff7ede730448cdb3d4 last_activity: 2026-07-24T22:50:46Z expires_at: 2026-07-24T23:00:46Z blocker: none
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #883
issue: #854
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 81690-c44c62139020
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr883-formal-20260724-185037
phase: pre_review_mutation
candidate_head: 0a78da39e5
target_branch: master
target_branch_sha: 870843f999
last_activity: 2026-07-24T22:50:53Z
expires_at: 2026-07-24T23:00:53Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #883 issue: #854 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 81690-c44c62139020 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr883-formal-20260724-185037 phase: pre_review_mutation candidate_head: 0a78da39e578e5a05b5dc2fbd4b6eab8aa13511a target_branch: master target_branch_sha: 870843f999fb4bb8fc8c15ff7ede730448cdb3d4 last_activity: 2026-07-24T22:50:53Z expires_at: 2026-07-24T23:00:53Z blocker: none
sysadmin approved these changes 2026-07-24 17:51:38 -05:00
Dismissed
sysadmin left a comment
Owner

Formal review — PR #883 (Closes #854)

Verdict: APPROVE at head 0a78da39e578e5a05b5dc2fbd4b6eab8aa13511a.

Findings

  • Scope clean: allocator_service.py, tests/test_issue_854_semantic_container_exclusion.py only.
  • Extends #844 container exclusion to vision/roadmap/umbrella with body markers + labels; title prefixes corroborate only, never exclude alone.
  • Live-shaped canary covers #631/#652/#653/#655; incidental mentions stay eligible; no assignment/lease to containers.
  • Closing keyword Closes #854 present.
  • Secret sweep: clean.

Validation

  • venv/bin/pytest tests/test_issue_854_semantic_container_exclusion.py tests/test_allocator_epic_container_exclusion.py -q23 passed, 8 subtests (exit 0)
  • Worktree clean before/after; HEAD == pinned head
  • Author-safety: sysadmin != jcwalker3

Review Metadata:

  • LLM-Agent-SHA: llm-c44c62139020
  • LLM-Role: reviewer
  • Authenticated-Gitea-User: sysadmin
  • MCP-Profile: prgs-reviewer
  • Eligibility: passed

Canonical PR State

STATE: ready-to-merge
WHO_IS_NEXT: merger
NEXT_ACTION: Merge PR #883 at approved head after merger preflight confirms approval_at_current_head
NEXT_PROMPT:

Merge PR #883 (fix/issue-854-semantic-container-exclusion) at head 0a78da39e578e5a05b5dc2fbd4b6eab8aa13511a after full merger gates. remote=prgs org=Scaled-Tech-Consulting repo=Gitea-Tools. Do not re-review unless head moved.

WHAT_HAPPENED: Formal reviewer approval after worktree validation and diff review of allocator semantic container exclusion.
WHY: Scope matches #854 acceptance; markers/labels/title rules correct; tests pass; no blockers.
ISSUE: #854
HEAD_SHA: 0a78da39e5
REVIEW_STATUS: approved / approval_at_current_head
MERGE_READY: true
BLOCKERS: none
VALIDATION: 23 passed, 8 subtests on unmodified head 0a78da39e5
NATIVE_REVIEW_PROOF: transport=native_mcp; entrypoint=mcp_server; token_fingerprint=f02814ed834dda2e
LAST_UPDATED_BY: sysadmin (prgs-reviewer)

## Formal review — PR #883 (Closes #854) **Verdict: APPROVE** at head `0a78da39e578e5a05b5dc2fbd4b6eab8aa13511a`. ### Findings - Scope clean: `allocator_service.py`, `tests/test_issue_854_semantic_container_exclusion.py` only. - Extends #844 container exclusion to vision/roadmap/umbrella with body markers + labels; title prefixes corroborate only, never exclude alone. - Live-shaped canary covers #631/#652/#653/#655; incidental mentions stay eligible; no assignment/lease to containers. - Closing keyword `Closes #854` present. - Secret sweep: clean. ### Validation - `venv/bin/pytest tests/test_issue_854_semantic_container_exclusion.py tests/test_allocator_epic_container_exclusion.py -q` → **23 passed, 8 subtests** (exit 0) - Worktree clean before/after; HEAD == pinned head - Author-safety: sysadmin != jcwalker3 Review Metadata: - LLM-Agent-SHA: llm-c44c62139020 - LLM-Role: reviewer - Authenticated-Gitea-User: sysadmin - MCP-Profile: prgs-reviewer - Eligibility: passed ## Canonical PR State STATE: ready-to-merge WHO_IS_NEXT: merger NEXT_ACTION: Merge PR #883 at approved head after merger preflight confirms approval_at_current_head NEXT_PROMPT: ```text Merge PR #883 (fix/issue-854-semantic-container-exclusion) at head 0a78da39e578e5a05b5dc2fbd4b6eab8aa13511a after full merger gates. remote=prgs org=Scaled-Tech-Consulting repo=Gitea-Tools. Do not re-review unless head moved. ``` WHAT_HAPPENED: Formal reviewer approval after worktree validation and diff review of allocator semantic container exclusion. WHY: Scope matches #854 acceptance; markers/labels/title rules correct; tests pass; no blockers. ISSUE: #854 HEAD_SHA: 0a78da39e578e5a05b5dc2fbd4b6eab8aa13511a REVIEW_STATUS: approved / approval_at_current_head MERGE_READY: true BLOCKERS: none VALIDATION: 23 passed, 8 subtests on unmodified head 0a78da39e578e5a05b5dc2fbd4b6eab8aa13511a NATIVE_REVIEW_PROOF: transport=native_mcp; entrypoint=mcp_server; token_fingerprint=f02814ed834dda2e LAST_UPDATED_BY: sysadmin (prgs-reviewer)
jcwalker3 added 1 commit 2026-07-24 21:06:43 -05:00
jcwalker3 added 1 commit 2026-07-24 21:27:57 -05:00
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #883
issue: #854
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 49253-04cd5f9f8d14
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr883
phase: claimed
candidate_head: 3b68d15593
target_branch: master
target_branch_sha: a4c73766f4
last_activity: 2026-07-25T03:06:30Z
expires_at: 2026-07-25T03:16:30Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #883 issue: #854 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 49253-04cd5f9f8d14 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr883 phase: claimed candidate_head: 3b68d1559388b5dcdc4f17b5615886202f617821 target_branch: master target_branch_sha: a4c73766f4b0cc32f7c3808688eceeb6fee74335 last_activity: 2026-07-25T03:06:30Z expires_at: 2026-07-25T03:16:30Z blocker: none
sysadmin approved these changes 2026-07-24 22:07:49 -05:00
sysadmin left a comment
Owner

Review: PR #883 — allocator semantic container exclusion (Closes #854)

Verdict: APPROVE at head 3b68d1559388b5dcdc4f17b5615886202f617821, base master @ a4c73766f4b0cc32f7c3808688eceeb6fee74335.

Fresh independent review at the current live head. Review 579 (approve at 0a78da39e578e5a05b5dc2fbd4b6eab8aa13511a) is stale and was not relied on. Note the head moved twice since that approval and once past the head named in my review task: 0a78da39…b2e28428…3b68d1559388b5dcdc4f17b5615886202f617821.

Moved-head delta: does it change any earlier conclusion?

No. Both commits since the approved head are pure master integrations:

3b68d15 Merge branch 'master' into fix/issue-854-semantic-container-exclusion
b2e2842 Merge branch 'master' into fix/issue-854-semantic-container-exclusion

git diff a4c73766...3b68d155 — the effective contribution against current master — is unchanged in shape and scope:

 allocator_service.py                                |  98 +++-
 tests/test_issue_854_semantic_container_exclusion.py | 378 +++++++++++++++
 2 files changed, 459 insertions(+), 17 deletions(-)

commits_behind: 0, mergeable: true, has_conflicts: false. No PR-owned file changed between 0a78da39… and this head, so every earlier conclusion carries forward; I re-established them below at this head anyway.

Live-body revalidation (#652, #653, #655)

I ran the actual classify_epic_or_child_only_container at this head against verbatim excerpts of the live bodies and label sets, plus controls:

Case excluded expected skip reason
#652 live (Product vision) True True title_vision_prefix; body_marker='do not implement features on this issue'
#653 live (Roadmap) True True title_roadmap_prefix; body_marker='implementing features on this roadmap issue'
#655 live (Umbrella) True True title_umbrella_prefix; body_marker='implementation is via linked children only'
#631-shaped (Epic) True True title_epic_prefix; body_marker='implementation is delivered via child issues only'
ordinary child (#640-shaped, links to #652/#653) False False
ordinary issue, incidental vision/roadmap/umbrella mention False False
title prefix only, no body evidence False False

0 failures. Each live container matches on a contiguous authoritative phrase, and each returns a structured skip reason rather than a bare boolean.

Acceptance criteria — all eight verified

  1. Reproduce the chain against #652/#653/#655-shaped fixtures on top of #844test_652_vision_is_container, test_653_roadmap_is_container, test_655_umbrella_is_container, plus my live-body run above.
  2. Classify vision, roadmap, umbrella, epic, and child-only signals consistently before ranking — one marker set and one label set feed a single classifier called pre-rank; test_631_still_container_after_854 proves the #844 behavior is preserved.
  3. Keep independently executable children eligibletest_child_referencing_parent_policy_stays_eligible, test_apply_selects_child_not_container; my #640-shaped control stays eligible even though it links to both #652 and #653.
  4. Do not exclude ordinary issues for incidental mentionstest_incidental_vision_roadmap_umbrella_words_not_container, test_title_prefix_alone_not_container, test_incidental_mentions_remain_eligible; confirmed independently.
  5. Structured semantic skip reason for every excluded containerdetail returns label=… / body_marker=… with the title prefix as a corroborating prefix token, as shown in the table.
  6. Excluded containers cannot receive assignments or workflow leasestest_containers_cannot_receive_assignment_or_lease.
  7. Live-equivalent canary: #631/#652/#653/#655-shaped records all excluded in one inventorytest_live_equivalent_canary_excludes_all_containers_selects_child, which also asserts a real child is selected from the same inventory.
  8. Candidate-set fingerprint / CAS behavior preserved after exclusionstest_fingerprint_stable_with_containers_present.

Design point worth crediting: title prefixes never exclude on their own. _title_container_prefix only contributes a corroborating token, and exclusion still requires a label or a body marker — which is exactly what AC4 demands and what keeps Roadmap: tighten allocator ranking eligible.

Validation

Executed from a read-only export pinned to 3b68d1559388b5dcdc4f17b5615886202f617821; no worktree was modified.

  • Focused: pytest tests/test_issue_854_semantic_container_exclusion.py tests/test_allocator_epic_container_exclusion.py -q23 passed, 8 subtests, exit 0.
  • Allocator regression surface (all tests/*alloc* modules) at this head → 135 passed.
  • Same suite at base master a4c73766f4b0cc32f7c3808688eceeb6fee74335135 passed. Identical set, identical result: zero introduced regressions.
  • Live-body classifier revalidation → 7/7, 0 failures.

Author-safety: sysadmin != jcwalker3. Closing keyword Closes #854 present. Scope is limited to allocator_service.py and the new canary test — no unrelated refactoring.

Non-blocking observations (carried forward; severity unchanged by this delta)

These are recorded for follow-up and are not merge blockers.

  1. Exclusion of #652/#653/#655 still depends partly on exact body wording. I confirmed at this head that none of the three carries a structured container label — their live label sets are dashboard/documentation/mcp-health/status:ready/type:feature/workflow-hardening (#652), dashboard/documentation/queue/status:ready/type:feature/workflow-hardening (#653), and anti-stomp/mcp-health/safety/stale-runtime/status:ready/type:guardrail/workflow-hardening (#655). Exclusion therefore rests entirely on body phrases. An editorial rewording of any of those bodies would silently restore the original regression. Adding a structured container label (or type:tracker-style marker) to the three records would make this robust; that is an issue-data change, not a code change, so it does not block this PR.
  2. Broad labels exclude on their own. _EPIC_LABELS now contains bare vision, roadmap, and umbrella, and test_roadmap_label_alone_is_container makes that an intentional, tested rule. Live issue #820 already carries a roadmap label; it is a tracker, so exclusion is correct there, but an ordinary implementable issue given one of these bare labels would be skipped with no body evidence.
  3. Generic source-of-truth wording may create false positives. this issue is the enduring source of truth and enduring source of truth for the are broad enough to match an ordinary issue that merely declares itself authoritative for some narrow topic. Narrowing these to the vision-specific phrasing would reduce that surface.

Canonical PR State

STATE:
approved

WHO_IS_NEXT:
merger

NEXT_ACTION:
Acquire the merger lease and merge PR #883 at head 3b68d15593 after merger preflight re-confirms approval_at_current_head and a live mergeable check.

NEXT_PROMPT:

Merger task: PR #883 (fix/issue-854-semantic-container-exclusion) / issue #854 is approved at head 3b68d1559388b5dcdc4f17b5615886202f617821, base master a4c73766f4b0cc32f7c3808688eceeb6fee74335. remote=prgs org=Scaled-Tech-Consulting repo=Gitea-Tools. Run full merger gates and pin expected_head_sha to 3b68d1559388b5dcdc4f17b5615886202f617821. Review 579 at former head 0a78da39e578e5a05b5dc2fbd4b6eab8aa13511a is stale and must not be used to authorize the merge. This branch has moved twice under concurrent master integration, so re-confirm the live head and approval_at_current_head immediately before merging; if the head moved again, stop and route a fresh review. Do not re-review unless the head moved.

WHAT_HAPPENED:
Reviewer performed a fresh independent review of PR #883 at live head 3b68d15593, confirmed the delta since the previously approved head is master integration only, revalidated container classification against the live bodies and label sets of #652/#653/#655, verified all eight acceptance criteria, and ran focused and allocator regression suites against a master baseline.

WHY:
The semantic container exclusion correctly classifies vision, roadmap, umbrella, epic, and child-only records from label or body evidence while title prefixes only corroborate, ordinary and incidental-mention issues stay eligible, excluded containers cannot receive assignments or leases, fingerprint behavior is preserved, and no regression was introduced.

ISSUE:
#854

BASE:
master

HEAD:
fix/issue-854-semantic-container-exclusion

HEAD_SHA:
3b68d15593

REVIEW_STATUS:
approved

MERGE_READY:
yes

BLOCKERS:
none

SUPERSEDES:
Review 579 (approve at former head 0a78da39e5, stale against this head).

SUPERSEDED_BY:
none

VALIDATION:
Focused pytest tests/test_issue_854_semantic_container_exclusion.py tests/test_allocator_epic_container_exclusion.py -> 23 passed, 8 subtests, exit 0. Allocator regression surface at this head -> 135 passed; identical suite at base master a4c73766f4 -> 135 passed, zero introduced regressions. Live-body classifier revalidation against #652/#653/#655 plus #631-shaped and three eligibility controls -> 7/7, 0 failures, each container returning a structured skip reason. git diff a4c73766...3b68d155 limited to allocator_service.py and tests/test_issue_854_semantic_container_exclusion.py. All commands run from a read-only export of the pinned head; no worktree modified.

NATIVE_REVIEW_PROOF:
transport=native_mcp; entrypoint=mcp_server; pid=49253

LAST_UPDATED_BY:
sysadmin / prgs-reviewer / 2026-07-25

# Review: PR #883 — allocator semantic container exclusion (Closes #854) **Verdict: APPROVE** at head `3b68d1559388b5dcdc4f17b5615886202f617821`, base `master` @ `a4c73766f4b0cc32f7c3808688eceeb6fee74335`. Fresh independent review at the current live head. Review `579` (approve at `0a78da39e578e5a05b5dc2fbd4b6eab8aa13511a`) is stale and was not relied on. Note the head moved twice since that approval and once past the head named in my review task: `0a78da39…` → `b2e28428…` → `3b68d1559388b5dcdc4f17b5615886202f617821`. ## Moved-head delta: does it change any earlier conclusion? No. Both commits since the approved head are pure master integrations: ``` 3b68d15 Merge branch 'master' into fix/issue-854-semantic-container-exclusion b2e2842 Merge branch 'master' into fix/issue-854-semantic-container-exclusion ``` `git diff a4c73766...3b68d155` — the effective contribution against current master — is unchanged in shape and scope: ``` allocator_service.py | 98 +++- tests/test_issue_854_semantic_container_exclusion.py | 378 +++++++++++++++ 2 files changed, 459 insertions(+), 17 deletions(-) ``` `commits_behind: 0`, `mergeable: true`, `has_conflicts: false`. No PR-owned file changed between `0a78da39…` and this head, so every earlier conclusion carries forward; I re-established them below at this head anyway. ## Live-body revalidation (#652, #653, #655) I ran the actual `classify_epic_or_child_only_container` at this head against verbatim excerpts of the **live** bodies and label sets, plus controls: | Case | excluded | expected | skip reason | | --- | --- | --- | --- | | #652 live (Product vision) | True | True | `title_vision_prefix; body_marker='do not implement features on this issue'` | | #653 live (Roadmap) | True | True | `title_roadmap_prefix; body_marker='implementing features on this roadmap issue'` | | #655 live (Umbrella) | True | True | `title_umbrella_prefix; body_marker='implementation is via linked children only'` | | #631-shaped (Epic) | True | True | `title_epic_prefix; body_marker='implementation is delivered via child issues only'` | | ordinary child (#640-shaped, links to #652/#653) | False | False | — | | ordinary issue, incidental vision/roadmap/umbrella mention | False | False | — | | title prefix only, no body evidence | False | False | — | 0 failures. Each live container matches on a contiguous authoritative phrase, and each returns a structured skip reason rather than a bare boolean. ## Acceptance criteria — all eight verified 1. **Reproduce the chain against #652/#653/#655-shaped fixtures on top of #844** — `test_652_vision_is_container`, `test_653_roadmap_is_container`, `test_655_umbrella_is_container`, plus my live-body run above. 2. **Classify vision, roadmap, umbrella, epic, and child-only signals consistently before ranking** — one marker set and one label set feed a single classifier called pre-rank; `test_631_still_container_after_854` proves the #844 behavior is preserved. 3. **Keep independently executable children eligible** — `test_child_referencing_parent_policy_stays_eligible`, `test_apply_selects_child_not_container`; my #640-shaped control stays eligible even though it links to both #652 and #653. 4. **Do not exclude ordinary issues for incidental mentions** — `test_incidental_vision_roadmap_umbrella_words_not_container`, `test_title_prefix_alone_not_container`, `test_incidental_mentions_remain_eligible`; confirmed independently. 5. **Structured semantic skip reason for every excluded container** — `detail` returns `label=…` / `body_marker=…` with the title prefix as a corroborating prefix token, as shown in the table. 6. **Excluded containers cannot receive assignments or workflow leases** — `test_containers_cannot_receive_assignment_or_lease`. 7. **Live-equivalent canary: #631/#652/#653/#655-shaped records all excluded in one inventory** — `test_live_equivalent_canary_excludes_all_containers_selects_child`, which also asserts a real child is selected from the same inventory. 8. **Candidate-set fingerprint / CAS behavior preserved after exclusions** — `test_fingerprint_stable_with_containers_present`. Design point worth crediting: title prefixes never exclude on their own. `_title_container_prefix` only contributes a corroborating token, and exclusion still requires a label or a body marker — which is exactly what AC4 demands and what keeps `Roadmap: tighten allocator ranking` eligible. ## Validation Executed from a read-only export pinned to `3b68d1559388b5dcdc4f17b5615886202f617821`; no worktree was modified. - Focused: `pytest tests/test_issue_854_semantic_container_exclusion.py tests/test_allocator_epic_container_exclusion.py -q` → **23 passed, 8 subtests**, exit 0. - Allocator regression surface (all `tests/*alloc*` modules) at this head → **135 passed**. - Same suite at base master `a4c73766f4b0cc32f7c3808688eceeb6fee74335` → **135 passed**. Identical set, identical result: **zero introduced regressions**. - Live-body classifier revalidation → 7/7, 0 failures. Author-safety: `sysadmin` != `jcwalker3`. Closing keyword `Closes #854` present. Scope is limited to `allocator_service.py` and the new canary test — no unrelated refactoring. ## Non-blocking observations (carried forward; severity unchanged by this delta) These are recorded for follow-up and are **not** merge blockers. 1. **Exclusion of #652/#653/#655 still depends partly on exact body wording.** I confirmed at this head that none of the three carries a structured container label — their live label sets are `dashboard/documentation/mcp-health/status:ready/type:feature/workflow-hardening` (#652), `dashboard/documentation/queue/status:ready/type:feature/workflow-hardening` (#653), and `anti-stomp/mcp-health/safety/stale-runtime/status:ready/type:guardrail/workflow-hardening` (#655). Exclusion therefore rests entirely on body phrases. An editorial rewording of any of those bodies would silently restore the original regression. Adding a structured container label (or `type:tracker`-style marker) to the three records would make this robust; that is an issue-data change, not a code change, so it does not block this PR. 2. **Broad labels exclude on their own.** `_EPIC_LABELS` now contains bare `vision`, `roadmap`, and `umbrella`, and `test_roadmap_label_alone_is_container` makes that an intentional, tested rule. Live issue #820 already carries a `roadmap` label; it is a tracker, so exclusion is correct there, but an ordinary implementable issue given one of these bare labels would be skipped with no body evidence. 3. **Generic source-of-truth wording may create false positives.** `this issue is the enduring source of truth` and `enduring source of truth for the` are broad enough to match an ordinary issue that merely declares itself authoritative for some narrow topic. Narrowing these to the vision-specific phrasing would reduce that surface. ## Canonical PR State STATE: approved WHO_IS_NEXT: merger NEXT_ACTION: Acquire the merger lease and merge PR #883 at head 3b68d1559388b5dcdc4f17b5615886202f617821 after merger preflight re-confirms approval_at_current_head and a live mergeable check. NEXT_PROMPT: ```text Merger task: PR #883 (fix/issue-854-semantic-container-exclusion) / issue #854 is approved at head 3b68d1559388b5dcdc4f17b5615886202f617821, base master a4c73766f4b0cc32f7c3808688eceeb6fee74335. remote=prgs org=Scaled-Tech-Consulting repo=Gitea-Tools. Run full merger gates and pin expected_head_sha to 3b68d1559388b5dcdc4f17b5615886202f617821. Review 579 at former head 0a78da39e578e5a05b5dc2fbd4b6eab8aa13511a is stale and must not be used to authorize the merge. This branch has moved twice under concurrent master integration, so re-confirm the live head and approval_at_current_head immediately before merging; if the head moved again, stop and route a fresh review. Do not re-review unless the head moved. ``` WHAT_HAPPENED: Reviewer performed a fresh independent review of PR #883 at live head 3b68d1559388b5dcdc4f17b5615886202f617821, confirmed the delta since the previously approved head is master integration only, revalidated container classification against the live bodies and label sets of #652/#653/#655, verified all eight acceptance criteria, and ran focused and allocator regression suites against a master baseline. WHY: The semantic container exclusion correctly classifies vision, roadmap, umbrella, epic, and child-only records from label or body evidence while title prefixes only corroborate, ordinary and incidental-mention issues stay eligible, excluded containers cannot receive assignments or leases, fingerprint behavior is preserved, and no regression was introduced. ISSUE: #854 BASE: master HEAD: fix/issue-854-semantic-container-exclusion HEAD_SHA: 3b68d1559388b5dcdc4f17b5615886202f617821 REVIEW_STATUS: approved MERGE_READY: yes BLOCKERS: none SUPERSEDES: Review 579 (approve at former head 0a78da39e578e5a05b5dc2fbd4b6eab8aa13511a, stale against this head). SUPERSEDED_BY: none VALIDATION: Focused pytest tests/test_issue_854_semantic_container_exclusion.py tests/test_allocator_epic_container_exclusion.py -> 23 passed, 8 subtests, exit 0. Allocator regression surface at this head -> 135 passed; identical suite at base master a4c73766f4b0cc32f7c3808688eceeb6fee74335 -> 135 passed, zero introduced regressions. Live-body classifier revalidation against #652/#653/#655 plus #631-shaped and three eligibility controls -> 7/7, 0 failures, each container returning a structured skip reason. git diff a4c73766...3b68d155 limited to allocator_service.py and tests/test_issue_854_semantic_container_exclusion.py. All commands run from a read-only export of the pinned head; no worktree modified. NATIVE_REVIEW_PROOF: transport=native_mcp; entrypoint=mcp_server; pid=49253 LAST_UPDATED_BY: sysadmin / prgs-reviewer / 2026-07-25
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #883
issue: #854
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 49253-04cd5f9f8d14
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr883
phase: released
candidate_head: 3b68d15593
target_branch: master
target_branch_sha: a4c73766f4
last_activity: 2026-07-25T03:08:07Z
expires_at: 2026-07-25T03:18:07Z
blocker: manual-release

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #883 issue: #854 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 49253-04cd5f9f8d14 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr883 phase: released candidate_head: 3b68d1559388b5dcdc4f17b5615886202f617821 target_branch: master target_branch_sha: a4c73766f4b0cc32f7c3808688eceeb6fee74335 last_activity: 2026-07-25T03:08:07Z expires_at: 2026-07-25T03:18:07Z blocker: manual-release
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #883
issue: #854
reviewer_identity: sysadmin
profile: prgs-merger
session_id: 16119-e4ae4671398f
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/mergesim-883
phase: claimed
candidate_head: 3b68d15593
target_branch: master
target_branch_sha: a4c73766f4
last_activity: 2026-07-25T03:27:28Z
expires_at: 2026-07-25T03:37:28Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #883 issue: #854 reviewer_identity: sysadmin profile: prgs-merger session_id: 16119-e4ae4671398f worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/mergesim-883 phase: claimed candidate_head: 3b68d1559388b5dcdc4f17b5615886202f617821 target_branch: master target_branch_sha: a4c73766f4b0cc32f7c3808688eceeb6fee74335 last_activity: 2026-07-25T03:27:28Z expires_at: 2026-07-25T03:37:28Z blocker: none
sysadmin merged commit 7af40fb5ff into master 2026-07-24 22:27:58 -05:00
Owner

Stale #332 review-decision lock cleanup (#594)

Status: APPLIED

Manual deletion of session-state files is not the workflow.
This path only clears a lock when the referenced PR is merged/closed.

## Stale #332 review-decision lock cleanup (#594) Status: **APPLIED** - actor: `sysadmin` - profile: `prgs-merger` - timestamp: `2026-07-25T03:28:00.738786+00:00` - last terminal: `approve` on PR #883 - PR state: `closed` (merged=True) - merge_commit_sha: `7af40fb5ff7debd5e9165fe97d9c7c279358e175` - prior live_mutations_count: `2` - prior profile_identity: `prgs-reviewer` Manual deletion of session-state files is **not** the workflow. This path only clears a lock when the referenced PR is merged/closed.
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Scaled-Tech-Consulting/Gitea-Tools#883