v1 Roadmap
This roadmap turns the v1 line into a sequence of semantic versions so the team can reason about delivery scope, acceptance, and dependencies with more precision.
v1.0.0 — Architecture Baseline / Contract Freeze
Goal
Lock down the backend, data, and API baseline required for all later v1 work.
Scope
- confirm Laravel as the long-term backend runtime
- freeze the P0 API surface and response conventions
- freeze core MariaDB entity semantics and state transitions
- consolidate project documentation into the Docusaurus site
Primary deliverables
- Laravel-backed P0 API contract baseline
- documented data model and state machine baseline
- Docusaurus documentation site with English default and Simplified Chinese i18n
- GitHub Pages workflow for docs publishing
Exit criteria
- the team agrees on the long-term stack direction
- P0 API and state semantics are documented in one stable location
website/builds successfully and becomes the documentation source of truth- frozen response conventions include unified list
meta, includingGET /api/samples/{id}/results - sample P0 state advancement is explicitly backend-owned for result intake
- initialization includes an idempotent seeded core-chain verification example
v1.1.0 — Frontend Transition Foundation
Goal
Prepare the business frontend to move toward a Laravel API + React/TypeScript SPA mainline.
Scope
- define the transition target from the current frontend phase to the SPA mainline
- identify API consumption boundaries required by the new frontend
- keep deployment assumptions aligned with Nginx and Compose
- ship a minimal React/Vite workspace skeleton without replacing the current Nuxt runtime
Primary deliverables
- documented frontend transition baseline
frontend-spa/React + TypeScript + Vite scaffold- API integration assumptions for the new SPA
- deployment notes covering static asset serving through Nginx
- target static build and container examples that do not break the current Compose line
Exit criteria
- the frontend direction is unambiguous for the delivery team
- no critical product area depends on SSR-specific behavior
- the target integration contract for the SPA is documented
- the repository contains a buildable SPA baseline with configurable
VITE_API_BASE - the Nuxt implementation remains available for the current running path during transition
v1.2.0 — Core Workspace Completion
Goal
Complete the core internal workspace around inspection tasks, samples, results, exceptions, and summary views.
This is the version where the React/Vite frontend is expected to move beyond the transition skeleton and take on the main core workspace delivery.
Scope
- inspection task list, detail, and minimum actions
- sample list, detail, and creation flow
- sample result entry and retrieval
- exception creation and resolution
- dashboard summary integration
Primary deliverables
- a usable internal workspace for day-to-day MVP operations
- connected P0 UI flows against Laravel APIs
- stable user paths through task, sample, result, and exception workflows
Exit criteria
- users can complete the core P0 chain without placeholder-only pages
- key list/detail/action flows are operational against live APIs
- failure and empty states are addressed for core pages
v1.3.x correction
The default Compose/Nginx runtime now serves the React/Vite SPA, completing the practical frontend cutover that v1.2.0 intended. The old Nuxt implementation remains available as repository reference material, not the default runtime.
v1.3.0 — Async Analysis Loop
Goal
Make analysis jobs a real, traceable async execution loop instead of a static record system.
Scope
- create and track analysis jobs
- preserve Redis as the async boundary
- run Python worker processing against queued jobs
- write back success, failure, retry, and summary states
Primary deliverables
- working
analysis_jobslifecycle flow - Python worker execution path for supported job types
- retry semantics that preserve failed history and create new queued jobs
- operational visibility into running and failed analysis work
Exit criteria
- analysis jobs move through their defined lifecycle with traceable status changes
- failed tasks can be retried without mutating historical failed records
- users can see useful status and next-step guidance after completion
v1.3.0 implementation note
The v1.3 line uses MariaDB as the durable analysis_jobs source of truth and Redis as the worker handoff boundary. Laravel stores the job row, pushes a compact payload to ANALYSIS_JOB_REDIS_QUEUE, and the Python worker consumes that queue before calling the Laravel API to start, succeed, or fail the job. The worker still keeps the HTTP queued-list path as a compatibility fallback for older environments.
v1.3.x — Frontend Usability and Componentization Follow-through
Goal
Turn the default SPA from a connected MVP workspace into a maintainable React 19 operational console.
Scope
- make language switching explicit and visible in the workspace header
- replace the single-canvas workspace with section navigation for Overview, Tasks, Samples, Results, Exceptions, and Analysis
- split the frontend into reusable workspace components, feature panels, and a dedicated workspace state/API hook
- standardize
frontend-spa/local development and container build commands onpnpm - keep i18n resources as the only place for user-facing SPA labels
- unify the visual language around Mantine theme tokens plus Tailwind utility classes, rather than scattered one-off CSS
Primary deliverables
App.tsxreduced to composition rather than business logic and form orchestration- shared components under
src/components/workspace/ - workspace feature code under
src/features/workspace/ - committed
pnpm-lock.yamlfor reproducible SPA installs - updated Docker build path using
pnpm install --frozen-lockfileandpnpm run build - documented frontend visual standards for typography scale, color palette, border radius, shadows, layout density, and anti-patterns to avoid
Exit criteria
- users can find the Chinese/English language switch without hunting through dense controls
- each major workspace capability is reachable through a clear section tab
- no new v1.3.x workspace feature requires appending another large block to
App.tsx pnpm run buildsucceeds infrontend-spa/websitedocumentation remains synchronized in English and Simplified Chinese- new SPA UI work follows the documented Mantine/Tailwind design language instead of introducing ad hoc gradients, oversized typography, or inconsistent radii
v1.4.0 — Governance and Operations
Goal
Add the governance and runtime controls required for a more dependable internal system.
Scope
- authentication and identity injection strategy
- baseline RBAC
- audit trail improvements
- operational runbooks and validation routines
Primary deliverables
- a documented and implementable auth direction
- baseline role and permission model
- clearer audit expectations for sensitive actions
- improved operational guidance for deployment and maintenance
Exit criteria
- the system has a clear path away from manually supplied identity fields
- high-value actions have defined audit expectations
- operators have stable documentation for common runtime tasks
v1.4.0 implementation note
The v1.4 line introduces SPA token login through POST /api/auth/login, baseline RBAC permissions for high-value mutation routes, and an audit_events table for task, sample, result, exception, and analysis-job actions. Legacy payload identity fields remain accepted for attribution compatibility, but protected user mutations require Authorization: Bearer <token>. X-Ocean-Actor-Id remains only as an internal transition bridge for non-SPA tooling, and the Python worker uses a separate internal worker bridge until a stronger worker credential is introduced.
v1.4.1 — Settings and User Management Consolidation
Goal
Consolidate scattered operational preferences and user identity controls into first-class SPA pages before expanding additional governance features.
Scope
- add a Settings page as the single user-facing entry point for workspace-level options that are currently scattered across the shell and feature panels
- add a Users page for administrators to view, create, edit, activate/deactivate, and inspect role assignments for internal users
- add a personal profile path for the current user to review account information and update safe self-service fields
- keep permission-sensitive user mutations in Laravel with RBAC and audit coverage rather than implementing client-only controls
- decide which preferences are local-only UI preferences and which require backend persistence before development starts
Primary deliverables
- SPA navigation entries for Settings and Users
- documented Settings information architecture, including language, display, workspace behavior, and future notification/import-export placeholders
- documented user-management API contract for admin-managed user updates and current-user profile updates
- backend user-management endpoints guarded by baseline RBAC
- audit events for sensitive user administration actions such as role changes, activation changes, and password resets once those actions are implemented
Exit criteria
- language and other workspace preferences no longer feel hidden inside unrelated controls
- admins have one clear page for user administration instead of relying on seeded data or ad hoc backend changes
- non-admin users can see their own identity and profile details without gaining administrative user-management permissions
- all user mutations are validated and authorized by Laravel
- English and Simplified Chinese docs describe the Settings/User Management scope before implementation is marked complete
v1.4.1 implementation note
v1.4.1 ships Settings and Users as first-class SPA tabs. Settings combines current-user profile editing, language preference, display density, default workspace tab, and runtime/auth summary. Users gives administrators one page for user listing, filtering, creation, profile/status/password edits, role replacement, activation, and deactivation. Laravel owns all mutations through token-authenticated APIs, persists user preferences in user_preferences, and records audit events for user administration, profile updates, and settings updates. Non-admin users can update their own profile/settings but cannot access administrative user management.
v1.4.2 — Production App Image and Worker Naming
Goal
Make production deployment easier by packaging the main web application into one deployable image and making service names reflect product responsibilities instead of implementation languages.
Scope
- add a production
ocean-appimage that combines Nginx, PHP-FPM, Laravel API code, Composer production dependencies, and the built React/Vite SPA - keep MariaDB and Redis as separate stateful infrastructure services
- keep the async analysis worker as a separate runtime service, but rename the current
pythonservice to a responsibility-oriented name such asanalysis-worker - make the analysis worker image self-contained enough for production by copying worker source and required model/runtime assets instead of relying on development bind mounts
- preserve the Redis boundary between Laravel and the analysis worker
- define a production Compose profile or production Compose file that uses the combined app image while keeping local development ergonomics clear
Primary deliverables
docker/app/Dockerfileor equivalent multi-stage production Dockerfile for Laravel + SPA- production Nginx config that serves SPA assets directly and routes
/api/to Laravelpublic/index.phpthrough local PHP-FPM - app entrypoint or supervisor configuration for running Nginx and PHP-FPM in the same app container
- Compose changes introducing an
appservice for production and renaming the worker-facing service frompythontoanalysis-worker - a production-ready analysis worker image path, or an explicit documented follow-up if model packaging remains external
- updated operations documentation covering migration execution, storage volumes, worker API base URL, and the renamed services
Exit criteria
- production deployment can run the main web app from one immutable image without bind-mounting
backend/orfrontend-spa/ - the deployment topology is reduced from
frontend + nginx + php + db + redis + pythontoapp + db + redis + analysis-workerfor production - uploaded/public storage remains persistent and shareable with the analysis worker where needed
- the worker service name communicates its role in the product chain rather than the implementation language
docker compose configand the relevant app-image build command succeed- existing backend, SPA, and documentation validation commands still pass
v1.4.2 implementation note
v1.4.2 shipped the production packaging baseline. docker/compose.prod.yml introduces an app service backed by docker/app/Dockerfile, which builds the React/Vite SPA, installs Laravel production Composer dependencies, serves SPA assets through Nginx, and routes /api/ to local PHP-FPM in the same container. The default and production Compose paths use analysis-worker as the service name for asynchronous model/inference execution. The analysis worker image copies worker code and model assets at build time for production use. MariaDB and Redis remain separate services, and migrations remain an explicit deployment step unless OCEAN_RUN_MIGRATIONS=true is intentionally enabled.
v1.4.3 — Repository Structure Normalization
Goal
Make the repository layout match the product architecture now that the React/Vite SPA and analysis-worker are the default runtime paths, reducing historical naming noise before the v1.5 release-hardening phase.
Scope
- promote
frontend-spa/to a first-classfrontend/orweb/directory name and update all Compose, Docker, documentation, Opencode skill, GitHub labeler, Dependabot, and validation references - retire the old Nuxt/Vue
frontend/line from the default repository shape; delete it if no remaining tests or reference-only files are still needed, or move a minimal archived note into documentation instead of keeping a full runnable app - rename the implementation directory
python/toanalysis-worker/so the source tree, Docker service, and product responsibility use the same vocabulary - collect Docker and Compose assets under
docker/with explicit names, for exampledocker/compose.local.yml,docker/compose.prod.yml,docker/app/,docker/analysis-worker/, anddocker/nginx/ - remove obsolete deployment examples such as
docker-compose.spa.example.ymlonce the SPA is the default frontend and production app image path exists - keep root-level entry points small and intentional:
README.md,README.zh-Hans.md,.env.example, and optionally a rootdocker-compose.ymlcompatibility shim only if it materially improves local onboarding - update ignore rules so build output and local caches from the renamed directories stay untracked
Primary deliverables
- renamed active frontend directory with preserved
pnpm-lock.yaml, Mantine skills, and build behavior - removed or archived Nuxt/Vue reference frontend, including cleanup of stale package locks, tests, Dockerfile, and CI/dependency references
- renamed
analysis-worker/source directory with updated Dockerfiles, Compose files, worker storage paths, and model path documentation - Docker directory hierarchy that owns app image config, worker image config, Nginx config, and Compose files with clear local/production naming
- deleted
docker-compose.spa.example.ymlif no longer referenced by docs or workflows - updated English and Simplified Chinese docs for architecture, operations, contributing, README, and roadmap references
Exit criteria
- a new contributor can infer the active runtime from directory names without knowing the historical Nuxt-to-SPA transition
frontend-spa/andpython/no longer appear as active path names outside historical roadmap notes- the old Nuxt/Vue frontend is removed or clearly archived outside the active runtime path
- Docker-related files are no longer split unpredictably across the repository root,
nginx/,backend/docker/, frontend directories, and worker directories - local and production Compose configurations validate after the moves
- backend tests, active frontend build, documentation build, app image build, and analysis-worker image build still pass
v1.4.3 implementation note
v1.4.3 normalizes the active repository layout. The React/Vite SPA is promoted to frontend/, the old Nuxt/Vue implementation is removed, the worker source moves to analysis-worker/, and Docker-related assets move under docker/ with explicit local and production Compose files. The root docker-compose.yml remains only as a lightweight compatibility include for local onboarding.
v1.4.4 — Release Image Publishing
Goal
Make tagged releases publish the deployable Docker images that operators need for repeatable production rollout.
Scope
- rename backend development Docker configuration from
docker/php/todocker/backend/so file locations match the normalized repository vocabulary - keep local Compose service names compatible while making the source Docker config role-oriented
- extend the GitHub release workflow to build and push the production
appandanalysis-workerimages to GitHub Container Registry - extend the CNB tag release pipeline to build and push the same release image set to the CNB Docker registry
- include both immutable version tags and a moving
latesttag for release images - document where release images are published and how they relate to
docker/compose.prod.yml
Primary deliverables
docker/backend/as the backend PHP-FPM development image configuration path- GitHub release workflow publishing
ghcr.io/<owner>/<repo>/app:<tag>andghcr.io/<owner>/<repo>/analysis-worker:<tag>pluslatest - CNB tag release pipeline publishing app and analysis-worker images under
$CNB_DOCKER_REGISTRY/$CNB_REPO_SLUG/ - release notes that mention published container image locations
- updated operations documentation for release image publishing and registry behavior
Exit criteria
- local and production Compose configs still validate after the backend Docker config rename
- GitHub release workflow has
packages: writeand authenticated GHCR Docker build/push steps - CNB pipeline validates with Docker service support for tag releases
- documentation describes the two published images, their registries, and the intended tag semantics
- app and analysis-worker image builds continue to pass before the v1.4.4 work is marked complete
v1.4.4 implementation note
v1.4.4 makes release packaging explicit. Backend development Docker configuration now lives in docker/backend/, while the local Compose service can remain php for compatibility. GitHub tag releases build and push the production app image and the separate analysis-worker image to GHCR with the release tag and latest. CNB tag releases build and push the same image pair to the CNB Docker registry under the repository slug, also using the release tag and latest. MariaDB and Redis remain external runtime services; they are not baked into either release image.
v1.5.0 — Release Hardening
Goal
Harden the v1 line for repeatable release, onboarding, and controlled expansion.
Scope
- strengthen validation and regression confidence
- align build, deployment, and documentation expectations
- reduce ambiguity across product, architecture, and operational documentation
Primary deliverables
- cleaner release checklist and validation expectations
- documentation consistency across architecture, API, data, and operations
- reduced risk when onboarding new contributors or shipping incremental changes
Exit criteria
- release readiness no longer depends on scattered tribal knowledge
- architecture and delivery guidance are internally consistent
- the v1 line is stable enough for controlled iteration beyond the initial MVP phase