Skip to content

Captain-answer attribution has no per-key record, so the gated-hold shape cannot be marked #263

Description

@HelloWorldSungin

Split out of #235 on 2026-09-04 as a deliberate deferral with a record, not a quiet scope reduction.

What #235's fix does and does not cover

#235's accepted fix makes a self-decided ask-user finding visible by marking firstmate's own answers, so an answered call can be told from one a worker decided for itself. That marking works only where the answer's decision key is recoverable from what already exists: the key IS the held task id, or it is the legacy <origin>-decision-<key> form that encodes the key in the id.

It does NOT cover the shape captain-hold-lifecycle itself recommends. That skill says, verbatim, "Prefer holding the work item the question gates over minting a new row", so the common case is an origin task escalating needs-decision [key=route] while the held row is the gated work item under a different id. In that shape the mark cannot be attributed.

Why it was not simply fixed

Established from the code during the #235 work rather than assumed: command_complete receives a flat list of hold ids with no keys attached, and pairs them with fold-derived keys only by writing the whole inventory on every key's line, so the transfer note records no key-to-hold mapping at all. Any hold in the inventory therefore matches every key that the same complete transferred. Nothing else associates a hold with a key.

An attempted fix inside #235 made this worse rather than better: it over-marked, writing a false answered record for one call using another call's ruling and then suppressing the real answer. That is a false record, which is strictly worse than a gap.

So closing this properly needs durable per-key attribution that does not exist today. That is new state, it was judged an expansion beyond #235's accepted intent, and it was declined there deliberately.

What #235 ships instead

Marking restricted to the provably attributable shapes, and for every other shape the row is VISIBLY SILENT: it reports that this shape cannot be attributed and why, rather than emitting either a verdict or an accusation. A check that names what it cannot see is preferred over one that quietly gets it wrong.

The question this issue holds

Should firstmate carry durable per-key attribution so a captain answer can be tied to the specific decision key it answered, covering the gated-hold shape?

Worth weighing when it is picked up:

  • The benefit is real: the uncovered shape is the one the lifecycle skill actively recommends, so the blind spot sits over the common case rather than an edge.
  • The cost is real too: this mechanism produced defects in five consecutive review rounds, and the one attempt to add correlation without new state produced a false-record defect. New durable state on that path deserves a deliberate decision rather than an accretion.
  • A cheaper alternative may exist and was not explored: having complete record the mapping at write time IF the caller can supply it, rather than reconstructing it afterwards. That was ruled out for A steer delegated ask-user finding authority back to the implementation worker, and nothing in the fleet noticed for four findings #235 only because the current caller does not have the keys, which is a caller question rather than a storage question.

Not urgent

Nothing is blocked. The shipped behaviour is honest about its own limits, which is what #235 asked for.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions