Skip to content

System Need Analysis

This page captures the System Need Analysis (SA) viewpoint from the Arcadia method — defining what the system must do and what it interacts with, without prescribing how. It sits between operational scenarios (what users need) and logical architecture (how the system is decomposed).

The system boundary is defined using BFO/IOF categories: what’s inside is composed of EngineeredSystems (IOF), Information Bearing Entities (IAO), and Processes (BFO). What’s outside includes external EngineeredSystems and Persons bearing Roles (CCO/BFO).

graph LR
    subgraph "External EngineeredSystems"
        SHOP[Shopify Admin API]
        DROP[Dropbox]
        GSSO[Google SSO]
    end

    subgraph "BluntDashboard (EngineeredSystem Composite)"
        UI[Dashboard UI]
        API[API Layer]
        BG[Background Jobs]
        DB[(Database — IBEs)]
        OBJ[(R2 — IBEs)]
    end

    subgraph "Persons bearing Roles"
        OPS[Ops / Creative / Fulfillment / Design]
    end

    OPS -->|browse, configure| UI
    UI -->|HTTP| API
    API -->|read/write| DB
    API -->|enqueue| BG
    BG -->|read/write| DB
    BG -->|upload/archive| OBJ
    BG -->|bulk query| SHOP
    BG -->|download assets| DROP
    BG -->|write metafields| SHOP
    GSSO -->|JWT assertion| API

Inside the system (EngineeredSystems + IBEs)

Section titled “Inside the system (EngineeredSystems + IBEs)”

[IOF: EngineeredSystem | IAO: Information Bearing Entities (persistent storage)]

  • Dashboard React UI (Vite, shadcn/ui, React Query)
  • API layer (Hono on Cloudflare Workers) — EngineeredSystem
  • Background jobs (queue consumers + cron handlers) — EngineeredSystem
  • PlanetScale PostgreSQL — IBEs carrying all persistent ICEs
  • Cloudflare R2 — IBEs carrying design assets, JSONL archives, document artifacts
  • In-app CSV import/export

Outside the system (external EngineeredSystems)

Section titled “Outside the system (external EngineeredSystems)”
DependencyProtocolDirectionAuthOntological type
Shopify Admin APIGraphQL + RESTRead orders/products; write metafieldsPermanent offline access tokenExternal EngineeredSystem (IOF)
DropboxHTTPS (share links)Read-only asset downloadNone (public share links, dl=1)External EngineeredSystem (IOF)
Cloudflare AccessJWT headerInbound auth gateGoogle SSOExternal EngineeredSystem (IOF)
Cloudflare HyperdriveTCP (pooled)DB connectivityBinding credentialEngineeredSystem (IOF)

[CCO: Person | BFO: bears Role]

RoleBFO TypeTypical interactions
OperationsRole (BFO)Configure objective specifications, trigger syncs, monitor health
CreativeRole (BFO)Manage creative act reports, create plan specifications, classify tags
DesignRole (BFO)Assigned to tags via agent role assignments for attribution
FulfillmentRole (BFO)Monitor fulfillment metrics, look up commercial transaction records
SourceDataMethodFrequencyOntological character
ShopifyOrders, line items, products, tags, vendorsGraphQL bulk ops + RESTDaily cron + manualIBEs carrying Process Records + MaterialArtifact data
DropboxDesign asset files (PNG, JPG, PDF, etc.)HTTP download from share linksOn-demand (staff-initiated)IBEs carrying ICEs (design assets)
Staff (UI)Combo logs, tag classifications, designer assignments, classification settings, export requestsHTTP POST / CSV uploadInteractiveICEs, Objective Specifications, Agent Role Assignments
DestinationDataMethodOntological character
Shopifycustom.production_asset_url metafield (R2 URL for design assets)REST PUTIBE reference (pointer to R2-hosted ICE)
R2 → StaffCSV exports, design assetsDownload via R2 public URLDocument Artifacts + ICEs via IBEs
Dashboard UIPerformance metrics, tag analytics, combo logs, fulfillment stats, order lookupsHTTP GET (JSON)Measurement Data, ICEs, Creative Act Reports, Process Records
Cloudflare LogsStructured JSON logs, run historyWorkers Logs + optional LogpushProcedureExecution status observations
OwnerDataOntological character
Shopify (source of truth)Products, orders, inventory, base product data, fulfillment statusMaterialArtifact attributes, Process Records (commercial transactions)
BluntDashboard (system-owned)Performance classifications, tag groups, designer assignments, combo logs/templates/suggestions, ingest run history, R2 assetsNominal Classifications, ICE Collections, Agent Role Assignments, Creative Act Reports, Plan Specifications, Suggestion ICEs, ProcedureExecution Records
Staff (human-created)Classification rules/thresholds, tag categorizations, combo definitionsObjective Specifications, Tag ICEs, Plan Specifications (authored by Persons bearing Roles)
RequirementTargetMeasurement
CRUD endpoint latencyp99 < 200msWorkers analytics
Daily sync duration< 15 minutesprocedure_execution_record.process_completed_at - process_initiated_at
Mart freshness< 2 hours staleperformance_measurement_dataset.last_refreshed
Search response< 500msEnd-to-end including DB query
RequirementTargetMechanism
Sync runs daily without intervention100% scheduledCron Trigger + queue retry (3 attempts)
Transient failures don’t lose dataRetry + resumeWatermark-based restart; JSONL archived before parse
Poison messages don’t block queueDLQ isolationDead-letter queue for unprocessable messages
Data is recoverableR2 archivesRaw JSONL (IBEs) stored in R2 for replay
RequirementNotes
Staff-hours availabilityInternal tool — no 24/7 SLA required
Graceful degradationStale mart data is acceptable; sync will catch up
Rollback capabilityDNS revert < 5 min; PlanetScale branch restore
RequirementImplementation
No unauthenticated endpointsCF Access gate on all routes
No hardcoded credentialsWrangler secrets + Worker bindings (no .env in code)
Single auth planeCF Access with Google SSO (replaces dual Passport + Supabase Auth)
No RBAC in v1All authenticated staff have equal access
Audit trailprocedure_execution_record tracks every sync; R2 archives raw data
ConstraintValueDesign response
GraphQL cost budget50 pts/sec restored, ~1000 pt bucketBulk operations for high-volume reads
Bulk operation concurrency1/shop (API < 2026-01), 5/shop (>= 2026-01)Queue orchestration with retry on “already running”
REST pagination250 items/pageCursor-based pagination
Bulk op result retention7 daysDownload promptly after completion

See PlanetScale Constraints for the full table. Key limits:

ConstraintValueDesign response
Rows per query100kCursor-based pagination
Rows per statement100kChunked batch writes
Transaction timeout20sShort, independent transactions
ConstraintValue
CSV combo import2 MB
Template import3 MB
Asset file typesPNG, JPG, JPEG, GIF, WEBP, SVG, ICO, BMP, PDF
ConditionSeverityThreshold
Sync not completedCriticalNo completed run in 26 hours
Sync durationWarning> 15 minutes
DLQ messagesCriticalAny message in DLQ
Queue retriesWarning> 10 retries/hour
API error rateCritical> 5% 5xx in 5-minute window
Mart stalenessWarning> 2 hours since last refresh

See Observability for the full alerting strategy.