# probe_matrix

## Probe Context

- Date: `2026-03-22`
- Endpoint: `http://localhost/buh_test/odata/standard.odata/`
- Source files:
  - `logs/probe_report.json`
  - `logs/sample_links.json`
  - `logs/metadata.xml`
  - `logs/deep_subconto_join_probe.json`

## Chain Status Matrix

| Chain | Description | Status | Evidence summary |
|---|---|---|---|
| A | `Document_Реализация -> Posting -> Account -> Subconto` | `derivable` | Proven by join: document lines (`Ref_Key + LineNumber`) to posting rows (`Recorder + LineNumber`), with account match and `Subconto_Type` present. |
| B | `Document_Поступление -> Posting -> Accounts` | `derivable` | Document rows are readable; account keys restored via `Recorder` bridge to accounting register. |
| C | `Counterparty -> Contract -> Documents -> Movements` | `derivable` | `Owner_Key`, `Контрагент_Key`, `ДоговорКонтрагента_Key` are available; movement path is derivable through recorder-based joins. |
| D | `Bank docs -> BankAccount -> Movements` | `derivable` | Bank documents and bank account keys are readable; movements are joinable via register records. |
| E | `Document_ОперацияБух -> AccountingRegister -> Explainability` | `derivable` | Manual operation docs and accounting register records are readable with stable account/recorder fields. |
| F | `ChartOfAccounts -> SubcontoType -> Posting` | `derivable` | Derivable in data-driven mode (posting account + linked document-line `Subconto_Type`), even though direct normative mapping from ChartOfAccounts fields is not exposed. |

## Relation-Level Status (core)

| Relation | Status | Evidence type |
|---|---|---|
| `Document -> Posting` | `derivable` | key-based join (`Ref_Key` <-> `Recorder`) plus `LineNumber` |
| `Posting -> debitAccount` | `direct` | `AccountDr_Key` in `AccountingRegister_Хозрасчетный_RecordType` |
| `Posting -> creditAccount` | `direct` | `AccountCr_Key` in `AccountingRegister_Хозрасчетный_RecordType` |
| `Posting -> Organization` | `direct` | `Организация_Key` in `AccountingRegister_Хозрасчетный_RecordType` |
| `Document -> Counterparty` | `direct` | `Контрагент_Key` in document entity sets |
| `Document -> Contract` | `direct` | `ДоговорКонтрагента_Key` in document entity sets |
| `Counterparty -> Contract` | `direct` | `Owner_Key` in `Catalog_ДоговорыКонтрагентов` |
| `Organization -> BankAccount` | `direct` | `ОсновнойБанковскийСчет_Key` / `СчетОрганизации_Key` |
| `Posting -> SubcontoType` | `derivable` | Proven in `logs/deep_subconto_join_probe.json` with joined rows and stable `Subconto_Type` extraction |

## Evidence Snapshot For Deep Subconto Probe

- Tested document key: `b8661088-b0f2-11e4-9980-5404a6c12c2c`
- Posting rows for document: `108`
- Document line rows: `36`
- Joined rows: `36`
- Account match in joined sample: `true`
- Chain A status in deep probe: `derivable`
- Chain F status in deep probe: `derivable`

## Caveat (important)

- `ChartOfAccounts -> SubcontoType` is currently reconstructed from observed data (`Posting + Line Subconto_Type`), not from an explicit normative field map exposed by OData metadata.
- For strict compliance scenarios, keep this caveat in model governance notes.
- Hard-gate check `posting -> subconto[1..3] -> counterparty/contract/item` is still incomplete: slots `1` and `2` are proven, slot `3` is not yet reproducibly proven (`logs/deep_accounting_mvp_gate.json`).
- Slot `3` recon artifact confirms this is a data/evidence gap on current sample (`logs/slot3_recon_report.json`): slot3 fields exist in metadata, but non-null slot3 values were not observed in sampled rows.

## Security Check (write deny)

Transport-level check on `$metadata`:

- `POST` -> `405`
- `PATCH` -> `405`
- `DELETE` -> `405`

Role-level read-only should still be audited in 1C permissions.
