Skip to content

Unattended capture produces records with no Record-Id, so nothing can cite or supersede them #535

Description

@MongLong0214

What happens

A record captured through the full unattended pipeline lands on the commit with no Record-Id.

Reproduced end to end against current dev:

commitlore capture --transcript <t> --draft <d> --unattended   # staged: true, rejected: []
git commit -m "fix: bound the limiter"
fix: bound the limiter

Ruled-out: Redis-backed sliding window | pricing must answer when Redis is down
Provenance: drafted

Provenance is stamped by the pipeline. Record-Id is not stamped by anything, so a draft that does not carry one produces an anonymous record — and nothing in prepare, verify or stage reports its absence.

Why this is not a drafting nit

The product's claim is that recording leaves the user's workflow: install it, work normally, and the decision is preserved without anyone remembering an extra step. A pipeline that requires the author to invent a well-formed unique identifier has not left the workflow — it has moved one step of it onto whoever writes the draft, and that step is the one most likely to be skipped, because omitting it produces no error.

Measured across four repositories running unattended capture today:

                       CommitLore trailers   Record-Id
agent-operator-score                   250          28
logic-pro-mcp                          101           0
stock-ai-newsletter                     39           0
hermes-agent                           106           0

The one repository with identities is the one whose records were hand-authored by someone who knew to add them. Every repository relying on the automatic path has none.

What is lost without an identity

Record-Id is not decoration. Without it:

  • supersession cannot resolve. A later record that retires an earlier one has nothing to name, so lifecycle state cannot be folded (SPEC §5).
  • identity-collision detection has no key. The withheld: ... due to a Record-Id collision path cannot fire on records that have no id to collide.
  • the injected payload renders - where the id belongs. An agent handed a constraint cannot cite the record it is about to act on, which is the whole point of delivering it.
  • CDEB candidate registration requires record_ids (PRD §3.2), so records accumulating now cannot back a task later.

Expected

The capture pipeline mints a Record-Id when the draft does not carry one, the same way it already stamps Provenance. A draft that supplies its own valid id keeps it.

Properties worth pinning:

  • the minted id matches ^r-[a-z0-9]{6,}$ — the same grammar validate enforces
  • it is unique within the repository at stage time; an id already present is not reused
  • re-preparing an unchanged record yields the same id rather than a second one, so a retried capture does not create a duplicate identity for one decision
  • an id the draft supplied is never silently replaced

Related

Not the same as #527, which is about init overstating what unattended capture does when no host initiator exists. This one is about what the pipeline produces once it does run.

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