Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
e07f28b
Plan hosted Smol execution integration
Abiorh001 Oct 26, 2026
ef018b7
Integrate pinned model-provider dependency for hosted Smol wiring
Abiorh001 Oct 26, 2026
088090a
Wire hosted execution to the native Smol node
Abiorh001 Oct 26, 2026
1ef4912
Clarify hosted operator authority and cold migration entrypoint
Abiorh001 Oct 26, 2026
e850c4d
Merge remote-tracking branch 'origin/main' into codex/hosted-smol-int…
Abiorh001 Oct 26, 2026
771e293
Reconcile hosted dependency record with current main
Abiorh001 Oct 26, 2026
dcbb8a6
docs(hosted): bound isolated integration and live model qualification
Abiorh001 Oct 26, 2026
e249337
Scope native hosted image proof to backend artifacts
Abiorh001 Oct 26, 2026
cc74220
Bound worker lifecycle and Smol socket paths in hosted preflight
Abiorh001 Oct 26, 2026
c334775
docs(hosted): record scoped image and worker lifecycle proof
Abiorh001 Oct 26, 2026
7abdf7f
Expose the existing ART preparation deadline in hosted releases
Abiorh001 Oct 26, 2026
5969913
Attach public runtime proof to inspected hosted services
Abiorh001 Oct 26, 2026
99fbaac
Attest hosted tmpfs and actual parser custody
Abiorh001 Oct 26, 2026
93ac9b0
Document hosted attachment custody and verification limits
Abiorh001 Oct 26, 2026
4baeb16
Merge branch 'codex/terminal-systems-post-checkers' into codex/hosted…
Abiorh001 Oct 26, 2026
cf6db90
Record scoped AWS artifact qualification custody
Abiorh001 Oct 26, 2026
5f58257
Qualify hosted Celery references in lifecycle documentation
Abiorh001 Oct 26, 2026
2e7e54e
Merge commit '64d3efabd4c3cbb303b3eb9ad8ed7116bdacc06c' into codex/ho…
Abiorh001 Oct 26, 2026
f7d50c7
Merge commit '0ff6ed0d002a54e548661b29a3d014d7936072ff' into codex/ho…
Abiorh001 Oct 26, 2026
fc9e57b
Define the single-budget public model qualification
Abiorh001 Oct 26, 2026
5e28b08
Keep hosted fault supervisor and runtime custody separate
Abiorh001 Oct 26, 2026
89dfe1e
Merge commit 'ee9436e19e53c6584de00c8ac8d0bfcd95def029' into codex/ho…
Abiorh001 Oct 26, 2026
ea49554
Add bounded public hosted model POST qualification
Abiorh001 Oct 26, 2026
89752e6
Record hosted custody and bounded model qualification review
Abiorh001 Oct 26, 2026
5947bfb
Merge commit 'd7b037305' into codex/hosted-smol-integration
Abiorh001 Oct 26, 2026
56cecab
Document the fixed host service identity before native startup
Abiorh001 Oct 26, 2026
9db6d68
Register hosted baseline checker capabilities after Operator grant
Abiorh001 Oct 26, 2026
b348eaa
Require hosted public journey guards in release proof CI
Abiorh001 Oct 26, 2026
f406310
test(hosted): isolate worker settings in model proof guard
Abiorh001 Oct 26, 2026
5ecd143
Record reproduced hosted guard test isolation repair
Abiorh001 Oct 26, 2026
931703c
Merge branch 'codex/terminal-systems-post-checkers' into codex/hosted…
Abiorh001 Oct 26, 2026
ff09250
Observe hosted duplicate deliveries through scoped Celery events
Abiorh001 Oct 26, 2026
c61b0c0
Merge commit 'b2ce3fa4528886c239c7ee51306a08b406316f42' into codex/ho…
Abiorh001 Oct 26, 2026
6c483ca
Fix hosted duplicate delivery report identity
Abiorh001 Oct 26, 2026
c09180c
Validate model qualification windows before public work
Abiorh001 Oct 26, 2026
e9b9eb9
Use canonical socket deadline for the hosted model proof
Abiorh001 Oct 26, 2026
346a9f1
Merge commit '050b12723' into codex/hosted-smol-integration
Abiorh001 Oct 26, 2026
b3ddfd2
Provision model evidence writer and verify prepared-effect recovery
Abiorh001 Oct 26, 2026
5ab9625
Merge commit '113792b02c657d55c73de8a04d6959316818a1b3' into codex/ho…
Abiorh001 Oct 26, 2026
b068622
Merge commit '8012f279281f4f6caa471eac82587134186bb5b9' into codex/ho…
Abiorh001 Oct 26, 2026
0add60a
Merge commit '6d2a3424dd491071c1d0522d45cb060547ba278d' into codex/ho…
Abiorh001 Oct 26, 2026
fb55061
Record live hosted model recovery and exact cleanup evidence
Abiorh001 Oct 26, 2026
5f1b780
Name Celery explicitly in hosted qualification summary
Abiorh001 Oct 26, 2026
e14423b
Merge remote-tracking branch 'origin/main' into codex/hosted-smol-int…
Abiorh001 Oct 27, 2026
ba48f92
fix(hosted): preserve native asset refusal diagnostics
Abiorh001 Oct 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
426 changes: 426 additions & 0 deletions .commitrail/changes/hosted-smol-project-execution.md

Large diffs are not rendered by default.

10 changes: 10 additions & 0 deletions .github/workflows/release-images.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ on:
- 'deploy/hosted/**'
- 'scripts/*hosted_release*.py'
- 'scripts/test_public_smol_proof.py'
- 'scripts/test_public_hosted_attachment.py'
- 'scripts/test_public_hosted_model_post.py'
- 'experiments/pilot04_external_checker_runtime/**'
- 'scripts/test_local_guide_runtime.py'
- 'scripts/test_guide_document_api_drill.py'
Expand Down Expand Up @@ -76,6 +78,14 @@ jobs:
scripts.test_local_guide_runtime scripts.test_guide_document_api_drill \
scripts.test_public_smol_proof
test -z "$(git status --porcelain)"
- name: Verify hosted public journey and model qualification guards
timeout-minutes: 5
shell: bash
run: |
set -euo pipefail
PYTHONPATH=backend backend/.venv/bin/python -m unittest -v \
scripts.test_public_hosted_attachment scripts.test_public_hosted_model_post
test -z "$(git status --porcelain)"
- name: Build exact release images without cache or publication
timeout-minutes: 42
shell: bash
Expand Down
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,12 +98,17 @@ These parts work in a local test run:
The local test run used recorded AI model output. It does not prove project
setup with a live AI model.

An isolated hosted API/Celery/Smol/AWS run also passed both review-policy
branches. A separate live OpenRouter POST reached automatic acceptance with
recorded model usage and replay protection. These runs used fixture identity
and engineering submissions; they do not prove the full real-project journey.

These parts are not complete:

- Live human review and revision after a human decision.
- Reviewer contribution records, because live human review is not complete.
- Proof of project setup with a live AI model.
- Operation on a hosted server.
- The full hosted project journey with production Flow identity.
- Payment delivery.

The [v0.1 Roadmap And Capability Status](docs/roadmap_status.md) gives the
Expand Down
1 change: 1 addition & 0 deletions backend/scripts/provision_local_service_actors.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
"workstream.artifact.verifier",
"workstream.artifact.scheduler",
"workstream.artifact.binding",
"workstream.artifact.checker_output",
"workstream.artifact.guide_reader",
"workstream.artifact.materializer",
"workstream.project.setup",
Expand Down
133 changes: 133 additions & 0 deletions backend/tests/test_checker_output_custody.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,139 @@ def content_sha256(value: bytes) -> str:
return "sha256:" + hashlib.sha256(value).hexdigest()


@pytest.mark.parametrize("provider", ["local", "minio"])
async def test_canonical_public_provisioning_enables_exact_model_request_custody(
tmp_path, isolated_database_env, admin_access, provider,
) -> None:
"""The journey bootstrap must provision the writer before any model request I/O."""
from scripts.provision_local_service_actors import (
JOURNEY_SERVICE_IDENTITIES,
idempotency_key,
subject_for,
)
from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine

from app.adapters.artifacts import create_artifact_store_bootstrap
from app.interfaces.artifacts import ArtifactStoreNamespaceClaim
from app.modules.actors.models import ActorProfile
from app.modules.artifacts.preparation import (
ArtifactPreparationService,
ArtifactScratchManager,
)
from app.modules.artifacts.service import artifact_storage_namespace_spec
from app.modules.checkers.api.output_custody import (
CheckerOutputReservation,
CheckerOutputSelector,
CheckerOutputSlot,
)
from tests.artifact_store_helpers import artifact_preparation_limits
from tests.checker_output_admission_helpers import seed_checker_output_relationships
from tests.checker_output_custody_helpers import (
ObservedStore,
_output_storage_settings,
_prepare_model_attempt,
_provision_model_policy,
_store_model_request_evidence,
)
from tests.checkers_model_calls.model_usage_boundary_support import BoundaryPorts

if provider == "minio":
from tests.test_s3_artifact_store import provision_minio_bucket

await provision_minio_bucket.__wrapped__()
engine = create_async_engine(isolated_database_env)
factory = async_sessionmaker(engine, expire_on_commit=False)
settings = _output_storage_settings(tmp_path, provider, None)
bootstrap = create_artifact_store_bootstrap(settings, activation_guard=None)
namespace = artifact_storage_namespace_spec(settings, bootstrap)
store = ObservedStore(bootstrap.initialize_after_namespace_claim(
ArtifactStoreNamespaceClaim(
bootstrap.identity, bootstrap.namespace_identity, namespace.namespace_fingerprint,
)
))
manager = ArtifactScratchManager(
root=tmp_path / "request-scratch", limits=artifact_preparation_limits(),
)
try:
policy, profile = await _provision_model_policy(factory, namespace, admin_access)
data = b'{"prompt":"publicly provisioned request custody"}'
async with factory() as session:
_, _, run_id = await seed_checker_output_relationships(
session, namespace, policy_bundle=policy,
)
execution, attempt, _ = await _prepare_model_attempt(
session, run_id, content_sha256(data), model_profile=profile,
model_ports=BoundaryPorts(),
)
await session.commit()
selector = CheckerOutputSelector(
paid_slot=attempt.slot_key, task_id=execution.task_id,
model_call_slot_id=attempt.slot_id, model_call_attempt_id=attempt.attempt_id,
slot_key="model_request", content_sha256=content_sha256(data), execution=execution,
)
reservation = CheckerOutputReservation(
selector=selector,
slot=CheckerOutputSlot(key="model_request", maximum_bytes=profile.spec.maximum_request_bytes),
)
identity = ServiceIdentity.ARTIFACT_CHECKER_OUTPUT.value
async with factory() as session:
assert await session.scalar(select(ActorProfile.id).where(
ActorProfile.service_identity == identity,
)) is None
arguments = dict(
factory=factory, preparation=ArtifactPreparationService(manager), store=store,
namespace=namespace, settings=settings, reservation=reservation, request_bytes=data,
)
with pytest.raises(CheckerOutputUnavailable, match="authority_unavailable"):
await _store_model_request_evidence(**arguments)
assert (store.puts, store.opens) == (0, 0)
async with factory() as session:
for table in (ArtifactPutAttempt, ArtifactOperationReceipt):
assert await session.scalar(select(func.count()).select_from(table).where(
table.model_call_attempt_id == str(attempt.attempt_id),
)) == 0
assert await session.scalar(select(func.count()).select_from(ArtifactBinding).where(
ArtifactBinding.resource_type == "checker_model_call",
ArtifactBinding.resource_id == str(attempt.attempt_id),
)) == 0
effect = await session.get(ModelUsageEffect, str(attempt.attempt_id))
assert effect.state == "prepared" and effect.request_binding_id is None
assert effect.reserved_nanodollars is None

# Select through the actual canonical bootstrap list; removing the identity
# must leave this real storage call refused, rather than pass a constant test.
responses = []
for service_identity in JOURNEY_SERVICE_IDENTITIES:
if service_identity == identity:
subject = subject_for(service_identity, "public-request-custody")
for _ in range(2):
response = await admin_access.signed.client.post(
"/api/v1/service-actors",
headers=admin_access.admin.headers | {
"Idempotency-Key": idempotency_key(service_identity, subject),
},
json={"service_identity": service_identity, "subject": subject,
"reason": "Provision canonical model evidence writer"},
)
assert response.status_code == 201, response.text
responses.append(response.json())
evidence = await _store_model_request_evidence(**arguments)
assert len(responses) == 2 and responses[0] == responses[1]
assert (store.puts, store.opens) == (1, 1)
assert evidence.content_sha256 == selector.content_sha256
async with factory() as session:
binding = await session.get(ArtifactBinding, str(evidence.binding_id))
assert (binding.resource_type, binding.resource_id, binding.logical_role) == (
"checker_model_call", str(attempt.attempt_id), "model_request",
)
assert binding.put_attempt_id == str(evidence.put_attempt_id)
assert binding.verification_receipt_id == str(evidence.verification_receipt_id)
finally:
manager.close()
bootstrap.close()
await engine.dispose()


@pytest.mark.parametrize("provider", ["local", "minio"])
async def test_real_store_verification_and_binding(
tmp_path,
Expand Down
Loading
Loading