kell_creations/docs/development/build_execution_tracker.md

105 KiB
Raw Blame History

Build Execution Tracker

Current status

  • main baseline updated through: feat/square-catalog-sync-repositories (Stage 10C complete, 2026-07-25)
  • audit completed: chore/audit-state-sync — Comprehensive State Audit (PROJECT_STATE_AUDIT.md) completed 2026-07-25; all findings incorporated into master_development_brief.md and this tracker
  • merged: feat/square-catalog-sync-service (Stage 10D) — merged to main; 506/506 feature_wordpress, 167/167 feature_inventory; analyze clean
  • main baseline updated through: feat/square-sync-ui (Stage 10F complete, merged 2026-07-25)
  • merged: feat/square-mobile-pos (Stage 10C POS) — merged to main, commit 7bf8f55
  • merged: feat/observability-error-logging (Stage 16A) — error logging, crash capture, and bug reporting; merged to main 2026-08-29
  • merged: feat/custom-order-domain (Stage 11A) — custom order domain and data; merged to main 2026-08-29, commit 85501fd
  • main baseline updated through: feat/custom-order-domain (Stage 11A complete, merged 2026-08-29)
  • reconciled: chore/state-reconciliation-flutter-347 — working tree vs. main reconciled 2026-09-25; toolchain moved to Flutter 3.47.0 / Dart 3.13.0; master documents re-baselined
  • merged: feat/custom-order-ui (Stage 11B) — custom order intake UI; merged to main 2026-09-25, commit 6c299e8
  • main baseline updated through: feat/custom-order-ui (Stage 11B complete, merged 2026-09-25)
  • merged: feat/custom-order-tracking (Stage 11C) — custom order tracking and fulfillment; merged to main 2026-09-25, commit 07e7e08. Stage 11 complete; audit finding P2.2 closed
  • main baseline updated through: feat/custom-order-tracking (Stage 11C complete, merged 2026-09-25)
  • next branch: feat/inventory-write-ops (Stage 12A) — Inventory write operations and domain expansion
  • total tests on branch: 2373/2373 passing (+329 new: 293 in feature_orders, 22 in kell_mobile, 14 in kell_web); dart analyze --fatal-infos clean across all 11 packages and apps
  • note: previously quoted totals omitted feature_policy (17 tests); it is now included in the count
  • release review: docs/operations/release-checklist.md created 2026-08-29 — per-environment release gates for Development, Test/QA, Staging, and Production
  • toolchain: Flutter 3.47.0 / Dart 3.13.0. Flutter 3.47 auto-generates an analyzer.exclude block in every analysis_options.yaml on each pub get / analyze / run / build with no opt-out (flutter#191160). Do not open a slice to revert it — see "Toolchain baseline" in master_development_brief.md

Slice tracker

feat/custom-order-tracking

  • status: merged to main (commit 07e7e08)
  • branch: feat/custom-order-tracking
  • stage: 11C — Custom order tracking and fulfillment
  • date: 2026-09-25
  • baseline: 6c299e8 (main, Stage 11B complete)
  • inspection: complete
  • implementation: complete
  • closes audit findings: P2.2 (tracking portion — closes the finding entirely; Stage 11 is now complete)
  • scope: domain, data, application, presentation, and app wiring across feature_orders, kell_web, and kell_mobile
  • files added — feature_orders domain:
    • lib/src/domain/fulfillment_event.dart — FulfillmentEvent (from/status/occurredAt/note) with intake(), isIntake, isRework, hasNote, description, and a from|to|iso|note wire format that sanitises separators out of notes; fromWire() tolerates malformed lines
    • lib/src/domain/material_usage.dart — MaterialUsage (sku, quantity, displayName) with isValid, label, and a sku|qty|name wire format
    • lib/src/domain/material_consumption_port.dart — MaterialDeductionResult (per-SKU failures, isPartial, totalUnitsDeducted, summary) and the MaterialConsumptionPort outbound port, plus NoopMaterialConsumptionPort
  • files added — feature_orders application:
    • lib/src/application/advance_fulfillment.dart — AdvanceFulfillment use case; adds no rule of its own, so the pipeline is defined in exactly one place
    • lib/src/application/complete_custom_order.dart — CompleteCustomOrder + CompleteCustomOrderResult; advances first, deducts second, and never lets a stock failure fail the completion
    • lib/src/application/custom_order_tracking_controller.dart — CustomOrderTrackingController (ChangeNotifier): custom-order-only load, stage filter, search over customer/ID/spec summary, stageCounts, activeCount, advanceTo() (routing completions through CompleteCustomOrder), and consumeActionResult() / consumeDeductionWarning()
  • files added — feature_orders presentation:
    • lib/src/presentation/custom_order_tracking_page.dart — CustomOrderTrackingPage; master-detail above KcBreakpoints.medium, pushed detail below it
    • lib/src/presentation/widgets/fulfillment_timeline.dart — FulfillmentTimeline; dot-and-rail rows, rework marker, colour-coded by outcome
    • lib/src/presentation/widgets/custom_order_tracking_card.dart — CustomOrderTrackingCard; leads with the workshop stage, spec summary, balance, and last update
    • lib/src/presentation/widgets/custom_order_tracking_detail.dart — CustomOrderTrackingDetail; stage action, spec, deposit/balance, materials, timeline
    • lib/src/presentation/widgets/advance_stage_dialog.dart — showAdvanceStageDialog() + AdvanceStageResult; offers only domain-legal stages and an operator progress note
  • files changed — feature_orders:
    • lib/src/domain/order.dart — added fulfillmentHistory and materialUsage (both default const []); added currentStage, hasFulfillmentHistory, latestFulfillmentEvent, lastFulfillmentUpdate, allowedNextStages, isFulfillmentComplete, hasMaterialUsage, deductibleMaterials, and the append-only withFulfillmentEvent(). All existing fields, defaults, and copyWith semantics preserved — every Stage 11A/11B test passed unchanged (792/792 verified before any new test was added)
    • lib/src/domain/orders_repository.dart — advanceFulfillmentStatus() gained optional note and occurredAt; added recordMaterialUsage()
    • lib/src/data/fake_orders_repository.dart — injectable now clock; advanceFulfillmentStatus appends an event; createCustomOrder seeds an intake event; recordMaterialUsage implemented; all five seeded commissions now carry realistic histories (KC-C2004 includes a rework loop) and material usage
    • lib/src/data/woo_commerce_orders_repository.dart — injectable now clock; same history and material behaviour as the fake
    • lib/src/data/woo_commerce_order_mapper.dart — two new meta keys (_kc_fulfillment_history, _kc_material_usage), trackingMetaEntries(), historyFromMeta(), materialUsageFromMeta(); malformed lines are skipped, empty lists are omitted rather than blanking remote values
    • lib/src/presentation/orders_page.dart — optional onTrackCustomOrders callback adds a "Track Custom Orders" action beside the existing intake action; both omitted when the host has no route
    • lib/feature_orders.dart — barrel exports for all new types
    • README.md — documents the tracking workspace, the timeline, and the inventory-deduction port
  • files changed — apps:
    • kell_web/lib/composition/inventory_material_consumption_adapter.dart — new adapter bridging InventoryRepository to MaterialConsumptionPort; tolerant by contract, never throws, logs per-SKU failures
    • kell_web/lib/composition/app_services.dart — materialConsumptionPort built from the inventory repository
    • kell_web/lib/routing/app_routes.dart — new /orders/tracking route; _parseStage() returns null for an unknown stage rather than FulfillmentStatus.fromWire's quoted default, which would be the wrong behaviour for a filter
    • kell_web/lib/navigation/app_navigation.dart — ordersToCustomOrderTracking()
    • kell_mobile/lib/composition/inventory_material_consumption_adapter.dart — new; deliberately duplicated rather than shared, matching the existing get_dashboard_summary.dart convention
    • kell_mobile/lib/composition/mobile_app_services.dart — materialConsumptionPort
    • kell_mobile/lib/pages/mobile_custom_order_tracking_page.dart — new full-screen SafeArea host for the shared page
    • kell_mobile/lib/pages/mobile_orders_page.dart — small tracking FAB above the existing intake FAB; reloads the list on return
    • kell_mobile/lib/shell/mobile_shell.dart — passes the material port through
  • tests updated (contract widening):
    • feature_orders/test/widgets/orders_page_test.dart — _EmptyOrdersRepository satisfies the widened contract
    • kell_web/test/dashboard/application/dashboard_controller_test.dart — _StubOrdersRepository satisfies the widened contract
  • tests added (329 new):
    • feature_orders/test/fulfillment_event_test.dart — 32 tests (construction, intake, rework detection, description, wire round trip, separator/newline sanitisation, malformed-line tolerance, equality)
    • feature_orders/test/material_usage_test.dart + material_consumption_port_test.dart — 41 tests (validity, labels, wire format, deduction-result shape, summaries, unmodifiable collections, noop port, partial failure)
    • feature_orders/test/order_tracking_test.dart — 33 tests (defaults, currentStage, history accessors, allowed stages, deductible materials, withFulfillmentEvent immutability and append-only behaviour, copyWith)
    • feature_orders/test/fake_orders_repository_tracking_test.dart — 31 tests (seeded-history integrity, incl. checks that every seeded transition is domain-legal and that each history ends at the stamped stage; note trimming, clock injection, illegal-advance no-op, recordMaterialUsage validation)
    • feature_orders/test/woo_commerce_tracking_meta_test.dart — 22 tests (meta keys, packing, read/write round trip, malformed-line skipping, no payment identifier on the wire)
    • feature_orders/test/complete_custom_order_test.dart — 22 tests (ordering — no deduction on a rejected transition; partial-failure warnings, unwired port, empty materials, AdvanceFulfillment delegation and verbatim rejection reasons)
    • feature_orders/test/custom_order_tracking_controller_test.dart — 45 tests (load, stage filter, counts, search, selection, advance, rework, cancel, completion routing, deduction warnings, unwired use cases)
    • feature_orders/test/widgets/fulfillment_timeline_test.dart — 14 tests (empty state, rows, timestamps, notes, rework marker, ordering, newestFirst, privacy)
    • feature_orders/test/widgets/custom_order_tracking_page_test.dart, custom_order_tracking_detail_test.dart, advance_stage_dialog_test.dart — 53 tests (listing, stage chips with counts, search, intake action, header, stage-action states, spec, money, materials, timeline, dialog selection/notes/cancel)
    • kell_mobile/test/pages/mobile_custom_order_tracking_page_test.dart — 9 tests (app bar, shared host, SafeArea, listing, chips, filtering, intake action, port injection)
    • kell_mobile/test/composition/inventory_material_consumption_adapter_test.dart — 13 tests (real stock decrement, missing SKU, invalid record, rejected adjustment, throwing repository, plus end-to-end completion decrementing real inventory and a rejected completion leaving it untouched)
    • kell_web/test/routing/custom_order_tracking_route_test.dart — 14 tests (route constant, shell rendering, listing, chips, timeline, stage argument, unknown stage ignored, selectedId, orders entry point, port identity)
  • architecture: feature_orders still has no dependency on feature_inventory. The orders layer declares MaterialConsumptionPort; each app's composition layer supplies the adapter — the same "feature states what it needs, app decides how" pattern already used for cross-feature navigation callbacks
  • ordering guarantee: CompleteCustomOrder advances the order before deducting, so an illegal jump to completed can never decrement stock. Asserted by test in both the use case suite and the end-to-end adapter suite
  • privacy: operator progress notes are workshop-only and the dialog labels them as such; the timeline and tracking detail render no payment identifier anywhere — asserted by test. Log context is limited to order IDs, SKUs, stage names, and quantities, and still passes through KcRedactor
  • tests: passed (1085/1085 feature_orders +293, 109/109 kell_mobile +22, 81/81 kell_web +14; all other packages unchanged — core 90, design_system 51, auth 42, integrations 123, data 63, feature_wordpress 545, feature_inventory 167, feature_policy 17)
  • analyze: passed (dart analyze --fatal-infos — no issues found in feature_orders, kell_web, or kell_mobile)
  • format: dart format --line-length 100 applied to every file touched by this slice
  • test-harness notes: the stage chip row scrolls horizontally, so tests scrollUntilVisible before tapping a later chip rather than working around a layout defect; the detail panel's indeterminate LinearProgressIndicator never settles, so the isUpdating test uses pump() rather than pumpAndSettle()
  • defect found and fixed while testing: CustomOrderTrackingCard's footer row overflowed at the 340 px master-list width; both halves are now Flexible with ellipsis
  • brief updated: yes

feat/custom-order-ui

  • status: merged to main
  • branch: feat/custom-order-ui
  • stage: 11B — Custom order creation UI
  • date: 2026-09-25
  • baseline: 0e3987b (main, Stage 11A complete + state reconciliation)
  • inspection: complete
  • implementation: complete
  • closes audit findings: P2.2 (UI portion — intake and confirmation; tracking remains open as Stage 11C)
  • scope: application and presentation layers plus app wiring — no domain or data change; every repository contract from Stage 11A is consumed as-is
  • files added — feature_orders application:
    • lib/src/application/create_custom_order.dart — CreateCustomOrder use case wrapping OrdersRepository.createCustomOrder
    • lib/src/application/record_deposit.dart — RecordDeposit use case wrapping OrdersRepository.recordDeposit; accepts no payment identifier
    • lib/src/application/custom_order_form_controller.dart — CustomOrderField enum + CustomOrderFormController (ChangeNotifier): field state, field-keyed validation, buildSpec(), submit(), reset(), derived estimatedPriceCents / depositAmountCents / balanceDueCents, and the static parseMoneyToCents() money parser. Injectable clock and ID generator keep tests deterministic
  • files added — feature_orders presentation:
    • lib/src/presentation/custom_order_form_page.dart — CustomOrderFormPage; owns a controller unless one is injected, swaps to the confirmation page on success
    • lib/src/presentation/custom_order_confirmation_page.dart — CustomOrderConfirmationPage with the commission summary and the deposit receipt
    • lib/src/presentation/widgets/fulfillment_status_chip.dart — FulfillmentStatusChip over the design-system KcStatusChip
    • lib/src/presentation/widgets/reference_image_dialog.dart — showReferenceImageDialog() + ReferenceImageDialogResult with URL validation
  • files changed:
    • feature_orders/lib/src/presentation/orders_page.dart — optional onCreateCustomOrder callback surfaces a "New Custom Order" toolbar action; omitted when the host has no intake route
    • feature_orders/lib/feature_orders.dart — barrel exports for all new application and presentation types
    • feature_orders/README.md — documents the intake UI and the cents-only money rule
    • kell_web/lib/routing/app_routes.dart — new /orders/custom route rendering CustomOrderFormPage inside AppShell; orders route now passes onCreateCustomOrder
    • kell_web/lib/navigation/app_navigation.dart — ordersToCustomOrder() and customOrderToOrders() handoffs
    • kell_mobile/lib/pages/mobile_custom_order_page.dart — new full-screen SafeArea host for the shared form
    • kell_mobile/lib/pages/mobile_orders_page.dart — extended FAB pushes the intake form and reloads the list on return
  • tests added (146 new):
    • feature_orders/test/custom_order_form_controller_test.dart — 82 tests (money parsing incl. separators/precision/negatives, initial state, setters, derived balance and clamping, reference image add/remove/dedupe, the full validation matrix, buildSpec mapping, submission, deposit quoting vs. collection, repository failure, duplicate ID, reset)
    • feature_orders/test/widgets/custom_order_form_page_test.dart — 26 widget tests (section and field rendering, validation feedback per field, running balance, deposit method reveal, reference image dialog paths, submission → confirmation, "New Custom Order" reset, onComplete)
    • feature_orders/test/widgets/custom_order_confirmation_page_test.dart — 24 widget tests (summary, spec rendering, deposit receipt quoted vs. paid, balance, no payment identifier on screen, actions, the 7-value FulfillmentStatusChip matrix)
    • feature_orders/test/widgets/orders_page_test.dart — 3 new tests for the custom order entry point
    • kell_mobile/test/pages/mobile_custom_order_page_test.dart — 6 tests (app bar, shared form host, SafeArea, sections, submit action, validation)
    • kell_web/test/routing/custom_order_route_test.dart — 5 tests (route constant, route renders the form in the shell, intake sections, orders action present, action opens the form)
  • privacy: the deposit receipt renders amount, method, date, and balance only — the transaction ID stays on PaymentResult and is asserted absent by test. The controller holds no payment identifier at any point
  • money: every amount is typed as text and converted to integer cents by parseMoneyToCents before it reaches DepositInfo; the only double is the derived OrderItem.unitPrice, computed once from cents
  • test-harness note: the intake form is taller than the default 800×600 test view, so the submit-button tests resize tester.view rather than working around a layout defect — the page scrolls normally on device
  • toolchain note: kell_web/pubspec.lock picked up SDK-pinned transitive bumps on flutter pub get (matcher 0.12.19→0.12.20, meta 1.18.0→1.19.0, test_api 0.7.11→0.7.12, vector_math 2.2.0→2.4.3). Same accepted class as the kell_mobile bumps recorded under chore/state-reconciliation-flutter-347; committed so the lock file matches the toolchain in use
  • tests: passed (792/792 feature_orders, 87/87 kell_mobile, 67/67 kell_web, 545/545 feature_wordpress, 167/167 feature_inventory, 123/123 integrations, 90/90 core, 63/63 data, 51/51 design_system, 42/42 auth, 17/17 feature_policy — 2044 total)
  • analyze: passed (dart analyze --fatal-infos — no issues found across all 11 packages and apps)
  • brief updated: yes

chore/state-reconciliation-flutter-347

  • status: merged to main
  • branch: chore/state-reconciliation-flutter-347
  • stage: n/a — repository state reconciliation, no product code change
  • date: 2026-09-25
  • baseline: 92d83e0 (main, Stage 11A complete)
  • inspection: complete
  • implementation: complete
  • trigger: the working tree had drifted from main and local main was 4 commits ahead of origin/main
  • scope: documentation and toolchain hygiene only — no lib/ or test/ source file was modified

What the drift actually was

  1. Flutter 3.47.0 analysis_options.yaml churn (accepted). The local toolchain moved from Flutter 3.44.x to Flutter 3.47.0 / Dart 3.13.0. Flutter 3.47 ships AnalysisOptionsMigration, which unconditionally writes a fixed seven-entry analyzer.exclude block (build/**, android/**, ios/**, web/**, windows/**, macos/**, linux/**) into every analysis_options.yaml it finds. Upstream bugs: flutter#191160 and flutter#191131.
    • Commit 92d83e0 previously tried to revert this. That revert does not hold. The migration runs from ensureReadyForPlatformSpecificTooling, so flutter pub get, flutter analyze, flutter run, and flutter build all rewrite the block. There is no opt-out. This was confirmed empirically: a full flutter test sweep regenerated the block in 8 further packages that were clean beforehand.
    • Decision: accept and commit the block in all 11 packages/apps rather than fight the tool. Reverting it only produces a permanently dirty working tree and misleading diffs.
    • Safety check: the web/** entry is the dangerous one (it can hide real Dart sources in dart create -t web packages). Verified that neither kell_web/web/ nor kell_mobile/web/ contains any .dart file, so nothing is dropped from analysis here. dart analyze --fatal-infos remains clean across all 11 packages and apps.
  2. kell_mobile web scaffold (reverted). Someone had run flutter create --platforms=web inside kell_mobile, which produced an untracked web/ directory (index.html, manifest.json, favicon.png, 4 icons) and rewrote .metadata so the android platform entry was replaced by web. kell_mobile is the Android target and its android/ directory is tracked, so this was unintended tool output, not a deliberate platform addition.
    • Decision: reverted. .metadata restored to the tracked Android-only revision (ad70ec46…); the untracked web/ scaffold deleted. kell_mobile remains Android-only.
  3. kell_mobile/pubspec.lock transitive bumps (accepted). Resolved under the newer SDK: clock 1.1.2→1.1.3, matcher 0.12.19→0.12.20, meta 1.18.0→1.18.3, stack_trace 1.12.1→1.12.2, test_api 0.7.11→0.7.12, vector_math 2.2.0→2.4.2, plus vm_service. All transitive, all pinned by the Flutter SDK. Committed so the lock file matches the toolchain that is actually in use.

Master document corrections

  • PROJECT_STATE_AUDIT.md — removed a duplicated ## 5. Summary Scorecard section. The file carried the entire scorecard and readiness table twice (lines 615–657 and 658–702), the second copy being a bad append. Removed the duplicate, leaving one authoritative §5.

  • PROJECT_STATE_AUDIT.md — added a reconciliation notice clarifying that §1–§4 are the preserved historical 2026-07-25 record while §5 is re-baselined to main.

  • PROJECT_STATE_AUDIT.md §3.4 — test counts corrected to the verified run (core 24→90, design_system 41→51, feature_wordpress 506→545, feature_orders 198→657, feature_policy ~5→17, kell_web 24→62, kell_mobile 26→81).

  • PROJECT_STATE_AUDIT.md §3.5 — marked three antipatterns resolved: SquareCatalogSyncService ID conflation (10E), no logging infrastructure (16A), no crash reporting (16A).

  • PROJECT_STATE_AUDIT.md §5 — scorecard re-baselined with a test-count column; Square POS, Square catalog/inventory sync, and observability moved to ✅; custom orders moved to ⚠️ (domain+data done, UI open).

  • master_development_brief.md Appendix A — feature maturity matrix refreshed to the same verified counts and maturity levels.

  • master_development_brief.md — toolchain baseline recorded (Flutter 3.47.0 / Dart 3.13.0) with the analysis_options.yaml caveat so the next slice does not try to revert it again.

  • tests: passed (1,898 / 1,898 — core 90, design_system 51, auth 42, integrations 123, data 63, feature_wordpress 545, feature_inventory 167, feature_orders 657, feature_policy 17, kell_web 62, kell_mobile 81). Identical to the Stage 11A total, confirming this slice changed no behaviour.

  • analyze: passed (dart analyze --fatal-infos — no issues found across all 11 packages and apps)

  • brief updated: yes

feat/custom-order-domain

  • status: merged to main
  • branch: feat/custom-order-domain
  • stage: 11A — Custom order domain and data
  • date: 2026-08-29
  • baseline: 666abd2 (main, Stage 16A complete, 1,475/1,475 passing)
  • commits: 86c630d (implementation), 85501fd (merge to main)
  • inspection: complete
  • implementation: complete
  • scope: domain and data layers only — no UI in this slice
  • closes audit findings: P2.2 (domain + data portion; UI remains open as Stage 11B/11C) and P3.8 (feature_orders scaffolding files)
  • files changed:
    • feature_orders/lib/src/domain/order_type.dart — new OrderType enum (standard/custom) with label, wireValue, fromWire() defaulting to standard
    • feature_orders/lib/src/domain/custom_order_spec.dart — new immutable CustomOrderSpec (material, color, size, dimensions, unmodifiable referenceImageUrls, notes, estimatedCompletionDate); copyWith, list-aware ==/hashCode, toString, isProductionReady, hasReferenceImages, summary
    • feature_orders/lib/src/domain/deposit_info.dart — new immutable DepositInfo; money as integer cents (depositAmountCents, totalAmountCents), depositDate, settlementDate, depositPaid, derived balanceDueCents (clamped at zero), markDepositPaid(), markSettled(), formatCents(), .quoted(); deliberately carries no payment identifier
    • feature_orders/lib/src/domain/fulfillment_status.dart — new FulfillmentStatus (quoted → depositReceived → inProduction → qualityCheck → readyForPickup → completed, plus cancelled) with label, stageIndex, pipeline, wireValue, fromWire(); FulfillmentTransition extension with allowedNextStatuses, canTransitionTo(), rejectionReason(), isTerminal, isSuccessful, requiresDeposit
    • feature_orders/lib/src/domain/order.dart — added orderType (defaults to standard), nullable customOrderSpec, depositInfo, fulfillmentStatus; added isCustom, hasDeposit, balanceDueCents; all existing fields, defaults, and copyWith semantics preserved
    • feature_orders/lib/src/domain/orders_repository.dart — added createCustomOrder(), updateCustomOrderSpec(), recordDeposit(), advanceFulfillmentStatus()
    • feature_orders/lib/src/data/fake_orders_repository.dart — implemented all four methods; injected KcLogger (defaults to KcLogger.silent()); five seeded custom orders KC-C2001…KC-C2005 covering every non-terminal pipeline stage; existing rejection paths now logged via _rejected()
    • feature_orders/lib/src/data/woo_commerce_orders_repository.dart — implemented all four methods; injected KcLogger; _guard() converts every exception into a logged failure result; _loadCustomOrder() validates existence and order type before any write; _pushCustomOrderMeta() sends only _kc_ meta so commercial fields are never disturbed
    • feature_orders/lib/src/data/woo_commerce_order_mapper.dart — 13 _kc_-prefixed meta keys with a documented mapping table; customOrderMetaData(), specMetaEntries(), depositMetaEntries(), toMetaDataList(); fromJson() reconstructs spec/deposit/type/stage; internal _-prefixed keys stay out of Order.customFields
    • feature_orders/lib/feature_orders.dart — barrel updated with 4 new domain exports
    • feature_orders/pubspec.yaml — added core path dependency (for KcLogger); description expanded
    • feature_wordpress/lib/src/data/woo_commerce_api_client.dart — new updateOrder(orderId, body) generic order PUT, mirroring updateProduct()
    • feature_orders/.metadata, CHANGELOG.md, LICENSE, README.md — P3.8 scaffolding (.gitignore already existed)
    • feature_orders/test/fake_orders_repository_test.dart — seeded-count assertions updated 6 → 11 and 7 → 12; added a standard-order count test
    • feature_orders/test/orders_controller_test.dart — count assertions updated for the larger seed set (11 total, 3 pending)
    • feature_orders/test/widgets/orders_page_test.dart — order-count label updated to 11 orders; _EmptyOrdersRepository satisfies the widened contract
    • kell_web/test/dashboard/application/dashboard_controller_test.dart — _StubOrdersRepository satisfies the widened contract
  • tests added:
    • feature_orders/test/order_type_test.dart — 12 tests (enum shape, labels, wire round-trip, fallbacks)
    • feature_orders/test/custom_order_spec_test.dart — 46 tests (construction, unmodifiable list, derived state, summary PII safety, copyWith, equality, toString leak checks)
    • feature_orders/test/deposit_info_test.dart — 58 tests (cents arithmetic, balance derivation and clamping, formatting parity with PaymentResult, transitions, copyWith, equality, no-payment-identifier check)
    • feature_orders/test/fulfillment_status_test.dart — 150 tests including the exhaustive 7 × 7 transition matrix: every legal pair asserted allowed, every other pair asserted rejected with an explanatory reason
    • feature_orders/test/fake_orders_repository_custom_test.dart — 77 tests (seeded data shape, all four new methods, legal and illegal advances, log-context assertions, PII and money redaction checks)
    • feature_orders/test/woo_commerce_custom_order_test.dart — 79 tests (meta read/write, round trip through every pipeline stage, malformed-meta tolerance, all four methods over MockClient, observability on pre-existing operations, no-payment-identifier-on-the-wire checks)
  • observability: KcLogger injected into both repositories; rejections logged at warning, API failures at error with status code and originating exception; no silent catch (_) {}; log context limited to identifiers, operation names, and status names — never customer identity, addresses, money amounts, or payment identifiers; all context additionally passes through KcRedactor
  • WooCommerce mapping: custom order state persisted as 13 _kc_-prefixed order meta keys (_kc_order_type, _kc_fulfillment_status, _kc_spec_*, _kc_deposit_*, _kc_settlement_date). balanceDueCents is derived on read, never persisted. The deposit transaction ID is deliberately excluded — order meta is readable by any store administrator
  • tests: passed (1898/1898 total; feature_orders 657/657 +423; all other packages unchanged — core 90, design_system 51, auth 42, integrations 123, data 63, feature_wordpress 545, feature_inventory 167, kell_web 62, kell_mobile 81, feature_policy 17)
  • analyze: passed (dart analyze --fatal-infos — no issues found across all 11 packages and apps)
  • format: dart format --line-length 100 applied to all files touched by this slice (matches the repo's .vscode/settings.json dart.lineLength: 100); --set-exit-if-changed clean across feature_orders, and the two files touched in feature_wordpress / kell_web
  • known pre-existing issues (not introduced here, left untouched): kell_web/lib/composition/app_services.dart and kell_web/lib/shell/app_nav_item.dart are not format-clean at 100 cols; tools/run_all_tests.sh reports TOTAL 0 under Git Bash on Windows because its grep for the ✓ glyph does not match the console encoding — per-package "All tests passed!" lines and the analyze gate remain accurate
  • brief updated: yes

feat/observability-error-logging

  • status: merged to main
  • branch: feat/observability-error-logging
  • stage: 16A — Error logging, crash reporting, and bug reporting
  • date: 2026-08-29
  • inspection: complete
  • implementation: complete
  • closes audit findings: P3.4 (structured logging), P3.5 (crash reporting), and the "No logging infrastructure" / "No crash reporting" architectural risks in PROJECT_STATE_AUDIT.md §3.4
  • files changed:
    • core/lib/src/observability/kc_log_level.dart — new KcLogLevel enum (debug/info/warning/error/fatal) with severity, label, isAtLeast(), fromString()
    • core/lib/src/observability/kc_log_record.dart — new immutable KcLogRecord (level, source, message, timestamp, unmodifiable context, error, stackTrace); format(), toJson(), isFailure
    • core/lib/src/observability/kc_redactor.dart — new KcRedactor; isSensitiveKey(), redactMap() (recurses nested maps/lists), maskValue(); 14 sensitive key fragments
    • core/lib/src/observability/kc_log_sink.dart — new KcLogSink contract; KcConsoleLogSink (release-silent by default), KcInMemoryLogSink (bounded ring buffer with recent()/recordsAtLeast()/clear()), KcMultiLogSink (fault-tolerant fan-out)
    • core/lib/src/observability/kc_logger.dart — new KcLogger facade; level helpers, threshold filtering, automatic context redaction, forSource(), KcLogger.silent(); never throws
    • core/lib/src/observability/kc_error_reporter.dart — new KcErrorReporter; install() wires FlutterError.onError + PlatformDispatcher.instance.onError, runGuarded() wraps runApp, restore() for test isolation
    • core/lib/src/observability/kc_bug_report.dart — new KcBugSeverity enum and KcBugReport model with redacted diagnostics, hasFailureEvidence, toJson(), toMarkdown()
    • core/lib/src/observability/kc_bug_report_service.dart — new KcBugReportResult, KcBugReportSink contract, KcInMemoryBugReportSink, and KcBugReportService (validation, log-tail evidence, graceful sink-failure handling)
    • core/lib/src/observability/kc_observability.dart — new KcObservability bundle; standard() and silent() factories guarantee logger and bug report service share one evidence buffer
    • core/lib/core.dart — barrel updated with all 9 observability exports
    • design_system/lib/src/widgets/kc_bug_report_dialog.dart — new KcBugReportDraft and KcBugReportDialog (title/description/severity/reporter, inline validation, no-credentials notice)
    • design_system/lib/design_system.dart — barrel updated
    • kell_web/lib/composition/app_services.dart — observability field + logger/bugReportService accessors + appVersion; all 4 factories stamp environment labels (FAKE/WP/SQ/MULTI)
    • kell_mobile/lib/composition/mobile_app_services.dart — mirrored observability wiring across all 4 factories
    • kell_web/lib/main.dart — KcErrorReporter.install() + runGuarded() + startup record
    • kell_mobile/lib/main.dart — mirrored error handler installation and startup record
    • kell_web/lib/shell/app_shell.dart — _ReportProblemAction app bar action wired to bugReportService
    • kell_mobile/lib/shell/mobile_shell.dart — _reportProblem() app bar action capturing the active tab
  • tests added:
    • core/test/observability_test.dart — 56 tests across KcLogLevel, KcRedactor, KcLogRecord, KcInMemoryLogSink, KcMultiLogSink, KcLogger, KcErrorReporter, KcBugSeverity, KcBugReport, KcBugReportService
    • design_system/test/kc_bug_report_dialog_test.dart — 10 tests (rendering, screen context, validation, trimming, severity selection, cancel)
    • kell_web/test/shell/bug_report_action_test.dart — 10 tests (service wiring, shared buffer, environment labels, shell submission flow)
    • kell_mobile/test/shell/bug_report_action_test.dart — 9 tests (service wiring, shared buffer, shell submission flow, active-tab capture)
  • tests: passed (1475/1475 total; core 90/90 +56; design_system 51/51 +10; kell_web 62/62 +10; kell_mobile 81/81 +9)
  • analyze: passed (dart analyze --fatal-infos — no issues found across all packages and apps)
  • brief updated: yes

feat/square-mobile-pos

  • status: in progress (ready to merge)
  • branch: feat/square-mobile-pos
  • stage: 10C — Square Mobile POS / Checkout
  • date: 2026-07-25
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_orders/lib/src/domain/payment_method.dart — PaymentMethod enum (cash, card) with label and iconHint extensions
    • feature_orders/lib/src/domain/payment_result.dart — PaymentResult immutable value object (transactionId, amountCents, method, completedAt, receiptUrl, amountFormatted)
    • feature_orders/lib/src/application/payment_service.dart — PaymentService abstract contract + PaymentException
    • feature_orders/lib/src/application/checkout_controller.dart — CheckoutController (ChangeNotifier), CartEntry, sealed CheckoutState hierarchy (idle/processing/success/error)
    • feature_orders/lib/src/data/fake_payment_service.dart — FakePaymentService (always succeeds, counter-based IDs)
    • feature_orders/lib/feature_orders.dart — barrel updated with all new exports
    • kell_mobile/lib/pages/mobile_checkout_page.dart — MobileCheckoutPage (product selection → cart → payment → receipt flow; Cash + Card buttons; confirmation dialog; haptic feedback)
    • kell_mobile/lib/shell/mobile_shell.dart — Sales tab (index 4) added; CheckoutController initialised in didChangeDependencies; _titles updated to 6 entries
    • kell_mobile/lib/composition/mobile_app_services.dart — paymentService field + checkoutCatalogue field; _fakeCatalogue const; all factory constructors updated
    • kell_mobile/test/widget_test.dart — updated destination count assertion 5 → 6
  • tests added:
    • feature_orders/test/payment_method_test.dart — 5 tests
    • feature_orders/test/payment_result_test.dart — 11 tests
    • feature_orders/test/fake_payment_service_test.dart — 4 tests
    • feature_orders/test/checkout_controller_test.dart — 16 tests
    • kell_mobile/test/composition/mobile_app_services_test.dart — 11 new tests (paymentService + checkoutCatalogue groups)
    • kell_mobile/test/pages/mobile_checkout_page_test.dart — 11 widget tests
  • tests: passed (1373/1373 total; feature_orders 234/234 +36; kell_mobile 72/72 +18)
  • analyze: passed (dart analyze — no issues found across all packages)
  • brief updated: yes

feat/description-only-edit

  • status: merged to main
  • commit: cebac4c
  • inspection: complete
  • implementation: complete
  • tests: passed (212/212)
  • analyze: passed
  • brief updated: yes

feat/category-only-edit

  • status: merged to main
  • commit: 8e7e4cb
  • inspection: complete
  • implementation: complete
  • tests: passed (223/223 feature_wordpress, 5/5 kell_web dashboard)
  • analyze: passed (dart analyze — no issues found)
  • brief updated: yes

feat/post-write-consistency

  • status: merged to main
  • commit: 7acff83
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_wordpress/lib/src/application/product_publishing_controller.dart — added _refreshSelection() helper; wired into load() and all write methods to preserve/refresh selectedDraft by id after reload
    • feature_wordpress/test/product_publishing_controller_test.dart — added 11 post-write consistency tests covering selection preservation, field refresh (status/price/name/description/category), lastModified, filter/search/sort persistence after writes, item repositioning under active sort, and filter-exit auto-reselection
  • tests: passed (234/234 feature_wordpress)
  • analyze: passed (dart analyze — no issues found)
  • brief updated: yes

feat/publishing-ux-hardening

  • status: merged to main
  • commit: b81016d
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_wordpress/lib/src/presentation/widgets/product_preview_panel.dart — added inline validation error state (_nameError, _priceError, _descriptionError, _categoryError); error messages shown below text fields on empty/invalid submit; errors cleared on cancel; added onCategoryChanged callback; text fields and save buttons disabled during isUpdating; added tooltips (Save price, Save category, Cancel) for consistency
    • feature_wordpress/lib/src/presentation/widgets/status_action_snack_bar.dart — failure SnackBar now appends errorMessage detail to the failure text for operator visibility
    • feature_wordpress/test/widgets/product_preview_panel_test.dart — added onCategoryChanged to test helper; added 13 new tests: inline validation errors (name, price, description, category), error-clears-on-cancel, valid-input-clears-error, and text-field-disabled-during-isUpdating for all four edit fields
    • feature_wordpress/test/widgets/status_action_snack_bar_test.dart — updated 2 failure SnackBar assertions to match new wording that includes error detail
  • tests: passed (247/247 feature_wordpress)
  • analyze: passed (dart analyze — no issues found)
  • brief updated: yes

feat/multi-select-groundwork

  • status: merged to main
  • date: 2026-05-22
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_wordpress/lib/src/application/product_publishing_controller.dart — added multi-selection state (toggleMultiSelect, clearMultiSelection, selectAllVisible, isMultiSelected, multiSelectedIds, multiSelectedCount)
    • feature_wordpress/lib/src/presentation/widgets/product_draft_card.dart — added optional leading checkbox for multi-select mode
    • feature_wordpress/lib/src/presentation/product_publishing_page.dart — added _MultiSelectBar with selected-count display, Select All, and Clear actions
    • feature_wordpress/test/product_publishing_controller_test.dart — added 15 new multi-select tests
  • tests: passed (262/262 feature_wordpress)
  • analyze: passed
  • brief updated: yes

feat/list-efficiency-improvements

  • status: merged to main
  • date: 2026-05-22
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_wordpress/lib/src/application/product_publishing_controller.dart — added ListDensity enum, compact/standard view toggle, staleness detection (isStale(), staleCount() with 30-day threshold), keyboard navigation (selectNextDraft/selectPreviousDraft with wrapping)
    • feature_wordpress/lib/src/presentation/widgets/product_draft_card.dart — added compact two-row layout variant, description snippet in standard card, stale indicator icon, Flexible overflow handling
    • feature_wordpress/lib/src/presentation/product_publishing_page.dart — wired Focus+onKeyEvent for arrow keys and density toggle button
    • feature_wordpress/test/product_publishing_controller_test.dart — added 32 new tests
  • tests: passed (294/294 feature_wordpress, 5/5 kell_web dashboard)
  • analyze: passed
  • brief updated: yes

feat/design-system-shared-widgets

  • status: merged to main
  • date: 2026-05-22
  • inspection: complete
  • implementation: complete
  • files changed:
    • design_system/lib/design_system.dart — expanded barrel exports with typography, layout, and 5 new widgets
    • design_system/lib/src/theme/kc_typography.dart — new shared typography scale (KcTypography) with full Material 3 text style hierarchy and applyKcTypography() helper
    • design_system/lib/src/theme/kc_theme.dart — updated to use KcTypography.applyKcTypography() instead of inline text styles
    • design_system/lib/src/layout/kc_breakpoints.dart — new responsive breakpoint utilities (KcBreakpoints) with compact/medium/expanded/large queries and grid column helper
    • design_system/lib/src/widgets/kc_empty_state.dart — migrated from kell_web EmptyStatePanel as KcEmptyState
    • design_system/lib/src/widgets/kc_section_header.dart — migrated from kell_web SectionHeader as KcSectionHeader
    • design_system/lib/src/widgets/kc_summary_card.dart — migrated from kell_web SummaryCard as KcSummaryCard
    • design_system/lib/src/widgets/kc_loading_state.dart — new shared loading state widget
    • design_system/lib/src/widgets/kc_error_state.dart — new shared error state widget with optional retry
    • design_system/test/design_system_test.dart — expanded from 3 to 41 tests covering all new widgets, typography, breakpoints, colors, spacing
    • kell_web/lib/pages/dashboard_page.dart — updated imports to use design_system widgets directly (KcSectionHeader, KcSummaryCard, KcEmptyState)
    • kell_web/lib/shell/widgets/empty_state_panel.dart — replaced with backward-compatible typedef re-export
    • kell_web/lib/shell/widgets/section_header.dart — replaced with backward-compatible typedef re-export
    • kell_web/lib/shell/widgets/summary_card.dart — replaced with backward-compatible typedef re-export
  • tests: passed (41/41 design_system, 294/294 feature_wordpress, 24/24 kell_web)
  • analyze: passed (dart analyze — no issues found in design_system and kell_web)
  • brief updated: yes

feat/shared-composition-pattern

  • status: merged to main
  • date: 2026-05-22
  • inspection: complete
  • implementation: complete
  • files changed:
    • core/lib/src/app/ — extracted shared composition abstractions (KcAppConfig, KcAppEnvironment, KcAppServices, KcServiceFactory, KcBootstrap, KcAppScope)
    • core/lib/core.dart — expanded barrel exports for app composition
    • core/test/core_test.dart — added 20 tests for shared composition abstractions
    • kell_web/ — updated to use core composition abstractions
  • tests: passed (20/20 core, 41/41 design_system, 294/294 feature_wordpress, 24/24 kell_web)
  • analyze: passed
  • brief updated: yes

feat/flutter-cicd

  • status: merged to main
  • date: 2026-05-22
  • inspection: complete
  • implementation: complete
  • files changed:
    • .forgejo/workflows/flutter-analyze.yml — new Forgejo Actions workflow for dart analyze on all 8 packages/apps
    • .forgejo/workflows/flutter-test.yml — new Forgejo Actions workflow for flutter test per package with aggregate pass/fail summary
    • kell_creations_apps/tools/run_all_tests.sh — new local CI helper script with optional --analyze flag
    • kell_creations_apps/tools/README.md — documents scripts and CI workflow inventory
  • tests: passed (20/20 core, 41/41 design_system, 294/294 feature_wordpress, 24/24 kell_web — 379 total)
  • analyze: passed (dart analyze — no issues found across all 8 packages/apps)
  • brief updated: yes

feat/test-coverage-visibility

  • status: merged to main
  • date: 2026-05-22
  • inspection: complete
  • implementation: complete
  • files changed:
    • .forgejo/workflows/flutter-test.yml — enhanced to run flutter test --coverage, parse lcov.info, report per-package line coverage percentages in aggregate summary table
    • kell_creations_apps/tools/collect_coverage.sh — new local coverage helper script with summary table
    • kell_creations_apps/tools/README.md — documented collect_coverage.sh script
    • .gitignore — added coverage/ directories
    • docs/development/master_development_brief.md — marked Stage 4D complete, documented baseline coverage table, updated next branch to Stage 5A, partially resolved improvement #5
  • tests: passed (20/20 core, 41/41 design_system, 294/294 feature_wordpress, 24/24 kell_web — 379 total)
  • analyze: passed
  • coverage baseline: core 85.7%, design_system 100.0%, feature_wordpress 84.7%, kell_web 54.1%, overall 78.4%
  • brief updated: yes

feat/android-app-shell

  • status: merged to main
  • date: 2026-05-28
  • inspection: complete
  • implementation: complete
  • files changed:
    • kell_mobile/pubspec.yaml — replaced default template dependencies with shared packages (core, design_system, feature_inventory, feature_orders, feature_policy, feature_wordpress); SDK constraint corrected to ^3.11.0
    • kell_mobile/lib/main.dart — replaced counter template with KcBootstrap entry point using --dart-define environment variables
    • kell_mobile/lib/app.dart — new KellMobileApp widget with KcAppScope<MobileAppServices>, KcTheme, and environment badge
    • kell_mobile/lib/composition/mobile_app_services.dart — new MobileAppServices extending KcAppServices with fake() and wp() factory constructors
    • kell_mobile/lib/shell/mobile_shell.dart — new MobileShell with 5-tab NavigationBar (Dashboard, Inventory, Orders, Publishing, More) and IndexedStack body
    • kell_mobile/lib/dashboard/domain/dashboard_summary.dart — shared DashboardSummary value object with fromData() and empty() constructors
    • kell_mobile/lib/dashboard/application/get_dashboard_summary.dart — use case aggregating inventory, orders, and publishing repositories
    • kell_mobile/lib/dashboard/application/dashboard_controller.dart — ChangeNotifier controller with loading/error/summary state
    • kell_mobile/lib/pages/dashboard_page.dart — mobile-optimized dashboard with GridView summary cards using design system widgets
    • kell_mobile/lib/pages/finance_placeholder_page.dart — placeholder page for Finance tab
    • kell_mobile/lib/pages/integrations_placeholder_page.dart — placeholder page for Integrations tab
    • kell_mobile/test/widget_test.dart — 6 widget tests covering shell loading, summary cards, environment badge, navigation bar, tab switching, and More menu
    • 13 other pubspec.yaml files — SDK constraint corrected from ^3.11.4 to ^3.11.0 across all packages
  • tests: passed (6/6 kell_mobile, 24/24 kell_web, 294/294 feature_wordpress — all passing)
  • analyze: not yet run (SDK constraint fix was prerequisite)
  • brief updated: yes

feat/android-publishing-surface

  • status: merged to main
  • date: 2026-05-29
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_wordpress/lib/feature_wordpress.dart — expanded barrel exports with ProductPublishingController, ProductSortField, ProductDraftCard, ProductPreviewPanel, and all 5 use cases + snack bar helpers for mobile consumption
    • kell_mobile/lib/pages/mobile_publishing_page.dart — new mobile-optimized publishing workspace with search bar, horizontal filter chips, sort dropdown, product count, compact card list, pull-to-refresh, and push navigation to detail page
    • kell_mobile/lib/pages/mobile_product_detail_page.dart — new full-screen product detail page wrapping shared ProductPreviewPanel with all narrow edit callbacks
    • kell_mobile/lib/shell/mobile_shell.dart — Products tab (case 2) switched from ProductPublishingPage to MobilePublishingPage; removed unused feature_wordpress import
    • kell_mobile/test/widget_test.dart — added 4 new mobile publishing surface tests (search bar, filter chips, product count, sort button) — 10 total kell_mobile tests
  • tests: passed (10/10 kell_mobile)
  • analyze: passed (dart analyze — no issues found)
  • brief updated: yes

feat/android-feedback-polish

  • status: merged to main
  • date: 2026-05-29
  • inspection: complete
  • implementation: complete
  • files changed:
    • kell_mobile/lib/pages/mobile_product_detail_page.dart — converted from stateless to StatefulWidget; added local controller listener for SnackBar feedback in detail page context; added confirmation dialogs for publish/move-to-draft actions; added haptic feedback (mediumImpact for status, lightImpact for field edits) on successful actions
    • kell_mobile/lib/pages/mobile_publishing_page.dart — added _detailPageActive guard to suppress SnackBars when detail page is pushed (prevents invisible behind-route feedback); updated _navigateToDetail to set/clear the guard flag using Navigator.push().then()
    • kell_mobile/test/widget_test.dart — added 4 new Stage 6A tests: detail page navigation, confirmation dialog for status changes, product name in app bar, and back navigation returning to product list
  • tests: passed (14/14 kell_mobile)
  • analyze: passed (dart analyze — no issues found)
  • brief updated: yes

feat/android-mobile-ux-hardening

  • status: merged to main
  • date: 2026-05-30
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_wordpress/lib/src/presentation/widgets/product_preview_panel.dart — removed constraints: BoxConstraints() and padding: EdgeInsets.zero overrides from 12 IconButtons (edit/save/cancel for name, price, description, category) to restore Material Design 48×48dp minimum touch targets; replaced fixed-width SizedBox(width: 80) on price edit TextField with Expanded for flexible layout on narrow mobile screens; added tooltip: 'Edit price' for consistency with other edit buttons
    • kell_mobile/lib/pages/mobile_product_detail_page.dart — wrapped ProductPreviewPanel in SafeArea to prevent content clipping under system UI on devices with notches/gesture bars
    • feature_wordpress/test/widgets/product_preview_panel_test.dart — added 6 new touch target tests: rendered size ≥ 48×48dp verification for edit name, edit price, edit category, edit description, save/cancel name buttons, and flexible price edit TextField width
  • tests: passed (300/300 feature_wordpress, 14/14 kell_mobile, 24/24 kell_web, 41/41 design_system — 379 total)
  • analyze: passed
  • brief updated: yes

feat/bulk-status-actions

  • status: merged to main
  • commit: 2c3ed3b
  • date: 2026-05-30
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_wordpress/lib/src/application/product_publishing_controller.dart — added BulkActionResult value class with successCount, failureCount, targetStatus, failedProductNames, totalCount, allSucceeded; added lastBulkActionResult, consumeBulkActionResult(), and bulkUpdateStatus() method that processes selected products sequentially with per-row updating state, then reloads once and clears multi-selection
    • feature_wordpress/lib/src/presentation/widgets/status_action_snack_bar.dart — added showBulkActionSnackBar() helper with success/partial-failure/total-failure variants showing count summaries and up to 3 failed product names
    • feature_wordpress/lib/src/presentation/product_publishing_page.dart — added _confirmBulkMoveToDraft() confirmation dialog; updated _MultiSelectBar with onBulkMoveToDraft callback and "Move to Draft" OutlinedButton.icon; added bulk result listener in _onControllerChanged
    • feature_wordpress/test/product_publishing_controller_test.dart — added 11 new bulkUpdateStatus tests: no-op on empty selection, moves all to draft, sets result on all-success, clears multi-selection, clears updatingIds, handles mixed statuses, consume clears result, starts null, preserves preview selection, persists filter/sort, disposal safety
  • tests: passed (311/311 feature_wordpress, 24/24 kell_web — 335+ total)
  • analyze: passed (info-level only — 8 pre-existing unnecessary_import in test files)
  • brief updated: yes

feat/inventory-domain-expansion

  • status: merged to main
  • date: 2026-07-10
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_inventory/lib/src/domain/inventory_item.dart — expanded model with description, imageUrl, category, reorderPoint, supplier, location, lastUpdated fields; added copyWith()
    • feature_inventory/lib/src/domain/inventory_adjustment_result.dart — new value object with success, updatedItem, errorMessage; named constructors success() and failure()
    • feature_inventory/lib/src/domain/inventory_repository.dart — expanded contract with adjustQuantity(), setQuantity(), createItem(), updateItem(), updateItemImage()
    • feature_inventory/lib/src/data/fake_inventory_repository.dart — expanded seed data (6 items with full fields, supplier/location, reorderPoint); implemented all write methods with status auto-update logic
    • feature_inventory/lib/src/application/adjust_inventory_quantity.dart — new use case wrapping adjustQuantity()
    • feature_inventory/lib/src/application/create_inventory_item.dart — new use case wrapping createItem()
    • feature_inventory/lib/src/application/update_inventory_item.dart — new use case wrapping updateItem()
    • feature_inventory/lib/src/application/inventory_controller.dart — added isUpdating, lastActionResult, adjustQuantity(), createItem(), updateItem(), _refreshItem() with pre-filter selectedItem refresh
    • feature_inventory/lib/src/presentation/inventory_page.dart — updated InventoryController constructor call to pass all 4 use cases
    • feature_inventory/lib/feature_inventory.dart — expanded barrel exports for all new types and use cases
    • feature_inventory/test/feature_inventory_test.dart — 49 tests covering InventoryStatus, InventoryItem, InventoryAdjustmentResult, FakeInventoryRepository (all write methods), and InventoryController (read + write actions)
    • kell_web/test/dashboard/domain/dashboard_summary_test.dart — updated InventoryItem construction to use expanded model
    • kell_web/test/dashboard/application/dashboard_controller_test.dart — updated stub InventoryRepository to implement expanded contract
  • tests: passed (49/49 feature_inventory, 24/24 kell_web, 20/20 core, 41/41 design_system, 311/311 feature_wordpress — 445 total)
  • analyze: passed (dart analyze — no issues found)
  • brief updated: yes

feat/inventory-page-ui

  • status: merged to main
  • date: 2026-07-10
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_inventory/lib/src/presentation/inventory_page.dart — full inventory page with search bar, status filter chips (All / In Stock / Low Stock / Out of Stock / Draft), item count display, InventoryItemCard list, initialFilter and initialQuery constructor params
    • feature_inventory/lib/src/presentation/widgets/inventory_status_chip.dart — InventoryStatusChip widget mapping InventoryStatus to label and color
    • feature_inventory/lib/src/presentation/widgets/inventory_detail_panel.dart — InventoryDetailPanel with name, SKU, description, quantity, price, status chip, supplier, location, reorder point, last updated; Adjust Quantity and View Product action buttons; isUpdating loading indicator
    • feature_inventory/lib/src/presentation/widgets/adjust_quantity_dialog.dart — AdjustQuantityDialog with +/- delta input, reason field, and AdjustQuantityDialogResult value object
    • feature_inventory/lib/src/presentation/inventory_action_snack_bar.dart — showInventoryActionSnackBar() helper for success/failure feedback
    • feature_inventory/lib/feature_inventory.dart — expanded barrel exports for all new presentation types
    • feature_inventory/test/widgets/inventory_page_test.dart — 26 new widget tests covering InventoryStatusChip (4), InventoryDetailPanel (11), InventoryPage (9), AdjustQuantityDialogResult (2)
    • kell_creations_apps/tools/run_all_tests.sh — added feature_inventory to TESTABLE list
  • tests: passed (75/75 feature_inventory, 311/311 feature_wordpress, 24/24 kell_web, 14/14 kell_mobile, 41/41 design_system, 20/20 core — 485 total)
  • analyze: passed (dart analyze --fatal-infos — no issues found)
  • brief updated: yes

feat/orders-domain

  • status: merged to main
  • date: 2026-07-10
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_orders/lib/src/domain/order.dart — added customerPhone, notes, orderNotes fields; added copyWith()
    • feature_orders/lib/src/domain/order_action_result.dart — new value object with success, updatedOrder, errorMessage; named constructors success() and failure()
    • feature_orders/lib/src/domain/orders_repository.dart — expanded contract with updateOrderStatus(), addOrderNote(), createOrder()
    • feature_orders/lib/src/data/fake_orders_repository.dart — added customerPhone to seed data; implemented all write methods with duplicate-check, empty-note guard, and status auto-update
    • feature_orders/lib/src/application/update_order_status.dart — new use case wrapping updateOrderStatus()
    • feature_orders/lib/src/application/add_order_note.dart — new use case wrapping addOrderNote()
    • feature_orders/lib/src/application/create_order.dart — new use case wrapping createOrder()
    • feature_orders/lib/src/application/orders_controller.dart — added isUpdating, lastActionResult, updateOrderStatus(), addOrderNote(), createOrder(), consumeActionResult(), _reloadAndRefresh() with filter/search persistence after writes; write use cases are optional named params for backward compatibility
    • feature_orders/lib/feature_orders.dart — expanded barrel exports for all new types and use cases
    • feature_orders/test/feature_orders_test.dart — expanded domain tests: Order (copyWith, defaults, computed props), OrderItem, OrderStatus, OrderActionResult, barrel smoke test
    • feature_orders/test/fake_orders_repository_test.dart — expanded with write method tests: updateOrderStatus (4), addOrderNote (6), createOrder (4)
    • feature_orders/test/orders_controller_test.dart — expanded with write-side tests: updateOrderStatus (6), addOrderNote (6), createOrder (4), consumeActionResult (3), filter/search persistence (2); read-side tests preserved
    • kell_web/test/dashboard/application/dashboard_controller_test.dart — updated _StubOrdersRepository to implement expanded OrdersRepository contract
    • kell_creations_apps/tools/run_all_tests.sh — added feature_orders and kell_mobile to TESTABLE list
  • tests: passed (90/90 feature_orders, 24/24 kell_web — all passing)
  • analyze: passed (dart analyze --fatal-infos — no issues found in feature_orders and kell_web)
  • brief updated: yes

feat/orders-page-ui

  • status: merged to main
  • date: 2026-07-10
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_orders/lib/src/presentation/orders_page.dart — full orders page with search bar, status filter chips (All / Pending / Processing / Shipped / Delivered / Cancelled), order count display, OrderCard list, master-detail wide layout, push-navigation narrow layout; initialFilter, initialQuery, initialSelectedId constructor params; onViewProduct and onViewInventory cross-feature callbacks
    • feature_orders/lib/src/presentation/widgets/order_card.dart — OrderCard with order ID, customer name, date, status chip, item count, and total
    • feature_orders/lib/src/presentation/widgets/order_detail_panel.dart — OrderDetailPanel with customer info, shipping address, line items table, order total, order notes, status update dropdown, Add Note button, and isUpdating loading indicator; optional onViewProduct/onViewInventory cross-feature links per line item
    • feature_orders/lib/src/presentation/widgets/order_status_chip.dart — OrderStatusChip mapping OrderStatus to label and color
    • feature_orders/lib/src/presentation/widgets/add_note_dialog.dart — AddNoteDialog with text field, empty-note validation, and AddNoteDialogResult value object
    • feature_orders/lib/src/presentation/orders_action_snack_bar.dart — showOrderActionSnackBar() helper for success/failure feedback
    • feature_orders/lib/feature_orders.dart — expanded barrel exports for all new presentation types and OrdersController
    • feature_orders/test/widgets/orders_page_test.dart — 25 new widget tests covering OrderDetailPanel (14), AddNoteDialog (3), OrdersPage (6), and _EmptyOrdersRepository test double
  • tests: passed (115/115 feature_orders, 24/24 kell_web — 139 total for affected packages)
  • analyze: passed (dart analyze — no issues found)
  • brief updated: yes

feat/orders-mobile-surface

  • status: merged to main
  • date: 2026-07-10
  • inspection: complete
  • implementation: complete
  • files changed:
    • kell_mobile/lib/pages/mobile_orders_page.dart — new MobileOrdersPage with search bar, horizontal status filter chips (All / Pending / Processing / Shipped / Delivered / Cancelled), order count display, OrderCard list at 160px height, pull-to-refresh, _detailPageActive guard to suppress behind-route SnackBars
    • kell_mobile/lib/pages/mobile_order_detail_page.dart — new MobileOrderDetailPage wrapping shared OrderDetailPanel; StatefulWidget with local controller listener for SnackBar feedback; confirmation dialog before status changes; haptic feedback (mediumImpact for status, lightImpact for note additions); SafeArea wrapper
    • kell_mobile/lib/shell/mobile_shell.dart — Orders tab (case 3) switched from shared OrdersPage to MobileOrdersPage; removed unused feature_orders direct import
    • kell_mobile/test/widget_test.dart — added 6 new Stage 6B tests: Orders tab search bar, status filter chips, order count, order card navigation to detail, confirmation dialog for status change, back navigation returning to orders list — 20 total kell_mobile tests
  • tests: passed (20/20 kell_mobile, 115/115 feature_orders — all passing)
  • analyze: passed (dart analyze --fatal-infos — no issues found)
  • brief updated: yes

feat/inventory-mobile-surface

  • status: merged to main
  • date: 2026-07-10
  • inspection: complete
  • implementation: complete
  • files changed:
    • kell_mobile/lib/pages/mobile_inventory_page.dart — new MobileInventoryPage with search bar, horizontal status filter chips (All / In Stock / Low Stock / Out of Stock / Draft), item count display, compact _MobileInventoryCard list at 120px height showing name, SKU, status chip, and quantity-on-hand, pull-to-refresh, _detailPageActive guard to suppress behind-route SnackBars
    • kell_mobile/lib/pages/mobile_inventory_detail_page.dart — new MobileInventoryDetailPage wrapping shared InventoryDetailPanel; StatefulWidget with local controller listener for SnackBar feedback; shows showAdjustQuantityDialog on Adjust Quantity tap; haptic feedback (mediumImpact on result, lightImpact on successful adjust); SafeArea wrapper
    • kell_mobile/lib/shell/mobile_shell.dart — Inventory tab (case 1) switched from shared InventoryPage to MobileInventoryPage; removed unused feature_inventory direct import
    • kell_mobile/test/widget_test.dart — added 6 new Stage 6C tests: Inventory tab search bar, status filter chips, item count, inventory card navigation to detail, adjust quantity dialog, back navigation returning to inventory list — 26 total kell_mobile tests
  • tests: passed (26/26 kell_mobile, 75/75 feature_inventory — all passing)
  • analyze: passed (dart analyze --fatal-infos — no issues found)
  • brief updated: yes

chore/analyze-cleanup-and-tracker-sync

  • status: merged to main
  • date: 2026-05-30
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_wordpress/test/product_publishing_controller_test.dart — removed 3 unnecessary_import directives (get_product_drafts, product_publishing_controller, publish_product)
    • feature_wordpress/test/widgets/product_draft_card_test.dart — removed 1 unnecessary_import directive (product_draft_card)
    • feature_wordpress/test/widgets/product_preview_panel_test.dart — removed 1 unnecessary_import directive (product_preview_panel)
    • feature_wordpress/test/widgets/publish_status_chip_test.dart — removed 1 unnecessary_import directive (publish_status_chip)
    • feature_wordpress/test/widgets/status_action_snack_bar_test.dart — removed 2 unnecessary_import directives (product_publishing_controller, status_action_snack_bar)
    • kell_mobile/test/widget_test.dart — removed unused productCards local variable
    • docs/development/build_execution_tracker.md — updated Stage 7A to merged, synced current status
    • docs/development/master_development_brief.md — updated next recommended branch, validation state, test counts
  • tests: passed (311/311 feature_wordpress, 14/14 kell_mobile, 24/24 kell_web, 41/41 design_system, 20/20 core — 410 total)
  • analyze: passed (dart analyze --fatal-infos — no issues found across all packages)
  • brief updated: yes

feat/integrations-contracts

  • status: merged to main
  • date: 2026-07-11
  • inspection: complete
  • implementation: complete
  • files changed:
    • integrations/lib/src/api_exception.dart — new ApiException base class with statusCode, message, body; replaces placeholder Calculator class
    • integrations/lib/src/api_client.dart — new ApiClient abstract class with initialize(), dispose(), isReady, execute<T>() lifecycle contract
    • integrations/lib/src/retry_policy.dart — new RetryPolicy abstract class; NoRetryPolicy (never retries); ExponentialBackoffRetryPolicy (doubles delay per attempt, capped at maxDelay, retries on 5xx and network errors)
    • integrations/lib/src/rate_limiter.dart — new RateLimiter abstract class; NoRateLimiter (no-op); TokenBucketRateLimiter (maxRequests per window, queues excess requests)
    • integrations/lib/src/integration_health_check.dart — new HealthCheckResult value object with healthy/unhealthy named constructors; IntegrationHealthCheck abstract contract
    • integrations/lib/src/webhook_handler.dart — new WebhookEvent, WebhookProcessingStatus enum, WebhookResult with processed/ignored/failed constructors; WebhookHandler abstract contract
    • integrations/lib/src/channel_adapter.dart — new ChannelProduct, ChannelOrder, ChannelOrderItem, ChannelInventoryCount neutral value objects; ChannelAdapter abstract contract with products/orders/inventory operations
    • integrations/lib/integrations.dart — replaced Calculator placeholder with barrel exports for all 7 new contract files
    • integrations/test/integrations_test.dart — replaced placeholder test with 38 tests covering all contracts and value objects
    • feature_wordpress/lib/src/data/woo_commerce_api_client.dart — WooCommerceApiClient now implements ApiClient; added initialize(), isReady, execute<T>(); dispose() also resets _ready
    • feature_wordpress/lib/src/data/woo_commerce_api_client.dart — WooCommerceApiException now extends ApiException instead of implementing Exception directly
    • feature_wordpress/pubspec.yaml — added integrations: path: ../integrations dependency
    • kell_creations_apps/tools/run_all_tests.sh — added packages/integrations to both TESTABLE and ANALYZABLE lists
  • tests: passed (38/38 integrations, 319/319 feature_wordpress — 357 total for affected packages)
  • analyze: passed (dart analyze --fatal-infos — no issues found in integrations and feature_wordpress)
  • brief updated: yes

feat/data-layer-contracts

  • status: merged to main
  • date: 2026-07-11
  • inspection: complete
  • implementation: complete
  • files changed:
    • data/lib/src/local_cache.dart — new LocalCache<T> abstract contract; InMemoryCache<T> implementation with TTL-based expiry, key enumeration, and dispose
    • data/lib/src/sync_queue.dart — new SyncOperationStatus enum, SyncOperation value object with copyWith(); SyncFlushResult with success/failure constructors; SyncQueue abstract contract; InMemorySyncQueue implementation with enqueue, process (success/failure tracking), remove, pruneCompleted, and length
    • data/lib/src/conflict_resolver.dart — new ConflictResolution enum, ConflictResult<T> with useLocal/useRemote/merged/requiresReview constructors; ConflictResolver<T> abstract contract; LastWriteWinsResolver<T>, LocalAlwaysWinsResolver<T>, RemoteAlwaysWinsResolver<T> concrete implementations
    • data/lib/src/change_tracker.dart — new ChangeState enum, TrackedChange<T> value object with copyWith(); ChangeTracker<T> abstract contract; InMemoryChangeTracker<T> implementation with trackCreated/trackModified/trackDeleted/markSynced/markSyncError/pendingChanges/hasPendingChanges/clear
    • data/lib/src/data_mapper.dart — new DataMapper<TLocal, TRemote> abstract contract with fromRemote/toRemote/fromRemoteList/toRemoteList; DataMappingException with field, message, rawValue
    • data/lib/data.dart — replaced Calculator placeholder with barrel exports for all 5 new contract files
    • data/test/data_test.dart — replaced placeholder test with 63 tests covering all contracts and implementations
    • kell_creations_apps/tools/run_all_tests.sh — added packages/data to both TESTABLE and ANALYZABLE lists
  • tests: passed (63/63 data)
  • analyze: passed (dart analyze --fatal-infos — no issues found)
  • brief updated: yes

feat/auth-foundation

  • status: merged to main
  • date: 2026-07-11
  • inspection: complete
  • implementation: complete
  • files changed:
    • auth/lib/src/domain/kc_user.dart — KcUser value object with id, displayName, email, role; KcUserRole enum (admin, operator, viewer)
    • auth/lib/src/domain/auth_state.dart — AuthState sealed class hierarchy: AuthStateUnauthenticated, AuthStateAuthenticated, AuthStateLoading, AuthStateError
    • auth/lib/src/domain/auth_exception.dart — AuthException with code and message; named constructors invalidCredentials, sessionExpired, networkError, unknown
    • auth/lib/src/domain/auth_service.dart — AuthService abstract contract with login(), logout(), currentUser, authStateStream, isAuthenticated
    • auth/lib/src/domain/credential_store.dart — CredentialKeys constants; CredentialStore abstract contract with save(), load(), delete(), clear()
    • auth/lib/src/data/in_memory_credential_store.dart — InMemoryCredentialStore implementation
    • auth/lib/src/data/fake_auth_service.dart — FakeAuthService with configurable users, delay simulation, and stream broadcasting
    • auth/lib/auth.dart — barrel exports for all auth types
    • auth/test/auth_test.dart — 42 tests covering all domain models, contracts, and implementations
    • core/lib/src/app/kc_app_environment.dart — added KcAppEnvironment.square value
    • kell_creations_apps/tools/run_all_tests.sh — added packages/auth to TESTABLE and ANALYZABLE lists
  • tests: passed (42/42 auth, 21/21 core — all passing)
  • analyze: passed (dart analyze --fatal-infos — no issues found)
  • brief updated: yes

feat/wc-orders-integration

  • status: merged to main
  • date: 2026-07-11
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_orders/lib/src/domain/order_status.dart — added onHold, refunded, failed values
    • feature_orders/lib/src/domain/order_item.dart — added productId, variationId, customizations fields
    • feature_orders/lib/src/domain/order.dart — added paymentMethod, source, customFields fields
    • feature_orders/lib/src/domain/orders_repository.dart — added getOrder(id) to contract
    • feature_orders/lib/src/domain/order_source.dart — new OrderSource enum (online, market, manual)
    • feature_orders/lib/src/data/fake_orders_repository.dart — implemented getOrder(id) with null-safe lookup
    • feature_orders/lib/src/data/woo_commerce_order_mapper.dart — new WooCommerceOrderMapper mapping WooCommerce JSON ↔ Order domain model
    • feature_orders/lib/src/data/woo_commerce_orders_repository.dart — new WooCommerceOrdersRepository implementing full OrdersRepository contract via WooCommerceApiClient
    • feature_orders/lib/feature_orders.dart — expanded barrel exports for all new types
    • feature_orders/pubspec.yaml — added feature_wordpress dependency; added http dev dependency
    • feature_wordpress/lib/src/data/woo_commerce_api_client.dart — added getOrders(), getOrder(id), updateOrderStatus(), createOrder(), addOrderNote() methods
    • feature_wordpress/lib/feature_wordpress.dart — exported WooCommerceApiClient and WooCommerceApiException
    • feature_orders/test/woo_commerce_order_mapper_test.dart — 25 mapper tests covering full JSON → domain mapping, status mapping, item mapping, customizations, edge cases
    • feature_orders/test/woo_commerce_orders_repository_test.dart — 23 repository and API client tests covering all CRUD operations, error handling, empty-note guard, and FakeOrdersRepository.getOrder
  • tests: passed (198/198 feature_orders, 24/24 kell_web, 26/26 kell_mobile — 248 total for affected packages; 847/847 total across all packages)
  • analyze: passed (dart analyze --fatal-infos — no issues found in feature_orders, feature_wordpress, kell_web, kell_mobile)
  • brief updated: yes

feat/bulk-operator-workflows

  • status: merged to main
  • date: 2026-05-30
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_wordpress/lib/src/data/wordpress_product_mapper.dart — toWooCommerceStatus() now maps PublishStatus.pendingReview → 'pending' instead of throwing ArgumentError; only unpublished throws
    • feature_wordpress/lib/src/presentation/product_publishing_page.dart — added _confirmBulkPublish() and _confirmBulkSubmitForReview() confirmation dialogs; updated _MultiSelectBar with onBulkPublish and onBulkSubmitForReview callbacks; added "Publish" and "Submit for Review" OutlinedButton.icon buttons; refactored bar layout from Row to Wrap for responsive overflow
    • feature_wordpress/test/wordpress_product_mapper_test.dart — updated pendingReview test: now expects 'pending' return value instead of ArgumentError
    • feature_wordpress/test/product_publishing_controller_test.dart — added 3 new bulk tests: publishes all selected products, submits all for review, handles mixed statuses to published
    • feature_wordpress/test/widgets/product_publishing_page_test.dart — added 5 new widget tests: multi-select bar shows Publish button, Publish confirmation dialog, Submit for Review confirmation dialog, cancel preserves selection, plural count in dialog
    • feature_wordpress/test/wordpress_product_publishing_repository_test.dart — removed pendingReview from unsupported-throws test; only unpublished asserted
  • tests: passed (319/319 feature_wordpress)
  • analyze: passed (dart analyze --fatal-infos — no issues found)
  • brief updated: yes

feat/wc-inventory-sync

  • status: merged to main
  • date: 2026-07-11
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_inventory/lib/src/domain/inventory_sync_status.dart — new InventorySyncStatus enum (notSynced, synced, pending, conflict, error)
    • feature_inventory/lib/src/domain/inventory_item.dart — added wooCommerceProductId (nullable int), syncStatus, lastSyncedAt fields; updated copyWith() to preserve/update all three
    • feature_inventory/lib/src/domain/inventory_repository.dart — added getItemBySku(sku) and syncWithRemote(id, remoteQuantity, reason) to contract
    • feature_inventory/lib/src/data/fake_inventory_repository.dart — updated seed data with wooCommerceProductId, syncStatus, lastSyncedAt; implemented getItemBySku() and syncWithRemote() with status auto-derivation and lastSyncedAt stamping
    • feature_inventory/lib/src/application/inventory_sync_service.dart — new InventorySyncService orchestrating pull-only or bidirectional sync; syncAll(), syncItem(id), checkDifference(id); InventorySyncResult value object; StockDifference value object
    • feature_inventory/lib/src/data/woo_commerce_inventory_repository.dart — new WooCommerceInventoryRepository implementing full InventoryRepository contract; adjustQuantity() and setQuantity() push to WooCommerce via updateProductStock(); syncWithRemote() pulls remote quantity and stamps lastSyncedAt; local-only items (no wooCommerceProductId) skip WooCommerce calls
    • feature_inventory/lib/feature_inventory.dart — expanded barrel exports for InventorySyncService, WooCommerceInventoryRepository, InventorySyncStatus
    • feature_inventory/pubspec.yaml — added feature_wordpress: path: ../feature_wordpress dependency; added http: ^1.4.0 dev dependency
    • feature_wordpress/lib/src/data/woo_commerce_api_client.dart — added getProductStock(productId), updateProductStock(productId, quantity), batchUpdateStock(updates) methods
    • feature_inventory/test/woo_commerce_inventory_sync_test.dart — 57 new tests covering InventorySyncStatus, InventoryItem sync fields, FakeInventoryRepository (getItemBySku, syncWithRemote), WooCommerceApiClient stock methods, WooCommerceInventoryRepository, InventorySyncService, StockDifference, InventorySyncResult
    • kell_web/test/dashboard/application/dashboard_controller_test.dart — updated _StubInventoryRepository and _FailingInventoryRepository stubs to implement expanded InventoryRepository contract (getItemBySku, syncWithRemote)
  • tests: passed (132/132 feature_inventory, 24/24 kell_web, 319/319 feature_wordpress — all passing)
  • analyze: passed (dart analyze — no issues found)
  • brief updated: yes

feat/wc-catalog-expansion

  • status: merged to main
  • date: 2026-07-11
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_wordpress/lib/src/domain/product_category.dart — new ProductCategory value object with id, name, slug, parentId, count; copyWith(), ==/hashCode, toString()
    • feature_wordpress/lib/src/domain/product_image.dart — new ProductImage value object with id, url, alt, position; copyWith(), ==/hashCode
    • feature_wordpress/lib/src/domain/product_publishing_repository.dart — added createProduct(), deleteProduct(), updateProductImages(), getProductImages(), getCategories(), createCategory(), updateCategory(), deleteCategory() to contract
    • feature_wordpress/lib/src/data/fake_product_publishing_repository.dart — implemented all 8 new repository methods; added seed categories (Jewelry, Accessories, Home Decor, Kitchen Accessories); createProduct() resolves category name from id; createCategory() auto-generates slug from name; updateCategory() and deleteCategory() throw StateError for unknown ids
    • feature_wordpress/lib/src/data/woo_commerce_api_client.dart — added createProduct(), deleteProduct(), getCategories(), createCategory(), updateCategory(), deleteCategory(), getProductImages(), setProductImages() methods; getCategories() paginates with per_page=100
    • feature_wordpress/lib/src/data/wordpress_product_publishing_repository.dart — implemented all 8 new repository methods delegating to WooCommerceApiClient; maps JSON ↔ domain models
    • feature_wordpress/lib/src/application/create_product.dart — new CreateProduct use case
    • feature_wordpress/lib/src/application/delete_product.dart — new DeleteProduct use case
    • feature_wordpress/lib/src/application/get_categories.dart — new GetCategories use case
    • feature_wordpress/lib/src/application/create_category.dart — new CreateCategory use case
    • feature_wordpress/lib/src/application/update_product_images.dart — new UpdateProductImages use case
    • feature_wordpress/lib/feature_wordpress.dart — exported all new domain models and use cases
    • feature_wordpress/test/wc_catalog_expansion_test.dart — 69 new tests covering ProductCategory, ProductImage, FakeProductPublishingRepository (all new methods), WooCommerceApiClient (all new methods), WordPressProductPublishingRepository (all new methods), and all 5 use cases
    • kell_web/test/dashboard/application/dashboard_controller_test.dart — updated _StubProductPublishingRepository to implement expanded ProductPublishingRepository contract
    • kell_creations_apps/packages/feature_wordpress/test/widgets/product_publishing_page_test.dart — updated _FakeProductPublishingRepository stub to implement expanded contract
  • tests: passed (388/388 feature_wordpress, 24/24 kell_web — all passing)
  • analyze: passed (dart analyze — no issues found)
  • brief updated: yes

feat/wc-catalog-expansion-ui

  • status: merged to main
  • date: 2026-07-11
  • inspection: complete
  • implementation: complete
  • files changed:
    • feature_wordpress/lib/src/presentation/widgets/create_product_dialog.dart — new CreateProductDialog StatefulWidget with name (required), price (required), SKU, category dropdown, description, and initial-status SegmentedButton (Draft / Review); inline validation errors; CreateProductDialogResult value object; showCreateProductDialog() helper
    • feature_wordpress/lib/src/presentation/category_management_page.dart — new CategoryManagementPage with category list, add-category FAB, inline rename, delete with confirmation dialog, empty state, loading/error states; CategoryManagementPage.route() static helper
    • feature_wordpress/lib/src/application/product_publishing_controller.dart — added CreateProductResult sealed class (CreateProductSuccess, CreateProductFailure); added lastCreateProductResult, consumeCreateProductResult(), createNewProduct() (calls CreateProduct use case, auto-selects new product, reloads); added fetchCategories() (calls GetCategories use case); CreateProduct and GetCategories use cases are optional named constructor params for backward compatibility
    • feature_wordpress/lib/src/presentation/product_publishing_page.dart — added "New Product" FilledButton.icon in toolbar; wired showCreateProductDialog() → controller.createNewProduct(); added showCreateProductSnackBar() result listener; added "Manage Categories" TextButton in toolbar linking to CategoryManagementPage
    • feature_wordpress/lib/feature_wordpress.dart — exported CreateProductDialog, CreateProductDialogResult, showCreateProductDialog, CategoryManagementPage, CreateProductResult, CreateProductSuccess, CreateProductFailure
    • kell_mobile/lib/pages/mobile_create_product_page.dart — new MobileCreateProductPage full-screen form (name, price, SKU, category dropdown, description, initial status) with AppBar and "Create Product" action button; mirrors dialog fields in a scrollable page layout
    • kell_mobile/lib/pages/mobile_publishing_page.dart — added "New Product" FloatingActionButton navigating to MobileCreateProductPage; wired result back to controller.createNewProduct(); added showCreateProductSnackBar() result listener
    • feature_wordpress/test/widgets/create_product_dialog_test.dart — 13 new widget tests: renders fields, Cancel returns null, name/price validation errors, valid submit returns result, SKU/description included, category dropdown shown/hidden, initial status defaults to draft, error-clears-on-type, standalone render
    • feature_wordpress/test/widgets/category_management_page_test.dart — 14 new widget tests: renders category list, empty state, add category dialog, rename inline, delete confirmation, loading state, error state, category count
    • feature_wordpress/test/product_publishing_controller_test.dart — added 7 new controller tests: createNewProduct success/auto-select/failure/consume/null-use-case, fetchCategories success/null-use-case
  • tests: passed (424/424 feature_wordpress — all passing)
  • analyze: passed (dart analyze --fatal-infos — no issues found)
  • brief updated: yes

feat/square-api-client

  • status: merged to main
  • date: 2026-07-19
  • inspection: complete
  • implementation: complete
  • files changed:
    • integrations/lib/src/square_api_client.dart — new SquareApiClient implementing ApiClient contract; sandbox() and production() factory constructors; initialize(), dispose(), isReady, execute<T>() lifecycle; Catalog API (listCatalogItems() with cursor pagination, getCatalogItem(), upsertCatalogItem(), deleteCatalogItem()); Inventory API (getInventoryCount(), batchChangeInventory()); Orders API (createOrder(), listOrders(), getOrder()); Payments API (createPayment(), getPayment()); Bearer token + Square-Version headers on all requests
    • integrations/lib/src/square_api_exception.dart — new SquareApiException extending ApiException with statusCode, message, body; toString() includes all fields
    • integrations/lib/integrations.dart — expanded barrel exports for SquareApiClient and SquareApiException
    • integrations/test/square_api_client_test.dart — 50 new tests covering SquareApiException (5), SquareApiClient construction (2), ApiClient contract (5), Catalog API (12), Inventory API (7), Orders API (9), Payments API (8), auth headers (2)
    • integrations/pubspec.yaml — removed duplicate http dev dependency (was also in normal dependencies)
    • core/lib/src/composition/kc_app_environment.dart — added multi value to KcAppEnvironment enum (joining existing fake, wp, square)
    • core/lib/src/composition/kc_app_config.dart — added KC_SQUARE_ACCESS_TOKEN, KC_SQUARE_LOCATION_ID, KC_SQUARE_ENVIRONMENT dart-define key constants
    • core/test/core_test.dart — added 3 new tests: KcAppEnvironment.multi exists, KC_SQUARE_ACCESS_TOKEN constant, KC_SQUARE_LOCATION_ID constant — 24 total core tests
  • tests: passed (88/88 integrations, 24/24 kell_web, 26/26 kell_mobile, 424/424 feature_wordpress, 132/132 feature_inventory, 198/198 feature_orders, 41/41 design_system, 24/24 core — 957 total)
  • analyze: passed (dart analyze --fatal-infos — no issues found across all 11 packages/apps)
  • brief updated: yes

feat/square-catalog-sync

  • status: in progress on branch (commit a6f888c)
  • date: 2026-07-25
  • inspection: complete
  • implementation: complete (Stage 10B slice)
  • files changed:
    • integrations/lib/src/square_product_mapper.dart — new SquareProductMapper; fromSquareCatalogObject() maps Square ITEM CatalogObject JSON → ChannelProduct (cents→dollars, is_deleted → archived status, first-variation SKU/price extraction); fromSquareCatalogList() batch variant skipping non-ITEM entries; toSquareCatalogObject() maps ChannelProduct → Square ITEM JSON (dollars→cents rounding, default variation with FIXED_PRICING, location_overrides with track_inventory, optional description/SKU omitted when null)
    • integrations/lib/src/square_inventory_mapper.dart — new SquareInventoryMapper; fromSquareInventoryCount() maps Square InventoryCount JSON → ChannelInventoryCount (IN_STOCK only, string quantity parsed safely); fromSquareInventoryCountList() batch variant; toSquareBatchChangeEntry() maps ChannelInventoryCount → Square PHYSICAL_COUNT batch-change entry (quantity as string, RFC 3339 timestamp); toSquareBatchChangeEntries() batch variant
    • integrations/lib/integrations.dart — added square_inventory_mapper.dart and square_product_mapper.dart to barrel exports
    • integrations/test/square_catalog_sync_test.dart — 35 new tests: SquareProductMapper (20: fromSquareCatalogObject ×9, fromSquareCatalogList ×3, toSquareCatalogObject ×6) and SquareInventoryMapper (15: fromSquareInventoryCount ×8, fromSquareInventoryCountList ×3, toSquareBatchChangeEntry ×3, toSquareBatchChangeEntries ×2)
    • feature_wordpress/lib/src/domain/product_id_mapping.dart — new ProductIdMapping value object with localId, wooCommerceId, squareCatalogObjectId, squareVariationId, lastUpdated; copyWith(), ==/hashCode, toString()
    • feature_wordpress/lib/src/domain/product_id_mapping_repository.dart — new ProductIdMappingRepository abstract contract: getAllMappings(), getMappingByLocalId(), getMappingByWooCommerceId(), getMappingBySquareId(), saveMapping() (upsert), deleteMapping() (no-op safe)
    • feature_wordpress/lib/src/data/fake_product_id_mapping_repository.dart — new FakeProductIdMappingRepository in-memory implementation; seeded with 6 mappings matching fake catalog (products 1–3 fully synced with Square IDs, products 4–5 WooCommerce-only, product 6 draft/unsynced); 50ms simulated async delay on all operations; getAllMappings() returns List.unmodifiable
    • feature_wordpress/lib/feature_wordpress.dart — added fake_product_id_mapping_repository.dart, product_id_mapping.dart, product_id_mapping_repository.dart to barrel exports
    • feature_wordpress/test/product_id_mapping_test.dart — 23 new tests: ProductIdMapping (7: fields, null defaults, copyWith, equality, hashCode, toString) and FakeProductIdMappingRepository (16: getAllMappings, getMappingByLocalId, getMappingByWooCommerceId, getMappingBySquareId, seed state, saveMapping insert/replace/count, deleteMapping remove/count/no-op, unmodifiable list)
  • tests: passed (123/123 integrations ← +35 new; 23/23 feature_wordpress product_id_mapping ← +23 new)
  • analyze: clean (no new issues introduced)
  • brief updated: yes

feat/square-catalog-sync-service

  • status: in progress on branch — ready for merge
  • date: 2026-07-25
  • inspection: complete
  • implementation: complete (Stage 10D slice)
  • files changed:
    • feature_wordpress/lib/src/application/square_catalog_sync_service.dart — new SquareCatalogSyncService application-layer service; SyncError value object with itemId, message, ==/hashCode/toString(); SquareSyncResult value object with catalogSynced, inventorySynced, catalogFailed, inventoryFailed, errors, totalProcessed, allSucceeded, merge(); InventorySyncAdapter abstract contract with syncItem(itemId, remoteQuantity); syncCatalog() fetches all products via ProductPublishingRepository.getProductDrafts(), looks up or creates ProductIdMapping per product via ProductIdMappingRepository, captures per-item failures without aborting; syncInventory() iterates all mappings with a squareVariationId, calls InventorySyncAdapter.syncItem() for each, captures per-item failures; syncAll() runs syncCatalog() then syncInventory() and merges results; no-op when no adapter provided
    • feature_wordpress/lib/feature_wordpress.dart — added square_catalog_sync_service.dart to barrel exports (Application section)
    • feature_wordpress/test/square_catalog_sync_service_test.dart — 31 new tests: SyncError (3: fields, equality, toString), SquareSyncResult (7: defaults, totalProcessed, allSucceeded×3, merge, toString), syncCatalog (9: empty, single, id match, multiple, existing-not-duplicated, fetch-failure, saveMapping-failure, partial-failure, SyncError-details), syncInventory (7: no-adapter, no-variationId-skipped, synced, false-return, throw-continues, getAllMappings-failure, empty-mappings), syncAll (5: merges, pre-seeded-variation-IDs, totalProcessed, catalog-failure-no-prevent-inventory, no-adapter)
  • tests: passed (506/506 feature_wordpress ← +31 new, 167/167 feature_inventory — all passing)
  • analyze: clean (dart analyze — no issues found)
  • brief updated: yes

chore/audit-state-sync

  • status: complete (documentation-only — no code changes)
  • date: 2026-07-25
  • inspection: complete — full repository audit conducted against all 11 packages/apps
  • implementation: complete
  • audit reference: PROJECT_STATE_AUDIT.md — Kell Creations Operations Platform Comprehensive Code Audit
  • files changed:
    • PROJECT_STATE_AUDIT.md — new comprehensive audit document; covers monorepo architecture, built vs. remaining matrix for all 13 packages + 2 apps, technical debt assessment (dead code, error handling gaps, hardcoded values, test coverage, architectural antipatterns), and actionable engineering backlog (Phase 1/2/3 priorities)
    • docs/development/master_development_brief.md — updated validation state (core 24/24, feature_wordpress 506/506 post-10D, total 1,015/1,015); updated next recommended branch to include P1.1–P1.5 scope; added "Comprehensive State Audit (2026-07-25)" section with platform scorecard, Phase 1/2/3 backlog tables, and key technical debt findings; updated Appendix A (feature maturity matrix — all test counts, completeness percentages, kell_web/kell_mobile rows added); updated Appendix B (integration landscape — all Square repos now marked complete, WC repos status corrected); updated Appendix C (Square keys moved from "Planned" to "Active"; KC_ENV values table updated with current status)
    • docs/development/build_execution_tracker.md — updated current status section (audit completion noted, pending merge flagged, next branch scope documented); added this slice entry
  • tests: n/a (documentation-only change)
  • analyze: n/a (documentation-only change)
  • brief updated: yes
  • audit findings summary:
    • 1,015/1,015 tests passing across all 11 packages/apps
    • dart analyze --fatal-infos clean across all 11 packages/apps
    • CRITICAL: AppServices/MobileAppServices have no square() or multi() factory — KC_ENV=square silently falls to fake mode
    • HIGH: SquareCatalogSyncService ID conflation bug; RetryPolicy/RateLimiter not wired; auth package not imported by any app
    • Phase 1 (5 items) → target feat/square-catalog-sync-service-controller (Stage 10E)
    • Phase 2 (10 items) → Stages 10C, 11, 12, 13, 14, 15
    • Phase 3 (12 items) → Stages 16A/B + standalone hardening tasks

feat/square-catalog-sync-repositories

  • status: in progress on branch — ready for merge
  • date: 2026-07-25
  • inspection: complete
  • implementation: complete (Stage 10C slice)
  • files changed:
    • feature_wordpress/lib/src/data/square_catalog_repository.dart — new SquareCatalogRepository implementing ProductPublishingRepository; backed by SquareApiClient; getProductDrafts() calls listCatalogItems() and maps via SquareProductMapper, populating an in-memory cache; publishDraft() returns cached draft with published status (no-op — Square items are always live); updateProductStatus(), updateProductPrice(), updateProductName(), updateProductDescription(), updateProductCategory() each mutate the cached ProductDraft, call upsertCatalogItem() with the updated Square JSON, and return the refreshed draft; createProduct() calls upsertCatalogItem() with a #NEW_ idempotency key, maps the response, and adds to cache; deleteProduct() calls deleteCatalogItem() and removes from cache; updateProductImages(), getCategories(), createCategory(), updateCategory(), deleteCategory(), getProductImages() throw UnsupportedError (Square manages these separately)
    • feature_wordpress/lib/feature_wordpress.dart — added square_catalog_repository.dart to barrel exports
    • feature_inventory/lib/src/domain/inventory_item.dart — added squareVariationId (nullable String) field; updated copyWith() to preserve/update it
    • feature_inventory/lib/src/data/square_inventory_repository.dart — new SquareInventoryRepository implementing InventoryRepository; backed by SquareApiClient + initialItems seed list; getInventoryItems() returns List.unmodifiable; getItemBySku() linear scan; adjustQuantity() validates non-negative result, pushes batchChangeInventory() when squareVariationId is set (stamps synced/lastSyncedAt), otherwise marks notSynced; setQuantity() validates non-negative, same Square push pattern; syncWithRemote() validates non-negative, calls getInventoryCount() when squareVariationId is set and uses live count (falls back to remoteQuantity on empty response), stamps synced/lastSyncedAt; createItem() appends to local store; updateItem() replaces by id and stamps lastUpdated; updateItemImage() updates imageUrl by id; all write failures return InventoryAdjustmentResult.failure() with descriptive messages; status auto-derived from quantity vs reorderPoint
    • feature_inventory/lib/feature_inventory.dart — added square_inventory_repository.dart to barrel exports
    • feature_inventory/pubspec.yaml — added integrations: path: ../integrations dependency
    • feature_wordpress/test/square_catalog_repository_test.dart — 30 new tests: getProductDrafts (5: empty, single mapping, is_deleted status, multi+skip non-ITEM, cache population), publishDraft (2: success, StateError), updateProductStatus (2: upserts, StateError), updateProductPrice (2: upserts, StateError), updateProductName (1), updateProductDescription (1), updateProductCategory (1), createProduct (4: maps result, draft status, StateError on bad type, adds to cache), deleteProduct (1: removes from cache), unsupported operations (6: images/categories all throw UnsupportedError), status mapping (2), SquareApiException propagation (1)
    • feature_inventory/test/square_inventory_repository_test.dart — 37 new tests: getInventoryItems (3: all items, empty, unmodifiable), getItemBySku (2), adjustQuantity (8: local-only, Square push, not-found, below-zero, API failure, inStock/lowStock/outOfStock status derivation), setQuantity (5: local-only, Square push, negative, not-found, API failure), syncWithRemote (6: local-only, Square pull, empty-count fallback, negative, not-found, API failure), createItem (2), updateItem (3: updates, StateError, stamps lastUpdated), updateItemImage (2), InventoryItem.squareVariationId (4: default null, constructor, copyWith preserve, copyWith update)
  • tests: passed (123/123 integrations, 475/475 feature_wordpress ← +51 new, 167/167 feature_inventory ← +35 new)
  • analyze: clean
  • brief updated: yes

feat/square-sync-ui

  • status: ready for merge (branch feat/square-sync-ui)
  • date: 2026-07-25
  • inspection: complete
  • implementation: complete (Stage 10F — Square sync UI surface)
  • files changed:
    • feature_wordpress/lib/src/presentation/widgets/square_sync_status_panel.dart — new SquareSyncStatusPanel StatefulWidget; listens to SquareSyncController; shows status chip (Never synced / OK / Partial / Error), last-synced timestamp, Syncing… progress indicator during sync, Sync Now FilledButton (disabled while syncing), and last-sync-result section with Catalog/Inventory row counts when lastResult is non-null
    • feature_wordpress/lib/feature_wordpress.dart — added square_sync_status_panel.dart to barrel exports (Presentation section)
    • kell_creations_apps/apps/kell_web/lib/pages/integrations_page.dart — new IntegrationsPage; shows SquareSyncStatusPanel when squareSyncController is non-null; shows placeholder card with hub icon and "No integrations configured" message otherwise; "Square" section label when controller is present
    • kell_creations_apps/apps/kell_mobile/lib/pages/mobile_integrations_page.dart — new MobileIntegrationsPage; mirrors IntegrationsPage layout for mobile; SafeArea wrapper
    • kell_creations_apps/apps/kell_web/lib/routing/app_routes.dart — added AppRoute.integrations case routing to IntegrationsPage(squareSyncController: services.squareSyncController)
    • kell_creations_apps/apps/kell_mobile/lib/shell/mobile_shell.dart — More tab (case 4) switched from IntegrationsPlaceholderPage to MobileIntegrationsPage(squareSyncController: services.squareSyncController)
    • feature_wordpress/test/square_sync_status_panel_test.dart — 8 new widget tests: renders title, shows Never synced chip, shows Last synced: Never, Sync Now button enabled, shows OK chip after sync, shows last sync result section, rebuilds on notify, unregisters listener on dispose; uses tester.pump(Duration) to advance fake time through Future.delayed timers
    • kell_creations_apps/apps/kell_web/test/pages/integrations_page_test.dart — 4 new widget tests: placeholder when controller null, shows SquareSyncStatusPanel when controller provided, shows Square section label, placeholder shows hub icon
    • kell_creations_apps/apps/kell_mobile/test/pages/mobile_integrations_page_test.dart — 4 new widget tests: mirroring kell_web integrations page tests for mobile
    • kell_creations_apps/apps/kell_web/test/composition/app_services_test.dart — expanded to 28 tests (added squareSyncController non-null assertion for square() factory, multi() factory tests, full KcBootstrap credential validation tests)
    • kell_creations_apps/apps/kell_mobile/test/composition/mobile_app_services_test.dart — expanded to 28 tests (mirrored kell_web composition tests)
  • tests: passed (545/545 feature_wordpress ← +8 new; 52/52 kell_web ← +5 new; 54/54 kell_mobile ← +5 new — 651 total across tested packages)
  • analyze: passed (dart analyze --fatal-infos — no issues found across all packages)
  • brief updated: yes

feat/square-catalog-sync-service-controller

  • status: ready for merge (branch feat/square-catalog-sync-service-controller)
  • date: 2026-07-25
  • inspection: complete
  • implementation: complete (Stage 10E — all P1.1–P1.5 items)
  • files changed:
    • feature_wordpress/lib/src/application/square_sync_controller.dart — new SquareSyncController ChangeNotifier; SyncPhase enum (idle, syncing, done, error); syncAll() delegates to SquareCatalogSyncService, sets phase/lastResult/lastError, guards against concurrent calls; reset() returns to idle; isLoading getter; disposal guard prevents post-dispose notifications
    • feature_wordpress/lib/feature_wordpress.dart — added square_sync_controller.dart to barrel exports (Application section)
    • kell_creations_apps/apps/kell_web/lib/composition/app_services.dart — added square() factory (P1.1): SquareCatalogRepository as productPublishingRepository, SquareInventoryRepository as inventoryRepository, SquareSyncController wired to SquareCatalogSyncService; added multi() factory: SquareInventoryRepository + WordPressProductPublishingRepository; updated KcBootstrap to validate Square credentials (P1.5) and fall back to fake with warning; added squareSyncController field to AppServices
    • kell_creations_apps/apps/kell_mobile/lib/composition/mobile_app_services.dart — mirrored square() and multi() factories; added squareSyncController field; same KcBootstrap Square credential validation
    • feature_wordpress/lib/src/domain/product_draft.dart — added squareCatalogObjectId (nullable String) field to ProductDraft; updated copyWith() to preserve/update it; updated ==/hashCode/toString()
    • feature_wordpress/lib/src/application/square_catalog_sync_service.dart — fixed ID conflation bug (P1.2): syncCatalog() now reads draft.squareCatalogObjectId to look up existing mapping instead of using draft.id; mapping lookup uses getMappingBySquareId() when Square ID is present, falls back to getMappingByLocalId() for unsynced items; prevents duplicate mapping creation for already-synced products
    • feature_wordpress/test/square_sync_controller_test.dart — 18 new tests: SyncPhase enum (1), SquareSyncController construction (2), syncAll success (3), syncAll error (2), concurrent guard (2), reset() (2), isLoading (2), disposal guard (2), lastResult/lastError lifecycle (2)
    • kell_creations_apps/apps/kell_web/test/composition/app_services_test.dart — added square() factory tests (3: creates instance, SquareCatalogRepository, SquareInventoryRepository), multi() factory tests (2), KcBootstrap Square credential validation tests (3: selects square with credentials, selects multi with all credentials, falls back to fake without credentials) — 23 total kell_web composition tests
    • kell_creations_apps/apps/kell_mobile/test/composition/mobile_app_services_test.dart — mirrored kell_web composition tests — 23 total kell_mobile composition tests
  • tests: passed (537/537 feature_wordpress ← +31 new; 47/47 kell_web ← +23 new; 49/49 kell_mobile ← +23 new; 34/34 core; 167/167 feature_inventory — 834 total across tested packages)
  • analyze: passed (dart analyze --fatal-infos — no issues found across all 5 packages)
  • brief updated: yes