13 Commits
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
197cc66169 |
feat(stage-11c): custom order tracking and fulfillment
Adds the workshop-side counterpart to Stage 11B's intake form: a tracking workspace filtered by fulfillment stage, an auditable timeline of stage changes, and inventory deduction on completion. Closes audit finding P2.2; Stage 11 is complete. Domain: FulfillmentEvent (append-only transition record with operator notes and a malformed-line-tolerant wire format), MaterialUsage, MaterialConsumptionPort + MaterialDeductionResult. Order gains fulfillmentHistory, materialUsage, derived stage accessors, and withFulfillmentEvent(). All existing fields, defaults, and copyWith semantics preserved. Data: advanceFulfillmentStatus() records an event with an optional note and injectable clock; recordMaterialUsage() added. WooCommerce round-trips both through _kc_ meta keys, skipping malformed lines and never blanking remote values. Application/presentation: AdvanceFulfillment, CompleteCustomOrder, CustomOrderTrackingController, CustomOrderTrackingPage, FulfillmentTimeline, showAdvanceStageDialog. Illegal transitions surface the domain rejection reason verbatim. Architecture: inventory deduction crosses the feature boundary through an outbound port, not a package dependency. feature_orders still has no dependency on feature_inventory; each app supplies InventoryMaterialConsumptionAdapter. Completion advances first and deducts second, so a rejected transition can never decrement stock, and a deduction failure warns rather than failing the commission. Tests: 329 new (293 feature_orders, 22 kell_mobile, 14 kell_web). 1085/1085 feature_orders, 109/109 kell_mobile, 81/81 kell_web. dart analyze --fatal-infos clean. |
|
|
|
595d0b5a93 |
feat(stage-11b): custom order intake UI
Adds the operator-facing intake flow for made-to-order commissions on top of
the Stage 11A domain and data layers. The form, validation, and confirmation
receipt all live in feature_orders, so web and mobile host the same widget
rather than forking business logic per platform.
Stage 11C still covers the tracking page, the status-change timeline, and
inventory deduction on completion.
Application:
- CreateCustomOrder and RecordDeposit use cases wrapping the repository
methods added in Stage 11A, so presentation never assembles a custom order
aggregate by hand. RecordDeposit deliberately accepts no payment identifier.
- CustomOrderFormController with field-keyed validation, so each input renders
its own error rather than a single form-level message. Clock and ID
generator are injected, which keeps created-at stamps and order IDs
deterministic under test.
- All money is typed as text and converted to integer cents by
parseMoneyToCents before it reaches DepositInfo, consistent with
PaymentResult.amountCents. Thousands separators, currency symbols, excess
precision, and negatives are rejected or normalised at the boundary. The
only double is the derived OrderItem.unitPrice, computed once from cents.
- Derived balance clamps at zero rather than reporting a credit when a deposit
exceeds the quoted total, matching DepositInfo.balanceDueCents.
Presentation:
- CustomOrderFormPage — sectioned intake (customer, specification, pricing and
deposit, reference images) over the shared design-system widgets.
- CustomOrderConfirmationPage — order summary, spec rendering, and a deposit
receipt showing amount, method, date, and balance only.
- FulfillmentStatusChip over the design-system KcStatusChip, covering all
seven pipeline values.
- showReferenceImageDialog() plus ReferenceImageDialogResult with URL
validation and de-duplication.
- OrdersPage gains an optional onCreateCustomOrder callback. When null the
"New Custom Order" action is not rendered, so the page stays usable in hosts
that have no intake route.
Hosts:
- kell_web: new /orders/custom route rendering CustomOrderFormPage inside
AppShell, with ordersToCustomOrder() and customOrderToOrders() handoffs on
AppNavigation. Confirmation returns to Orders pre-selecting the new order.
- kell_mobile: new MobileCustomOrderPage, a full-screen SafeArea host for the
shared form, reached from an extended FAB on the orders list. Market intake
is the primary custom-order use case, so mobile gets a dedicated route
rather than an inline panel. The list reloads on return.
Privacy:
- The deposit receipt renders amount, method, date, and balance only. The
transaction ID stays on PaymentResult and is asserted absent from the
rendered confirmation by test. The controller holds no payment identifier at
any point.
Deferred to Stage 11C, recorded in the Stage 11B section:
- Product-base selection from the catalogue; the form captures a free-text
specification instead.
- Platform camera and file-picker capture for reference images; the dialog
accepts validated URLs only.
Validation:
- 146 new tests: 82 on CustomOrderFormController (money parsing, setters,
derived balance and clamping, reference image add/remove/dedupe, the full
validation matrix, buildSpec mapping, submission, quoted vs. collected
deposit, repository failure, duplicate ID, reset), 26 on the form page, 24
on the confirmation page including the no-payment-identifier assertion, 3 on
the OrdersPage entry point, 6 on MobileCustomOrderPage, and 5 on the web
route.
- 2,044/2,044 passing across all 11 packages and apps, up from the 1,898
baseline at
|
|
|
|
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. |
|
|
|
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. |
|
|
|
116255f8ac | feat(stage-10F): SquareSyncStatusPanel + IntegrationsPage + MobileIntegrationsPage + squareSyncController wired into both shells | |
|
|
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
|
|
|
|
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 |
|
|
|
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 |
|
|
|
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) |
|
|
|
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 |
|
|
|
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. |
|
|
|
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 |
|
|
|
59548cedbd |
Add Flutter app and package monorepo scaffold
Publish Docs / publish-docs (push) Successful in 59s
Details
|