fix(store): source_issue "none" clears it (move a split's closing edge) - #491
Conversation
…osing edge to the last slice
update_feature treated an empty/whitespace source_issue as 'leave it', and there was no
way to clear one. When a split grew a new last slice (ADR 0115 gained a docs card after
C6), C6 kept 'Fixes #3760' next to the new last card, so C6's merge would close the issue
before the docs landed. "none" / "clear" / "-" now clears it (the waits_for convention),
through board_update_feature and PATCH /features/{fid}.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
QA panel review — PASS
code-review-structural · head 78429b3712e7 · formal
Low-risk, well-scoped change: adds sentinel values ("none", "clear", "-") to source_issue in update_feature to clear the stored source-issue line, with docstring updates and a parametrized test. All four LLM finders confirm the logic is sound and consistent across call sites. The protoPatch engine produced 16 findings, all targeting pre-existing code outside this diff's scope — dropped. The single surviving finding is a naming nit on the new set_source variable, confirmed by the verifier. No panel disagreements; no coverage gaps.
Findings
| Severity | Location | Finding | Verified | |
|---|---|---|---|---|
| ⚪ | nit | store.py:2229 |
The local variable set_source now evaluates True when the source issue is being CLEARED, so its name no longer matches its meaning. |
confirmed |
findings JSON (machine-readable)
[
{
"file": "store.py",
"line": 2229,
"severity": "nit",
"category": "conventions",
"claim": "The local variable `set_source` now evaluates True when the source issue is being CLEARED, so its name no longer matches its meaning.",
"evidence": "set_source = (source_issue is not None and str(source_issue).strip()) or clear_source",
"verdict": "confirmed",
"note": "Code verified verbatim at head SHA; when clear_source is True, set_source is True, so the name misleads \u2014 a name like `touch_source` would be more accurate."
}
]There was a problem hiding this comment.
Promoting the PASS verdict for head 78429b3712e7: all checks terminal-green, zero unresolved review threads. (approve-on-green)
Open findings carried by this approval — non-blocking, but they did not go away:
- nit
store.py:2229— The local variableset_sourcenow evaluates True when the source issue is being CLEARED, so its name no longer matches its meaning.
Approving a WARN does not resolve its findings (issue #22).
There was no way to clear a card's
source_issue. An empty value means "leave it", and "none" failed validation. So when a split gains a new last slice, the old last slice keepsFixes #Nand closes the issue early. Live case: the ADR 0115 split gained a docs card (bd-negi) after C6 (bd-83sh), and C6 still carriedsource_issue=#3760."none"/"clear"/"-"now clears it, the same convention aswaits_for. It's instore.update_feature, so bothboard_update_featureandPATCH /features/{fid}get it. Files and the requirement ledger in the shared notes field are carried forward. The docstrings say how to clear.Test: parametrized clear, keeping
files_to_modify. Full suite: 2649 passed, 36 skipped. ruff clean.🤖 Generated with Claude Code