Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
20260321 - 2026-03-21¶
Added¶
- Staging attestation for docs / EventCatalog-only deploys: Attest Staging can run when Acceptance Test is skipped but Deploy Staging succeeded with docs and/or EventCatalog in the affected set (static-site path). Attestation payloads set
acceptanceTestsPassedfrom the real Acceptance Test stage outcome (attestAcceptanceJson) instead of alwaystrue. - Digest checks before cosign attestation: Each per-image attestation step validates a
sha256:<64-hex>digest for the service being attested (gateway, web, docs, EventCatalog, microservices, slicer). - Technology stack summary asset: New
docs/03-architecture/technology-stack-summary.svgplus refresh oftechnology-stack.svg.
Fixed¶
- Azure Pipelines variable expansion in bash attestation scripts: Replaced
${macro:-default}-style reads with$(macro)and explicit empty checks so runtime macros (acceptanceStageResult, image digests) resolve correctly underset -u-safe patterns. - Grype SBOM scan flakiness:
.azuredevops/pipelines/templates/sbom-scan-publish.ymlrunssyncbefore scanning and retries Grype up to three times with incremental backoff for transient errors (for example “Text file busy”). AuthWithAuditControllersession usage (@forma3d/service-common): Guard when session middleware is missing; capturereq.sessionin a local variable beforesave/destroycallbacks for correct TypeScript strict typing and closure behavior.
Changed¶
- Lighthouse CI report publishing: Pipeline selects the HTML report that pairs with the highest performance score from
*.report.json, with fallback to the first HTML artifact; Python score extraction and float comparison simplified for reliability. - Business requirements: Substantial update to
docs/01-business/requirements.md(implementation history and requirement alignment). - Root and EventCatalog dependencies: pnpm overrides for
fast-xml-parser(≥5.5.7) andflatted(≥3.4.2); matching pins indocs/03-architecture/eventcatalog/package.json.
Security¶
- Supply-chain hygiene: Patch-level bumps for
fast-xml-parserandflattedvia overrides and EventCatalog pins to stay on maintained versions.
Documentation¶
- Pipeline reference & staging deployment:
docs/05-deployment/pipeline-reference.mdandstaging-deployment-guide.md— Acceptance Test vs Attest Staging flow, docs/EventCatalog-only attestation path, digest and predicate behavior. - Agentic team operations:
docs/10-agentic-teamand rootagentic-team/— Ryan’s scope extended to SonarCloud, license-check, Grype, and Lighthouse failures with full failed-step logs to Cody; Sam’s scope explicit for infrastructure anomalies (e.g. cryptominer-style processes, suspicious CPU);configure-secrets.sh,setup-summary.md, agentCLAUDE.mdfiles, and prompts updated accordingly. - Agentic team health-check cadence: Ryan (build agent) and Sam (staging) routine monitoring documented as hourly (24 checks/agent/day); pipeline failures remain Azure DevOps webhook-driven (immediate). Updated prompts,
agentic-team/agents/*/CLAUDE.md,implementation-plan.md,agentic-team/README.md, and related notes. - Sonar issue resolution guide: Updates to
reports/sonarcloud-issue-resolution-guide.md. - AI implementation advantage: Minor revision in
docs/04-development/AI-implementation-advantage.md.
20260319 - 2026-03-19¶
Added¶
- Inventory & stock replenishment system: Full inventory management with reorder-point / order-up-to model.
StockBatchandInventoryTransactionPrisma models,InventoryModuleandStockReplenishmentModulein order-service, scheduled replenishment evaluation, stock-aware order fulfillment with ORDER-over-STOCK print job priority, andGRIDFLOCK_PIPELINEretry job type for transient pipeline failures with exponential backoff. - Inventory management UI: Four new pages — Stock Levels dashboard (
/inventory), Inventory Config (/inventory/config) with inline editing of min/max stock, priority, and batch size, Transaction History (/inventory/transactions) with product selector and pagination, and Replenishment Status (/inventory/replenishment). Navigation sidebar updated withArchiveBoxIconlink. Permission-gated behindinventory.read/inventory.write. - Inventory API endpoints:
GET /api/v1/inventory/stock-levels,PATCH /api/v1/inventory/config,POST /api/v1/inventory/adjust,POST /api/v1/inventory/scrap,GET /api/v1/inventory/transactions,GET /api/v1/inventory/replenishment-status. TanStack Query hooks for all endpoints. - Feature flags admin UI: New admin page (
/settings/feature-flags) for managing feature availability per tenant, withFeatureFlagsAdminModulein gateway, API client methods, and tenant-specific feature flag hooks. - Tenant feature flags in health checks:
HealthControllernow filters reported services based on tenant feature flags (e.g.gridflock-serviceandslicerhidden when GridFlock disabled for tenant).TenantFeaturesModuleintegrated into gateway. - Grid pricing settings UI: New settings page for managing grid pricing parameters (currency, pricing fields), with
SettingsModulein order-service,GridPricingSettingsController, gateway route, API client methods, and frontend hooks. - SimplyPrint upload folder configuration: Tenants can configure a SimplyPrint folder path for uploaded grid files, with a test endpoint to validate folder existence before saving.
- API Gateway OpenAPI aggregation: Gateway now aggregates OpenAPI specifications from all microservices with background fetching — initial load shows gateway endpoints, subsequent loads include all service endpoints.
- Lighthouse CI:
@lhci/cliintegration with.lighthouserc.cjsconfig (Performance 70, Accessibility 90, Best Practices 90, SEO 90),lighthouseNx target inapps/web, andLighthouseAuditpipeline stage running against staging after deployment. - SonarCloud integration: SonarCloud code quality analysis in Azure Pipelines with quality gate checks, coverage reporting, and duplication detection.
- CodeCharta city visualization: Pipeline stage generates CodeCharta metrics from SonarCloud data, deploys interactive 3D visualization to staging via Docker volume mount (decoupled from docs image build).
- Grype CVE scanning: Grype vulnerability scanning after each of the 9 SBOM generation steps in the pipeline, with
--fail-on highthreshold. - ClickHouse log backup cron job: Daily automated backup at 3 AM UTC via
deploy.shcron setup. - Storefront variant tracking:
isNewVariantboolean inGridAddToCartResponseindicating newly created variants, with configurator delay for variant propagation. - Storefront pricing throttle: Relaxed rate limiting decorator (
StorefrontPricingThrottle) for read-only pricing endpoints, separate from checkout/add-to-cart throttling. - Acceptance tests for inventory:
inventory-stock-api.featurewith step definitions for stock level, configuration, adjustment, and transaction endpoints. @forma3d/service-commonshared modules: Extracted and centralized the following duplicated code into the shared library:SharedAuthModule.forRoot()— auth services, guards, decorators, DTOsSharedNotificationsModule.forRoot()— email service, notifications service, Handlebars templatesSharedConfigModule.forRoot()— env validation,SystemConfigService- Event log module —
EventLogService, controller, module - Shipments module — repository, service, controller
- Sendcloud module —
SendcloudBaseService, API client, connection repository, webhook types - Product mappings module — controller, service, repository, DTOs
- Print jobs controllers —
PrintJobsController,PrintJobsAdminController - Auth controllers —
AuthWithAuditController - Correlation, throttler, fulfillment events
- Notification event handlers
Fixed¶
- SimplyPrint reconciliation CANCELLED → COMPLETED guard: Prevented incorrect status transition from CANCELLED to COMPLETED during reconciliation when stale printer references remain after job re-queues.
- Service worker stale data: Switched API caching from
StaleWhileRevalidatetoNetworkFirstwith 5-second timeout for/api/v1/ordersand/api/v1/dashboard, ensuring React Query cache invalidation retrieves fresh data. - Staging deployment
npxnot found: FixedError: Cannot find module '/app/npx'by changing migration commands fromnpx prisma migrate deploytopnpm prisma migrate deployindeploy.shandazure-pipelines.yml. - SonarCloud S6853 (form label association): Wired
htmlFor/idattributes on form labels and controls in stock adjustment modal, shipping info, user form modal, inventory config, transactions, and new mapping pages. - SonarCloud S7735 (negated conditions): Fixed 40 negated-condition instances across ~20 files by flipping conditions and swapping branches.
- SonarCloud S3863 (duplicate imports): Merged 80 duplicate imports from the same module across production and test files.
- SonarCloud S3776 (cognitive complexity): Reduced cognitive complexity in
handleSimplyPrintStatusChange,updateJobStatus,runBackfillForShop,runLegacyBackfill,uploadFileToSimplyPrint,generatePlateBorderStls,calculatePlateSet, andenumerateAllBasePlateKeysby extracting helper functions. - File promotion resilience: Added retry logic with exponential backoff for promoting SimplyPrint temporary API files to user files, with Sentry error reporting on failure.
- Path sanitization in gridflock: Replaced regex-based
..removal with string replacement insanitizePathSegmentfor clarity. - Constructor parameter count: Reduced
SendcloudBaseServiceand shipping-service constructor parameters from 9 to ≤7 by grouping dependencies. fast-xml-parserCVE: Updated to v5.4.1.- Security headers: Added
SecurityHeadersMiddlewareto order-serviceAppModule. - Email input sanitization: Refactored email handling in auth services to safely convert inputs to strings.
- Cosign attestation retry: Added retry logic for
cosign attestin Azure Pipelines to handle transient registry authentication failures. - Database migration reliability: Updated migration commands in CI/CD scripts for consistent behavior across environments.
Changed¶
- 0.6mm nozzle support for Bambu Lab A1: Updated default print settings (nozzle diameter, layer height, infill, layer counts), added machine/process/filament profile paths, enhanced
GridflockPipelineServiceto select edge puzzle parameters based on nozzle diameter. - Slicer profile resolution: Introduced fallback mechanism prioritizing custom profiles, refactored profile flattening for multiple profile types (machine, process, filament), improved output naming.
- GridFlock feature flag key: Changed from
gridflock.enabledtofeature.gridflock.enabledfor consistency with generic feature flag management UI. - Grid pricing service: Refactored to use currency-agnostic keys.
- Prisma seed:
grid.unitSizeMmchanged from 75 to 42 (Gridfinity standard). - Jest → SWC: Switched all 5 backend services from
ts-jestto@swc/jestfor faster TypeScript compilation during tests. - Duplication reduction: All 5 microservices now import auth, notifications, config, event-log, shipments, Sendcloud, product mappings, print job controllers, correlation, and throttler from
@forma3d/service-commoninstead of maintaining local copies. - Print job
lineItemIdnullable:PrintJob.lineItemIdis now optional (null for STOCK purpose jobs). - Azure Pipelines: SBOM generation and vulnerability scanning refactored with Syft + Grype replacing Aikido; deployment tagging improvements for
deploymentHappenedaccuracy; registry maintenance and staging promotion stages restructured. - ClickHouse configuration: Daily partitions, adjusted TTL settings for
query_metric_loganderror_log, resolving OOM death spiral. - Nx project configuration: Added tagging and
@nx/enforce-module-boundariesimport rules across all projects. - Docs Dockerfile optimization: CodeCharta moved from image build to Docker volume mount, decoupling CodeCharta generation from docs packaging.
- Acceptance tests: Product mapping selectors updated for improved accuracy and reliability.
Removed¶
- Aikido security scanning: Replaced by Syft (SBOM) + Grype (CVE scanning) in the pipeline.
- Duplicated service code: Removed local implementations of auth, notifications, config, event-log, shipments, Sendcloud, product mappings, print jobs controllers, correlation, throttler, and fulfillment events from individual microservices (now in
@forma3d/service-common).
Security¶
- Syft + Grype pipeline: SBOM generation (Syft) and CVE scanning (Grype,
--fail-on high) for all 9 container images, replacing Aikido. - Cryptominer audit: Security audit of staging and nanoclaw servers — no cryptominers found;
/tmp/slicer-build/executables confirmed as expected build artifacts. fast-xml-parserupdate: v5.4.1 addressing known CVEs.- Security headers middleware: Applied to order-service.
Documentation¶
- Technology stack overview: Comprehensive technology stack document (
docs/03-architecture/technology-stack.md) with rationale, PlantUML diagram, and SVG — Aikido replaced by Syft + Grype in security section. - Trunk-based development workflow: New workflow document with PlantUML branching model diagram and pipeline reference cross-link.
- Operational tooling guide: New guide (
docs/05-deployment/operational-tooling.md) documenting Uptime Kuma, Dozzle, pgAdmin, Grafana, Zensical, and EventCatalog. - CodeCharta research: Research document for CodeCharta city visualization integration with SonarCloud.
- Inventory architecture diagrams: Updated C4 component (OrderService), domain model, database, and ERD diagrams. New sequence diagrams for stock replenishment, stock-aware fulfillment, and stock job completion. New state machine diagram for StockBatch lifecycle.
- C4 container diagram: Added Uptime Kuma container with operator and gateway relationships.
- C4 deployment diagram: Added pgAdmin container to staging Docker Compose node.
- ClickHouse backup documentation: Updated staging deployment guide with backup types, storage locations, and verification steps.
- Sonar quality gate protocols: Documented agent workflows for handling quality gate failures.
- Stackshare documentation: Technology icons, tool usage mapping, and custom-built services documentation.
- README.md: Added process documentation section.
Database¶
- Added
StockBatchmodel with status tracking (IN_PROGRESS,COMPLETED,FAILED,CANCELLED) and job count fields. - Added
InventoryTransactionmodel with transaction types (PRODUCED,CONSUMED,ADJUSTMENT_IN,ADJUSTMENT_OUT,SCRAPPED), direction, reference tracking, and audit fields. - Added
PrintJobPurposeenum (ORDER,STOCK) andpurposefield onPrintJob. - Added
stockBatchIdfield onPrintJob(nullable, for STOCK purpose jobs). - Made
PrintJob.lineItemIdnullable for STOCK purpose jobs. - Added inventory fields on
ProductMapping:currentStock,minimumStock,maximumStock,replenishmentPriority,replenishmentBatchSize. - Added
GRIDFLOCK_PIPELINEtoRetryJobTypeenum. - Added composite indexes for stock replenishment queries (
tenantId, purpose, statuson PrintJob;tenantId, productMappingId, statuson StockBatch).
Tests¶
- Added stock replenishment unit tests:
StockReplenishmentService(14 tests) andStockReplenishmentScheduler(4 tests). - Added
@forma3d/gridflock-coregeometry unit tests:numbering.spec.ts,grid-cells.spec.ts,intersection-puzzle.spec.ts,edge-puzzle.spec.ts,magnet-holes.spec.ts. - Added
SendcloudBaseServiceunit tests (20+ cases covering all shared methods, error handling, retryable errors, service point delivery). - Added shared controller unit tests for
service-commoncontrollers. - Added frontend hook tests:
use-inventory.test.tsx,use-feature-flags-admin.test.tsx,use-grid-pricing-settings.test.tsx,use-print-settings.test.tsx,use-stock-settings.test.tsx,use-feature-flags.test.tsx. - Added MSW handlers for inventory, settings, feature flags, and tenant features endpoints.
- Added inventory acceptance tests (
inventory-stock-api.feature). - Updated SimplyPrint reconciliation tests for CANCELLED → COMPLETED guard.
- Updated acceptance tests for product mapping selector improvements.
20260302 - 2026-03-02¶
Added¶
- Plate-level preview cache: 268 plate-level cache files (~60 MB) uploaded and verified on staging (
Plate cache loaded: 268 plates, 59.5 MB), replacing the legacy full-preview cache. The preview service now uses a two-tier cascade: plate-level assembly (10–100 ms) → full JSCAD fallback (12–30 s). - Aikido security configuration: Added
.aikidoconfiguration file for automated security scanning (dependency vulnerabilities, exposed secrets, SAST, IaC, malware detection). - Microservice stubs and handlers: Implemented missing stubs and handlers across services —
FulfillmentService.createFulfillmentin shipping-service,AuditServicein shipping/gridflock/print services, retry queue handlers forCANCELLATIONandPRINT_JOB_CREATIONin order-service and shipping-service. - Prisma connection retry logic:
PrismaServicenow retries database connections on startup with configurable retry count and delay.
Fixed¶
- Grid configurator dimension rounding: Changed
snapToMm()fromMath.roundtoMath.floorin the Shopify storefront configurator so dimensions like 74.41–74.49 cm floor to 74.4 cm instead of rounding up. Addedstep="0.1",max="100", and validation feedback to dimension inputs. - GridFlock rounded corners on individual plates: Fixed corner rendering on individual plate previews in the 3D configurator.
Changed¶
- Preview cache architecture: Replaced the legacy per-dimension preview cache with plate-level assembly. Cache keys normalize dimensions with larger dimension first. Full JSCAD fallback retained for uncached combinations.
- Internal prompt management: Moved
prompt-openscad-server-side-preview.mdfromtodo/todone/— superseded by the plate-level cache approach.
Removed¶
- Legacy full-preview cache system: Deleted 16,471 preview files (~35 GB) from the staging server and removed all associated code:
PreviewCacheController, preview cache management UI (/settings/preview-cache),usePreviewCachehooks,previewCacheAPI client methods,scripts/populate-preview-cache.ts, andscripts/upload-preview-cache.sh. The legacy disk read/write path inGridflockPreviewServicehas been removed.
Security¶
- Aikido security scanning: Configured Aikido for continuous security monitoring. Initial scan identified Prisma operator injection risks, Express security header gaps, and
fast-xml-parserCVEs — tracked for remediation infix/aikido-violationsbranch.
Documentation¶
- SaaS launch readiness research: New research document (
docs/03-architecture/research/saas-launch-readiness-research.md) covering onboarding, pricing/billing, invoicing, tax compliance, offboarding, GDPR, legal, multi-lingual/i18n, Stripe integration, security requirements, and feature flags for a future SaaS offering. - Internal README update: Updated
docs/_internal/README.mdwith current workspace structure, projects, and configuration details. - Plate-level preview cache prompt: Created
docs/_internal/prompts/todo/prompt-plate-level-preview-cache.mddocumenting the plate cache strategy.
20260227 - 2026-02-27¶
Added¶
- STL preview cache pre-population scripts: Two offline scripts for eliminating cold-start latency in the storefront configurator.
scripts/populate-preview-cache.tsgenerates all STL preview files locally on a powerful machine with CPU-aware parallelism (auto-detects cores, partitions concurrent jobs to prevent thread oversubscription),--dry-runmode, resumability, and progress reporting.scripts/upload-preview-cache.shtransfers generated files to the staging server via rsync with Docker container ownership fix. - Preview generation library extraction: Extracted
generatePreviewStl()function fromGridflockPreviewServiceinto@forma3d/gridflock-coreas a reusable, NestJS-independent module. MovedcomputeUniformOffsets(),computeOffsetsPerColumn(),PLATE_GAP_MM, andDEFAULT_PREVIEW_OPTIONSfrom the service class into the library. Both the server and offline scripts now share a single source of truth for STL preview generation. - Configurable worker thread count: Added optional
maxWorkersparameter togeneratePlatesParallel()in@forma3d/gridflock-core(backward-compatible — existing callers unaffected). Enables callers to control CPU usage when running multiple combinations concurrently. - STL cache management search: Added search/filter input to the Preview Cache admin screen for finding cached files by filename.
- SimplyPrint default file color: Set default color to Jade White (Bambulab PLA) when uploading files to SimplyPrint for consistent color/material tagging.
Fixed¶
- Three.js grid preview dark backside: Changed STL material from
FrontSidetoDoubleSiderendering and improved directional/ambient lighting in the storefront 3D configurator to eliminate dark backsides on grid previews.
Changed¶
- GridFlock preview service refactored:
GridflockPreviewService.generatePreview()is now a thin caching wrapper that delegates all generation logic togeneratePreviewStl()from@forma3d/gridflock-core. No offset computation, plate set calculation, or STL combining logic remains in the service. - Cache key normalization: Preview cache keys now normalize dimensions with the larger dimension first — requesting 320×450 and 450×320 both resolve to
preview-450x320.stl, preventing duplicate cache entries.
Documentation¶
- ADR-060: Single Source of Truth for STL Preview Generation — documents the extraction of preview generation logic from the NestJS service into
@forma3d/gridflock-core. - Real-world testing guide: Added Part 12: STL Preview Cache Pre-Population — offline generation and upload workflow, CLI usage, verification steps.
- STL cache prepopulation research: Updated status from Research to Implemented with ADR cross-reference.
- C4 component diagram: Updated GridFlock Service component diagram with preview generator and preview controller components.
20260222 - 2026-02-22¶
Added¶
- On-demand pgAdmin container management: Gateway DevTools API (
/api/v1/devtools/pgadmin) and web UI settings page for starting, stopping, and monitoring a pgAdmin container on demand. Gateway Dockerfile now includes Docker CLI, and the gateway container has Docker socket access for container orchestration. IncludesDevtoolsModule,DevtoolsService,DevtoolsController, container status DTO, and unit tests. - Nx affected resilience via deploy tag (ADR-059): Pipeline
DetectAffectedjob now uses alast-successful-deploygit tag as the--baseref instead ofHEAD~1. A newUpdateDeployTagstage advances the tag only after the full pipeline succeeds. If a pipeline fails partway through, the next run re-evaluates all changes since the last successful deployment, preventing "forgotten" undeployed changes. - ClickHouse initialization scripts: Automated TTL policy application (
apply-ttl.sh) mounted as a ClickHouse init script in Docker Compose, with pipeline support for deploying init scripts to staging. - TIMELINE.md: Project evolution timeline document added to docs build (
.dockerignoreupdated,COPYadded to docs Dockerfile).
Fixed¶
- Database connection pool standardization: Explicit
connection_limitparameter added to all 5 services' Prisma configuration viaDATABASE_URLquery parameter andconfiguration.tspool settings, preventing connection exhaustion under load. - Sentry debug mode in non-production: Disabled
debug: truein Sentry config for non-production environments to reduce console noise. - Sentry test configuration: Cleaned up Sentry config spec to work without live DSN.
- Nginx proxy resolution: Updated
nginx.confproxy configuration for dynamic gateway hostname resolution, fixing 502 errors after container restarts. - ClickHouse backup script: Enhanced with JSONL export functionality alongside existing SQL backup for more portable log archives.
- Grafana structured logs dashboard: Updated SQL queries for ClickHouse OTel schema compatibility; added log search dashboard.
- pgAdmin Docker Compose: Switched from
.envfile mount to explicit environment variables, used explicit volume name and project name for reliable container lifecycle management.
Changed¶
- Nx affected base ref: Pipeline compares against
last-successful-deploytag instead ofHEAD~1, with automatic fallback toHEAD~1when the tag doesn't exist (first run). Bothnx affectedandgit diff(for docs, slicer, eventcatalog) use the same dynamic base ref. - pgAdmin monitoring: Removed pgAdmin from Uptime Kuma permanent monitors since it is now an on-demand container managed through the DevTools UI.
Documentation¶
- ADR-059: Nx Affected Resilience via Last-Successful-Deploy Tag — documents the problem with
HEAD~1base ref, the git tag solution, bootstrap behavior, and alternatives considered. - Staging deployment guide: Updated with database connection pool configuration and pgAdmin on-demand instructions.
20260221 - 2026-02-21¶
Added¶
- ClickHouse + Grafana logging pipeline: Full observability stack with OTel Collector (OTLP gRPC/HTTP receivers, batch processor, ClickHouse exporter), ClickHouse server with memory limits and S3 backup disk, Grafana with provisioned ClickHouse datasource, and backup scripts for DigitalOcean Spaces. Installed
@opentelemetry/sdk-node,@opentelemetry/api,@opentelemetry/exporter-logs-otlp-grpc,@opentelemetry/sdk-logs,@opentelemetry/instrumentation-pino, and related packages. NewOtelLoggerServiceinlibs/observabilityusing Pino with pino-pretty transport for dev. - Integration hot-reload architecture: SimplyPrint and Sendcloud API clients now re-initialize immediately when integration settings are saved or disconnected via the UI, with cross-service BullMQ event notification (
INTEGRATION_SIMPLYPRINT_CHANGED,INTEGRATION_SENDCLOUD_CHANGED). Replaced startup-only initialization pattern withSimplyPrintInitializerServiceandSendcloudInitializerServicethat support on-demandreinitialize()anddisable(). - EventCatalog flows: 4 business flow visualizations — Order Fulfillment, Order Cancellation, GridFlock Pipeline, and Shipping & Tracking — with interactive visualizer pages, Mermaid diagram exports, and cross-references to domains and services.
- EventCatalog Schema Explorer: Added
schemaPathfrontmatter to all 11 events, created TypeScript schema files for all 8 commands and 7 queries, enabling the Schema Explorer across the entire catalog. - EventCatalog architecture documentation: Full EventCatalog project (
docs/03-architecture/eventcatalog/) with domain, service, event, command, query, and channel documentation, Mermaid flow diagrams, Dockerfile, Docker Compose configuration, and CI/CD pipeline integration. - Event traceability fields: Added
eventId(UUID v4) andsource(service name) toServiceEventinterface for cross-service event tracing, cherry-picked from the CloudEvents specification. - SimplyPrint & Sendcloud UI configuration: Database-backed integration settings (
SimplyPrintConnection,SendcloudConnectionPrisma models) with AES-256-GCM encrypted credential storage, sharedIntegrationTokenService, CRUD APIs, frontend settings page with connection status indicators and test-connection functionality. - Implementation prompts: Created prompts for ClickHouse + Grafana logging pipeline (
prompt-clickhouse-grafana-logging.md) and on-demand pgAdmin container (prompt-pgadmin-on-demand-container.md).
Fixed¶
- Unresolved Azure DevOps pipeline variables causing crash loops: Removed 10 dead pipeline variables (
SIMPLYPRINT_API_URL,SIMPLYPRINT_API_KEY,SIMPLYPRINT_COMPANY_ID,SIMPLYPRINT_WEBHOOK_SECRET,SENDCLOUD_PUBLIC_KEY,SENDCLOUD_SECRET_KEY,SHOPIFY_SHOP_DOMAIN,SHOPIFY_ACCESS_TOKEN,DEFAULT_SHIPPING_METHOD_ID,DEFAULT_SENDER_ADDRESS_ID) fromenv.validation.ts(all 4 services),docker-compose.yml,azure-pipelines.ymlheredoc template, and env templates. Azure DevOps passed literal$(VAR)strings when variables were undefined, failing@IsUrl()validation and crash-looping order-service and print-service. - Integration client initialization in order-service: Order-service had no startup services for SimplyPrint or Sendcloud — API clients were never initialized after container restart. Added
SimplyPrintInitializerService,SendcloudInitializerService, connection repositories, and BullMQ event listeners. - Order status transition validation: Added FAILED → PROCESSING and PARTIALLY_COMPLETED → PROCESSING transitions, allowing orders to be revived when print jobs are requeued.
- BullMQ
print-job.status-changedsubscription: Added missing Worker subscription in order-service for print job status change events; jobs were stuck in "waiting" state indefinitely. - Dashboard real-time updates: Added
['analytics']and['dashboard']query key invalidation to socket event handlers; added missing handlers fororder:fulfilled,order:failed,printjob:created,printjob:completed,printjob:cancelled. - Double
#prefix in Shopify order numbers: Removed hardcoded#from frontend templates that duplicated the#already present in order data. - EventCatalog Dockerfile: Changed
npm citonpm installto fix build failure caused by missingpackage-lock.jsonin pnpm monorepo. - Docs Docker build: Fixed
zensical buildfailing onCHANGELOG.mdsnippet — removed from.dockerignore, addedCOPYto Dockerfile, updatedzensical.tomlbase paths, and fixed snippet path reference. - SimplyPrint reconciliation logic: Fixed printer state checking —
OPERATIONALnow correctly maps to COMPLETED instead of PRINTING. - Cross-service event name mismatches: Fixed event publisher/subscriber to use
PRINT_JOB_EVENTS.*constants instead of hardcoded strings. - Gateway webhook routing: Fixed SimplyPrint and Sendcloud webhook paths from
/api/v1/webhooks/*to/webhooks/*to match controller paths.
Changed¶
- Logging architecture: Replaced
SentryLoggerServicewithOtelLoggerService(Pino + OpenTelemetry SDK) across all 5 backend services. Sentry retained for error tracking and performance monitoring. Added 3 new Docker Compose services (otel-collector, clickhouse, grafana) withOTEL_EXPORTER_OTLP_ENDPOINTin all backend services. Deleted 5sentry-logger.service.tsfiles. - Environment configuration cleanup: Removed dead integration credential env vars from all 4 services'
env.validation.tsandgetIntegrationStatuses()— SimplyPrint and Sendcloud credentials are now DB-configured, Shopify uses OAuth. - Monolith API removed: Deleted
apps/api/andapps/api-e2e/directories entirely (previously deprecated in favor of microservice architecture per ADR-051). - Removed duplicate webhook controllers: Cleaned up duplicate SimplyPrint and Sendcloud webhook controllers, guards, and DTOs from order-service (webhooks now handled exclusively by print-service and shipping-service).
- Removed duplicate reconciliation services: Removed duplicate SimplyPrint and Sendcloud reconciliation from order-service (handled by print-service and shipping-service respectively).
- Internal prompts reorganization: Updated
docs/_internal/README.mdto reflectprompts/done/andprompts/todo/structure with all completed and upcoming prompts listed.
Documentation¶
- TIMELINE.md: Project evolution timeline with AI-human collaboration analysis, feature implementation chronology, and inline PlantUML diagrams.
- Patterns evaluation: Comprehensive architectural patterns analysis (
docs/03-architecture/patterns-evaluation.md) covering microservices patterns, design patterns, 12-factor app compliance, and enterprise application architecture patterns with inline PlantUML illustrations. - ClickHouse + Grafana logging: Infrastructure config files, application integration guide, and backup strategy documentation for the logging pipeline.
- EventCatalog flows: 4 flow visualizations (Order Fulfillment, Order Cancellation, GridFlock Pipeline, Shipping & Tracking) with cross-references to 4 domains and 5 services.
- Event handling architecture: Major update to
docs/03-architecture/events/README.md— documented two-layer event architecture (internal EventEmitter2 + cross-service BullMQ), bridge pattern, event naming translation table, and service ownership. - CloudEvents evaluation research: New research document (
docs/03-architecture/research/cloudevents-evaluation.md) covering gap analysis, cost/benefit, cherry-picked fields, and when to revisit full adoption. - Real-world testing: Added service point delivery setup, grid product configuration in Shopify, and GridFlock pipeline documentation sections to
docs/04-development/real-world-testing.md. - State machine diagram: Updated
C4_Code_State_Order.pumlfor FAILED → PROCESSING and PARTIALLY_COMPLETED → PROCESSING transitions. - EventCatalog prompt corrections: Updated prompt with corrected commands (8), queries (7), delivery guarantee (at-least-once), and service subscription tables.
- Pre-production flowchart: Updated ROADMAP.md pre-production flow diagram to loop back to the top instead of the replenishment node.
Database¶
- Added
SimplyPrintConnectionandSendcloudConnectionmodels with migration for UI-configurable integration credentials.
Tests¶
- Updated
bullmq-event-bus.spec.tswith requiredeventIdandsourcefields. - Updated gateway route config tests for corrected webhook paths.
- Added SimplyPrint reconciliation tests for printer-state-aware behavior.
20260217 - 2026-02-17¶
Added¶
- Microservice architecture: Split monolith API into 5 independent NestJS services — Gateway (
:3000), Order Service (:3001), Print Service (:3002), Shipping Service (:3003), and GridFlock Service (:3004) — with HTTP for synchronous and Redis pub/sub for asynchronous inter-service communication. - API Gateway: New gateway service (
apps/gateway/) with session-based auth, HTTP reverse proxy to downstream services, WebSocket proxy, and aggregated health checks. - GridFlock STL generation service: New microservice (
apps/gridflock-service/) for automated STL baseplate generation — baseplates, plate sets, async BullMQ job processing, STL-to-gcode pipeline via BambuStudio CLI slicer, SimplyPrint integration, scheduled cleanup, and feature flag guard. - Slicer container: BambuStudio CLI wrapper (
deployment/slicer/) with Express REST API for STL slicing, printer profile management (Bambu A1, A1 Mini, P1S), and health checks. - GridFlock database models:
GridflockJobandGridflockPresetPrisma models with migration20260215100000_add_gridflock_tables. - SimplyPrint history-based reconciliation:
getJobHistory()API method with graceful fallback chain — 5-minute grace period, triple matching (uid/id/queueItemId), rate limiting (max 10 history lookups per cycle), and escalation logging for persistently missing jobs. - Build agent setup: Automated DigitalOcean droplet provisioning script (
deployment/build-agent/setup-build-agent.sh) for Azure DevOps self-hosted build agents. - Container registry cleanup script: Script (
scripts/cleanup-registry.sh) for DigitalOcean container registry image cleanup. - Activity log detail modal: Clickable log rows (desktop table and mobile cards) now open a detail modal showing severity, event type, timestamp, message, and contextual action links (e.g. "View Order").
- Shopify variant selection in product mapping: Products with multiple variants can be expanded in the Shopify product picker to select a specific variant (e.g. grey vs white).
- ECharts dashboard analytics research: Research document (
docs/03-architecture/research/echarts-dashboard-analytics-research.md) evaluating Apache ECharts for dashboard analytics with mockup assets and implementation prompt. - ECharts dashboard analytics: Full analytics dashboard with Apache ECharts (v6) — donut charts for order/print job/shipment status distributions, weekly revenue bar chart, 30-day order trend line chart, and enhanced KPI tiles with day-over-day comparison deltas. Includes shared period dropdown (Today / Week / Month / All Time), click-to-filter navigation on donut slices, and lazy-loaded chart components for bundle optimization.
- Analytics backend module: New
AnalyticsModulewith repository, service, controller, and DTOs exposing 6 REST endpoints under/api/v1/analytics/*(order analytics, print job analytics, shipment analytics, revenue trend, order trend, enhanced dashboard stats). - Analytics shared contracts:
AnalyticsPeriod,OrderAnalyticsApiResponse,PrintJobAnalyticsApiResponse,ShipmentAnalyticsApiResponse,TrendsApiResponse,EnhancedDashboardStatsApiResponseinlibs/domain-contracts. - Analytics database indexes: Composite indexes
@@index([tenantId, status, createdAt])on Order, PrintJob, and Shipment models for efficient analytics queries. - Analytics TanStack Query hooks:
useOrderAnalytics,usePrintJobAnalytics,useShipmentAnalytics,useRevenueTrend,useOrderTrend,useEnhancedDashboardStatswith automatic refetching. - Bull Board queue dashboard: Integrated BullMQ job queue monitoring UI at
/admin/queueson the gateway, accessible only to admin users on the default tenant. - Help & Support admin tiles: Added external link tiles for Aikido Security, Bull Board queue dashboard, pgAdmin, Dozzle, and Sentry in Settings > Help & Support section, visible only to admin users on the default tenant.
- Per-service version & uptime display: Extended gateway
/health/servicesendpoint to include per-service uptime. AddedServiceHealthInfointerface andHealthServicesApiResponsetype indomain-contracts. Settings page now shows a "Service Versions" card with status badges, versions, and uptime for all microservices. - Shared service context utility:
setServiceName()/getServiceName()helpers inlibs/observabilityfor consistent per-service identification in Sentry. - Gateway proxy route for push notifications: Added missing
/api/v1/pushroute entry in gateway route config pointing to Order Service.
Fixed¶
- pnpm lockfile out of sync: Regenerated
pnpm-lock.yamlto include missingform-datadependency causingERR_PNPM_OUTDATED_LOCKFILEin CI. - Git fetch non-fast-forward in CI: Fixed Nx affected calculation by correcting
git fetchbehavior with force-ref syntax on self-hosted agents. - Gateway proxy unit tests: Fixed failing proxy service spec.
- Toast "New order arrived: undefined":
OrderCreatedEventnow includesshopifyOrderNumberso toast notifications display the actual Shopify order number. - Missing
ExclamationTriangleIconimport: Fixed lint error on the order detail page. - Integrations page
useEffectdependency warnings: WrappedfetchConnectedShopsinuseCallbackand added it to dependency arrays. - "View Order" button missing for flagged print jobs: Added
orderIdto theflagForReviewlog call so the "View Order" link appears forPRINT_JOB_NEEDS_REVIEWactivity log entries. - ECharts v6 TypeScript strict types: Fixed formatter callback types (
CallbackDataParams), graphic elementtextAlign→align, and event handler typing for ECharts v6 compatibility. - Microservice crash loops after deployment: Fixed NestJS dependency injection errors in order-service (missing
GridflockServiceClientinOrchestrationModule), print-service (missingAuditServiceinAuthModule), and shipping-service (missingIOrdersServiceinSendcloudModule). - Gridflock-service crash loop:
AuthModuledidn't provideAuditServicerequired byAuthController. - Push notification subscription failure: Missing gateway proxy route for
/api/v1/pushcaused 404 after monolith-to-microservices split. - Shipping label 404 returning 500: Fixed
createShipmentservice method to properly throwNotFoundExceptionfor non-existent orders; resolved the last failing acceptance test (95/95 now pass). - Sentry service identification: All 5 backend microservices had identical Sentry tags (
app: 'api'). Updated eachinstrument.tswith uniqueserviceandcomponenttags, and updatedSentryLoggerServiceto includeserviceattribute on every log entry. - Bull Board 403 on cross-subdomain access: Fixed session cookie issue by adding nginx proxy rule for
/admin/queues, usingwindow.location.originfor the link, and enablingtrust proxyin gateway Express config. - CI pipeline code coverage not published: Moved
--coverageflag after--separator inpnpm nx run-manyso it reaches the test runners instead of being consumed by Nx. - Cosign attestation 401 Unauthorized: Pipeline attestation/verification jobs ran on MS-hosted agents where cosign couldn't authenticate with DigitalOcean registry. Fixed by specifying
pool: name: 'DO-Build-Agents'for all attestation jobs. - Unit test
--passWithNoTestsforwarding on self-hosted agent:--passWithNoTestswas not forwarded through the--separator to Jest, causing 5 projects with no test files to fail.
Changed¶
- Azure Pipelines: Rewritten for microservice architecture with parallel build/push stages for gateway, order-service, print-service, shipping-service, gridflock-service, and slicer; image signing (cosign) and SBOM generation (syft) for each service.
- Docker Compose staging: Updated for all new microservice containers with Traefik routing and service dependencies.
- Staging environment: Updated Traefik routing rules and environment variable template for all new services.
- Monolith API deprecated: Marked
apps/api/project.jsonas deprecated in favor of microservice architecture. - Shopify product picker modal: Updated to support expandable variant selection for multi-variant products.
- Product mapping form:
onSelectShopifyProductnow accepts an optional variant parameter. - Dashboard stat cards: Replaced simple stat cards with enhanced KPI tiles showing trend delta indicators (up/down arrows with day-over-day change values).
- Dashboard layout: Added analytics charts section (3 donut charts + 2 trend charts) between KPI tiles and existing lists, with responsive grid layout.
- Docker build cache optimization: Created
.dockerignoreto reduce build context from ~330MB to a few MB. OptimizedARGplacement to prevent cache-busting, replacedRUN chown -RwithCOPY --chown, switched to local BuildKit cache on self-hosted agent, and removeddocker builder prune -afthat was wiping cache after every deployment. - Microservice configuration cleanup: Trimmed
configuration.tsin print-service, shipping-service, and gridflock-service to remove copy-pasted monolith env vars each service doesn't use. - C4 component overview diagram: Refactored
C4_Component.pumlfrom monolithic detail view to inter-service ecosystem overview showing communication patterns between the 5 microservices. - C4 web component diagram: Updated
C4_Component_Web.pumlto reflect current state — new pages (Settings/Integrations, Admin/Users, Audit Logs), PWA components, shipping components, and permission-gated routes. - Pipeline unit test tuning: Added
--maxWorkers=2to limit parallel workers on self-hosted agents and reduce memory pressure.
Removed¶
- Deprecated
PackageApipipeline job: Removed the fully disabledPackageApijob and associatedapiAffectedvariable/detection logic fromazure-pipelines.yml, as the monolithic API was replaced by microservices per ADR-051.
Documentation¶
- ADR-050: Apache ECharts for Dashboard Analytics — decision, rationale, implementation details, alternatives considered, and test coverage.
- Updated research document status from "Research / Proposal" to "Implemented" with ADR-050 cross-reference.
- Updated
docs/03-architecture/research/README.mdwith ECharts entry. - Updated ADR with SimplyPrint history API integration details (history-based reconciliation, grace period, rate limiting, escalation).
- Updated
docs/04-development/real-world-testing.md: replaced "no backfill mechanism" warning with self-healing history reconciliation documentation. - Updated C4 architecture diagrams (Context, Container, Component API/Web, Domain Model, DTO Contracts, Deployment, Database) for microservice architecture.
- New sequence diagram
C4_Seq_10_GridFlockPipeline.pumlfor GridFlock STL generation pipeline. - Updated sequence diagrams: Shopify webhook, print job creation, print job sync, and fulfillment sequences for microservice routing.
- New state machine diagram
C4_Code_State_GridflockPipeline.pumlfor GridFlock job lifecycle. - Updated
prisma/ERD.pumlwith GridFlock entities. - Split monolithic GridFlock prompt into 6 focused part files (
docs/_internal/prompts/todo/prompt-gridflock-stl-generation-service-part1.mdthroughpart6.md). - New implementation prompts: inventory/stock management, GridFlock microservice architecture, EventCatalog architecture documentation.
- Created pipeline template
.azuredevops/pipelines/templates/setup-database.yml. - C4 component-level diagrams: 5 new per-microservice PlantUML diagrams —
C4_Component_Gateway.puml,C4_Component_OrderService.puml,C4_Component_PrintService.puml,C4_Component_ShippingService.puml,C4_Component_GridflockService.puml. - ClickHouse + Grafana logging research: Research document evaluating OpenTelemetry collector, ClickHouse storage, Grafana dashboards, log rotation, and backup strategy to DigitalOcean Object Spaces.
- Uptime Kuma monitoring setup guide: Comprehensive guide with import-ready JSON configuration for monitoring all 13 staging Docker containers.
Database¶
- Added
GridflockJobandGridflockPresetmodels with migration20260215100000_add_gridflock_tables.
Tests¶
- Added GridFlock service unit tests: feature guard, pipeline service, service, repository, cleanup service, internal controller, event publisher (7 test files).
- Added SimplyPrint history reconciliation tests: API client
getJobHistory()tests, reconciliation service history-based fallback tests (grace period, rate limiting, escalation, cleanup). - Added print service SimplyPrint service tests.
- Updated
push.service.spec.tsandorchestration.service.spec.tsforshopifyOrderNumberinOrderCreatedEvent. - Added
shopify-product-picker-modal.test.tsxunit tests for the product picker modal. - Updated
new-mapping-page.test.tsxfor variant selection behavior. - Added
analytics.repository.spec.ts— 11 tests covering all repository methods (groupBy, aggregate, raw SQL queries, date filtering, null handling). - Added
analytics.service.spec.ts— 13 tests covering business logic (percentage calculations, zero-division guards, period date filtering, enhanced stats with comparison deltas). - Added
analytics.controller.spec.ts— 7 tests covering all 6 endpoints with tenant scoping and period param passthrough. - Added
use-analytics.test.tsx— 14 hook tests covering all 6 analytics hooks (loading state, success data, period passthrough, delta values). - Added MSW handlers for all 6 analytics API endpoints with mock data factories.
- Added gateway route config test for
/api/v1/pushroute mapping to order-service. - All 95 Gherkin acceptance tests passing on staging after shipping label 404 fix.
0.11.0 - 2026-02-12¶
Added¶
- Order "Needs Attention" status: Orders with stuck or failed print jobs are now flagged with a "needs attention" indicator; new filter, badge, and dashboard UI for quick operator triage.
- Shopify Fulfillment Orders API: Fulfillment service now uses the Shopify Fulfillment Orders API (
getFulfillmentOrders) instead of the deprecated fulfillment endpoint, with new OAuth scopesread_merchant_managed_fulfillment_ordersandwrite_merchant_managed_fulfillment_orders. - Service point delivery: End-to-end support for Sendcloud service point delivery — Prisma schema,
note_attributesparsing from Shopify orders, Sendcloud parcel creation with service point fields, and shipping info display on the order detail page. - "Select from Shopify" product picker: Product mapping form now offers a Shopify product picker to select products directly instead of manual data entry.
- Settings Integrations page: New UI page for managing Shopify OAuth connections (
/settings/integrations). - Activity log and audit log clearing: Admin endpoints and UI ("Clear All" button) for clearing event logs and audit logs, gated behind new
logs.writeandaudit.writepermissions. - Stuck job monitor:
StuckJobMonitorServicedetects and resolves stuck print jobs with configurable thresholds; admin API endpoints for force-status, stuck-job listing, and threshold management. - SimplyPrint
job_unassignedwebhook: New webhook event handler for unassigned print jobs with reconciliation support. simplyprintQueueItemIdtracking: New Prisma field onPrintJobfor tracking SimplyPrint queue item IDs, enabling accurate job-to-queue mapping.- Product mapping activate/deactivate: Replaced boolean
isActivewith explicit activate/deactivate actions across API, domain, and web layers. - Settings page enhancements: Frontend version display and PWA sync information.
- Route preloading: Lazy route preloading and
<link rel="preload">hints for faster dashboard navigation (Lighthouse performance optimization). - Configurable
SIMPLYPRINT_API_URL: SimplyPrint base URL is now configurable via environment variable. - Shopify theme: Storefront theme in
deployment/shopify-theme/with design system, sections, templates, and logos. - Penetration testing research: Methodology document (
docs/03-architecture/research/penetration-testing-research.md) covering staging pen-test tools, reports, and NIS2 compliance. - Disaster recovery research: Research document (
docs/03-architecture/research/disaster-recovery-research.md) for backup and recovery planning. - Marketing research: Research document (
docs/03-architecture/research/marketing-research.md) covering product photoshoot, webshop copy, Instagram content, and blog strategy.
Fixed¶
- Shopify fulfillment error: Fulfillment service now uses the Fulfillment Orders API, resolving errors caused by the deprecated fulfillment endpoint.
- Shopify webhook route mismatch: Fixed 404s caused by Shopify posting to
/shopify/webhookswhile the API expected/api/v1/webhooks/shopify; updated webhook guard, service, and routes. - Product mapping edit mode: Fixed edit form not loading existing mapping data correctly.
- SimplyPrint job ID release: Relaxed
releaseSimplyPrintJobIdto allow release from active jobs (QUEUED/ASSIGNED/PRINTING), fixing "Cannot release simplyPrint.JobId" errors when the same file is queued multiple times. - Cancelled orders excluded from "Needs Attention": CANCELLED orders no longer appear in the needs-attention filter or failed print job counts.
- Fulfillment error status transition: Fulfillment error handler no longer incorrectly transitions an order from COMPLETED to FAILED; status update wrapped in try/catch.
- SimplyPrint webhook guard: Made
X-SP-Tokenverification optional whenSIMPLYPRINT_WEBHOOK_SECRETis not configured. - Shopify backfill OAuth: Fixed API request handling for OAuth-connected shops during backfill.
Changed¶
- Shopify OAuth scopes: Added
read_merchant_managed_fulfillment_ordersandwrite_merchant_managed_fulfillment_ordersscopes toshopify.app.tomland configuration. - Acceptance tests: Global setup/teardown now persists seeded data to JSON for cross-worker sharing; product mapping steps use activate/deactivate instead of
isActive. - Default Shipping Method docs: Updated to point to Verzenden (Shipping) instead of Settings → Integrations, with API-based shipping method ID lookup.
- Order detail page: Added "Force status" button for resolving stuck print jobs.
Documentation¶
- Updated
docs/04-development/real-world-testing.mdwith Shopify webhook URL configuration, SimplyPrint webhook process, Sendcloud test mode, and service point delivery setup. - Updated
docs/05-deployment/staging-deployment-guide.mdwith OAuth and webhook environment variables. - Updated
docs/04-development/keys-certificates-inventory.mdwith webhook secrets and fulfillment scopes. - Updated runbook with Shopify theme installation instructions and stuck job troubleshooting.
- Updated architecture docs (ADR, C4 models, sequences, ERD) for needs-attention flow and fulfillment orders.
Database¶
- Added
simplyprintQueueItemIdfield toPrintJobmodel with migration.
Tests¶
- Updated fulfillment service tests for Fulfillment Orders API flow.
- Updated SimplyPrint service, reconciliation, and webhook tests for
job_unassignedandsimplyprintQueueItemId. - Updated print job service, repository, and controller tests for queue item tracking.
- Updated orders repository tests for needs-attention filter and
hasFailedJobs. - Updated product mapping tests for activate/deactivate (removed
isActivefrom specs and mocks). - Updated acceptance tests with seeded data persistence and activate/deactivate product mapping flows.
- Updated push notification and notification service tests.
0.10.0 - 2026-02-03¶
Added¶
- Shopify OAuth 2.0 Authentication: Full OAuth flow implementation replacing legacy static API keys for multi-shop support (ADR-048).
- OAuth authorization flow with CSRF protection (
/api/v1/shopify/oauth/authorize,/api/v1/shopify/oauth/callback) - Encrypted token storage using AES-256-GCM with HMAC verification
- Automatic token refresh for expiring tokens (24-hour threshold)
- App uninstall webhook handler with HMAC verification
- Admin endpoints for shop management (
/api/v1/shopify/oauth/shops,/api/v1/shopify/oauth/status) - Multi-shop backfill support: Enhanced
ShopifyBackfillServiceto support both legacy mode and OAuth-connected shops with per-shop watermarks. - Third-party CLI & MCP server research: Added research document (
docs/03-architecture/research/third-party-cli-mcp-research.md) documenting CLI and MCP server availability for Shopify, SendCloud, and SimplyPrint. - GridFlock feasibility study: Added research document for STL generation service (
docs/03-architecture/research/gridflock-feasibility-study.md). - SimplyPrint emulator feasibility study: Added research document for virtual printer testing (
docs/03-architecture/research/SimplyPrint-emulator-feasibility-study.md). - AI agent cluster feasibility study: Added research document for PicoCluster with OpenClaw (
docs/03-architecture/research/ai-agent-cluster-feasibility-study.md). - Design documentation: Added
docs/09-design/folder with Shopify storefront mockups and design notes.
Changed¶
- Shopify API upgraded to 2026-01: Updated all Shopify API calls to use the latest API version.
- ShopifyApiClient: Added
requestForShop()andrequestForShopByDomain()methods for per-shop token support while maintaining backward compatibility with legacy static token mode. - Container registry cleanup: Improved error handling and resilience in
scripts/cleanup-registry.sh. - Docker build process: Enhanced Docker image builds for API and Web with optimized multi-stage builds.
- Documentation site: Updated Dockerfile for PlantUML integration and optimized rendering process.
- Real-world testing docs: Updated Shopify app creation instructions for Dev Dashboard (legacy custom apps deprecated as of January 1, 2026).
Documentation¶
- ADR-048: Shopify OAuth 2.0 Authentication decision documenting the migration from static API keys to OAuth.
- Updated
docs/04-development/real-world-testing.mdwith OAuth setup instructions. - Updated
docs/04-development/runbook.mdwith OAuth troubleshooting section. - Updated
docs/04-development/security-audit-checklist.mdwith OAuth-specific security checks. - Updated C4 diagrams with ShopifyShop entity and OAuth sequence diagram (
C4_Seq_09_ShopifyOAuth.puml). - Updated research README with all feasibility studies.
Database¶
- Added
ShopifyShopmodel for storing OAuth-connected shop credentials with encrypted tokens. - Migration
20260128000000_add_shopify_oauthfor new ShopifyShop table.
Tests¶
- Added
ShopifyTokenServiceunit tests for token encryption, decryption, and refresh. - Added
ShopifyOAuthControllerunit tests for OAuth flow endpoints. - Updated
ShopifyBackfillServicetests for multi-shop backfill support.
0.9.0 - 2026-01-27¶
Added¶
- Role-Based Access Control (RBAC): Full multi-user authentication with session-based login, Argon2id password hashing, and permission-based authorization.
- User Management UI: Admin interface to create, edit, and deactivate users with role assignment (accessible via Settings → Administration for users with
users.read/users.writepermissions). - Audit Logs UI: Admin page (
/admin/audit-logs) displaying security-relevant events with filtering by user, action type, and date range (requiresaudit.readpermission). - Predefined Roles: Four built-in roles (
admin,operator,viewer,legacy-admin) with appropriate permission bundles. - Session Authentication: HTTP-only cookie-based sessions with PostgreSQL session store, replacing API key requirement for dashboard access.
- Tenant-Ready Architecture: All entities include
tenantIdfor future multi-tenant support; single default tenant for current operations. - Security Auditing:
AuditLogtable captures authentication events, permission changes, and security-relevant actions. - Shopify order backfill service for downtime recovery: scheduled job polls Shopify Orders API to catch orders missed during webhook delivery failures (configurable via
SHOPIFY_BACKFILL_ENABLED,SHOPIFY_BACKFILL_BATCH_SIZE). - Admin endpoints for Shopify backfill management (
GET /api/v1/admin/shopify/backfill/status,POST /api/v1/admin/shopify/backfill/trigger,POST /api/v1/admin/shopify/backfill/reset). SystemConfigServicefor durable key-value storage of operational state (backfill watermarks, etc.).- SimplyPrint webhook idempotency using database-backed deduplication (reuses
ProcessedWebhooktable). - SimplyPrint job reconciliation service: scheduled job (every minute) that syncs print job statuses with SimplyPrint API to catch missed webhooks (configurable via
SIMPLYPRINT_RECONCILIATION_ENABLED). - SendCloud webhook receiver for real-time shipment status updates (
POST /webhooks/sendcloud) with HMAC-SHA256 signature verification (configurable viaSENDCLOUD_WEBHOOK_SECRET). - SendCloud shipment reconciliation service: scheduled job (every 5 minutes) that polls SendCloud API to catch missed webhook updates (configurable via
SENDCLOUD_RECONCILIATION_ENABLED). IShipmentsService.findBySendcloudParcelId()method for parcel ID lookups.- Structured event logging for
ShipmentsService(shipment.created,shipment.status_changed,shipment.cancelled,shipment.tracking_updated,shipment.label_generated). - CI/CD: docs image now receives staging and production promotion attestations (parity with API and Web images).
- Container registry cleanup script (
scripts/cleanup-registry.sh) now processesforma3d-connect-docsrepository and uses promotion-aware cleanup logic.
Fixed¶
- Push subscriptions: validated input for subscription cleanup endpoints to prevent a NoSQL-injection style payload from reaching Prisma filters.
- SSL certificate configuration for PostgreSQL session store in staging/production environments.
- Webhook guard tests: fixed mocks to use
configService.get()instead ofgetOrThrow().
Changed¶
- Acceptance tests (Playwright BDD): removed flaky
networkidlewaits and tightened step synchronization; re-enabled previously skipped flaky scenarios in orders + product mappings UI specs. - Orders page (
/orders) now supports client-side search filtering (order number, customer name, email), aligning UI behavior with acceptance coverage. - Observability: Sentry sampling is now configurable via env vars with safer production defaults (10% traces/profiles by default), and staging env template documents
SENTRY_TRACES_SAMPLE_RATE/SENTRY_PROFILES_SAMPLE_RATE(plusVITE_SENTRY_TRACES_SAMPLE_RATEfor the web build). - Backend robustness: runtime validation added for Prisma
Jsoncolumns (shippingAddress, print profiles, event metadata), and remaining generic error throws were replaced with typedDomainErrorvariants where applicable. - External integrations: API client timeouts and webhook idempotency retention are now configurable via
ConfigService(apiTimeout.*,webhook.idempotencyRetentionHours). - Container registry cleanup: improved retention logic to preserve currently-deployed images and promotion-attested images, with docs repository now included.
- C4 context model updated to include SendCloud (shipping) and Sentry (observability) as external systems.
Security¶
- Backend API: enforce
X-API-Keyauthentication globally for all endpoints except/health/**and external webhook receivers; removed the "allow whenINTERNAL_API_KEYis missing" bypass (fail-closed). - Real-time updates: secured Socket.IO
/eventsnamespace with the same internal API key. - SimplyPrint inbound webhooks: require
SIMPLYPRINT_WEBHOOK_SECRET(fail-closed) for webhook verification. - RBAC Guards:
SessionGuardandPermissionsGuardenforce authentication and authorization on all protected routes. - Password Security: Argon2id hashing with automatic rehashing on algorithm/parameter updates.
Documentation¶
- ADR-047: Two-Tier Logging Strategy documenting Application Logs (Pino), Business Events (EventLog), and Security Audit (AuditLog).
- User manual updated with Audit Logs page documentation and new screenshots.
- Updated
docs/04-development/AI-implementation-advantage.mdwith real cost data from January 2026.
Tests¶
- Added missing Nest controller unit tests across API modules (Shopify, Sendcloud, SimplyPrint webhook, Product Mappings, Event Log, Observability, Cancellation, Test Seeding, App).
- Added User Management UI unit tests (
UserFormModal,ChangePasswordModal,UsersPagecomponent tests). - Added
ShipmentsServiceevent logging unit tests (create, status change, cancel, tracking update, label generation). - Added Audit Logs controller tests and acceptance test coverage.
0.8.0 - 2026-01-21¶
Added¶
- User manual in
docs/08-user-manual/with automated screenshot capture intodocs/assets/user-manual/viascripts/capture-user-manual-screenshots.ts. - Product-mapping "part library" API for reusing parts at scale:
GET /api/v1/product-mappings/parts(search + pagination by parts). - "Use existing" part picker in the Product Mapping form (
/mappings/new,/mappings/:id/edit) with search and Prev/Next pagination.
Changed¶
- Product mappings now always model printable Parts: creating/updating a mapping requires at least 1 part, and the UI no longer offers "Single Part vs Assembly".
- Print job creation now always iterates mapping parts (a single-part product is a mapping with exactly 1 part).
Removed¶
ProductMapping.isAssemblyremoved from the database schema and API/domain contracts.
Documentation¶
- Updated
prisma/ERD.pumland related docs to reflect the "always parts" model.
Tests¶
- Added/updated unit + acceptance coverage for copying an existing part into a new mapping and for the parts library query/pagination.
0.7.1 - 2026-01-20¶
Added¶
POST /api/v1/push/testtest endpoint to send a Web Push notification to all subscribed clients (excluded and blocked in production).
0.7.0 - 2026-01-19¶
Added¶
- Progressive Web App (PWA) support for the dashboard (manifest, service worker caching, install/update prompts).
- Web Push notifications end-to-end (push subscription persistence, backend push service, frontend subscription flow).
- VAPID-based server configuration for Web Push (
VAPID_PUBLIC_KEY,VAPID_PRIVATE_KEY,VAPID_SUBJECT). - Offline-first UX (IndexedDB caching, queued actions for later sync, online/offline indicators).
Changed¶
- Dashboard experience optimized for mobile and "app-like" usage (install guidance, pull-to-refresh, app badges where supported).
0.6.0 - 2026-01-18¶
Added¶
- Production hardening: added operational documentation (runbook, troubleshooting, environment setup, keys/certificates inventory, security audit checklist).
- Load testing integrated into CI/CD (optional LoadTest stage with
runLoadTestsandloadTestBaselineModeparameters; k6 thresholds and baseline mode).
Security¶
- Dependency vulnerability remediation:
@remix-run/router1.22.0 → 1.23.2 (CVE-2026-22029)react-router-dom6.29.0 → 6.30.3 (CVE-2025-68470)- Removed vulnerable transitive
axios@0.21.4via pnpm override (CVE-2025-27152)
Changed¶
- Health checks and diagnostics improved for external integrations and runtime dependencies.
0.5.0 - 2026-01-16¶
Added¶
- Sendcloud shipping integration:
- Shipment persistence (
Shipmentmodel +ShipmentStatus) - Sendcloud API client + shipping service listening to
order.ready-for-fulfillment - Shipment/shipping endpoints and dashboard shipping UI (label download, regenerate, cancel)
- Shipping acceptance coverage (
apps/acceptance-tests/src/features/shipping.feature).
0.4.0 - 2026-01-14¶
Added¶
- Dashboard MVP foundation:
- UI component kit (
Button,Badge,Card,Input,Select,Modal,Pagination,LoadingSpinner,EmptyState) - Auth context (API key storage) and protected routing
- TanStack Query integration and extended API client
- Order management UI (
/orders,/orders/:id) with manual actions (retry print job, cancel order). - Product mapping UI (
/mappings,/mappings/new) including assembly parts editor for multi-part products. - Activity logs UI (
/logs) with filtering + CSV export. - Real-time updates via Socket.IO (backend
EventsGateway, frontendSocketProvider, toast notifications).
0.3.0 - 2026-01-14¶
Added¶
- Fulfillment automation loop (print completion → Shopify fulfillment) with a manual "force fulfill" path.
- Cancellation handling (Shopify cancel → cancel/flag SimplyPrint jobs; operator notifications for edge cases).
- Retry queue with exponential backoff + jitter and operator notification for repeated failures.
0.2.0 - 2026-01-13¶
Added¶
- SimplyPrint core integration:
apps/api/src/simplyprint/(API client, webhook controller, token guard, DTOs)apps/api/src/print-jobs/(create/update/cancel/retry + REST endpoints)apps/api/src/orchestration/(order-to-job orchestration andorder.ready-for-fulfillment)- Print job endpoints:
GET /api/v1/print-jobs,GET /api/v1/print-jobs/active,GET /api/v1/print-jobs/:idGET /api/v1/print-jobs/order/:orderIdPOST /api/v1/print-jobs/:id/cancel,POST /api/v1/print-jobs/:id/retryPOST /webhooks/simplyprint
0.1.3 - 2026-01-12¶
Added¶
apps/acceptance-tests/Playwright + Gherkin test project (playwright-bdd).- Feature coverage for staging verification:
health-check.featureapi-docs.feature(Swagger UI + OpenAPI spec)web-dashboard.feature(dashboard smoke tests)- CI integration: acceptance test stage that publishes JUnit results and HTML report artifacts.
0.1.2 - 2026-01-10¶
Added¶
- Automated staging deployment:
apps/api/Dockerfile+apps/web/Dockerfile(multi-stage)apps/web/nginx.conffor SPA routingdeployment/staging/docker-compose.yml,deployment/staging/traefik.yml,deployment/staging/deploy.sh,deployment/staging/env.staging.template- CI/CD pipeline extended with Docker packaging and staging deploy (including migration handling).
0.1.1 - 2026-01-10¶
Added¶
- Full-stack observability (Sentry error tracking + performance monitoring, OpenTelemetry tracing, structured JSON logging with correlation IDs).
- Frontend error boundaries and shared observability utilities.
0.1.0 - 2026-01-09¶
Added¶
- Shopify inbound integration:
- Shopify Admin API client (
apps/api/src/shopify/shopify-api.client.ts) including rate-limit retry - Webhook receiver at
POST /api/v1/webhooks/shopify(orders/create, orders/updated, orders/cancelled, orders/fulfilled) - Orders API (
/api/v1/orders) and Product Mapping API (/api/v1/product-mappings) - Order persistence with idempotency, validated status transitions, event emission, and audit/event logging.
- Product mapping system with assembly parts support and unmapped SKU detection.
- OpenAPI/Swagger API documentation.
Security¶
- Webhook authenticity verification (HMAC validation) and defensive handling for idempotency and replay/duplication scenarios.
0.0.0 - 2026-01-09¶
Added¶
- Nx monorepo foundation (
apps/api,apps/web, shared libraries) with strict TypeScript and workspace linting. - PostgreSQL + Prisma schema (orders, line items, print jobs, product mappings/assemblies, event logs, system config, printers).
- CI pipeline scaffolding and environment configuration templates.