Pressure-testing Ota on OSF.io: staged Compose control and bounded Postgres proof
How Ota 1.6.25 modeled OSF.io's staged Docker Compose path while proving only the explicit local Postgres slice it actually executed.
Overview
OSF.io is not a one-command Docker project. Its documented local path has a meaningful order: materialize overrides, run requirements containers, start backing services, start asset and supporting services, then start the app stack.
That is valuable pressure for Ota because an opaque docker compose up task loses the order, the service ownership, and the distinction between routine verification and deliberate local maintenance.
The refreshed pressure branch runs released Ota v1.6.25. It proves the complete contract and dry-run surface across Ubuntu, macOS, and Windows, then performs real runtime proof only for the explicit local-postgres workflow on Ubuntu. It does not claim that the full OSF application stack became ready.
The Contract Owns The Stages
The pressure contract lives on a fork while it is under review. It follows OSF's documented Docker Compose development path without turning that path into unstructured shell glue.
Ordered Compose Input And Image Hydration
The override file is materialized explicitly, and the ordered Compose file stack is part of image hydration truth:
images:pull: prepare: kind: dependency_hydration medium: container_images source: kind: docker_compose cwd: . files: - docker-compose.yml - docker-compose.override.yml effects: network: true network_kind: container_image_hydrationThis is stronger than a hand-written docker compose pull: the exact Compose input stack and the fact that this lane reaches the network are contract truth.
Staged Service Ownership
The contract preserves the documented topology instead of pretending every service belongs to one undifferentiated startup command:
core:up: compose: kind: up detach: true services: - elasticsearch - postgres - mongo - rabbitmqLater tasks own requirements containers, asset watchers, supporting services, and the app services separately. local-docker is the declared workflow for that full staged path; its current matrix coverage is admission and dry-run coverage, not a claim that every OSF container started.
Destructive Maintenance Is Explicit
The focused runtime lane is deliberately smaller. It starts the local Postgres Compose service and names volume reset as a destructive maintenance task:
postgres:reset: action: kind: reset_compose_service_volume service: postgres volume: osfio_postgres_data_vol compose: files: - docker-compose.yml - docker-compose.override.yml project_name: osfioThis is not a hidden cleanup recipe. The contract exposes the target service, volume, Compose inputs, and external Docker/Postgres effects before execution.
Released Ota 1.6.25 Matrix
The updated matrix installs Ota from the contract, verifies the exact release before it evaluates the contract, and retains JSON, topology, receipt, and proof evidence from successful as well as failed runs.
The green matrix run installed ota v1.6.25 at commit a3e9f98f3. It exercised:
ota validate, Doctor, task discovery, safe-task discovery, workflow discovery, and execution topology;- every public task and both workflows in dry-run mode;
- the real
local-postgresruntime proof before and afterpostgres:reseton Ubuntu; - contract and dry-run compatibility on macOS and Windows;
- retained evidence artifacts for all three lanes.
The runtime proof is intentionally qualified. Both Ubuntu proof records report passed_with_unproven_boundaries with broader_repo_completion_not_proved. Their summary remains risky because the selected path explicitly mutates Docker and Postgres. A successful local Postgres readiness result is not permission to read it as repository-wide readiness or as application correctness.
| Lane | What ran | What it proves | What it does not prove |
|---|---|---|---|
| Ubuntu | Discovery, full dry-run surface, Postgres startup, runtime proof, volume reset, second runtime proof | The selected local-postgres Docker Compose path was ready before and after the named reset | Full OSF app startup, migrations, assets, API behavior, or all Compose services |
| macOS | Discovery and full dry-run surface | The contract is valid and its declared paths can be planned on this host family | Docker Desktop behavior or runtime readiness |
| Windows | Discovery and full dry-run surface | The contract is valid and its declared paths can be planned on this host family | Docker Desktop behavior or runtime readiness |
The contract uses native host orchestration to call Docker Compose. That is not Ota container-mode coverage, and the matrix does not claim it is.
What Remains Bounded
The pressure result is useful precisely because it leaves important things uncollapsed:
local-dockerhas a governed staged topology and full dry-run coverage, but no full-stack hosted runtime proof;- PostgreSQL readiness is not proof of OSF web, API, worker, asset, migration, or third-party-service behavior;
- Docker engine configuration, daemon availability, image registry access, and host resource capacity remain provider and host concerns;
- the README's pre-asset
node_modulescleanup remains repo-owned setup guidance, not an implicit Ota mutation; - no result here governs the wider OSF.io repository, deployment workflows, or production environment.
This is the appropriate boundary for an external pressure repository: govern the selected path deeply, preserve the rest as explicit scope, and refuse the temptation to convert a green service probe into a broader claim.
Why OSF.io Was Useful
OSF.io confirms that Compose support is not merely up -d.
For serious repositories, the contract needs to express ordered files, image hydration, one-shot containers, staged detached services, readiness, and destructive state transitions. Ota can own those execution decisions while keeping the claims on the wire narrow enough to be trusted.
Links
- Pressure contract: osf.io
ota.yaml - Matrix workflow: test-ota-contract-matrix.yml
- Evidence: run 30624808234
- Upstream project: CenterForOpenScience/osf.io
Take action