Skip to content

tech-debt: /write-issue contract — $assignee parameter + membership-precedes-state invariant (deferred half of #402) #403

Description

@rucka

Problem

The deferred half of #402. That story fixes the mechanics in the PM-tool adapters (membership branch, assignee recipes) — reached through write-issue Step 7.2's existing delegation. What it deliberately leaves open is the contract in the skill:

  1. $assignee is not a parameter of /write-issue. assignee appears zero times in .skills/capability/write-issue/SKILL.md. Step 7.2 delegates "project field settings (priority, type, status)" — an enumeration that excludes the assignee, so a caller has no way to pass one and the adoption's Assignment rule stays unenforceable at the contract level.
  2. The membership-precedes-state invariant is unstated. Step 6/7 resolve $status and write the board field assuming a field exists to write. When the item is not in the tracked view there is none. The invariant is tool-agnostic and belongs here; the per-tool mechanics stay in the adapters (tech-debt: PM-tool adapters implement neither assignee nor board membership — an item can be written and stay invisible #402).
  3. The board write must HALT, not no-op. A caller whose item is unresolvable currently gets a skipped board write reported as success (Step 7.4 "confirm the board field reflects the resolved board state" has no failure path). Silent success is what let tech-debt: extend mirror-equality guard to all root skill artifacts (sub-docs + references) #384/Coverage baseline auto commit-back — CI persists/ratchets the baseline (opt-in, on top of #282) #372 sit off the board while looking fine.

Blocked on

#389 (PR #390 is a separate matter; this is PR #389) rewrites exactly the regions this story must edit:

Region #389 hunk
Params table (where $assignee goes) -9,28
Step 6 — board state resolution -112,15
Step 7 — the write -131,15

Implementing against today's main means a head-on content merge on those three hunks, and #389 restructures the params table for the code-host/PM-tool separation — so the merged result has to be re-derived by hand rather than rebased.

Also arrives with #389: linear-implementation.md (+312, new file). Its membership + assignee coverage belongs here too, since the file does not exist on main.

Scope

Dependencies

Origin

Split out of #402 during its refinement, after hunk-level verification showed the adapter half is parallel-safe against the six parked PRs and the skill half is not.


Scope reduced, and unblocked (2026-07-31)

Unblocked: #389 merged as 2da33a88, so the regions this story must edit (write-issue/SKILL.md's parameter table and Steps 6/7) are stable on main.

No longer in scope: linear-implementation.md's Item Visibility coverage. It moved to #402 (PR #404, bdd175c8) because #389's merge made that file present, and #402's guard requires the section from every adapter present — so the obligation landed there rather than waiting for this story.

What remains here is exactly the skill-contract half: $assignee in the /write-issue parameter table plumbed into Step 7.2's enumeration, the tool-agnostic membership-precedes-state invariant, a HALT on an unresolvable item instead of a silently skipped board write, and the /pair-capability-publish-pr PR-assignee write (added from PR #404's review finding M3).

Metadata

Metadata

Assignees

Labels

tech-debtTracked technical debt (living backlog, R7.2 — never blocks a PR)

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions