# Conversation context: Invoicing and contract frontend — branch-wide mock and wiring inventory

This is a source-based snapshot of `feature/SAAS-1584-invoice-planning` against `main` on 2026-10-23. It inventories newly introduced or modified frontend flows, including surfaces outside the three example routes. `REAL` means the described business data or mutation reaches the Tenant backend; `PARCIAL` means a real read or interaction is paired with an unimplemented business action; `MOCK` means business data or its apparent mutation is fabricated/client-only. URL navigation, temporary selection, modal visibility, draft validation, and tab/hash state are legitimate UI state, **not** persisted business operations. Classification applies to each stated capability, not necessarily its entire page. The inventory is based on static code inspection; the functional browser evidence and its coverage limits are consolidated in the final section.

## 1. Scope and discovery

The `main...HEAD` diff changes 1,171 files across Tenant Billing, Contracts, Invoicing, removed Payments/VariableRent, routes, translations, tests, shared frontend utilities, and docs. Frontend production changes cluster in `resources/js/pages/tenant/invoicing/v1/`, `resources/js/pages/tenant/contracts/v1/`, the Tenant contract-chain lookup module, sidebar, query builder, modal, hash hook, and notification-rule card. The old `/v1/billing/*`, Contract billing, payment collection, bulk payments and variable-rent/sales-report UI and routes are removed rather than still secretly connected: compare `routes/web/tenant/v1/inertia/payments.php` and `resources/js/pages/tenant/payments/v1/` (deleted in the diff) with `routes/web/tenant/v1/inertia/invoicing.php:10-29`. This is a changed product surface, not evidence that its replacement has feature parity. Container pages changed their hash-hook import only (`resources/js/hooks/use-active-form-hash.ts:1-65`); they do not gain fixture-driven business data. Existing contract details/history/docs and the main contract create/update form remain live features, except for the new sections described below.

Business/technical brief: Contract is the operating source for rent; payment obligations and fiscal documents are distinct concerns (`docs/business/colossu-overview.md:159-175`, `docs/business/tenant/contratos/contratos.md:44-55`). Inspect the new Tenant Inertia routes, their props and actual React consumers before deciding whether a rendered row, form, export, or action is backed by Tenant data. The business index references payments guides removed on this branch (`docs/business-context.md:16-18`); they cannot be used as current implementation evidence.

| Responsibility | Contract router / boundary | Wiring observed |
| --- | --- | --- |
| Tenant page, form, local lifecycle and URL state | `docs/platform/frontend/fe-ddd-pattern.md:168-181,267-281,473-495`; React UI contract | Inertia route → page/props → component/hook; some pages instead import fixture constants. |
| Query-backed detail tabs | `docs/platform/frontend/fe-ddd-pattern.md:27`; details-tab contract selected by router | Contract GET routes and Inertia navigation; local subtab URL is not a business mutation. |
| HTTP lookup and write transport | Frontend DDD API/Inertia methods; backend router for endpoint ownership | Contract-chain picker invokes an API lookup; standalone PaymentRequest uses Inertia POST/PATCH. Series/template POSTs exist without frontend callers. |

Schema review, full action-by-action backend bug review, and general overengineering assessment are outside this frontend connectivity audit. Existing persisted models and migrations do **not** make a screen integrated unless that screen consumes their responses. No Tenant DB operations were performed.

## 2. Production wiring and inventory

| Domain / route | Page or component / capability | State | Evidence and actual boundary |
| --- | --- | --- | --- |
| Global navigation, feature gated | Sidebar Facturación and three section tabs | REAL navigation | `resources/js/common/sidebar/items.ts:119-130`; `resources/js/pages/tenant/invoicing/v1/layouts/InvoicingSectionLayout.tsx:9-36`; `routes/web/tenant/v1/inertia/invoicing.php:10-21`. A real GET is not proof of real page contents. |
| `/v1/invoicing/commitments` | List, server paging, ID/client/concept/invoice-date/payment-date filters | REAL | `domain/Tenant/Invoicing/Core/V1/Application/Controllers/Inertia/InvoicingController.php:18-27` passes `PaymentRequestResource` from `SearchPaymentRequestsAction`; `resources/js/pages/tenant/invoicing/v1/CommitmentsPage.tsx:29-43,73-93`; `resources/js/pages/tenant/invoicing/v1/components/CommitmentFilters.tsx:24-54`. Real Tenant records, not `mockCommitments`. |
| Same | Add standalone commitment; edit existing commitment | REAL | `resources/js/pages/tenant/invoicing/v1/application/hooks/usePersistentCommitmentForm.ts:20-50` sends Inertia POST/PATCH; `routes/web/tenant/v1/inertia/invoicing.php:23-29`; `domain/Tenant/Billing/Core/V1/Application/Controllers/Inertia/PaymentRequestController.php:26-35,63-70` calls persistence actions. Live anchor pickers include real ContractChain lookup (`resources/js/modules/tenant/contracts/core/v1/domain/api/getContractChainLookup.ts:5-12`). Edit links only resolve rows on the current page (`resources/js/pages/tenant/invoicing/v1/domain/actions/commitmentFilters.ts:48-62`); off-page direct IDs are unavailable, not synthetic fallbacks. |
| Same | Delete once/future, capture manual amount, inflation batch | PARCIAL | Opened for actual server rows (`CommitmentsPage.tsx:35-38,80-89,113-119`), but their dialogs only validate/preview (`components/CommitmentDeleteModal.tsx:14-28,83-89`, `CommitmentAmountCaptureModal.tsx:17-26,68-75`, `InflationReviewModal.tsx:18-45,116-121`). No delete/capture/inflation write is invoked. |
| `/v1/invoicing/preinvoices` | Queue, filters, page totals and CSV | MOCK | Controller renders no business prop (`InvoicingController.php:37-45`); `PreinvoicesPage.tsx:20,32-53,113-122,164-187` joins hardcoded anchors, commitments, preinvoices. Filter/page selection is in-browser; CSV actually downloads a file, but **only fixture rows**, not live invoices. |
| Same | Variable/sales amount capture, no-CFDI review | MOCK | `PreinvoicesPage.tsx:80-87,203-224`; `components/CaptureAmountForm.tsx:18-23,33-46,58-66`; fixture-based provisional subtotal in `domain/actions/selectPreinvoiceQueue.ts:33-72`. Capture lasts only in React state and cannot change a PaymentRequest. Link action is a preview, not a sent link. |
| Same | Individual fiscal review, issuer/recipient/concept/summary, draft preview | PARCIAL | Preinvoice itself is a fixture (`PreinvoicesPage.tsx:35-53`); `components/PreinvoiceReviewModal.tsx:45-62,104-123,144-174,295-303` edits/previews only. Real `companyLookupProvider.resolve` can refresh recipient identity (`:64-95`), but this neither saves a preinvoice nor stamps, emails, prints, or creates a PDF. Stamp button disabled (`:159-161`). |
| Same | Batch selection/review | MOCK | `application/hooks/usePreinvoiceBatchReview.ts:6-60` holds selection and drafts in memory; `components/BatchPreinvoiceReviewModal.tsx:10-25,33-59` counts local readiness and disables final stamp. |
| `/v1/invoicing/documents` | Invoice list, statuses, currency counters, filter/sort/paging, sample CSV | MOCK | Controller sends page shell (`InvoicingController.php:48-56`); `DocumentsPage.tsx:21,34-59,97-105,125-155` selects invoice-kind fixtures and computes counts. `components/FiscalDocumentFilters.tsx:41-75` builds filter choices from fixtures; `domain/actions/selectInvoicingRecords.ts:21-82` sorts/filters/pages them locally. |
| Same | New invoice selection and continuation to Prefactura | MOCK | `DocumentsPage.tsx:56-57,119-121,183-189`; `domain/actions/selectNewInvoiceCandidates.ts:5-18` selects fixture candidates; `domain/inertia/visitPreinvoiceFromNewInvoiceSelection.ts:5-13` performs a real route visit carrying fixture IDs, not invoice creation. |
| Same | Document detail, related credits/complements/payments, synthetic UUID | MOCK | `components/FiscalDocumentDetails.tsx:16-19,29-44,72-88,116-126`; `domain/actions/fiscalDocuments.ts:23-37`. Graph and ledger are from constants; UUID is deterministically fabricated from document ID. PDF/XML/email controls are disabled (`FiscalDocumentDetails.tsx:128-136`). |
| Same | Edit due date, cancellation, substitution, credit note, payment complement | MOCK | `DocumentsPage.tsx:172-209`; `components/FiscalDocumentModal.tsx:18-50`; `FiscalDueDateDraftForm.tsx:18-24,62-73`, `FiscalCancellationDraftForm.tsx:18-26,104-112`, `FiscalCreditNoteDraftForm.tsx:27-35,216-224` only validate/show drafts. Substitution reuses the unpersisted Prefactura review and synthetic original UUID; complement is read-only with submit disabled (`FiscalPaymentComplementDetails.tsx:12-30`). |
| `/v1/contracts/{contract}/payment-commitments` | Upcoming obligations, status, paging, 90-day window | REAL | `routes/web/tenant/v1/inertia/contracts.php:39-42`; `ShowContractPaymentCommitments.tsx:9-25`; `ContractsController.php:130-148`; `ShowContractPaymentCommitmentsRequest.php:29-41` binds Contract and real PaymentRequests within today + 90 days; `components/ContractUpcomingCommitmentsTable.tsx:8-25` displays server `data/meta`. Not an all-time schedule. |
| Same `?subtab=tenant_sales` | Tenant sales table and its action controls | MOCK | `components/ContractPaymentCommitmentTabs.tsx:21-30`; `ContractTenantSalesTable.tsx:4-18` imports four fixed rows from `domain/constants/contract-detail-table-mocks.ts:2-43`, irrespective of contract ID. Every row action is disabled in `domain/actions/getContractTenantSalesColumns.tsx:35-52`. |
| Same | Edit commitments / go to commitments top buttons | PARCIAL | Visible on real-detail page but explicitly disabled (`ShowContractPaymentCommitments.tsx:16-23`). Subtab navigation itself is REAL UI GET (`components/ContractPaymentCommitmentTabs.tsx:14-30`). |
| `/v1/contracts/{contract}/invoicing` | Series, stored fiscal configuration, preview/status columns | REAL read | `ContractsController.php:158-173` returns `PaymentCommitmentSeriesResource::configCollection`; `ShowContractInvoicing.tsx:7-14`; `domain/actions/getContractInvoiceConceptRows.ts:4-24` maps server series/templates. `components/ContractInvoiceConceptsTable.tsx:9-27` renders empty state for no series, not fixture rows. |
| Same | Edit fiscal configuration | PARCIAL | Read is live, but edit button disabled (`ContractInvoiceConceptsTable.tsx:15-20`). POST endpoint exists (`routes/web/tenant/v1/inertia/invoicing.php:11-12`; `domain/Tenant/Billing/Core/V1/Application/Controllers/Inertia/InvoiceTemplateController.php:14-24`) and has no production JS call. |
| Contract manual create and edit (list/details/historic entry points) | Main form, Contact/Company/Asset, contract save | REAL | `components/ContractForm.tsx:97-152,251-321,698-719`; POST/PUT from `:287-319` and controller persistence (`ContractsController.php:240-281`). Existing PDF alternative and edit modal are real existing flows; their new tab/hash/PDF visibility behavior is UI-only. |
| Same | New Payment commitments tab, sample seed, concept addition, generation/charge days | MOCK | `components/ContractPaymentCommitmentsTab.tsx:17-35,86-111`; `domain/constants/contract-tab-edit-mocks.ts:3-37` seeds five invented rows in edit; create starts empty (`domain/actions/initializeContractTabDraft.ts:4-13`). All edits stay in `application/hooks/useContractTabDraft.ts:9-52`, including local IDs. `ContractForm.tsx:251-321` excludes all draft fields from actual create/update payload. |
| Same | New Invoicing tab, individual/joint setup, invoice-only Guante concept and monthly tax preview | MOCK | `components/ContractInvoicingTab.tsx:15-46,60-107`, `ContractInvoiceConfigurationModal.tsx:27-35,145-172`; edit-only Guante seed at `contract-tab-edit-mocks.ts:25-35`. Save updates local `configurations`, not backend; `ContractForm.tsx:251-321` never serializes them. Preview is illustrative, not the server tax calculation. |

The live path is **Tenant GET → search/action → Resource → Inertia prop → page table** for commitments and the two contract reads. The live write path is **commitment modal → `useForm.post/patch` → authorized route → Billing action → redirect/reloaded prop**. In contrast, Prefactura/Documents follow **Tenant GET → prop-less shell → static fixture graph → local filter/modal/preview → no business write**. Contract create/edit mixes its **real main-form POST/PUT** with **isolated local new-tab drafts**. Backend series/template POSTs and JSON Series list/config GETs (`routes/api/tenant/v1/private/core/billing.php:7-13`) are implemented server entry points, not evidence of frontend connectivity: a source search of `resources/js/` found no callers for those named routes.

## 3. Mock matrix: exact source and missing business effect

In the matrix and inventory, unqualified `components/`, `application/`, `domain/`, and page filenames resolve under `resources/js/pages/tenant/invoicing/v1/` for invoicing rows and `resources/js/pages/tenant/contracts/v1/` for contract rows. Deleted paths in section 1 and section 4 refer to the branch diff, not current files.

| Location | Simulated input/action | Observed result | Missing integration |
| --- | --- | --- | --- |
| `resources/js/pages/tenant/invoicing/v1/domain/constants/invoicing-mock-fixtures.ts:4-10,11-399,400-674,675-841` | Synthetic anchors, commitments `7001`–`7017`, preinvoices `8001`–`8013`, fiscal docs `9001`–`9008`, dates/customer/RFC/amount/status/payment links | Static cross-page business graph, unaffected by current Tenant and database writes | Tenant-backed queue, fiscal-document listing/details and their relationships. These are production imports, **not** test-only fixtures. |
| `PreinvoicesPage.tsx:32-53,113-122`; `domain/actions/selectPreinvoiceQueue.ts:24-102`; `components/PreinvoiceCommitmentFilters.tsx:23-42` | Queue, filters, page size, records count, export | Locally filtered fixture graph and downloaded sample CSV | Server selection/count/export of persisted queue; URL filters do not imply backend filtering. |
| `PreinvoicesPage.tsx:28,80-87,203-224`; `components/CaptureAmountForm.tsx:18-46,149-174` | Variable usage/sales capture and send-link preview | `capturedAmounts`/dialog state; temporary subtotal; no server mutation or delivery | Capture and reconciliation with real obligation/queue; link dispatch. |
| `components/PreinvoiceReviewModal.tsx:45-62,104-123,144-174,295-303`; `components/PreinvoiceDraftPreviewDialog.tsx:7-47` | Preinvoice form, taxes, document preview, no-CFDI and substitution | Local `useForm` validation and read-only illustrated draft; no `.post`/`.patch`; stamp disabled | Persist reviewed fiscal draft and issue/send/produce document. Real Company lookup is only a partial identity integration. |
| `application/hooks/usePreinvoiceBatchReview.ts:6-60`; `components/BatchPreinvoiceReviewModal.tsx:10-25` | Batch select/save/ready count | In-memory selection and draft map; stamp disabled | Batch persistence and emission. |
| `DocumentsPage.tsx:34-59,97-105,125-155`; `components/FiscalDocumentFilters.tsx:41-75` | Invoice rows, sample count, filters, due-date sort, CSV | Fixture-derived client view and genuine file download of fabricated rows | Live invoice response, backend filtering and real export. |
| `DocumentsPage.tsx:56-57,183-189`; `domain/inertia/visitPreinvoiceFromNewInvoiceSelection.ts:5-13` | New invoice | Selects hardcoded eligible commitment, navigates with demo ID | Real candidate lookup and invoice/draft creation. |
| `components/FiscalDocumentDetails.tsx:16-44,72-88,116-146`; `domain/actions/fiscalDocuments.ts:23-37` | Folio, UUID, balance, relation and payment/complement ledger | Synthetic IDs/relationships, optional sample-ledger arithmetic; PDF/XML/email disabled | Stored fiscal documents, real UUID, ledger, downloads/delivery. |
| `components/FiscalDueDateDraftForm.tsx:18-24,62-73`; `FiscalCancellationDraftForm.tsx:18-26,104-112`; `FiscalCreditNoteDraftForm.tsx:27-35,216-224`; `FiscalDocumentModal.tsx:32-50` | Date update, SAT cancellation/refacture, credit-note issuance | Client validation/JSON previews; final submit disabled, no status change | Authorized writes and external fiscal lifecycle. Complement (`FiscalPaymentComplementDetails.tsx:12-30`) is view-only demo. |
| `resources/js/pages/tenant/contracts/v1/domain/constants/contract-detail-table-mocks.ts:2-43`; `components/ContractTenantSalesTable.tsx:4-18`; `domain/actions/getContractTenantSalesColumns.tsx:35-52` | Tenant sales periods, variable rent and capture/view/send/resend | Same four rows on every contract, actions disabled | Contract-scoped sales records and actions; removed old variable-rent flow is not replaced here. |
| `resources/js/pages/tenant/contracts/v1/domain/constants/contract-tab-edit-mocks.ts:3-37`; `application/hooks/useContractTabDraft.ts:9-52`; `components/ContractForm.tsx:251-321` | Contract edit five seeded obligations, Guante, new concepts/days | Local ID/configuration reset per form/contract, omitted from real payload | Hydrate actual contract series and send series changes. |
| `components/ContractInvoicingTab.tsx:15-46,60-107`; `components/ContractInvoiceConfigurationModal.tsx:27-35,145-172` | Joint/individual header, concept taxes, monthly totals, Save | In-memory configuration and illustration, never backend POST | Stored invoice-template save and server reconciliation. |
| `components/CommitmentDeleteModal.tsx:14-28,83-89`; `CommitmentAmountCaptureModal.tsx:17-26,68-75`; `InflationReviewModal.tsx:18-45,116-121` | Live-row deletion, manual amount and batch inflation | Preview/confirmation only; list remains server-authoritative | Corresponding backend write and reload; this is **partial**, not fixture-backed data. |

Static UI defaults (e.g. currency list, tax-regime options, tab names), component-local dialog state and query/hash serialization are not independently classified as business mocks. Conversely, `useForm` alone does not establish persistence: only the commitment form calls `.post/.patch`; fiscal forms call `setData`/`setError` and preview functions only. `domain/actions/handleInvoicingSampleCsvDownload.ts:1-12` genuinely creates a browser CSV, but its input is fixture-derived. A real Company lookup inside a synthetic invoice form does not turn the containing document into a live invoice.

## 4. Cross-domain findings and non-obvious surfaces

1. **Backend/UI asymmetry:** Contract series upsert (`routes/web/tenant/v1/inertia/contracts.php:44-46`), invoice-template upsert (`routes/web/tenant/v1/inertia/invoicing.php:11-12`) and JSON series config (`routes/api/tenant/v1/private/core/billing.php:7-13`) have backend actions/controllers, but the new contract form/tab never invokes them. The live detail table is read-only, not proof that its similarly named create/edit tab saves.
2. **Independently fabricated fiscal universe:** New commitment POST/PATCH changes the Tenant database while Prefactura/Documents continue to read constants (`CommitmentsPage.tsx:29-35` versus `PreinvoicesPage.tsx:20,32-53` and `DocumentsPage.tsx:21,34-59`). Creating a real commitment will not appear in those two sections; fixture document details can point to IDs that never existed for that Tenant.
3. **Contract detail sales leak by presentation:** Every authorized contract shows the same four sales rows, including contract `105`, because `ContractTenantSalesTable.tsx:4-18` accepts no contract ID. Labels such as validated/captured are example states, not operational evidence. Its row buttons are disabled (`getContractTenantSalesColumns.tsx:35-52`).
4. **Discoverability and entitlements:** Sidebar changes from a billing-permission-filtered entry to a role/feature-filtered invoicing entry (`resources/js/common/sidebar/items.ts:119-130`); the three workspace GET routes are feature-gated (`routes/web/tenant/v1/inertia/invoicing.php:10-21`), while the create/update and contract-detail routes have their own policy guards. Thus visibility of the sidebar or a demo page does not imply write permission. No authorization bypass is inferred from the frontend alone.
5. **Removed rather than mocked:** The diff deletes prior payment recording, payment-request bulk flows, contract billing timeline, variable-rent/sales-report UI and associated routes/tests (`resources/js/pages/tenant/payments/v1/`, `routes/web/tenant/v1/inertia/payments.php`, `routes/api/tenant/v1/private/core/variable-rent.php`). This audit flags the loss of frontend reachability/parity, not an invented hidden implementation in the new workspace. `NotificationRuleCard.tsx` changes its reminder-specific day types to `[]` (`resources/js/modules/tenant/notification-rules/v1/ui/components/NotificationRuleCard.tsx:7-9`); this is a changed real notification UI, not a mock invoicing feature.
6. **Shared/new ancillary UI is not another data source:** `resources/js/common/modal/index.tsx` changes Escape handling for nested dialogs; `resources/js/modules/query-builder.ts` clears specified modal keys when real filters change; `resources/js/hooks/use-active-form-hash.ts` restores inner tabs on Inertia visits; Container screens adopt it. These are functioning navigation/interaction behaviors, not new unpersisted business records. `resources/js/modules/tenant/contracts/core/v1/domain/api/getContractChainLookup.ts:5-12` is a real API boundary used by the commitments picker.
7. **Dormant new presentation artifacts:** `components/InvoicingRecordPreview.tsx`, `components/SampleExportPreviewModal.tsx`, and `domain/actions/mapInvoicingRecordsToPreviewRows.ts` have no production page consumer (the mapping action is referenced by tests). They are not undiscovered live routes or alternative integrations; sample CSV in the active pages uses the browser download action instead.

## 5. Coverage and confidence

Source inspection covered the non-test frontend additions/modifications in the branch, route declarations, Inertia props, the three existing backend write controllers needed to classify frontend calls, and references to the fixture graph. Examples of coverage: `resources/js/pages/tenant/invoicing/v1/__tests__/CommitmentsPage.test.tsx`, `components/__tests__/CommitmentForms.test.tsx`, `__tests__/InvoicingFilterPages.test.tsx`, `components/__tests__/PreinvoiceForms.test.tsx`, `components/__tests__/FiscalDocumentForms.test.tsx`, `resources/js/pages/tenant/contracts/v1/components/__tests__/ContractForm.test.tsx`, `__tests__/ContractDetailMockTables.test.tsx`, `tests/Tenant/Invoicing/Core/V1/Feature/Http/InvoicingWorkspaceTest.php`, `tests/Tenant/Billing/Core/V1/Feature/Http/PaymentRequestHttpTest.php`, and the Contract series/config HTTP tests. They cover route/prop and client preview behavior, not live preinvoice/fiscal-document persistence; no such frontend transport is invoked. Code test suites were **not executed**. Functional browser observations and their remaining gaps are consolidated below; deployed feature-flag state, active Tenant identity, and external fiscal-service behavior remain unverified.

Existing docs are useful but not authoritative for this audit: `docs/features/tenant/frontend/invoicing/README.md:14-16` describes the Contract demonstration tabs as fixed fixtures and Contract `42/43` samples, whereas current code uses real upcoming PaymentRequests and real series config for the two read tabs (`ContractsController.php:130-173`), with only tenant sales remaining fixed. `docs/features/tenant/frontend/contracts/contract-detail-mock.md:13-20,35-37` matches this newer distinction. The former wording is a documentation delta, not a reason to reclassify working code.

## Functional validation with agent-browser

The follow-up functional pass used a fresh browser session at `http://spot2.localhost:8000`, authenticated as Miguel Gomez. Main routes were visited directly. No permissions, feature flags, or existing records were changed. The proposed test commitment was not created, so there is no test-record ID or evidence of a persistent write.

This section classifies what was observed in the browser. A page displaying data or retaining rows after reload does not, by itself, prove that the data came from the backend. The code-wiring evidence in the preceding sections remains static evidence.

| Flow | Action and observed evidence | Functional result |
| --- | --- | --- |
| Commitments | Open `/v1/invoicing/commitments`: five rows appear (IDs 2, 4, 3, 1, and 7), with client/concept/date/currency/amount/status headers and five matching results; page size 20, page 1 of 1. The follow-up session reproduced the same list. | **CONFIRMED — UI renders.** Data source and list persistence remain **UNVERIFIED**. |
| Create commitment | Clicked `Agregar compromiso` in the follow-up session; the browser click and a DOM click were accepted, but no form/modal, URL change, or visible error appeared. Nothing was submitted. | **UNVERIFIED.** No visible transition reproduced; no record was created and no test ID exists. |
| Commitment filters and pagination | Clicked `Filtros` in the follow-up session; no panel, chips, or URL change appeared. The sample has only five rows at page size 20; pagination controls are disabled. | **UNVERIFIED.** Applied filters and multiple commitment pages were not tested; current data cannot exercise multi-page pagination. |
| Preinvoices | Open `/v1/invoicing/preinvoices`: nine sample rows appear, including `CP-7002` and `CP-7004`, with illustrative statuses/amounts. The `Exportar CSV` control is present. Clicking `Filtros` in the follow-up session did not show a panel or change the page. | **MOCK — visually CONFIRMED.** Filter behavior is **UNVERIFIED**; CSV control presence is confirmed, but no download/content was inspected. |
| Documents | Open `/v1/invoicing/documents`: six folios appear (`CFDI-9001`, `9002`, `9004`, `9005`, `9006`, `9008`) with counts MXN 4, USD 2, EUR 0. After reload, the same six remain. `Exportar CSV`, `Nueva factura`, filters, and the `Vencimiento` sort control render. | **MOCK — visually CONFIRMED.** Reload confirms visual stability, not backend origin/persistence. Controls are present; their actions remain unverified. |
| CSV export | No CSV file has been downloaded or inspected. | **UNVERIFIED.** |
| Contract detail — commitments | Open `/v1/contracts/105/payment-commitments`: the upcoming-commitments empty state appears. `Editar compromisos de pago` and `Ir a Compromisos de pago` are rendered disabled. | **CONFIRMED — UI/empty state and disabled controls.** Backend read was not independently verified. |
| Contract detail — tenant sales | Open `/v1/contracts/105/payment-commitments?subtab=tenant_sales`: four May–August 2026 rows appear. Snapshot shows `Ver detalle`, `Capturar monto`, `Reenviar`, and `Enviar liga` disabled. | **MOCK — visually CONFIRMED.** Sample rows and disabled action states confirmed; no sales operation was performed. |
| Contract detail — invoicing | Open `/v1/contracts/105/invoicing`: the fiscal table is empty and `Editar facturación` is rendered disabled. | **CONFIRMED — empty state and disabled control.** No editor was available to open or save; persistence remains unverified. |
| Contract forms and tabs | The create/edit entry points were not reached; tabs, local drafts, previews, hash state, and state after reload were not inspected. | **UNVERIFIED.** No contract was saved or changed. |
| Commitment modals | Delete, amount-capture, and inflation dialogs were not opened; previews and reload reconciliation were not checked. | **UNVERIFIED.** |
| Preinvoice review and fiscal actions | Attempted to open the first preinvoice row's action menu; no menu or dialog appeared. Capture, individual/batch review, new-invoice selection, fiscal detail, due-date change, cancellation, substitution, credit note, and payment complement therefore remain inaccessible in this run. | **UNVERIFIED.** No document was issued, cancelled, sent, or saved. |
| Contract list pagination | Open `/v1/contracts`: 32 results are shown, page 1 of 2, with next/last-page controls enabled. Attempting to activate the next-page control did not change the page or row range in the observed session. | **PARTIALLY OBSERVED / UNVERIFIED.** Multi-page data and enabled controls are present, but navigation itself was not confirmed. This is the contract list, not the commitments/preinvoice/documents paginator. |
| Navigation/lookup and shared changes | ContractChain lookup, contract-form tabs/hashes, modal clearing on filter changes, Escape behavior in nested dialogs, reminders, and removed legacy routes were not tested. `Crear contrato` was visible on `/v1/contracts`, but clicking it did not open a form or change the URL in the follow-up session. | **UNVERIFIED.** Contract form entry and shared behaviors remain uncovered. |
| Alternate permissions and feature flags | An authenticated session was observed, but no other Tenant/user was used and no flags or permissions were changed. The active Tenant was not identified from the browser. | **NOT VERIFIABLE** with the available session. |

### Consolidated results

- **CONFIRMED:** Authentication and rendering of the visited routes; the five-row commitments list; empty states and disabled actions on Contract 105; sample content on Preinvoices, Documents, and tenant sales; visual stability of Documents after reload; and a 32-row, two-page contract list with enabled pagination controls.
- **Visually confirmed MOCKs:** Preinvoices, Documents, and tenant-sales rows match the illustrative datasets described in the audit. No additional sample datasets were observed functionally.
- **REAL:** No write or backend origin for the commitments list was confirmed through the browser. The screen renders, but the available observations do not establish the list's source.
- **PARTIAL:** No partial operation was functionally validated; classifications in the inventory remain code-based.
- **UNVERIFIED:** Create/open and persistent edit, applied filters, commitment/preinvoice/document multi-page navigation, CSV download/content, new-invoice continuation, row action menus, modals/previews, contract tabs/drafts, fiscal actions, and shared flows. Several controls (Add commitment, Filters, Create contract, and contract-list next page) produced no visible transition in the follow-up session; this observation does not establish the cause.
- **NOT VERIFIABLE:** Alternate permission/feature-flag states without another available identity or Tenant.

The `AUDIT-BROWSER-2026-10-23` record was not created, nor was any other persistent test data; the label is unreserved. No test suites, fiscal writes, deletions, or permission/configuration changes were performed. UI observations do not replace inspection of Inertia/network responses; when payload evidence was unavailable, data origin is explicitly left unverified.
