Pick up GitLab issue #295 ("Media tab: mark unfinished items for managers") with /pickup-issue 295, then get onto its branch with /branch-worktree 295. The issue body holds the spec: manager-only marks on Media tab tiles for "Needs a caption", "Default cover" (a generated cover has no uploaded filename), and "In a draft of <post title>". The draft check is one lookup per page against live manifests, the same check DeleteOrgMedia uses. Unhide is disabled with a hint, and the refused Delete explains that the picture is in a draft. Each mark opens the editor on that item. Marks are computed, never stored. Follow AGENTS.md: orient (CONTEXT.md, the media DECISIONS.md entries), then propose a plan cut into thin vertical slices and post it to the issue. Wait for James to say "build slice N" before writing code. When building, test the whole user action (drive the real Media tab: open the editor, finish the item, see the mark go away), not just helpers. Validate with pnpm check:fast on Node 24 (~/.nvm/versions/node/v24.18.0/bin). Never commit or push unless asked. Leave edits unstaged.
On branch 295-media-tab-mark-unfinished-items-for-managers (created on GitLab, switched in place). Now orienting on the media code and decisions.
Reading the reference lookups (getReferencedMediaKeys, getReferencedMediaIds) to see how the draft check works today.
Checking how the editor names a captured cover frame, since “Default cover” relies on a generated cover having no filename.
I posted the plan for #295 to the issue: plan comment. I made the branch 295-media-tab-mark-unfinished-items-for-managers on GitLab and switched this worktree onto it. No code is written and nothing is committed. The issue is still in workflow::inbox; once you approve the plan, /handoff-issue should move it to implementation.
How it works: the Media tab’s list call gains two facts per item, sent to managers only:
Default cover: whether the video’s cover has no uploaded filename. A generated cover has none. A frame captured in the editor uploads as cover.jpg, so it counts as chosen.
In a draft: which drafts hold the item. This is one lookup per page, using the same draft check as the Delete refusal.
“Needs a caption” needs no server change, because every tile already has its caption. Nothing is stored. Each editor save already refreshes the list, so a mark disappears as soon as the item is finished.
Slices. Each is tested by driving the real Media tab:
Needs a caption (screen only): the chip opens the editor; add a caption, press Done, and the chip is gone.
Default cover: pick a frame under Cover, and the chip is gone.
In a draft of title: publish the post, and the chip is gone. A job or trip draft the manager can’t author reads just “In a draft”.
Make public / Delete (screen only): Make public is disabled on a picture a draft holds, and tapping it shows “Publish the post to make it visible”. A refused Delete says the picture is in a draft of that post. Neither server action changes.
Questions in the comment (the box above asks the first):
Which drafts count: a published post that is being edited lists all its pictures in its draft, so they would all show the mark while someone edits it. I recommend marking only items in a draft that no published post shows.
A video whose generated cover failed: I recommend marking it “No cover”.
Which tool the editor opens on: a recorded decision says the editor always opens on Caption. I’d keep that, so clicking “Default cover” means one more tap on Cover.
Chip crowding on phone-width tiles: build it and have the designer look in review, or make a mock first?
