Commit Graph

47 Commits

Author SHA1 Message Date
Mike Kell a2354ccd36 chore: update tracker - feat/custom-order-domain merged to main (Stage 11A complete) 2026-08-29 15:20:19 -04:00
Mike Kell 86c630d670 feat(stage-11a): custom order domain and data
Adds the custom/made-to-order commission workflow to feature_orders at the
domain and data layers. No UI in this slice — Stage 11B/11C cover the
CustomOrderFormPage, confirmation, and tracking surfaces.

Custom orders extend the existing Order aggregate rather than forming a
parallel system, so they flow through the same repository contract and the
same order management pipeline as standard orders.

Domain:

- OrderType enum (standard, custom) with wireValue/fromWire; fromWire defaults
  to standard so an order written by an older client is never mis-classified
  as a commission.
- CustomOrderSpec value object — material, color, size, dimensions,
  unmodifiable reference image URLs, free-text notes, estimated completion.
  Immutable with copyWith, list-aware ==/hashCode, and a toString that reports
  the reference image count rather than the URLs.
- DepositInfo value object — all money as integer cents, consistent with
  PaymentResult.amountCents, so repeated deposit/balance/settlement arithmetic
  cannot drift. Derived balanceDueCents clamps at zero rather than reporting a
  credit when a deposit exceeds the total.
- FulfillmentStatus pipeline: quoted -> depositReceived -> inProduction ->
  qualityCheck -> readyForPickup -> completed, plus cancelled from any
  non-terminal stage. FulfillmentTransition enforces legality in the domain —
  illegal jumps, same-stage advances, and any move out of a terminal stage are
  rejected with an explanatory reason rather than silently applied.
  qualityCheck -> inProduction is permitted: failed inspection sending a piece
  back to the bench is a real workshop operation.
- Order extended with orderType (defaults to standard), nullable
  customOrderSpec, depositInfo, and fulfillmentStatus, plus isCustom,
  hasDeposit, and balanceDueCents. Every existing field, default, and copyWith
  semantic is preserved.
- OrdersRepository extended with createCustomOrder, updateCustomOrderSpec,
  recordDeposit, and advanceFulfillmentStatus.

Data:

- FakeOrdersRepository implements all four methods and seeds five custom
  orders (KC-C2001..KC-C2005) covering every non-terminal pipeline stage. The
  six standard orders are unchanged.
- WooCommerceOrdersRepository implements all four methods. Custom order state
  round-trips through 13 _kc_-prefixed order meta keys; the full mapping table
  is documented on WooCommerceOrderMapper. Spec edits and stage advances PUT
  only meta, so they can never mutate a price, a line item, or a customer
  record. balanceDueCents is derived on read, never persisted, to avoid a
  second source of truth.
- WooCommerceApiClient.updateOrder added in feature_wordpress — only
  updateOrderStatus existed, which cannot carry meta.

Observability (Stage 16A layer):

- KcLogger injected into both repositories, defaulting to KcLogger.silent().
  Domain rejections log at warning; API failures log at error with the status
  code and originating exception.
- No silent catch (_) {} blocks — every swallowed error produces both a log
  record and a failure result.
- Log context is limited to identifiers, operation names, and status names.
  Customer identity, addresses, money amounts, and payment identifiers are
  never logged, and all context additionally passes through KcRedactor.
- The deposit transaction ID is deliberately absent from both DepositInfo and
  the WooCommerce meta mapping — it lives on PaymentResult alone, because
  order meta is readable by any store administrator. Asserted by tests on both
  the object and the outgoing request body.

Also closes P3.8: adds .metadata, CHANGELOG.md, LICENSE, and README.md to
feature_orders so it matches every other package (.gitignore already existed).
The README documents the pipeline, the meta mapping, and the privacy rules.

Deviations from the brief, recorded in the Stage 11A section:

- estimatedCompletionDate lives on CustomOrderSpec rather than Order, and
  there is no separate updateEstimatedCompletion — a date revision goes
  through updateCustomOrderSpec. Deferred for review in Stage 11C.
- internalNotes not added; Order.notes already serves that purpose.

Validation:

- 423 new tests in feature_orders (234 -> 657), including an exhaustive 7x7
  legal/illegal transition matrix and coverage of every new repository method
  on both implementations.
- 1,898/1,898 passing across all packages; no regression from the 1,475
  baseline at 666abd2.
- dart analyze --fatal-infos clean across all 11 packages and apps.
- dart format --line-length 100 clean on every file touched by this slice.

Closes: P2.2 (domain + data portion), P3.8
2026-08-29 15:19:29 -04:00
Mike Kell 666abd2c26 chore: update tracker - feat/observability-error-logging merged to main (Stage 16A complete)
Publish Docs / publish-docs (push) Successful in 1m6s Details
2026-08-29 10:49:01 -04:00
Mike Kell 63a35eceeb feat(stage-16a): error logging, crash capture, and bug reporting
Closes the two findings the release committee review identified as absolute
gaps: the platform had no structured logging and no crash reporting, so runtime
errors were invisible in every environment and operators had no way to report a
defect with evidence attached.

Addresses PROJECT_STATE_AUDIT.md findings P3.4 (structured logging infrastructure)
and P3.5 (crash reporting integration), plus the "No logging infrastructure" and
"No crash reporting" architectural risks in section 3.4.

core — new observability layer (packages/core/lib/src/observability/):
- KcLogLevel: five ordered severities (debug/info/warning/error/fatal) with
  numeric severity, label, isAtLeast() threshold comparison, and fromString().
- KcLogRecord: immutable structured record (level, source, message, timestamp,
  unmodifiable context, error, stackTrace) with format(), toJson(), isFailure.
- KcRedactor: credential redaction over 14 sensitive key fragments, recursing
  through nested maps and lists. Applied to every logged context map and every
  bug report diagnostics map.
- KcLogSink contract plus three implementations: KcConsoleLogSink (silent in
  release by default), KcInMemoryLogSink (bounded ring buffer supplying bug
  report evidence), KcMultiLogSink (fan-out that tolerates a failing sink).
- KcLogger: the logging facade. Drops sub-threshold records, redacts context,
  and swallows sink exceptions so observability can never break a business
  operation. Provides forSource() for subsystem-scoped child loggers.
- KcErrorReporter: installs FlutterError.onError and
  PlatformDispatcher.instance.onError, and provides runGuarded() to wrap runApp.
  restore() resets global state so tests stay isolated.
- KcBugSeverity and KcBugReport: the report model with redacted diagnostics,
  hasFailureEvidence, toJson() for transmission, and toMarkdown() for export.
- KcBugReportSink contract plus KcInMemoryBugReportSink.
- KcBugReportService: validates input, attaches the recent log tail as evidence,
  logs the submission outcome, and returns a failure result rather than throwing
  when the tracker is unreachable.
- KcObservability: assembles logger, evidence buffer, and bug report service
  together. Building them independently is the most likely way to produce empty
  bug reports, so this bundle guarantees they share one buffer.

design_system:
- KcBugReportDialog and KcBugReportDraft: the shared operator reporting form
  with inline validation, severity selection, optional reporter identity, and an
  explicit statement that logs are attached and credentials are never included.
  Kept free of a core dependency so design_system stays dependency-free.

Application wiring (kell_web and kell_mobile):
- AppServices and MobileAppServices hold a KcObservability; all four factories
  (fake/wordpress/square/multi) stamp their environment label so reports are
  attributable to the mode that produced them.
- Both main.dart entry points install the global error handlers before the first
  frame and wrap runApp in a guarded zone, then emit a startup record capturing
  the effective environment and whether a fake-mode credential fallback occurred.
- "Report a problem" action added to the AppShell and MobileShell app bars,
  capturing the active screen (and tab index on mobile).

Documentation:
- docs/operations/release-checklist.md (new): per-environment release gates for
  Development, Test/QA, Staging, and Production. Each environment inherits the
  prior one's gates and adds its own, with build commands, functional and
  observability verification, a sign-off record, rollback triggers, and the open
  blocker register.
- master_development_brief.md: Stage 16A manifest, corrected baseline, Stage 16C
  defined for the deferred scope (retry/rate limiting, remote sink, health
  dashboard, analytics). Marked the square()/multi() factory and ID conflation
  debt items resolved (fixed in Stage 10E but still listed as open).
- build_execution_tracker.md: Stage 16A slice entry.
- PRD.md: milestone table brought current; observability added to infrastructure
  requirements. Added a scoped markdownlint-disable for MD011 because the PRD's
  "(text)[cite: n]" citation markers are indistinguishable from reversed links
  and were silently corrupted by markdownlint --fix during this review.
- mkdocs.yml and operations/index.md: register the release checklist.

Corrections made during review:
- The documented test total of 1,458 omitted feature_policy's 17 tests. The true
  grand total is 1,475; both figures are now documented with the reason.

Validation:
- 85 new tests: 56 core, 10 design_system, 10 kell_web, 9 kell_mobile.
- 1,475/1,475 passing across all 11 packages and apps.
- dart analyze --fatal-infos clean across all 11 packages and apps.
- markdownlint clean on all five modified/created documents.

Known limitations (tracked as Stage 16C):
- Logs and bug reports are held in-process only. There is no remote sink, so
  diagnostics are lost on restart and are unavailable off-device.
- Usage analytics and the per-channel integration health dashboard are not
  implemented; IntegrationHealthCheck remains a contract with no implementation.
2026-08-29 10:48:18 -04:00
Mike Kell 47b13b1ed1 feat(stage-10c): Square Mobile POS / Checkout
- Add PaymentMethod enum (cash, card) with label/iconHint extensions
- Add PaymentResult value object (transactionId, amountCents, method, completedAt, receiptUrl, amountFormatted)
- Add PaymentService abstract contract + PaymentException
- Add CheckoutController (ChangeNotifier) with CartEntry and sealed CheckoutState hierarchy
- Add FakePaymentService (always succeeds, counter-based IDs)
- Update feature_orders barrel exports
- Add MobileCheckoutPage (product selection -> cart -> payment -> receipt flow)
- Add Sales tab (index 4) to MobileShell; 6 tabs total
- Wire paymentService + checkoutCatalogue into all MobileAppServices factories
- Add 36 new feature_orders tests (234 total)
- Add 18 new kell_mobile tests (72 total); 1373 total across all packages
- Update widget_test.dart: destination count 5 -> 6
- Update build_execution_tracker.md and master_development_brief.md

All tests passing. dart analyze clean.
2026-07-25 17:37:36 -04:00
Mike Kell 94c62931fd chore: update tracker — feat/square-sync-ui merged to main (Stage 10F complete)
Publish Docs / publish-docs (push) Successful in 40s Details
2026-07-25 16:59:05 -04:00
Mike Kell 116255f8ac feat(stage-10F): SquareSyncStatusPanel + IntegrationsPage + MobileIntegrationsPage + squareSyncController wired into both shells 2026-07-25 16:55:46 -04:00
Mike Kell ab56c942c7 feat(stage-10E): SquareSyncController + square()/multi() factories + KcBootstrap Square validation + ID conflation fix
Stage 10E - feat/square-catalog-sync-service-controller

P1.1 AppServices.square() / multi() factories (kell_web + kell_mobile)
P1.2 SquareCatalogSyncService ID conflation fix (squareCatalogObjectId lookup)
P1.4 SquareSyncController ChangeNotifier (SyncPhase, syncAll, reset, disposal guard)
P1.5 KcBootstrap Square credential validation with fallback warning

New files:
  feature_wordpress/lib/src/application/square_sync_controller.dart
  feature_wordpress/test/square_sync_controller_test.dart (18 tests)

Modified files:
  feature_wordpress/lib/src/domain/product_draft.dart (squareCatalogObjectId field)
  feature_wordpress/lib/src/application/square_catalog_sync_service.dart (ID conflation fix)
  feature_wordpress/lib/feature_wordpress.dart (barrel export)
  kell_web/lib/composition/app_services.dart (square/multi factories)
  kell_mobile/lib/composition/mobile_app_services.dart (square/multi factories)
  kell_web/test/composition/app_services_test.dart (+23 tests)
  kell_mobile/test/composition/mobile_app_services_test.dart (+23 tests)
  docs/development/build_execution_tracker.md

Test results: 537/537 feature_wordpress, 47/47 kell_web, 49/49 kell_mobile,
              34/34 core, 167/167 feature_inventory - 834 total, 0 failures
dart analyze --fatal-infos: no issues found across all 5 packages
2026-07-25 16:26:53 -04:00
Mike Kell 4280a77017 chore: audit-state-sync — incorporate PROJECT_STATE_AUDIT.md findings into tracking docs 2026-07-25 15:56:44 -04:00
Mike Kell eb8e2250d6 feat(stage-10d): SquareCatalogSyncService + SquareSyncResult + SyncError + InventorySyncAdapter 2026-07-25 15:17:22 -04:00
Mike Kell 7ccc119a62 feat(stage-10c): SquareCatalogRepository + SquareInventoryRepository 2026-07-25 15:04:26 -04:00
Mike Kell 2a0bf6fa90 docs: finalize Stage 10B docs — tracker merged status, brief updated with validation state and next branch 2026-07-25 11:02:34 -04:00
Mike Kell bb54dfcf59 docs: update build_execution_tracker for Stage 10B (feat/square-catalog-sync) 2026-07-25 08:00:29 -04:00
Mike Kell 4b1168dbfa chore: update tracker — feat/square-api-client merged to main
Publish Docs / publish-docs (push) Successful in 40s Details
2026-07-19 19:48:44 -04:00
Mike Kell 9b2dd15ee2 feat(integrations): Stage 10A — Square API client and authentication
Validate Docs / validate-docs (push) Successful in 1m14s Details
Flutter Analyze / Dart Analyze (push) Has been cancelled Details
Flutter Test / Flutter Tests (push) Has been cancelled Details
2026-07-19 19:26:00 -04:00
Mike Kell a127ddba3a feat(stage-9d): product creation UI, category management page, mobile create-product page 2026-07-11 10:50:32 -04:00
Mike Kell 0a45ecb1c0 feat(wc-catalog-expansion): Stage 9C — WooCommerce catalog expansion
- Add ProductCategory domain model (id, name, slug, parentId, count) with copyWith, equality, toString
- Add ProductImage domain model (id, url, alt, position) with copyWith, equality
- Extend ProductPublishingRepository contract: createProduct, deleteProduct, updateProductImages, getProductImages, getCategories, createCategory, updateCategory, deleteCategory
- Implement all 8 new methods in FakeProductPublishingRepository with seed categories
- Implement all 8 new methods in WordPressProductPublishingRepository
- Add WooCommerceApiClient methods: createProduct, deleteProduct, getCategories (paginated), createCategory, updateCategory, deleteCategory, getProductImages, setProductImages
- Add use cases: CreateProduct, DeleteProduct, GetCategories, CreateCategory, UpdateProductImages
- Update feature_wordpress.dart barrel exports
- Update test stubs in dashboard_controller_test.dart and product_publishing_page_test.dart
- Add 69 new tests in wc_catalog_expansion_test.dart (388 total feature_wordpress, 24 kell_web — all passing)
- Update master_development_brief.md and build_execution_tracker.md
2026-07-11 10:23:31 -04:00
Mike Kell 5df3d8beac feat(inventory): Stage 9B — WooCommerce stock/inventory sync 2026-07-11 10:00:55 -04:00
Mike Kell e92788038a feat(orders): Stage 9A - WooCommerce Orders API integration
- Extend OrderStatus with onHold, refunded, failed
- Extend OrderItem with productId, variationId, customizations
- Extend Order with paymentMethod, source, customFields
- Add OrderSource enum (online, market, manual)
- Add getOrder(id) to OrdersRepository contract and FakeOrdersRepository
- Add WooCommerceOrderMapper (WooCommerce JSON <-> Order domain)
- Add WooCommerceOrdersRepository implementing full OrdersRepository
- Add orders API methods to WooCommerceApiClient (getOrders, getOrder,
  updateOrderStatus, createOrder, addOrderNote)
- Export WooCommerceApiClient/WooCommerceApiException from feature_wordpress
- Add feature_wordpress + http dev deps to feature_orders pubspec
- 83 new tests: mapper (25), repository+API client (23), FakeRepo.getOrder (3),
  plus existing suite grows to 198/198 feature_orders
- All packages analyze clean; 847/847 total tests passing
- Update master_development_brief.md and build_execution_tracker.md
2026-07-11 09:45:36 -04:00
Mike Kell 4a935e4989 feat(data): Stage 8B — shared data layer contracts activated 2026-07-11 08:31:46 -04:00
Mike Kell ec66626074 feat(integrations): Stage 8A - integration abstractions contracts
- Add ApiException base class (statusCode, message, body)
- Add ApiClient abstract class (initialize, dispose, isReady, execute<T>)
- Add RetryPolicy abstraction (NoRetryPolicy, ExponentialBackoffRetryPolicy)
- Add RateLimiter abstraction (NoRateLimiter, TokenBucketRateLimiter)
- Add IntegrationHealthCheck contract (HealthCheckResult value object)
- Add WebhookHandler contract (WebhookEvent, WebhookResult, WebhookProcessingStatus)
- Add ChannelAdapter contract (ChannelProduct, ChannelOrder, ChannelOrderItem, ChannelInventoryCount)
- Replace Calculator placeholder with barrel exports for all 7 contract files
- Refactor WooCommerceApiClient to implement ApiClient contract
- Refactor WooCommerceApiException to extend ApiException
- Add integrations dependency to feature_wordpress pubspec
- Add packages/integrations to TESTABLE and ANALYZABLE in run_all_tests.sh
- Add 38 tests for all contracts and value objects
- dart analyze clean (no issues in integrations and feature_wordpress)
- Tests: 38/38 integrations, 319/319 feature_wordpress
2026-07-11 08:21:03 -04:00
Mike Kell c67f92f844 Merge feat/bulk-operator-workflows into main (Stage 7B complete)
Publish Docs / publish-docs (push) Successful in 41s Details
2026-07-11 08:08:14 -04:00
Mike Kell 6898d9b877 chore: mark feat/bulk-operator-workflows as merged to main in tracker 2026-07-11 08:04:15 -04:00
Mike Kell 585dc14829 feat(mobile): Stage 6C — mobile inventory surface
- Add MobileInventoryPage with search bar, horizontal status filter chips
  (All / In Stock / Low Stock / Out of Stock / Draft), item count display,
  compact _MobileInventoryCard list at 120px height (name, SKU, status chip,
  quantity-on-hand), pull-to-refresh, and _detailPageActive guard to suppress
  behind-route SnackBars
- Add MobileInventoryDetailPage wrapping shared InventoryDetailPanel; local
  controller listener for SnackBar feedback; showAdjustQuantityDialog on
  Adjust Quantity tap; haptic feedback (mediumImpact on result, lightImpact
  on successful adjust); SafeArea wrapper
- Update MobileShell Inventory tab (case 1) from shared InventoryPage to
  MobileInventoryPage; remove unused feature_inventory direct import
- Add 6 Stage 6C widget tests: Inventory tab search bar, status filter chips,
  item count, card navigation to detail, adjust quantity dialog, back
  navigation returning to list (26/26 kell_mobile total)

All tests passing: 26/26 kell_mobile, 75/75 feature_inventory
dart analyze --fatal-infos: no issues found
Stage 6 complete — Products, Orders, and Inventory all have mobile surfaces
2026-07-10 20:13:27 -04:00
Mike Kell 6697bb02dd feat(mobile): Stage 6B — mobile orders surface
- Add MobileOrdersPage with search bar, horizontal status filter chips
  (All/Pending/Processing/Shipped/Delivered/Cancelled), order count
  display, OrderCard list at 160px height, pull-to-refresh, and
  \_detailPageActive guard to suppress behind-route SnackBars
- Add MobileOrderDetailPage wrapping shared OrderDetailPanel as a
  StatefulWidget with local controller listener for SnackBar feedback,
  confirmation dialog before status changes, haptic feedback
  (mediumImpact for status, lightImpact for note additions), and SafeArea
- Wire Orders tab (case 3) in MobileShell to MobileOrdersPage; remove
  unused feature_orders direct import from shell
- Add 6 new Stage 6B widget 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
- Update build_execution_tracker.md and master_development_brief.md

Tests: 20/20 kell_mobile, 115/115 feature_orders — all passing
Analyze: dart analyze --fatal-infos — no issues found
2026-07-10 20:03:22 -04:00
Mike Kell 3662f4fcc5 feat(orders): Stage 5D - orders page UI hardening
- OrdersPage with search bar, status filter chips, order count, master-detail wide layout, push-navigation narrow layout
- OrderCard widget with order ID, customer name, date, status chip, item count, total
- OrderDetailPanel with customer info, shipping address, line items, total, notes, status dropdown, Add Note button, isUpdating indicator
- OrderStatusChip mapping OrderStatus to label and color
- AddNoteDialog with text field, empty-note validation, AddNoteDialogResult value object
- showOrderActionSnackBar helper for success/failure feedback
- Cross-feature onViewProduct/onViewInventory callbacks per line item
- initialFilter, initialQuery, initialSelectedId constructor params on OrdersPage
- Expanded feature_orders barrel exports (OrdersController, all presentation types)
- 25 new widget tests (OrderDetailPanel x14, AddNoteDialog x3, OrdersPage x6)
- 115/115 feature_orders tests passing, 24/24 kell_web tests passing
- Updated build_execution_tracker.md and master_development_brief.md
2026-07-10 19:52:19 -04:00
Mike Kell b2bec44fcb feat/orders-domain: expand orders domain with write operations and 90 tests 2026-07-10 19:04:39 -04:00
Mike Kell f2b29d47a1 feat(inventory): Stage 5B — inventory page UI with search, filter chips, detail panel, quantity adjust dialog, and snack bar feedback 2026-07-10 18:51:09 -04:00
Mike Kell d36c2d1e73 feat(inventory): Stage 5A — inventory domain expansion with write actions 2026-07-10 18:33:02 -04:00
Mike Kell c4f76a90e5 feat: add bulk publish and bulk submit-for-review actions (Stage 7B)
Validate Docs / validate-docs (push) Successful in 59s Details
Flutter Analyze / Dart Analyze (push) Has been cancelled Details
Flutter Test / Flutter Tests (push) Has been cancelled Details
- Enable pendingReview in WordPressProductMapper.toWooCommerceStatus()
  (maps to WooCommerce 'pending'; only unpublished throws ArgumentError)
- Add Publish and Submit for Review buttons to _MultiSelectBar with
  confirmation dialogs and proper plural/singular messaging
- Refactor multi-select bar layout from Row to Wrap for responsive overflow
- Add 3 controller tests: bulk publish, bulk pending review, mixed statuses
- Add 5 page widget tests: button visibility, confirmation dialogs, cancel
  preserves selection, plural count
- Update repository test: remove pendingReview from unsupported-throws
- Update mapper test: pendingReview now returns 'pending'
- 319/319 feature_wordpress tests passing, dart analyze clean
- Update master_development_brief.md and build_execution_tracker.md
2026-05-30 11:17:13 -04:00
Mike Kell b61c886c23 chore: remove 8 unnecessary_import directives and 1 unused variable
Validate Docs / validate-docs (push) Successful in 49s Details
Publish Docs / publish-docs (push) Successful in 1m28s Details
Flutter Analyze / Dart Analyze (push) Has been cancelled Details
Flutter Test / Flutter Tests (push) Has been cancelled Details
- feature_wordpress/test: removed 8 unnecessary_import directives across
  5 test files (barrel exports already cover these symbols)
- kell_mobile/test: removed unused productCards local variable
- dart analyze --fatal-infos now passes clean across all packages
- All 410 tests still pass (311 feature_wordpress, 14 kell_mobile,
  24 kell_web, 41 design_system, 20 core)
- Updated build_execution_tracker.md (Stage 7A → merged)
- Updated master_development_brief.md (next branch, validation state)
2026-05-30 10:53:00 -04:00
Mike Kell ffc643739c feat: add bulk move-to-draft action (Stage 7A)
Add bulk status-change capability to the product publishing workspace,
starting with 'Move to Draft' as the first controlled bulk action.

Controller:
- Add BulkActionResult value class (successCount, failureCount,
  targetStatus, failedProductNames, totalCount, allSucceeded)
- Add bulkUpdateStatus() method: processes selected products
  sequentially with per-row updating state, single reload after
  completion, auto-clears multi-selection
- Add lastBulkActionResult / consumeBulkActionResult() pattern

Presentation:
- Add showBulkActionSnackBar() with three variants: all-success
  (green), total-failure (red), partial-failure (amber with up to
  3 failed product names)
- Update _MultiSelectBar with 'Move to Draft' OutlinedButton.icon
  and onBulkMoveToDraft callback
- Add _confirmBulkMoveToDraft() confirmation dialog
- Wire bulk result listener into _onControllerChanged

Tests:
- 11 new bulkUpdateStatus tests: no-op on empty selection, moves
  all to draft, sets result on all-success, clears multi-selection,
  clears updatingIds, handles mixed statuses, consume clears result,
  starts null, preserves preview selection, persists filter/sort,
  disposal safety
- Total: 311/311 feature_wordpress, 24/24 kell_web

Tracking:
- Update master_development_brief.md: Stage 7A marked complete,
  entry criteria marked as all met, test count updated to 311
- Update build_execution_tracker.md: new slice entry added
2026-05-30 10:36:00 -04:00
Mike Kell 871ae8c48b feat(Stage 6B): Android mobile workflow hardening
- Restore Material Design 48x48dp minimum touch targets on 12 IconButtons
  in ProductPreviewPanel by removing constraints/padding overrides
- Replace fixed-width SizedBox(width:80) on price edit TextField with
  Expanded for flexible layout on narrow mobile screens
- Add tooltip 'Edit price' for consistency with other edit buttons
- Wrap ProductPreviewPanel in SafeArea in MobileProductDetailPage to
  prevent content clipping under notches/gesture bars
- Add 6 new touch target rendered-size tests verifying >= 48x48dp
- Update master_development_brief.md and build_execution_tracker.md

Tests: 300/300 feature_wordpress, 14/14 kell_mobile, 24/24 kell_web,
       41/41 design_system — 379 total, all passing.
Stage 6 (Android operational maturity) complete.
2026-05-30 09:45:10 -04:00
Mike Kell 4b5c96c5ec docs: sync tracker and brief with Stage 6A merge to main — add kell_mobile validation state, update baseline commit, fix tracker date, update improvement #6 through Stage 6A
Publish Docs / publish-docs (push) Successful in 49s Details
2026-05-30 01:00:04 -04:00
Mike Kell e23d41b098 feat(mobile): Stage 6A — Android feedback and action polish
Validate Docs / validate-docs (push) Successful in 55s Details
Flutter Analyze / Dart Analyze (push) Has been cancelled Details
Flutter Test / Flutter Tests (push) Has been cancelled Details
- Convert MobileProductDetailPage to StatefulWidget with local controller
  listener for SnackBar feedback in detail page context
- Add confirmation dialogs for publish/move-to-draft status changes
- Add haptic feedback (mediumImpact for status, lightImpact for field edits)
  on successful actions
- Guard MobilePublishingPage SnackBars with _detailPageActive flag to prevent
  invisible behind-route feedback when detail page is pushed
- Add 4 new Stage 6A widget tests (14 total kell_mobile tests passing)
- Update build_execution_tracker.md and master_development_brief.md
2026-05-29 19:13:46 -04:00
Mike Kell 591de0c5c4 feat(mobile): add Android publishing surface (Stage 5B)
Validate Docs / validate-docs (push) Successful in 2m12s Details
Publish Docs / publish-docs (push) Successful in 59s Details
Flutter Analyze / Dart Analyze (push) Has been cancelled Details
Flutter Test / Flutter Tests (push) Has been cancelled Details
- Add MobilePublishingPage with search, filter chips, sort, product count,
  compact card list, pull-to-refresh, and push navigation to detail
- Add MobileProductDetailPage wrapping shared ProductPreviewPanel with
  all narrow edit callbacks (status, price, name, description, category)
- Switch Products tab in MobileShell from ProductPublishingPage to
  MobilePublishingPage
- Expand feature_wordpress barrel exports for mobile consumption
- Add 4 new widget tests (10 total kell_mobile tests passing)
- Zero business logic forked — all shared layers reused
- dart analyze clean, all tests passing

Stage 5 (Android application foundation) complete.
2026-05-29 02:32:28 -04:00
Mike Kell 65466ba513 feat(mobile): Stage 5A — Android app shell and bootstrap
Validate Docs / validate-docs (push) Successful in 3m31s Details
Flutter Analyze / Dart Analyze (push) Has been cancelled Details
Flutter Test / Flutter Tests (push) Has been cancelled Details
Replace default Flutter counter template in kell_mobile with a fully
integrated mobile operations platform shell reusing shared packages.

Mobile app shell:
- MobileAppServices extending KcAppServices with fake()/wp() factories
- KellMobileApp with KcAppScope<MobileAppServices>, KcTheme, env badge
- MobileShell with 5-tab NavigationBar (Dashboard, Inventory, Orders,
  Publishing, More) using IndexedStack for state preservation
- KcBootstrap entry point with --dart-define environment variables

Dashboard:
- DashboardSummary value object with fromData()/empty() constructors
- GetDashboardSummary use case aggregating inventory, orders, publishing
- DashboardController (ChangeNotifier) with loading/error/summary state
- MobileDashboardPage with GridView summary cards using design system
  widgets (KcSectionHeader, KcSummaryCard, KcEmptyState)

Placeholder pages:
- FinancePlaceholderPage, IntegrationsPlaceholderPage for More tab
- Feature tab pages delegate to shared feature presentation layers

Infrastructure:
- pubspec.yaml references all shared packages (core, design_system,
  feature_inventory, feature_orders, feature_policy, feature_wordpress)
- SDK constraint corrected from ^3.11.4 to ^3.11.0 across all 14
  pubspec.yaml files to match installed Dart SDK 3.11.3

Tests:
- 6 new kell_mobile widget tests: shell loading, summary cards,
  environment badge, navigation bar destinations, tab switching, More menu
- All existing tests remain passing (24/24 kell_web, 294/294
  feature_wordpress)

Documentation:
- master_development_brief.md: Stage 5A marked complete, next branch
  updated to feat/android-publishing-surface (Stage 5B), kell_mobile
  platform description updated
- build_execution_tracker.md: Stage 5A entry added with full file list
2026-05-28 19:10:14 -04:00
Mike Kell 2af9a8b6cb docs: update tracker for merged feat/test-coverage-visibility (Stage 4D)
Publish Docs / publish-docs (push) Successful in 1m5s Details
- Update current status to Stage 4D complete (Stage 4 complete)

- Add feat/test-coverage-visibility slice entry with coverage baseline

- Set next branch to feat/android-app-shell (Stage 5A)
2026-05-22 10:22:59 -04:00
Mike Kell 71abe9df7f docs: update briefs for merged feat/flutter-cicd (Stage 4C)
Publish Docs / publish-docs (push) Successful in 1m16s Details
- master_development_brief.md: mark Stage 4C complete, update baseline commit,

  next recommended branch (Stage 4D), tools/ description, resolve improvement #9

- build_execution_tracker.md: update current status to Stage 4C, add missing

  feat/shared-composition-pattern and feat/flutter-cicd slice entries
2026-05-22 10:11:51 -04:00
Mike Kell 8facefdff1 feat(design-system): Stage 4A — design system expansion and shared widget migration
- Migrate EmptyStatePanel, SectionHeader, SummaryCard from kell_web into design_system as KcEmptyState, KcSectionHeader, KcSummaryCard

- Add KcTypography shared typography scale with full Material 3 text style hierarchy

- Add KcBreakpoints responsive layout breakpoint utilities (compact/medium/expanded/large)

- Add KcLoadingState and KcErrorState shared state widgets

- Update kc_theme.dart to use KcTypography.applyKcTypography()

- Update kell_web dashboard_page.dart to use design_system widgets directly

- Replace kell_web shell widget files with backward-compatible typedef re-exports

- Expand design_system tests from 3 to 41 (all passing)

- All existing tests passing: design_system 41/41, feature_wordpress 294/294, kell_web 24/24

- dart analyze clean across design_system and kell_web
2026-05-22 09:42:31 -04:00
Mike Kell bee610ca2c docs: add Stage 4 — Platform foundations and cross-platform readiness
Publish Docs / publish-docs (push) Successful in 1m9s Details
2026-05-22 09:26:39 -04:00
Mike Kell 02090cde6a docs: add suggested improvements to master development brief
Publish Docs / publish-docs (push) Successful in 1m3s Details
2026-05-22 09:17:08 -04:00
Mike Kell 49a3702cec Updated build status
Publish Docs / publish-docs (push) Successful in 1m34s Details
2026-04-11 16:49:51 -04:00
Mike Kell 02cc75c655 feat: publishing workflow UX hardening (Stage 2B)
Validate Docs / validate-docs (push) Successful in 1m9s Details
2026-04-11 16:40:10 -04:00
Mike Kell 73b4a49939 docs: update briefs for merged feat/post-write-consistency (Stage 2A)
- Mark Stage 2A complete in master brief and build tracker

- Refresh main baseline to 7acff83

- Next slice: feat/publishing-ux-hardening (Stage 2B)
2026-04-11 16:18:00 -04:00
Mike Kell cf0889d4a9 feat: post-write consistency hardening (Stage 2A)
Validate Docs / validate-docs (push) Successful in 1m4s Details
Add _refreshSelection() to ProductPublishingController to preserve and refresh selectedDraft by id after all write-triggered reloads. Selection stays on the same product with latest data, or auto-selects first visible item if the original leaves the active filter.

- 11 new post-write consistency tests (234 total)

- dart analyze clean
2026-04-11 16:11:06 -04:00
Mike Kell 24671f5f59 feat(wordpress): add category-only product edit (Stage 1B) 2026-04-11 15:54:40 -04:00