105 KiB
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 intomaster_development_brief.mdand 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, commit7bf8f55 - 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, commit85501fd - main baseline updated through:
feat/custom-order-domain(Stage 11A complete, merged 2026-08-29) - reconciled:
chore/state-reconciliation-flutter-347— working tree vs.mainreconciled 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, commit6c299e8 - 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, commit07e7e08. 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.mdcreated 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.excludeblock in everyanalysis_options.yamlon eachpub get/analyze/run/buildwith no opt-out (flutter#191160). Do not open a slice to revert it — see "Toolchain baseline" inmaster_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, andkell_mobile - files added —
feature_ordersdomain:lib/src/domain/fulfillment_event.dart—FulfillmentEvent(from/status/occurredAt/note) withintake(),isIntake,isRework,hasNote,description, and afrom|to|iso|notewire format that sanitises separators out of notes;fromWire()tolerates malformed lineslib/src/domain/material_usage.dart—MaterialUsage(sku, quantity, displayName) withisValid,label, and asku|qty|namewire formatlib/src/domain/material_consumption_port.dart—MaterialDeductionResult(per-SKUfailures,isPartial,totalUnitsDeducted,summary) and theMaterialConsumptionPortoutbound port, plusNoopMaterialConsumptionPort
- files added —
feature_ordersapplication:lib/src/application/advance_fulfillment.dart—AdvanceFulfillmentuse case; adds no rule of its own, so the pipeline is defined in exactly one placelib/src/application/complete_custom_order.dart—CompleteCustomOrder+CompleteCustomOrderResult; advances first, deducts second, and never lets a stock failure fail the completionlib/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 throughCompleteCustomOrder), andconsumeActionResult()/consumeDeductionWarning()
- files added —
feature_orderspresentation:lib/src/presentation/custom_order_tracking_page.dart—CustomOrderTrackingPage; master-detail aboveKcBreakpoints.medium, pushed detail below itlib/src/presentation/widgets/fulfillment_timeline.dart—FulfillmentTimeline; dot-and-rail rows, rework marker, colour-coded by outcomelib/src/presentation/widgets/custom_order_tracking_card.dart—CustomOrderTrackingCard; leads with the workshop stage, spec summary, balance, and last updatelib/src/presentation/widgets/custom_order_tracking_detail.dart—CustomOrderTrackingDetail; stage action, spec, deposit/balance, materials, timelinelib/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— addedfulfillmentHistoryandmaterialUsage(both defaultconst []); addedcurrentStage,hasFulfillmentHistory,latestFulfillmentEvent,lastFulfillmentUpdate,allowedNextStages,isFulfillmentComplete,hasMaterialUsage,deductibleMaterials, and the append-onlywithFulfillmentEvent(). All existing fields, defaults, andcopyWithsemantics 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 optionalnoteandoccurredAt; addedrecordMaterialUsage()lib/src/data/fake_orders_repository.dart— injectablenowclock;advanceFulfillmentStatusappends an event;createCustomOrderseeds an intake event;recordMaterialUsageimplemented; all five seeded commissions now carry realistic histories (KC-C2004 includes a rework loop) and material usagelib/src/data/woo_commerce_orders_repository.dart— injectablenowclock; same history and material behaviour as the fakelib/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 valueslib/src/presentation/orders_page.dart— optionalonTrackCustomOrderscallback adds a "Track Custom Orders" action beside the existing intake action; both omitted when the host has no routelib/feature_orders.dart— barrel exports for all new typesREADME.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 bridgingInventoryRepositorytoMaterialConsumptionPort; tolerant by contract, never throws, logs per-SKU failureskell_web/lib/composition/app_services.dart—materialConsumptionPortbuilt from the inventory repositorykell_web/lib/routing/app_routes.dart— new/orders/trackingroute;_parseStage()returnsnullfor an unknown stage rather thanFulfillmentStatus.fromWire'squoteddefault, which would be the wrong behaviour for a filterkell_web/lib/navigation/app_navigation.dart—ordersToCustomOrderTracking()kell_mobile/lib/composition/inventory_material_consumption_adapter.dart— new; deliberately duplicated rather than shared, matching the existingget_dashboard_summary.dartconventionkell_mobile/lib/composition/mobile_app_services.dart—materialConsumptionPortkell_mobile/lib/pages/mobile_custom_order_tracking_page.dart— new full-screenSafeAreahost for the shared pagekell_mobile/lib/pages/mobile_orders_page.dart— small tracking FAB above the existing intake FAB; reloads the list on returnkell_mobile/lib/shell/mobile_shell.dart— passes the material port through
- tests updated (contract widening):
feature_orders/test/widgets/orders_page_test.dart—_EmptyOrdersRepositorysatisfies the widened contractkell_web/test/dashboard/application/dashboard_controller_test.dart—_StubOrdersRepositorysatisfies 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,withFulfillmentEventimmutability 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,recordMaterialUsagevalidation)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,AdvanceFulfillmentdelegation 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_ordersstill has no dependency onfeature_inventory. The orders layer declaresMaterialConsumptionPort; 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:
CompleteCustomOrderadvances the order before deducting, so an illegal jump tocompletedcan 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, orkell_mobile) - format:
dart format --line-length 100applied to every file touched by this slice - test-harness notes: the stage chip row scrolls horizontally, so tests
scrollUntilVisiblebefore tapping a later chip rather than working around a layout defect; the detail panel's indeterminateLinearProgressIndicatornever settles, so theisUpdatingtest usespump()rather thanpumpAndSettle() - defect found and fixed while testing:
CustomOrderTrackingCard's footer row overflowed at the 340 px master-list width; both halves are nowFlexiblewith 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_ordersapplication:lib/src/application/create_custom_order.dart—CreateCustomOrderuse case wrappingOrdersRepository.createCustomOrderlib/src/application/record_deposit.dart—RecordDeposituse case wrappingOrdersRepository.recordDeposit; accepts no payment identifierlib/src/application/custom_order_form_controller.dart—CustomOrderFieldenum +CustomOrderFormController(ChangeNotifier): field state, field-keyed validation,buildSpec(),submit(),reset(), derivedestimatedPriceCents/depositAmountCents/balanceDueCents, and the staticparseMoneyToCents()money parser. Injectable clock and ID generator keep tests deterministic
- files added —
feature_orderspresentation:lib/src/presentation/custom_order_form_page.dart—CustomOrderFormPage; owns a controller unless one is injected, swaps to the confirmation page on successlib/src/presentation/custom_order_confirmation_page.dart—CustomOrderConfirmationPagewith the commission summary and the deposit receiptlib/src/presentation/widgets/fulfillment_status_chip.dart—FulfillmentStatusChipover the design-systemKcStatusChiplib/src/presentation/widgets/reference_image_dialog.dart—showReferenceImageDialog()+ReferenceImageDialogResultwith URL validation
- files changed:
feature_orders/lib/src/presentation/orders_page.dart— optionalonCreateCustomOrdercallback surfaces a "New Custom Order" toolbar action; omitted when the host has no intake routefeature_orders/lib/feature_orders.dart— barrel exports for all new application and presentation typesfeature_orders/README.md— documents the intake UI and the cents-only money rulekell_web/lib/routing/app_routes.dart— new/orders/customroute renderingCustomOrderFormPageinsideAppShell; orders route now passesonCreateCustomOrderkell_web/lib/navigation/app_navigation.dart—ordersToCustomOrder()andcustomOrderToOrders()handoffskell_mobile/lib/pages/mobile_custom_order_page.dart— new full-screenSafeAreahost for the shared formkell_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,buildSpecmapping, 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-valueFulfillmentStatusChipmatrix)feature_orders/test/widgets/orders_page_test.dart— 3 new tests for the custom order entry pointkell_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
PaymentResultand 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
parseMoneyToCentsbefore it reachesDepositInfo; the onlydoubleis the derivedOrderItem.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.viewrather than working around a layout defect — the page scrolls normally on device - toolchain note:
kell_web/pubspec.lockpicked up SDK-pinned transitive bumps onflutter pub get(matcher0.12.19→0.12.20,meta1.18.0→1.19.0,test_api0.7.11→0.7.12,vector_math2.2.0→2.4.3). Same accepted class as thekell_mobilebumps recorded underchore/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
mainand localmainwas 4 commits ahead oforigin/main - scope: documentation and toolchain hygiene only — no
lib/ortest/source file was modified
What the drift actually was
- Flutter 3.47.0
analysis_options.yamlchurn (accepted). The local toolchain moved from Flutter 3.44.x to Flutter 3.47.0 / Dart 3.13.0. Flutter 3.47 shipsAnalysisOptionsMigration, which unconditionally writes a fixed seven-entryanalyzer.excludeblock (build/**,android/**,ios/**,web/**,windows/**,macos/**,linux/**) into everyanalysis_options.yamlit finds. Upstream bugs: flutter#191160 and flutter#191131.- Commit
92d83e0previously tried to revert this. That revert does not hold. The migration runs fromensureReadyForPlatformSpecificTooling, soflutter pub get,flutter analyze,flutter run, andflutter buildall rewrite the block. There is no opt-out. This was confirmed empirically: a fullflutter testsweep 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 indart create -t webpackages). Verified that neitherkell_web/web/norkell_mobile/web/contains any.dartfile, so nothing is dropped from analysis here.dart analyze --fatal-infosremains clean across all 11 packages and apps.
- Commit
kell_mobileweb scaffold (reverted). Someone had runflutter create --platforms=webinsidekell_mobile, which produced an untrackedweb/directory (index.html,manifest.json,favicon.png, 4 icons) and rewrote.metadataso theandroidplatform entry was replaced byweb.kell_mobileis the Android target and itsandroid/directory is tracked, so this was unintended tool output, not a deliberate platform addition.- Decision: reverted.
.metadatarestored to the tracked Android-only revision (ad70ec46…); the untrackedweb/scaffold deleted.kell_mobileremains Android-only.
- Decision: reverted.
kell_mobile/pubspec.locktransitive bumps (accepted). Resolved under the newer SDK:clock1.1.2→1.1.3,matcher0.12.19→0.12.20,meta1.18.0→1.18.3,stack_trace1.12.1→1.12.2,test_api0.7.11→0.7.12,vector_math2.2.0→2.4.2, plusvm_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 Scorecardsection. 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 tomain. -
PROJECT_STATE_AUDIT.md§3.4 — test counts corrected to the verified run (core24→90,design_system41→51,feature_wordpress506→545,feature_orders198→657,feature_policy~5→17,kell_web24→62,kell_mobile26→81). -
PROJECT_STATE_AUDIT.md§3.5 — marked three antipatterns resolved:SquareCatalogSyncServiceID 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.mdAppendix 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 theanalysis_options.yamlcaveat 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_ordersscaffolding files) - files changed:
feature_orders/lib/src/domain/order_type.dart— newOrderTypeenum (standard/custom) withlabel,wireValue,fromWire()defaulting tostandardfeature_orders/lib/src/domain/custom_order_spec.dart— new immutableCustomOrderSpec(material, color, size, dimensions, unmodifiablereferenceImageUrls, notes,estimatedCompletionDate);copyWith, list-aware==/hashCode,toString,isProductionReady,hasReferenceImages,summaryfeature_orders/lib/src/domain/deposit_info.dart— new immutableDepositInfo; money as integer cents (depositAmountCents,totalAmountCents),depositDate,settlementDate,depositPaid, derivedbalanceDueCents(clamped at zero),markDepositPaid(),markSettled(),formatCents(),.quoted(); deliberately carries no payment identifierfeature_orders/lib/src/domain/fulfillment_status.dart— newFulfillmentStatus(quoted → depositReceived → inProduction → qualityCheck → readyForPickup → completed, plus cancelled) withlabel,stageIndex,pipeline,wireValue,fromWire();FulfillmentTransitionextension withallowedNextStatuses,canTransitionTo(),rejectionReason(),isTerminal,isSuccessful,requiresDepositfeature_orders/lib/src/domain/order.dart— addedorderType(defaults tostandard), nullablecustomOrderSpec,depositInfo,fulfillmentStatus; addedisCustom,hasDeposit,balanceDueCents; all existing fields, defaults, andcopyWithsemantics preservedfeature_orders/lib/src/domain/orders_repository.dart— addedcreateCustomOrder(),updateCustomOrderSpec(),recordDeposit(),advanceFulfillmentStatus()feature_orders/lib/src/data/fake_orders_repository.dart— implemented all four methods; injectedKcLogger(defaults toKcLogger.silent()); five seeded custom ordersKC-C2001…KC-C2005covering 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; injectedKcLogger;_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 disturbedfeature_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 ofOrder.customFieldsfeature_orders/lib/feature_orders.dart— barrel updated with 4 new domain exportsfeature_orders/pubspec.yaml— addedcorepath dependency (forKcLogger); description expandedfeature_wordpress/lib/src/data/woo_commerce_api_client.dart— newupdateOrder(orderId, body)generic order PUT, mirroringupdateProduct()feature_orders/.metadata,CHANGELOG.md,LICENSE,README.md— P3.8 scaffolding (.gitignorealready existed)feature_orders/test/fake_orders_repository_test.dart— seeded-count assertions updated 6 → 11 and 7 → 12; added a standard-order count testfeature_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 to11 orders;_EmptyOrdersRepositorysatisfies the widened contractkell_web/test/dashboard/application/dashboard_controller_test.dart—_StubOrdersRepositorysatisfies 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,summaryPII safety,copyWith, equality,toStringleak checks)feature_orders/test/deposit_info_test.dart— 58 tests (cents arithmetic, balance derivation and clamping, formatting parity withPaymentResult, 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 reasonfeature_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 overMockClient, observability on pre-existing operations, no-payment-identifier-on-the-wire checks)
- observability:
KcLoggerinjected into both repositories; rejections logged atwarning, API failures aterrorwith status code and originating exception; no silentcatch (_) {}; log context limited to identifiers, operation names, and status names — never customer identity, addresses, money amounts, or payment identifiers; all context additionally passes throughKcRedactor - 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).balanceDueCentsis 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 100applied to all files touched by this slice (matches the repo's.vscode/settings.jsondart.lineLength: 100);--set-exit-if-changedclean acrossfeature_orders, and the two files touched infeature_wordpress/kell_web - known pre-existing issues (not introduced here, left untouched):
kell_web/lib/composition/app_services.dartandkell_web/lib/shell/app_nav_item.dartare not format-clean at 100 cols;tools/run_all_tests.shreportsTOTAL 0under Git Bash on Windows because itsgrepfor 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— newKcLogLevelenum (debug/info/warning/error/fatal) withseverity,label,isAtLeast(),fromString()core/lib/src/observability/kc_log_record.dart— new immutableKcLogRecord(level, source, message, timestamp, unmodifiable context, error, stackTrace);format(),toJson(),isFailurecore/lib/src/observability/kc_redactor.dart— newKcRedactor;isSensitiveKey(),redactMap()(recurses nested maps/lists),maskValue(); 14 sensitive key fragmentscore/lib/src/observability/kc_log_sink.dart— newKcLogSinkcontract;KcConsoleLogSink(release-silent by default),KcInMemoryLogSink(bounded ring buffer withrecent()/recordsAtLeast()/clear()),KcMultiLogSink(fault-tolerant fan-out)core/lib/src/observability/kc_logger.dart— newKcLoggerfacade; level helpers, threshold filtering, automatic context redaction,forSource(),KcLogger.silent(); never throwscore/lib/src/observability/kc_error_reporter.dart— newKcErrorReporter;install()wiresFlutterError.onError+PlatformDispatcher.instance.onError,runGuarded()wrapsrunApp,restore()for test isolationcore/lib/src/observability/kc_bug_report.dart— newKcBugSeverityenum andKcBugReportmodel with redacted diagnostics,hasFailureEvidence,toJson(),toMarkdown()core/lib/src/observability/kc_bug_report_service.dart— newKcBugReportResult,KcBugReportSinkcontract,KcInMemoryBugReportSink, andKcBugReportService(validation, log-tail evidence, graceful sink-failure handling)core/lib/src/observability/kc_observability.dart— newKcObservabilitybundle;standard()andsilent()factories guarantee logger and bug report service share one evidence buffercore/lib/core.dart— barrel updated with all 9 observability exportsdesign_system/lib/src/widgets/kc_bug_report_dialog.dart— newKcBugReportDraftandKcBugReportDialog(title/description/severity/reporter, inline validation, no-credentials notice)design_system/lib/design_system.dart— barrel updatedkell_web/lib/composition/app_services.dart—observabilityfield +logger/bugReportServiceaccessors +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 factorieskell_web/lib/main.dart—KcErrorReporter.install()+runGuarded()+ startup recordkell_mobile/lib/main.dart— mirrored error handler installation and startup recordkell_web/lib/shell/app_shell.dart—_ReportProblemActionapp bar action wired tobugReportServicekell_mobile/lib/shell/mobile_shell.dart—_reportProblem()app bar action capturing the active tab
- tests added:
core/test/observability_test.dart— 56 tests acrossKcLogLevel,KcRedactor,KcLogRecord,KcInMemoryLogSink,KcMultiLogSink,KcLogger,KcErrorReporter,KcBugSeverity,KcBugReport,KcBugReportServicedesign_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—PaymentMethodenum (cash, card) withlabelandiconHintextensionsfeature_orders/lib/src/domain/payment_result.dart—PaymentResultimmutable value object (transactionId, amountCents, method, completedAt, receiptUrl, amountFormatted)feature_orders/lib/src/application/payment_service.dart—PaymentServiceabstract contract +PaymentExceptionfeature_orders/lib/src/application/checkout_controller.dart—CheckoutController(ChangeNotifier),CartEntry, sealedCheckoutStatehierarchy (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 exportskell_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;CheckoutControllerinitialised indidChangeDependencies;_titlesupdated to 6 entrieskell_mobile/lib/composition/mobile_app_services.dart—paymentServicefield +checkoutCataloguefield;_fakeCatalogueconst; all factory constructors updatedkell_mobile/test/widget_test.dart— updated destination count assertion 5 → 6
- tests added:
feature_orders/test/payment_method_test.dart— 5 testsfeature_orders/test/payment_result_test.dart— 11 testsfeature_orders/test/fake_payment_service_test.dart— 4 testsfeature_orders/test/checkout_controller_test.dart— 16 testskell_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 intoload()and all write methods to preserve/refreshselectedDraftby id after reloadfeature_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; addedonCategoryChangedcallback; text fields and save buttons disabled duringisUpdating; added tooltips (Save price,Save category,Cancel) for consistencyfeature_wordpress/lib/src/presentation/widgets/status_action_snack_bar.dart— failure SnackBar now appendserrorMessagedetail to the failure text for operator visibilityfeature_wordpress/test/widgets/product_preview_panel_test.dart— addedonCategoryChangedto 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 fieldsfeature_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 modefeature_wordpress/lib/src/presentation/product_publishing_page.dart— added_MultiSelectBarwith selected-count display, Select All, and Clear actionsfeature_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— addedListDensityenum, compact/standard view toggle, staleness detection (isStale(),staleCount()with 30-day threshold), keyboard navigation (selectNextDraft/selectPreviousDraftwith 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,Flexibleoverflow handlingfeature_wordpress/lib/src/presentation/product_publishing_page.dart— wiredFocus+onKeyEventfor arrow keys and density toggle buttonfeature_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 widgetsdesign_system/lib/src/theme/kc_typography.dart— new shared typography scale (KcTypography) with full Material 3 text style hierarchy andapplyKcTypography()helperdesign_system/lib/src/theme/kc_theme.dart— updated to useKcTypography.applyKcTypography()instead of inline text stylesdesign_system/lib/src/layout/kc_breakpoints.dart— new responsive breakpoint utilities (KcBreakpoints) with compact/medium/expanded/large queries and grid column helperdesign_system/lib/src/widgets/kc_empty_state.dart— migrated from kell_web EmptyStatePanel as KcEmptyStatedesign_system/lib/src/widgets/kc_section_header.dart— migrated from kell_web SectionHeader as KcSectionHeaderdesign_system/lib/src/widgets/kc_summary_card.dart— migrated from kell_web SummaryCard as KcSummaryCarddesign_system/lib/src/widgets/kc_loading_state.dart— new shared loading state widgetdesign_system/lib/src/widgets/kc_error_state.dart— new shared error state widget with optional retrydesign_system/test/design_system_test.dart— expanded from 3 to 41 tests covering all new widgets, typography, breakpoints, colors, spacingkell_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-exportkell_web/lib/shell/widgets/section_header.dart— replaced with backward-compatible typedef re-exportkell_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 compositioncore/test/core_test.dart— added 20 tests for shared composition abstractionskell_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 summarykell_creations_apps/tools/run_all_tests.sh— new local CI helper script with optional --analyze flagkell_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 tablekell_creations_apps/tools/collect_coverage.sh— new local coverage helper script with summary tablekell_creations_apps/tools/README.md— documented collect_coverage.sh script.gitignore— added coverage/ directoriesdocs/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.0kell_mobile/lib/main.dart— replaced counter template withKcBootstrapentry point using--dart-defineenvironment variableskell_mobile/lib/app.dart— newKellMobileAppwidget withKcAppScope<MobileAppServices>,KcTheme, and environment badgekell_mobile/lib/composition/mobile_app_services.dart— newMobileAppServicesextendingKcAppServiceswithfake()andwp()factory constructorskell_mobile/lib/shell/mobile_shell.dart— newMobileShellwith 5-tabNavigationBar(Dashboard, Inventory, Orders, Publishing, More) andIndexedStackbodykell_mobile/lib/dashboard/domain/dashboard_summary.dart— sharedDashboardSummaryvalue object withfromData()andempty()constructorskell_mobile/lib/dashboard/application/get_dashboard_summary.dart— use case aggregating inventory, orders, and publishing repositorieskell_mobile/lib/dashboard/application/dashboard_controller.dart—ChangeNotifiercontroller with loading/error/summary statekell_mobile/lib/pages/dashboard_page.dart— mobile-optimized dashboard withGridViewsummary cards using design system widgetskell_mobile/lib/pages/finance_placeholder_page.dart— placeholder page for Finance tabkell_mobile/lib/pages/integrations_placeholder_page.dart— placeholder page for Integrations tabkell_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.yamlfiles — SDK constraint corrected from^3.11.4to^3.11.0across 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 withProductPublishingController,ProductSortField,ProductDraftCard,ProductPreviewPanel, and all 5 use cases + snack bar helpers for mobile consumptionkell_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 pagekell_mobile/lib/pages/mobile_product_detail_page.dart— new full-screen product detail page wrapping sharedProductPreviewPanelwith all narrow edit callbackskell_mobile/lib/shell/mobile_shell.dart— Products tab (case 2) switched fromProductPublishingPagetoMobilePublishingPage; removed unusedfeature_wordpressimportkell_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 actionskell_mobile/lib/pages/mobile_publishing_page.dart— added_detailPageActiveguard to suppress SnackBars when detail page is pushed (prevents invisible behind-route feedback); updated_navigateToDetailto 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— removedconstraints: BoxConstraints()andpadding: EdgeInsets.zerooverrides from 12IconButtons (edit/save/cancel for name, price, description, category) to restore Material Design 48×48dp minimum touch targets; replaced fixed-widthSizedBox(width: 80)on price editTextFieldwithExpandedfor flexible layout on narrow mobile screens; addedtooltip: 'Edit price'for consistency with other edit buttonskell_mobile/lib/pages/mobile_product_detail_page.dart— wrappedProductPreviewPanelinSafeAreato prevent content clipping under system UI on devices with notches/gesture barsfeature_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— addedBulkActionResultvalue class withsuccessCount,failureCount,targetStatus,failedProductNames,totalCount,allSucceeded; addedlastBulkActionResult,consumeBulkActionResult(), andbulkUpdateStatus()method that processes selected products sequentially with per-row updating state, then reloads once and clears multi-selectionfeature_wordpress/lib/src/presentation/widgets/status_action_snack_bar.dart— addedshowBulkActionSnackBar()helper with success/partial-failure/total-failure variants showing count summaries and up to 3 failed product namesfeature_wordpress/lib/src/presentation/product_publishing_page.dart— added_confirmBulkMoveToDraft()confirmation dialog; updated_MultiSelectBarwithonBulkMoveToDraftcallback and "Move to Draft"OutlinedButton.icon; added bulk result listener in_onControllerChangedfeature_wordpress/test/product_publishing_controller_test.dart— added 11 newbulkUpdateStatustests: 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 withdescription,imageUrl,category,reorderPoint,supplier,location,lastUpdatedfields; addedcopyWith()feature_inventory/lib/src/domain/inventory_adjustment_result.dart— new value object withsuccess,updatedItem,errorMessage; named constructorssuccess()andfailure()feature_inventory/lib/src/domain/inventory_repository.dart— expanded contract withadjustQuantity(),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 logicfeature_inventory/lib/src/application/adjust_inventory_quantity.dart— new use case wrappingadjustQuantity()feature_inventory/lib/src/application/create_inventory_item.dart— new use case wrappingcreateItem()feature_inventory/lib/src/application/update_inventory_item.dart— new use case wrappingupdateItem()feature_inventory/lib/src/application/inventory_controller.dart— addedisUpdating,lastActionResult,adjustQuantity(),createItem(),updateItem(),_refreshItem()with pre-filter selectedItem refreshfeature_inventory/lib/src/presentation/inventory_page.dart— updatedInventoryControllerconstructor call to pass all 4 use casesfeature_inventory/lib/feature_inventory.dart— expanded barrel exports for all new types and use casesfeature_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 modelkell_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,InventoryItemCardlist,initialFilterandinitialQueryconstructor paramsfeature_inventory/lib/src/presentation/widgets/inventory_status_chip.dart—InventoryStatusChipwidget mappingInventoryStatusto label and colorfeature_inventory/lib/src/presentation/widgets/inventory_detail_panel.dart—InventoryDetailPanelwith name, SKU, description, quantity, price, status chip, supplier, location, reorder point, last updated; Adjust Quantity and View Product action buttons;isUpdatingloading indicatorfeature_inventory/lib/src/presentation/widgets/adjust_quantity_dialog.dart—AdjustQuantityDialogwith +/- delta input, reason field, andAdjustQuantityDialogResultvalue objectfeature_inventory/lib/src/presentation/inventory_action_snack_bar.dart—showInventoryActionSnackBar()helper for success/failure feedbackfeature_inventory/lib/feature_inventory.dart— expanded barrel exports for all new presentation typesfeature_inventory/test/widgets/inventory_page_test.dart— 26 new widget tests coveringInventoryStatusChip(4),InventoryDetailPanel(11),InventoryPage(9),AdjustQuantityDialogResult(2)kell_creations_apps/tools/run_all_tests.sh— addedfeature_inventorytoTESTABLElist
- 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— addedcustomerPhone,notes,orderNotesfields; addedcopyWith()feature_orders/lib/src/domain/order_action_result.dart— new value object withsuccess,updatedOrder,errorMessage; named constructorssuccess()andfailure()feature_orders/lib/src/domain/orders_repository.dart— expanded contract withupdateOrderStatus(),addOrderNote(),createOrder()feature_orders/lib/src/data/fake_orders_repository.dart— addedcustomerPhoneto seed data; implemented all write methods with duplicate-check, empty-note guard, and status auto-updatefeature_orders/lib/src/application/update_order_status.dart— new use case wrappingupdateOrderStatus()feature_orders/lib/src/application/add_order_note.dart— new use case wrappingaddOrderNote()feature_orders/lib/src/application/create_order.dart— new use case wrappingcreateOrder()feature_orders/lib/src/application/orders_controller.dart— addedisUpdating,lastActionResult,updateOrderStatus(),addOrderNote(),createOrder(),consumeActionResult(),_reloadAndRefresh()with filter/search persistence after writes; write use cases are optional named params for backward compatibilityfeature_orders/lib/feature_orders.dart— expanded barrel exports for all new types and use casesfeature_orders/test/feature_orders_test.dart— expanded domain tests: Order (copyWith, defaults, computed props), OrderItem, OrderStatus, OrderActionResult, barrel smoke testfeature_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 preservedkell_web/test/dashboard/application/dashboard_controller_test.dart— updated_StubOrdersRepositoryto implement expandedOrdersRepositorycontractkell_creations_apps/tools/run_all_tests.sh— addedfeature_ordersandkell_mobiletoTESTABLElist
- 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,OrderCardlist, master-detail wide layout, push-navigation narrow layout;initialFilter,initialQuery,initialSelectedIdconstructor params;onViewProductandonViewInventorycross-feature callbacksfeature_orders/lib/src/presentation/widgets/order_card.dart—OrderCardwith order ID, customer name, date, status chip, item count, and totalfeature_orders/lib/src/presentation/widgets/order_detail_panel.dart—OrderDetailPanelwith customer info, shipping address, line items table, order total, order notes, status update dropdown, Add Note button, andisUpdatingloading indicator; optionalonViewProduct/onViewInventorycross-feature links per line itemfeature_orders/lib/src/presentation/widgets/order_status_chip.dart—OrderStatusChipmappingOrderStatusto label and colorfeature_orders/lib/src/presentation/widgets/add_note_dialog.dart—AddNoteDialogwith text field, empty-note validation, andAddNoteDialogResultvalue objectfeature_orders/lib/src/presentation/orders_action_snack_bar.dart—showOrderActionSnackBar()helper for success/failure feedbackfeature_orders/lib/feature_orders.dart— expanded barrel exports for all new presentation types andOrdersControllerfeature_orders/test/widgets/orders_page_test.dart— 25 new widget tests coveringOrderDetailPanel(14),AddNoteDialog(3),OrdersPage(6), and_EmptyOrdersRepositorytest 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— newMobileOrdersPagewith search bar, horizontal status filter chips (All / Pending / Processing / Shipped / Delivered / Cancelled), order count display,OrderCardlist at 160px height, pull-to-refresh,_detailPageActiveguard to suppress behind-route SnackBarskell_mobile/lib/pages/mobile_order_detail_page.dart— newMobileOrderDetailPagewrapping sharedOrderDetailPanel; StatefulWidget with local controller listener for SnackBar feedback; confirmation dialog before status changes; haptic feedback (mediumImpact for status, lightImpact for note additions);SafeAreawrapperkell_mobile/lib/shell/mobile_shell.dart— Orders tab (case 3) switched from sharedOrdersPagetoMobileOrdersPage; removed unusedfeature_ordersdirect importkell_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— newMobileInventoryPagewith search bar, horizontal status filter chips (All / In Stock / Low Stock / Out of Stock / Draft), item count display, compact_MobileInventoryCardlist at 120px height showing name, SKU, status chip, and quantity-on-hand, pull-to-refresh,_detailPageActiveguard to suppress behind-route SnackBarskell_mobile/lib/pages/mobile_inventory_detail_page.dart— newMobileInventoryDetailPagewrapping sharedInventoryDetailPanel; StatefulWidget with local controller listener for SnackBar feedback; showsshowAdjustQuantityDialogon Adjust Quantity tap; haptic feedback (mediumImpact on result, lightImpact on successful adjust);SafeAreawrapperkell_mobile/lib/shell/mobile_shell.dart— Inventory tab (case 1) switched from sharedInventoryPagetoMobileInventoryPage; removed unusedfeature_inventorydirect importkell_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 unusedproductCardslocal variabledocs/development/build_execution_tracker.md— updated Stage 7A to merged, synced current statusdocs/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— newApiExceptionbase class withstatusCode,message,body; replaces placeholderCalculatorclassintegrations/lib/src/api_client.dart— newApiClientabstract class withinitialize(),dispose(),isReady,execute<T>()lifecycle contractintegrations/lib/src/retry_policy.dart— newRetryPolicyabstract class;NoRetryPolicy(never retries);ExponentialBackoffRetryPolicy(doubles delay per attempt, capped atmaxDelay, retries on 5xx and network errors)integrations/lib/src/rate_limiter.dart— newRateLimiterabstract class;NoRateLimiter(no-op);TokenBucketRateLimiter(maxRequests per window, queues excess requests)integrations/lib/src/integration_health_check.dart— newHealthCheckResultvalue object withhealthy/unhealthynamed constructors;IntegrationHealthCheckabstract contractintegrations/lib/src/webhook_handler.dart— newWebhookEvent,WebhookProcessingStatusenum,WebhookResultwithprocessed/ignored/failedconstructors;WebhookHandlerabstract contractintegrations/lib/src/channel_adapter.dart— newChannelProduct,ChannelOrder,ChannelOrderItem,ChannelInventoryCountneutral value objects;ChannelAdapterabstract contract with products/orders/inventory operationsintegrations/lib/integrations.dart— replacedCalculatorplaceholder with barrel exports for all 7 new contract filesintegrations/test/integrations_test.dart— replaced placeholder test with 38 tests covering all contracts and value objectsfeature_wordpress/lib/src/data/woo_commerce_api_client.dart—WooCommerceApiClientnow implementsApiClient; addedinitialize(),isReady,execute<T>();dispose()also resets_readyfeature_wordpress/lib/src/data/woo_commerce_api_client.dart—WooCommerceApiExceptionnow extendsApiExceptioninstead of implementingExceptiondirectlyfeature_wordpress/pubspec.yaml— addedintegrations: path: ../integrationsdependencykell_creations_apps/tools/run_all_tests.sh— addedpackages/integrationsto bothTESTABLEandANALYZABLElists
- 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— newLocalCache<T>abstract contract;InMemoryCache<T>implementation with TTL-based expiry, key enumeration, and disposedata/lib/src/sync_queue.dart— newSyncOperationStatusenum,SyncOperationvalue object withcopyWith();SyncFlushResultwithsuccess/failureconstructors;SyncQueueabstract contract;InMemorySyncQueueimplementation with enqueue, process (success/failure tracking), remove, pruneCompleted, and lengthdata/lib/src/conflict_resolver.dart— newConflictResolutionenum,ConflictResult<T>withuseLocal/useRemote/merged/requiresReviewconstructors;ConflictResolver<T>abstract contract;LastWriteWinsResolver<T>,LocalAlwaysWinsResolver<T>,RemoteAlwaysWinsResolver<T>concrete implementationsdata/lib/src/change_tracker.dart— newChangeStateenum,TrackedChange<T>value object withcopyWith();ChangeTracker<T>abstract contract;InMemoryChangeTracker<T>implementation with trackCreated/trackModified/trackDeleted/markSynced/markSyncError/pendingChanges/hasPendingChanges/cleardata/lib/src/data_mapper.dart— newDataMapper<TLocal, TRemote>abstract contract withfromRemote/toRemote/fromRemoteList/toRemoteList;DataMappingExceptionwith field, message, rawValuedata/lib/data.dart— replacedCalculatorplaceholder with barrel exports for all 5 new contract filesdata/test/data_test.dart— replaced placeholder test with 63 tests covering all contracts and implementationskell_creations_apps/tools/run_all_tests.sh— addedpackages/datato bothTESTABLEandANALYZABLElists
- 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—KcUservalue object withid,displayName,email,role;KcUserRoleenum (admin,operator,viewer)auth/lib/src/domain/auth_state.dart—AuthStatesealed class hierarchy:AuthStateUnauthenticated,AuthStateAuthenticated,AuthStateLoading,AuthStateErrorauth/lib/src/domain/auth_exception.dart—AuthExceptionwithcodeandmessage; named constructorsinvalidCredentials,sessionExpired,networkError,unknownauth/lib/src/domain/auth_service.dart—AuthServiceabstract contract withlogin(),logout(),currentUser,authStateStream,isAuthenticatedauth/lib/src/domain/credential_store.dart—CredentialKeysconstants;CredentialStoreabstract contract withsave(),load(),delete(),clear()auth/lib/src/data/in_memory_credential_store.dart—InMemoryCredentialStoreimplementationauth/lib/src/data/fake_auth_service.dart—FakeAuthServicewith configurable users, delay simulation, and stream broadcastingauth/lib/auth.dart— barrel exports for all auth typesauth/test/auth_test.dart— 42 tests covering all domain models, contracts, and implementationscore/lib/src/app/kc_app_environment.dart— addedKcAppEnvironment.squarevaluekell_creations_apps/tools/run_all_tests.sh— addedpackages/authtoTESTABLEandANALYZABLElists
- 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— addedonHold,refunded,failedvaluesfeature_orders/lib/src/domain/order_item.dart— addedproductId,variationId,customizationsfieldsfeature_orders/lib/src/domain/order.dart— addedpaymentMethod,source,customFieldsfieldsfeature_orders/lib/src/domain/orders_repository.dart— addedgetOrder(id)to contractfeature_orders/lib/src/domain/order_source.dart— newOrderSourceenum (online,market,manual)feature_orders/lib/src/data/fake_orders_repository.dart— implementedgetOrder(id)with null-safe lookupfeature_orders/lib/src/data/woo_commerce_order_mapper.dart— newWooCommerceOrderMappermapping WooCommerce JSON ↔Orderdomain modelfeature_orders/lib/src/data/woo_commerce_orders_repository.dart— newWooCommerceOrdersRepositoryimplementing fullOrdersRepositorycontract viaWooCommerceApiClientfeature_orders/lib/feature_orders.dart— expanded barrel exports for all new typesfeature_orders/pubspec.yaml— addedfeature_wordpressdependency; addedhttpdev dependencyfeature_wordpress/lib/src/data/woo_commerce_api_client.dart— addedgetOrders(),getOrder(id),updateOrderStatus(),createOrder(),addOrderNote()methodsfeature_wordpress/lib/feature_wordpress.dart— exportedWooCommerceApiClientandWooCommerceApiExceptionfeature_orders/test/woo_commerce_order_mapper_test.dart— 25 mapper tests covering full JSON → domain mapping, status mapping, item mapping, customizations, edge casesfeature_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 mapsPublishStatus.pendingReview→'pending'instead of throwingArgumentError; onlyunpublishedthrowsfeature_wordpress/lib/src/presentation/product_publishing_page.dart— added_confirmBulkPublish()and_confirmBulkSubmitForReview()confirmation dialogs; updated_MultiSelectBarwithonBulkPublishandonBulkSubmitForReviewcallbacks; added "Publish" and "Submit for Review"OutlinedButton.iconbuttons; refactored bar layout fromRowtoWrapfor responsive overflowfeature_wordpress/test/wordpress_product_mapper_test.dart— updatedpendingReviewtest: now expects'pending'return value instead ofArgumentErrorfeature_wordpress/test/product_publishing_controller_test.dart— added 3 new bulk tests: publishes all selected products, submits all for review, handles mixed statuses to publishedfeature_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 dialogfeature_wordpress/test/wordpress_product_publishing_repository_test.dart— removedpendingReviewfrom unsupported-throws test; onlyunpublishedasserted
- 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— newInventorySyncStatusenum (notSynced,synced,pending,conflict,error)feature_inventory/lib/src/domain/inventory_item.dart— addedwooCommerceProductId(nullable int),syncStatus,lastSyncedAtfields; updatedcopyWith()to preserve/update all threefeature_inventory/lib/src/domain/inventory_repository.dart— addedgetItemBySku(sku)andsyncWithRemote(id, remoteQuantity, reason)to contractfeature_inventory/lib/src/data/fake_inventory_repository.dart— updated seed data withwooCommerceProductId,syncStatus,lastSyncedAt; implementedgetItemBySku()andsyncWithRemote()with status auto-derivation andlastSyncedAtstampingfeature_inventory/lib/src/application/inventory_sync_service.dart— newInventorySyncServiceorchestrating pull-only or bidirectional sync;syncAll(),syncItem(id),checkDifference(id);InventorySyncResultvalue object;StockDifferencevalue objectfeature_inventory/lib/src/data/woo_commerce_inventory_repository.dart— newWooCommerceInventoryRepositoryimplementing fullInventoryRepositorycontract;adjustQuantity()andsetQuantity()push to WooCommerce viaupdateProductStock();syncWithRemote()pulls remote quantity and stampslastSyncedAt; local-only items (nowooCommerceProductId) skip WooCommerce callsfeature_inventory/lib/feature_inventory.dart— expanded barrel exports forInventorySyncService,WooCommerceInventoryRepository,InventorySyncStatusfeature_inventory/pubspec.yaml— addedfeature_wordpress: path: ../feature_wordpressdependency; addedhttp: ^1.4.0dev dependencyfeature_wordpress/lib/src/data/woo_commerce_api_client.dart— addedgetProductStock(productId),updateProductStock(productId, quantity),batchUpdateStock(updates)methodsfeature_inventory/test/woo_commerce_inventory_sync_test.dart— 57 new tests coveringInventorySyncStatus,InventoryItemsync fields,FakeInventoryRepository(getItemBySku,syncWithRemote),WooCommerceApiClientstock methods,WooCommerceInventoryRepository,InventorySyncService,StockDifference,InventorySyncResultkell_web/test/dashboard/application/dashboard_controller_test.dart— updated_StubInventoryRepositoryand_FailingInventoryRepositorystubs to implement expandedInventoryRepositorycontract (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— newProductCategoryvalue object withid,name,slug,parentId,count;copyWith(),==/hashCode,toString()feature_wordpress/lib/src/domain/product_image.dart— newProductImagevalue object withid,url,alt,position;copyWith(),==/hashCodefeature_wordpress/lib/src/domain/product_publishing_repository.dart— addedcreateProduct(),deleteProduct(),updateProductImages(),getProductImages(),getCategories(),createCategory(),updateCategory(),deleteCategory()to contractfeature_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()anddeleteCategory()throwStateErrorfor unknown idsfeature_wordpress/lib/src/data/woo_commerce_api_client.dart— addedcreateProduct(),deleteProduct(),getCategories(),createCategory(),updateCategory(),deleteCategory(),getProductImages(),setProductImages()methods;getCategories()paginates withper_page=100feature_wordpress/lib/src/data/wordpress_product_publishing_repository.dart— implemented all 8 new repository methods delegating toWooCommerceApiClient; maps JSON ↔ domain modelsfeature_wordpress/lib/src/application/create_product.dart— newCreateProductuse casefeature_wordpress/lib/src/application/delete_product.dart— newDeleteProductuse casefeature_wordpress/lib/src/application/get_categories.dart— newGetCategoriesuse casefeature_wordpress/lib/src/application/create_category.dart— newCreateCategoryuse casefeature_wordpress/lib/src/application/update_product_images.dart— newUpdateProductImagesuse casefeature_wordpress/lib/feature_wordpress.dart— exported all new domain models and use casesfeature_wordpress/test/wc_catalog_expansion_test.dart— 69 new tests coveringProductCategory,ProductImage,FakeProductPublishingRepository(all new methods),WooCommerceApiClient(all new methods),WordPressProductPublishingRepository(all new methods), and all 5 use caseskell_web/test/dashboard/application/dashboard_controller_test.dart— updated_StubProductPublishingRepositoryto implement expandedProductPublishingRepositorycontractkell_creations_apps/packages/feature_wordpress/test/widgets/product_publishing_page_test.dart— updated_FakeProductPublishingRepositorystub 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— newCreateProductDialogStatefulWidget with name (required), price (required), SKU, category dropdown, description, and initial-statusSegmentedButton(Draft / Review); inline validation errors;CreateProductDialogResultvalue object;showCreateProductDialog()helperfeature_wordpress/lib/src/presentation/category_management_page.dart— newCategoryManagementPagewith category list, add-category FAB, inline rename, delete with confirmation dialog, empty state, loading/error states;CategoryManagementPage.route()static helperfeature_wordpress/lib/src/application/product_publishing_controller.dart— addedCreateProductResultsealed class (CreateProductSuccess,CreateProductFailure); addedlastCreateProductResult,consumeCreateProductResult(),createNewProduct()(callsCreateProductuse case, auto-selects new product, reloads); addedfetchCategories()(callsGetCategoriesuse case);CreateProductandGetCategoriesuse cases are optional named constructor params for backward compatibilityfeature_wordpress/lib/src/presentation/product_publishing_page.dart— added "New Product"FilledButton.iconin toolbar; wiredshowCreateProductDialog()→controller.createNewProduct(); addedshowCreateProductSnackBar()result listener; added "Manage Categories"TextButtonin toolbar linking toCategoryManagementPagefeature_wordpress/lib/feature_wordpress.dart— exportedCreateProductDialog,CreateProductDialogResult,showCreateProductDialog,CategoryManagementPage,CreateProductResult,CreateProductSuccess,CreateProductFailurekell_mobile/lib/pages/mobile_create_product_page.dart— newMobileCreateProductPagefull-screen form (name, price, SKU, category dropdown, description, initial status) withAppBarand "Create Product" action button; mirrors dialog fields in a scrollable page layoutkell_mobile/lib/pages/mobile_publishing_page.dart— added "New Product"FloatingActionButtonnavigating toMobileCreateProductPage; wired result back tocontroller.createNewProduct(); addedshowCreateProductSnackBar()result listenerfeature_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 renderfeature_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 countfeature_wordpress/test/product_publishing_controller_test.dart— added 7 new controller tests:createNewProductsuccess/auto-select/failure/consume/null-use-case,fetchCategoriessuccess/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— newSquareApiClientimplementingApiClientcontract;sandbox()andproduction()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 requestsintegrations/lib/src/square_api_exception.dart— newSquareApiExceptionextendingApiExceptionwithstatusCode,message,body;toString()includes all fieldsintegrations/lib/integrations.dart— expanded barrel exports forSquareApiClientandSquareApiExceptionintegrations/test/square_api_client_test.dart— 50 new tests coveringSquareApiException(5),SquareApiClientconstruction (2),ApiClientcontract (5), Catalog API (12), Inventory API (7), Orders API (9), Payments API (8), auth headers (2)integrations/pubspec.yaml— removed duplicatehttpdev dependency (was also in normal dependencies)core/lib/src/composition/kc_app_environment.dart— addedmultivalue toKcAppEnvironmentenum (joining existingfake,wp,square)core/lib/src/composition/kc_app_config.dart— addedKC_SQUARE_ACCESS_TOKEN,KC_SQUARE_LOCATION_ID,KC_SQUARE_ENVIRONMENTdart-define key constantscore/test/core_test.dart— added 3 new tests:KcAppEnvironment.multiexists,KC_SQUARE_ACCESS_TOKENconstant,KC_SQUARE_LOCATION_IDconstant — 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— newSquareProductMapper;fromSquareCatalogObject()maps Square ITEM CatalogObject JSON →ChannelProduct(cents→dollars,is_deleted→archivedstatus, first-variation SKU/price extraction);fromSquareCatalogList()batch variant skipping non-ITEM entries;toSquareCatalogObject()mapsChannelProduct→ Square ITEM JSON (dollars→cents rounding, default variation withFIXED_PRICING,location_overrideswithtrack_inventory, optional description/SKU omitted when null)integrations/lib/src/square_inventory_mapper.dart— newSquareInventoryMapper;fromSquareInventoryCount()maps Square InventoryCount JSON →ChannelInventoryCount(IN_STOCK only, string quantity parsed safely);fromSquareInventoryCountList()batch variant;toSquareBatchChangeEntry()mapsChannelInventoryCount→ Square PHYSICAL_COUNT batch-change entry (quantity as string, RFC 3339 timestamp);toSquareBatchChangeEntries()batch variantintegrations/lib/integrations.dart— addedsquare_inventory_mapper.dartandsquare_product_mapper.dartto barrel exportsintegrations/test/square_catalog_sync_test.dart— 35 new tests:SquareProductMapper(20: fromSquareCatalogObject ×9, fromSquareCatalogList ×3, toSquareCatalogObject ×6) andSquareInventoryMapper(15: fromSquareInventoryCount ×8, fromSquareInventoryCountList ×3, toSquareBatchChangeEntry ×3, toSquareBatchChangeEntries ×2)feature_wordpress/lib/src/domain/product_id_mapping.dart— newProductIdMappingvalue object withlocalId,wooCommerceId,squareCatalogObjectId,squareVariationId,lastUpdated;copyWith(),==/hashCode,toString()feature_wordpress/lib/src/domain/product_id_mapping_repository.dart— newProductIdMappingRepositoryabstract contract:getAllMappings(),getMappingByLocalId(),getMappingByWooCommerceId(),getMappingBySquareId(),saveMapping()(upsert),deleteMapping()(no-op safe)feature_wordpress/lib/src/data/fake_product_id_mapping_repository.dart— newFakeProductIdMappingRepositoryin-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()returnsList.unmodifiablefeature_wordpress/lib/feature_wordpress.dart— addedfake_product_id_mapping_repository.dart,product_id_mapping.dart,product_id_mapping_repository.dartto barrel exportsfeature_wordpress/test/product_id_mapping_test.dart— 23 new tests:ProductIdMapping(7: fields, null defaults, copyWith, equality, hashCode, toString) andFakeProductIdMappingRepository(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— newSquareCatalogSyncServiceapplication-layer service;SyncErrorvalue object withitemId,message,==/hashCode/toString();SquareSyncResultvalue object withcatalogSynced,inventorySynced,catalogFailed,inventoryFailed,errors,totalProcessed,allSucceeded,merge();InventorySyncAdapterabstract contract withsyncItem(itemId, remoteQuantity);syncCatalog()fetches all products viaProductPublishingRepository.getProductDrafts(), looks up or createsProductIdMappingper product viaProductIdMappingRepository, captures per-item failures without aborting;syncInventory()iterates all mappings with asquareVariationId, callsInventorySyncAdapter.syncItem()for each, captures per-item failures;syncAll()runssyncCatalog()thensyncInventory()and merges results; no-op when no adapter providedfeature_wordpress/lib/feature_wordpress.dart— addedsquare_catalog_sync_service.dartto 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-infosclean across all 11 packages/apps- CRITICAL:
AppServices/MobileAppServiceshave nosquare()ormulti()factory —KC_ENV=squaresilently falls to fake mode - HIGH:
SquareCatalogSyncServiceID conflation bug;RetryPolicy/RateLimiternot wired;authpackage 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— newSquareCatalogRepositoryimplementingProductPublishingRepository; backed bySquareApiClient;getProductDrafts()callslistCatalogItems()and maps viaSquareProductMapper, populating an in-memory cache;publishDraft()returns cached draft withpublishedstatus (no-op — Square items are always live);updateProductStatus(),updateProductPrice(),updateProductName(),updateProductDescription(),updateProductCategory()each mutate the cachedProductDraft, callupsertCatalogItem()with the updated Square JSON, and return the refreshed draft;createProduct()callsupsertCatalogItem()with a#NEW_idempotency key, maps the response, and adds to cache;deleteProduct()callsdeleteCatalogItem()and removes from cache;updateProductImages(),getCategories(),createCategory(),updateCategory(),deleteCategory(),getProductImages()throwUnsupportedError(Square manages these separately)feature_wordpress/lib/feature_wordpress.dart— addedsquare_catalog_repository.dartto barrel exportsfeature_inventory/lib/src/domain/inventory_item.dart— addedsquareVariationId(nullable String) field; updatedcopyWith()to preserve/update itfeature_inventory/lib/src/data/square_inventory_repository.dart— newSquareInventoryRepositoryimplementingInventoryRepository; backed bySquareApiClient+initialItemsseed list;getInventoryItems()returnsList.unmodifiable;getItemBySku()linear scan;adjustQuantity()validates non-negative result, pushesbatchChangeInventory()whensquareVariationIdis set (stampssynced/lastSyncedAt), otherwise marksnotSynced;setQuantity()validates non-negative, same Square push pattern;syncWithRemote()validates non-negative, callsgetInventoryCount()whensquareVariationIdis set and uses live count (falls back toremoteQuantityon empty response), stampssynced/lastSyncedAt;createItem()appends to local store;updateItem()replaces by id and stampslastUpdated;updateItemImage()updatesimageUrlby id; all write failures returnInventoryAdjustmentResult.failure()with descriptive messages; status auto-derived from quantity vsreorderPointfeature_inventory/lib/feature_inventory.dart— addedsquare_inventory_repository.dartto barrel exportsfeature_inventory/pubspec.yaml— addedintegrations: path: ../integrationsdependencyfeature_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— newSquareSyncStatusPanelStatefulWidget; listens toSquareSyncController; shows status chip (Never synced/OK/Partial/Error), last-synced timestamp,Syncing…progress indicator during sync,Sync NowFilledButton(disabled while syncing), and last-sync-result section with Catalog/Inventory row counts whenlastResultis non-nullfeature_wordpress/lib/feature_wordpress.dart— addedsquare_sync_status_panel.dartto barrel exports (Presentation section)kell_creations_apps/apps/kell_web/lib/pages/integrations_page.dart— newIntegrationsPage; showsSquareSyncStatusPanelwhensquareSyncControlleris non-null; shows placeholder card with hub icon and "No integrations configured" message otherwise; "Square" section label when controller is presentkell_creations_apps/apps/kell_mobile/lib/pages/mobile_integrations_page.dart— newMobileIntegrationsPage; mirrorsIntegrationsPagelayout for mobile;SafeAreawrapperkell_creations_apps/apps/kell_web/lib/routing/app_routes.dart— addedAppRoute.integrationscase routing toIntegrationsPage(squareSyncController: services.squareSyncController)kell_creations_apps/apps/kell_mobile/lib/shell/mobile_shell.dart— More tab (case 4) switched fromIntegrationsPlaceholderPagetoMobileIntegrationsPage(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; usestester.pump(Duration)to advance fake time throughFuture.delayedtimerskell_creations_apps/apps/kell_web/test/pages/integrations_page_test.dart— 4 new widget tests: placeholder when controller null, showsSquareSyncStatusPanelwhen controller provided, shows Square section label, placeholder shows hub iconkell_creations_apps/apps/kell_mobile/test/pages/mobile_integrations_page_test.dart— 4 new widget tests: mirroring kell_web integrations page tests for mobilekell_creations_apps/apps/kell_web/test/composition/app_services_test.dart— expanded to 28 tests (addedsquareSyncControllernon-null assertion forsquare()factory,multi()factory tests, fullKcBootstrapcredential 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— newSquareSyncControllerChangeNotifier;SyncPhaseenum (idle,syncing,done,error);syncAll()delegates toSquareCatalogSyncService, setsphase/lastResult/lastError, guards against concurrent calls;reset()returns to idle;isLoadinggetter; disposal guard prevents post-dispose notificationsfeature_wordpress/lib/feature_wordpress.dart— addedsquare_sync_controller.dartto barrel exports (Application section)kell_creations_apps/apps/kell_web/lib/composition/app_services.dart— addedsquare()factory (P1.1):SquareCatalogRepositoryasproductPublishingRepository,SquareInventoryRepositoryasinventoryRepository,SquareSyncControllerwired toSquareCatalogSyncService; addedmulti()factory:SquareInventoryRepository+WordPressProductPublishingRepository; updatedKcBootstrapto validate Square credentials (P1.5) and fall back to fake with warning; addedsquareSyncControllerfield toAppServiceskell_creations_apps/apps/kell_mobile/lib/composition/mobile_app_services.dart— mirroredsquare()andmulti()factories; addedsquareSyncControllerfield; sameKcBootstrapSquare credential validationfeature_wordpress/lib/src/domain/product_draft.dart— addedsquareCatalogObjectId(nullable String) field toProductDraft; updatedcopyWith()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 readsdraft.squareCatalogObjectIdto look up existing mapping instead of usingdraft.id; mapping lookup usesgetMappingBySquareId()when Square ID is present, falls back togetMappingByLocalId()for unsynced items; prevents duplicate mapping creation for already-synced productsfeature_wordpress/test/square_sync_controller_test.dart— 18 new tests:SyncPhaseenum (1),SquareSyncControllerconstruction (2),syncAllsuccess (3),syncAllerror (2), concurrent guard (2),reset()(2),isLoading(2), disposal guard (2),lastResult/lastErrorlifecycle (2)kell_creations_apps/apps/kell_web/test/composition/app_services_test.dart— addedsquare()factory tests (3: creates instance,SquareCatalogRepository,SquareInventoryRepository),multi()factory tests (2),KcBootstrapSquare credential validation tests (3: selects square with credentials, selects multi with all credentials, falls back to fake without credentials) — 23 total kell_web composition testskell_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