Skip to content

34 backfilled contracts carry a legal_owner, and is_backfilled says on the same row that no review ever happened #53

Description

@zhuangjianguo

Found while measuring #47. ⚠️ This is a semantics question, not a defect report: one of the two readings below is right and the fixture currently asserts the other without saying so.

Measured

claude/issue-47-seed-legal-owner, from the compiled artifact:

contracts with a legal_owner            68
  of those, is_backfilled = true        34
  of those 34, review_started_at        null  (all 34)

So a third of the corpus carries a named lawyer on a row that also says, in its own columns, that nobody ever reviewed it.

The contradiction, in the declarations' own words

  • clm_contract.legal_owner, src/objects/contract.object.ts: description "The lawyer who accepted the review. Required before a submitted contract enters review."
  • clm_contract.is_backfilled, DESIGN.md §13 Q8: 补录的已签合同 — an already-executed contract entered after the fact, which starts active and skipped review and approval. src/data/plan-contracts.ts says the same at length: the backfilled population "claims nothing they do not have … no submitted_at, no review_started_at, no approved_at, no review, no deviation and no signature round".
  • F16 (executed_upload) is the action that produces such a contract in the running app, and it assigns no legal owner.

The fixture's rule is hasLegalOwner = pastSubmission && type.requiresLegalReview && status !== 'submitted', which does not consult backfilled. That is why the two claims sit on the same row.

The two readings, and what each costs

  • A. legal_owner means "the lawyer who accepted the review". Then a backfilled contract must not carry one, and hasLegalOwner gains && !backfilled. ⚠️ Cost, and it is real: DESIGN.md §10 draws the expiring corpus from the backfilled contracts, so those 34 rows are precisely F12 renewal_notice and F13 expiration_sweep's population. Both copy legal_owner beside owner_id, so every renewal and expiry notice would drop from two recipients to one — the opposite direction from The demo makes M3's reminder layer look broken: 54 of 120 contracts have no legal_owner, so four of six scheduled jobs notify nobody #47.
  • B. legal_owner means "the lawyer who owns this file in legal". Then the data is right and the field description is what is wrong, and it should say so — custodianship, with the review-acceptance sentence demoted to how the column is normally first written.

B is the cheaper answer and, for a records-keeping product, arguably the truer one: a backfilled contract still has somebody in legal responsible for it. But that is a product decision about what a column means, not a developer's, and either way something has to change so the row stops asserting both.

Not urgent, and ⛔ not a rider

Nothing measured is broken: no gate, no flow and no screen misbehaves. It is on the "places the product lies" list from #45 — a column that says one thing while the column next to it says the opposite — which is why it is filed rather than left in a PR body.

Related

#47 (where this was measured; it deals this column but deliberately does not change WHICH rows carry it) · #39 / PR #42 (F12/F13, and F16 which creates backfilled contracts) · #45 (the dogfood pass and its "places the product lies" category) · DESIGN.md §13 Q8

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions