# P1-0 — C20 authored rows and A3 identity decision

**Date:** 2026-08-05
**Prototype pin:** `9359c67c4ef0101218d7e0ffff1986114ba5cc7a`
**Status:** normative P1-0 decision document; documentation only

This document records values that v5.0 creates rather than pretending they were present in the
pre-decision prototype. Every seed field has exactly one marker: `extracted`, `authored`, or
`absent`. `Absent` means the value is blank; its evidence search and reason are recorded. No value
is inferred from a neighbouring row, row count, or marginal vocabulary domain.

## 1. Extracted row shapes and observed domains

The DOCEFL source shape is the following ordered 20-field list from
`Editor/Data/flag_evaluation.json` (blob
`02ec1ac5e8e1389c7a94ccc30a6b1977414d9098`):

| Field | Observed domain at the pin / annex |
|---|---|
| `FlagReasonCategory` | free text; 44 distinct |
| `DetectionPattern` | nullable free text; 37 distinct |
| `FlagCategory` | `High Risk`, `Information`, `Low Risk`, `Medium Risk` |
| `RiskFactor` | integers 1–9 |
| `AutoReviewable` | `No`, `Yes` |
| `Summary` | free text; 45 distinct |
| `FlowDimension` | `Bank Reconciliation`, `Document Entry`, `Document Registry`, `Entity Item Classification` |
| `EFCode` | `EF0000001` through `EF0000045` at the pin |
| `AppliesToTable` | the nine verbatim domains in `docs/p1-0-vocabularies.md`; relational import expands each semicolon list one-row-per-pair |
| `AppliesToField` | nullable free text; 27 distinct |
| `PolicyReference` | free text; 8 distinct |
| `RequiredAction` | free text; 34 distinct |
| `AutoActionAllowed` | `No`, `Yes`, `Yes (provided all Entity Entry Flow requirements are verified)` |
| `ReviewOwnerRole` | `AI`, `Finance Reviewer`, `Master-Data Reviewer`, `Process Owner` |
| `ReviewPriority` | `Before Posting`, `High`, `Immediate`, `Informational`, `Periodic Review` |
| `BlockingLevel` | `Block Classification`, `Block Document`, `Block Financial Entry`, `Block Reconciliation`, `Non-Blocking` |
| `ResolutionEvidenceRequired` | free text / high-cardinality |
| `RuleVersion` | `1.0`, `1.1`, `2.0` |
| `Active` | `Yes` |
| `EffectiveFrom` | dates `2026-07-31` through `2026-08-03`; FDR authoring time, never Sibyla enforcement time |

Sibyla adds `EnforcementStartsAt` and `ItemClass`; their target domains are respectively an instant
and the closed `Decision|Status|Annotation` vocabulary. They are included in every authored
DOCEFL field table below.

The BNKMAT source shape is the following ordered 14-field list from `Editor/Data/bnkmat.json`
(blob `d34c1bba03fe6f1d6a23851f25c328029f57b161`): `MatchType`, `MatchDescription`,
`EntrySource`, `ReconciliationType`, `Explanation`, `BTCode`, `AutoProposeAllowed`,
`AutoCloseAllowed`, `RequiresFDCHDR`, `RequiresReview`, `MaxDateWindowDays`, `ToleranceAmount`,
`ControlFormula`, `Flag / Review Notes`. The annex enumerates the 11 pinned `MatchType` values;
the other fields are boolean-like or free-text governed values and have no marginal domain in the
annex. Sibyla's target rule also carries `RequiredEvidence`, `TestCaseReference`, `Active`, and
`RuleVersion`, included below.

## 2. C11 sentinel DOCEFL row

Placement: this is a reference row and the `(EFCode, ItemClass)` FK target for `FL0002653`,
`FL0002654`, `FL0002655`, and `FL0002661`. It makes imported no-rule instances queryable without
weakening the non-null EFCode constraint.

| Field | Value and same-cell justification | Marker | Basis / search |
|---|---|---|---|
| `FlagReasonCategory` | `imported instance with no rule attached` | `authored` | C11's verbatim description, placed in DOCEFL's category/description field |
| `DetectionPattern` |  | `absent` | C11, the governed source seed, scripts, and annex provide no pattern; a sentinel describes the absence of a detector |
| `FlagCategory` |  | `absent` | C11 does not decide a rule category; instance observations are not copied into a nonexistent rule |
| `RiskFactor` |  | `absent` | No risk factor is decided for the sentinel |
| `AutoReviewable` |  | `absent` | No review automation behavior is decided for the sentinel |
| `Summary` |  | `absent` | The only decided description is already preserved verbatim; no second prose value is invented |
| `FlowDimension` |  | `absent` | A row representing no attached rule has no defensible detector dimension |
| `EFCode` | `EF0000000` | `authored` | C11 verbatim |
| `AppliesToTable` |  | `absent` | No rule exists to evaluate a table; no `DOCEFLAppliesTo` child is created |
| `AppliesToField` |  | `absent` | No evaluated field exists |
| `PolicyReference` |  | `absent` | C11 names no business policy for the nonexistent detector |
| `RequiredAction` |  | `absent` | C11 records empty shells with no required action |
| `AutoActionAllowed` |  | `absent` | No auto-action decision exists |
| `ReviewOwnerRole` |  | `absent` | No rule owner exists |
| `ReviewPriority` |  | `absent` | No rule priority is decided |
| `BlockingLevel` | `Non-Blocking` | `authored` | C11 verbatim |
| `ResolutionEvidenceRequired` |  | `absent` | C11 records no evidence on the four shells |
| `RuleVersion` | `1.0` — initial target reference-row version | `authored` | Structurally implied by adding the first version of this target row |
| `Active` | `Yes` — the row must be active to serve as the imported FK target | `authored` | Structurally implied by the row's reference purpose |
| `EffectiveFrom` |  | `absent` | The row was not authored in FDR; no FDR authoring timestamp exists |
| `EnforcementStartsAt` |  | `absent` | A Non-Blocking sentinel enforces nothing and C11 supplies no timestamp |
| `ItemClass` | `Annotation` | `authored` | C11 verbatim |

## 3. C12 Monthly-gap DOCEFL row

EF allocation rule, amended by O8-D1: the governed source manifest occupies every value from
`EF0000001` through `EF0000052`; `EF0000000` is reserved by C11. Read-only checks at immutable pin
`b91768513fc638381fbde91f0b576b08220a98f6` found no EF code above `EF0000052` in either
`permanent_code_ledger.json` or `flag_instances.json`. The lowest code verified free on both sides
is therefore allocated as `EF0000053`. This is an authored allocation, not a value claimed from the
pin; O8-D1 is the single governed re-authoring of the never-imported, never-activated row.

| Field | Value and same-cell justification | Marker | Basis / search |
|---|---|---|---|
| `FlagReasonCategory` | `Expected monthly invoice gap` — names exactly the governed condition | `authored` | Structurally implied by C12's detector definition |
| `DetectionPattern` |  | `absent` | C12 defines a data-aware comparison, not a source-text pattern |
| `FlagCategory` |  | `absent` | C12 does not decide a risk category |
| `RiskFactor` |  | `absent` | C12 does not decide a numeric risk factor |
| `AutoReviewable` |  | `absent` | No auto-review decision is supplied |
| `Summary` | `Detect an expected invoice gap only for ENTMST providers whose evidenced InvoiceFrequency equals Monthly exactly; values containing (assumed) are excluded because an assumption without evidence must not manufacture a finding.` | `authored` | C12 semantics, verbatim in substance |
| `FlowDimension` |  | `absent` | The closed decision does not select one of the four observed dimensions |
| `EFCode` | `EF0000053` | `authored` | O8-D1 allocation rule immediately above |
| `AppliesToTable` | `ENTMST` — the governed predicate reads provider frequency there | `authored` | Structurally implied by C12 |
| `AppliesToField` | `InvoiceFrequency` — the exact field tested by the predicate | `authored` | Structurally implied by C12 |
| `PolicyReference` |  | `absent` | C12 cites no business-policy literal from the observed field domain |
| `RequiredAction` | `Review the missing monthly document and retain the decision so the same dismissed gap is not re-proposed.` | `authored` | Structurally implied by replacing the stateless OFDGAP view with persisted Decision findings |
| `AutoActionAllowed` |  | `absent` | C12 does not decide automatic action authority |
| `ReviewOwnerRole` |  | `absent` | C12 does not choose an owner role |
| `ReviewPriority` |  | `absent` | C12 does not choose a priority |
| `BlockingLevel` |  | `absent` | C12 does not decide whether the gap blocks an action |
| `ResolutionEvidenceRequired` | `Evidence of the invoice, an evidenced frequency change, or an authenticated dismissal reason.` — these are the facts that can resolve the gap | `authored` | Structurally implied by the persistent gap decision |
| `RuleVersion` | `1.0` — first governed version | `authored` | Structurally implied by adding a new governed rule |
| `Active` | `No` — the rule is seeded but cannot run until the governed activation command supplies its category, owner, priority, blocking level, and enforcement start | `authored` | Structurally implied by the fail-closed active-Decision CHECK |
| `EffectiveFrom` |  | `absent` | The row did not exist in FDR, so no FDR authoring timestamp exists |
| `EnforcementStartsAt` |  | `absent` | No Sibyla activation instant is decided in P1-0d; it must be supplied by the governed import/activation command |
| `ItemClass` | `Decision` | `authored` | C12 replaces a returning phantom backlog with persistent human-decision memory |

## 4. D6 BNKMAT row

BT allocation rule: the pinned BT sequence occupies every value from `BT000001` through
`BT000011`; the next unused monotonically increasing BT code is allocated as `BT000012`.

| Field | Value and same-cell justification | Marker | Basis / search |
|---|---|---|---|
| `MatchType` | `Matched — ledger reference, no entry` | `authored` | D6 verbatim |
| `MatchDescription` | `A bank movement is linked to a governed ledger reference but resolves to no FDCHDR EntryCode.` — states the distinct result | `authored` | Structurally implied by D6 |
| `EntrySource` | `BNKMOV` — the classified object is a bank movement | `authored` | Structurally implied by D6 |
| `ReconciliationType` |  | `absent` | D6 and the 11-row pin do not define a defensible governed type name for this addition |
| `Explanation` | `A ledger reference is not proof that a financial entry exists; this status is distinct and excluded from the reconciliation percentage.` | `authored` | D6 verbatim in substance |
| `BTCode` | `BT000012` | `authored` | Allocation rule immediately above |
| `AutoProposeAllowed` |  | `absent` | D6 does not decide proposal authority |
| `AutoCloseAllowed` |  | `absent` | D6 does not decide automatic closure authority |
| `RequiresFDCHDR` | `No` — the status exists precisely when no FDCHDR entry resolves | `authored` | Structurally implied by D6 |
| `RequiresReview` | `Yes` — the distinct visible result emits Decision-class review work | `authored` | Structurally implied by D6's required visibility and the schema mapping's review routing |
| `MaxDateWindowDays` |  | `absent` | No date-window logic applies or is decided |
| `ToleranceAmount` |  | `absent` | No amount tolerance is decided; inventing one is forbidden |
| `ControlFormula` | `LedgerReference is present AND no FDCHDR EntryCode resolves.` — the minimum deterministic classifier | `authored` | Structurally implied by D6 |
| `Flag / Review Notes` | `Exclude this status from the reconciliation numerator.` | `authored` | D6's field-level metric exclusion |
| `RequiredEvidence` | `The source ledger reference and deterministic evidence that it resolves to no FDCHDR EntryCode.` | `authored` | Structurally implied by the control formula |
| `TestCaseReference` | `A movement with a ledger reference and no FDCHDR row receives BT000012 and contributes to neither the reconciliation numerator nor a clean-match result.` | `authored` | Structurally implied acceptance case required by D6 governance |
| `Active` | `Yes` — D6 adds the governed status for use | `authored` | Structurally implied by the row's definition |
| `RuleVersion` | `1.0` — first governed version | `authored` | Structurally implied by adding the row |

## 5. A3 — BNKREC identity measurement

Measured over all 2,072 `Editor/Data/bnkrec.json` rows at the same pin. Collision count is
`row count - distinct count`, matching C13's table shape. No row values were copied.

| Candidate key | Distinct | Collisions |
|---|---:|---:|
| `(BMCode)` | 1,960 | 112 |
| `(BMCode, EntryCode)` | 2,072 | **0** |
| `(BMCode, EntryCode, MatchType)` | 2,072 | 0 |
| `(BMCode, EntryCode, ReconciliationMatchType)` | 2,072 | 0 |
| `(BMCode, EntryCode, MatchType, ReconciliationMatchType)` | 2,072 | 0 |
| `(MatchGroupID, BMCode, EntryCode)` | 2,072 | 0 |
| all business fields except `BRCode` and `MatchGroupID` | 2,072 | 0 |

Decision: the lowest-field, zero-collision, semantically defensible production key for BRCode is
`(Company, BMCode, EntryCode, FindingDiscriminator)`, with PostgreSQL NULLS NOT DISTINCT semantics.
At the pin every imported row has the ordinary `FindingDiscriminator='link'`, so its measured
equivalent is `(BMCode, EntryCode)`: 2,072 distinct, zero collisions. Company and discriminator
make the key safe for production company scope and for additional findings without depending on
row order. The key is `authored`, with this measurement as evidence. BR issuance remains P1-1b.

`MatchGroupID` is run-scoped and explicitly non-permanent. It is computed from `(MatchStatus,
BMCode)` for Unmatched, Internal, and payout-reconciliation Matched groups and from `(MatchStatus,
MatchedRef)` otherwise. It has no CodeLedger bucket, must never be quoted as stable identity or
cited in a decision record, and is not part of the BRCode key.
