Skip to content

fix(prism): AutoModel pin mount + in-flight site submissions - #128

Merged
echobt merged 3 commits into
mainfrom
fix/prism-automodel-board-and-pin
Aug 12, 2026
Merged

fix(prism): AutoModel pin mount + in-flight site submissions#128
echobt merged 3 commits into
mainfrom
fix/prism-automodel-board-and-pin

Conversation

@echobt

@echobt echobt commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Mount /var/lib/prism/automodel-pin into prism-challenge on prod/staging compose and set PRISM_AUTOMODEL_PIN_DIR so AutoModel 2.0 intake no longer fail-closes with code=pin after redeploy.
  • Change GET /v1/site/arenas/prism/submissions default to scope=all (in-flight + failed + scored); keep ?scope=champions for the Score>0 gallery. Leaderboard stays champions-only.
  • Default missing recipeEra to legacy after detail fan-out so Legacy/All tabs are not empty when enrichment is thin.
  • remote-deploy warns when the staged pin tree is missing on master.

Ops already done on prod

  • Staged pin at /var/lib/prism/automodel-pin (commit d02f49cb…, content sha matches freeze).
  • Recreated prism-challenge with pin mount; intake now reaches metagraph/auth checks instead of code=pin.

Test plan

  • cargo test -p site-api --lib
  • After merge: promote/deploy gateway image including this commit + feat(site): enrich prism board with detail, eras, and gpt-2 refs #126 site enrichment to prod
  • Confirm GET /v1/site/arenas/prism/submissions includes status=pending rows and recipeEra
  • Confirm GET …/submissions?scope=champions still Score>0 only
  • On next remote-deploy --env prod --role master, pin warning is silent when /var/lib/prism/automodel-pin exists

Summary by CodeRabbit

  • New Features
    • Submission listings now support filtering between all submissions and champions-only results.
    • All-submission listings include in-flight, completed, zero-score, and failed submissions.
    • Missing submission era information is now labeled as “legacy.”
  • Documentation
    • Added deployment guidance for configuring and staging AutoModel pin data.
    • Updated API documentation to describe submission scopes, leaderboard behavior, and legacy-era handling.
  • Deployment
    • Production and staging environments now support read-only AutoModel pin data configuration.

Prod intake was fail-closed (code=pin) without a mounted pin tree, and the
site submissions gallery hid everything except Score>0 champions — so the
AutoModel FE tab looked empty even while miners were blocked. Mount the
staged pin on master compose, default /submissions to scope=all with legacy
era fallback, and warn remote-deploy when the pin directory is missing.
@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@echobt, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 48 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: e6f95655-3a13-4e69-b643-c44a0c20b777

📥 Commits

Reviewing files that changed from the base of the PR and between 0426491 and 613fcfa.

📒 Files selected for processing (1)
  • crates/site-api/src/handlers.rs
📝 Walkthrough

Walkthrough

Prism submissions now support scope=all and scope=champions, with missing recipe eras labeled legacy. Production and staging mount the AutoModel pin read-only, and remote deployment checks for the staged pin.

Changes

Prism API behavior

Layer / File(s) Summary
Submission scope and era enrichment
crates/site-api/src/handlers.rs
The submissions endpoint accepts an optional scope. The default includes all submissions. Champion scope retains champion-only filtering. Missing eras use legacy for submissions and leaderboard rows.
Submission validation and API documentation
crates/site-api/src/handlers.rs, docs/SITE_API.md
Fixtures and tests cover running submissions, default results, legacy labeling, and champion filtering. The API documentation describes the updated behavior.

AutoModel pin deployment

Layer / File(s) Summary
Compose pin configuration
deploy/compose/env-prod.yml, deploy/compose/env-staging.yml
Both environments configure PRISM_AUTOMODEL_PIN_DIR and mount /var/lib/prism/automodel-pin read-only into prism-challenge.
Deployment verification and instructions
deploy/scripts/remote-deploy.sh, docs/PRISM_RECIPE.md
Master deployments check for the staged AutoModel pin and add its Compose overlay when present. Deployment instructions describe staging and mounting the pin.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant SiteAPI
  participant PrismAPI
  Client->>SiteAPI: Request submissions with optional scope
  SiteAPI->>PrismAPI: Fetch submission listings
  PrismAPI-->>SiteAPI: Return listings and detail data
  SiteAPI-->>Client: Return scoped submissions with recipeEra
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the two primary changes: the AutoModel pin mount and in-flight site submissions.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/prism-automodel-board-and-pin

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

echobt added 2 commits August 12, 2026 09:20
Pick up /var/lib/prism/docker-compose.automodel-pin.yml on master so a
redeploy before env-prod bake-in cannot drop the pin mount again.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (3)
crates/site-api/src/handlers.rs (3)

1225-1241: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Cover failed and zero-score rows in the scope test.

The new fixture covers a running row only. The documented contract also promises that scope=all includes failed and Score=0 rows, while scope=champions excludes them. Add a failed, zero-score fixture and assert both scope results.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/site-api/src/handlers.rs` around lines 1225 - 1241, Add a failed
submission fixture with a zero score to the scope test setup, then update the
scope=all assertions to verify it is included and the total reflects it. Update
the scope=champions assertions to verify the failed zero-score row is excluded
while the existing positive-score row remains included.

453-456: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add regression coverage for the leaderboard fallback.

The current Prism leaderboard fixture resolves an AutoModel era for sub1. It does not exercise the new row.recipe_era.is_none() branch. Add a champion whose detail request fails and assert that recipeEra is "legacy".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/site-api/src/handlers.rs` around lines 453 - 456, Add regression
coverage for the fallback in the leaderboard handler by extending the existing
Prism leaderboard fixture with a champion whose detail request fails, leaving
row.recipe_era unset. Assert that the resulting champion’s recipeEra is
"legacy", while preserving the existing AutoModel-era assertions for other
champions.

554-560: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Reject unsupported scope values.

Only all and champions are documented, but every value other than champions or champion currently selects all. A typo such as scope=championss silently broadens the result set. Parse supported values explicitly and return a client error for unsupported values.

Proposed validation
-            let champions_only = matches!(scope.as_str(), "champions" | "champion");
+            let champions_only = match scope.as_str() {
+                "all" => false,
+                "champions" | "champion" => true,
+                _ => {
+                    return json_err(
+                        StatusCode::BAD_REQUEST,
+                        "invalid_scope",
+                        "scope must be all or champions",
+                    );
+                }
+            };
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/site-api/src/handlers.rs` around lines 554 - 560, Update the scope
parsing in the handler around scope and champions_only to accept only “all” and
“champions” (optionally preserving the existing “champion” alias if intended),
and return an appropriate client error for any other value instead of defaulting
to all. Preserve the existing champions_only behavior for supported values.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/site-api/src/handlers.rs`:
- Around line 566-569: Update the detail fan-out logic around
fetch_prism_details to filter items by status_filter before limiting the IDs,
then order the eligible rows with in-flight statuses prioritized while
preserving recency within each group. Truncate only after prioritization, and
add a regression test covering pending or failed rows beyond the initial 24
receiving detail enrichment instead of RecipeEra::Legacy.

In `@deploy/compose/env-staging.yml`:
- Around line 63-68: Update the staging service configuration around
PRISM_FORCE_SIM and PRISM_AUTOMODEL_PIN_DIR so staging does not run the Sim path
or use Sim/fixture settings. Set PRISM_FORCE_SIM to false and configure
challenge execution through the Docker-backed path, keeping SimSandbox and
BASE_ALLOW_HOST_SIM opt-ins limited to CI/local configuration while preserving
the live AutoModel pin mount for staging.

In `@deploy/scripts/remote-deploy.sh`:
- Around line 263-269: Update the AutoModel pin check in the remote deployment
validation block to run the existing stage-automodel-pin.sh --verify-only
validation instead of only testing for the .git directory. Report success only
when the verification passes; otherwise retain the warning guidance for staging
the pin.
- Around line 270-275: Update the deployment validation around the AutoModel
overlay inclusion in the remote-deploy flow to invoke assert-compose-matrix.sh
against rendered master staging and production stacks with
/var/lib/prism/docker-compose.automodel-pin.yml applied. Ensure validation
rejects changes to role constraints, challenge environment files, the read-only
AutoModel pin mount, and digest-pinned images before adding the overlay to
COMPOSE_FILES.

---

Nitpick comments:
In `@crates/site-api/src/handlers.rs`:
- Around line 1225-1241: Add a failed submission fixture with a zero score to
the scope test setup, then update the scope=all assertions to verify it is
included and the total reflects it. Update the scope=champions assertions to
verify the failed zero-score row is excluded while the existing positive-score
row remains included.
- Around line 453-456: Add regression coverage for the fallback in the
leaderboard handler by extending the existing Prism leaderboard fixture with a
champion whose detail request fails, leaving row.recipe_era unset. Assert that
the resulting champion’s recipeEra is "legacy", while preserving the existing
AutoModel-era assertions for other champions.
- Around line 554-560: Update the scope parsing in the handler around scope and
champions_only to accept only “all” and “champions” (optionally preserving the
existing “champion” alias if intended), and return an appropriate client error
for any other value instead of defaulting to all. Preserve the existing
champions_only behavior for supported values.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: cd5b8d6e-5d9b-4e61-b1a4-e012d50ed49c

📥 Commits

Reviewing files that changed from the base of the PR and between defc59f and 0426491.

📒 Files selected for processing (6)
  • crates/site-api/src/handlers.rs
  • deploy/compose/env-prod.yml
  • deploy/compose/env-staging.yml
  • deploy/scripts/remote-deploy.sh
  • docs/PRISM_RECIPE.md
  • docs/SITE_API.md

Comment on lines +566 to 569
// Prefer in-flight + recent rows for detail fan-out (era / benches).
let mut ids: Vec<String> = items.iter().map(|s| s.id.clone()).collect();
ids.truncate(PRISM_CHAMPION_DETAIL_FANOUT);
let details = fetch_prism_details(&st, &ids).await;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

rg -n -C 5 \
  'fetch_prism_subs|PRISM_CHAMPION_DETAIL_FANOUT|updated_at_ms|created_at_ms' \
  --glob '*.rs' .

Repository: BaseIntelligence/base

Length of output: 50378


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '--- handlers structure ---'
ast-grep outline crates/site-api/src/handlers.rs | sed -n '1,220p'

echo '--- relevant handler references ---'
rg -n -C 12 \
  'PRISM_CHAMPION_DETAIL_FANOUT|fetch_prism_subs|fetch_prism_details|scope|list_submissions|submissions' \
  crates/site-api/src/handlers.rs crates/site-api/src --glob '*.rs' | sed -n '1,320p'

echo '--- store APIs and implementations ---'
rg -n -C 10 \
  'async fn (list|fetch).*submission|fn (list|fetch).*submission|list_submissions|list_recent|submissions.*ORDER BY|ORDER BY.*(created|updated)' \
  crates --glob '*.rs' | sed -n '1,360p'

Repository: BaseIntelligence/base

Length of output: 49030


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '--- Prism submissions handler and leaderboard ---'
sed -n '421,590p' crates/site-api/src/handlers.rs

echo '--- Prism store list definitions ---'
rg -n -C 18 \
  'pub async fn list\(|async fn list\(|ORDER BY.*created_at|ORDER BY.*updated_at|prism_submission' \
  crates/prism-store crates/prism-challenge/src --glob '*.rs' | sed -n '1,420p'

echo '--- repository files related to prism submission storage ---'
git ls-files crates/prism-store crates/prism-challenge/src | grep -E '(submission|store|lib|api)' | sed -n '1,200p'

Repository: BaseIntelligence/base

Length of output: 35564


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '--- MemoryPrismStore ordering ---'
sed -n '340,410p' crates/prism-store/src/store.rs

echo '--- DbPrismStore list implementation ---'
rg -n -C 24 \
  'async fn list\(' crates/prism-store/src/dbprism.rs

echo '--- database list query ---'
rg -n -C 24 \
  'list_prism_submissions|prism_submissions.*ORDER|FROM prism_submission.*ORDER|ORDER BY.*created_at.*prism' \
  crates --glob '*.rs' | sed -n '1,260p'

echo '--- relevant tests and helper fixtures ---'
rg -n -C 10 \
  'mount_prism_list_mocks|prism_leaderboard|scope=|champions|sub-running|PRISM_CHAMPION_DETAIL_FANOUT|detail' \
  crates/site-api/src/handlers.rs | sed -n '1,420p'

Repository: BaseIntelligence/base

Length of output: 27431


🏁 Script executed:

#!/bin/bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path

handler = Path("crates/site-api/src/handlers.rs").read_text()
db = Path("crates/db/src/prism_store.rs").read_text()

assert 'ORDER BY created_at DESC LIMIT $3' in db
fanout = handler.index('let mut ids: Vec<String> = items.iter().map(|s| s.id.clone()).collect();')
truncate = handler.index('ids.truncate(PRISM_CHAMPION_DETAIL_FANOUT);', fanout)
status_filter = handler.index('if let Some(st_f) = status_filter {', truncate)

rows = [
    {"id": "old-pending", "created_at_ms": 1},
    {"id": "new-scored", "created_at_ms": 3},
    {"id": "newer-failed", "created_at_ms": 4},
]
ordered = sorted(rows, key=lambda row: row["created_at_ms"], reverse=True)
selected = [row["id"] for row in ordered[:2]]
assert selected == ["newer-failed", "new-scored"]
assert "old-pending" not in selected
assert truncate < status_filter

print("list_prism_submissions guarantees created_at DESC, not in-flight-first ordering")
print("the handler truncates that order before applying status_filter")
print("synthetic order:", [row["id"] for row in ordered])
print("fan-out IDs:", selected)
PY

Repository: BaseIntelligence/base

Length of output: 409


Prioritize in-flight rows before truncating detail fan-out. /v1/submissions guarantees created_at DESC, but not in-flight-first ordering. This code truncates to 24 rows before applying status_filter, so older pending or failed rows can miss detail enrichment and fall back to RecipeEra::Legacy. Apply the filter before truncation and prioritize in-flight rows. Add a regression test.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/site-api/src/handlers.rs` around lines 566 - 569, Update the detail
fan-out logic around fetch_prism_details to filter items by status_filter before
limiting the IDs, then order the eligible rows with in-flight statuses
prioritized while preserving recency within each group. Truncate only after
prioritization, and add a regression test covering pending or failed rows beyond
the initial 24 receiving detail enrichment instead of RecipeEra::Legacy.

Comment on lines +63 to +68
# Same pin path as prod when testing live AutoModel intake on staging
# (stage with deploy/scripts/stage-automodel-pin.sh). Sim/fixture pins
# still work when miners submit automodel@fixture-v1.
PRISM_AUTOMODEL_PIN_DIR: "/var/lib/prism/automodel-pin"
volumes:
- /var/lib/prism/automodel-pin:/var/lib/prism/automodel-pin:ro

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Do not run the Sim path in staging.

PRISM_FORCE_SIM remains "true" for this service at Line 60. The new mount cannot provide a live AutoModel execution check while Sim is forced. Move the Sim and fixture configuration to CI/local, or set PRISM_FORCE_SIM to "false" and use the Docker-backed challenge path.

As per coding guidelines, deploy/**/* must never host Sim in staging or production; SimSandbox and BASE_ALLOW_HOST_SIM=1 are CI/local-only opt-ins. Based on learnings, staging challenge execution must use Docker and must not host Sim.

Suggested configuration change
-      PRISM_FORCE_SIM: "true"
+      PRISM_FORCE_SIM: "false"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@deploy/compose/env-staging.yml` around lines 63 - 68, Update the staging
service configuration around PRISM_FORCE_SIM and PRISM_AUTOMODEL_PIN_DIR so
staging does not run the Sim path or use Sim/fixture settings. Set
PRISM_FORCE_SIM to false and configure challenge execution through the
Docker-backed path, keeping SimSandbox and BASE_ALLOW_HOST_SIM opt-ins limited
to CI/local configuration while preserving the live AutoModel pin mount for
staging.

Sources: Coding guidelines, Learnings

Comment on lines +263 to +269
if ssh_h "test -d /var/lib/prism/automodel-pin/.git"; then
echo "remote-deploy: AutoModel pin present at /var/lib/prism/automodel-pin"
else
echo "remote-deploy: WARNING: AutoModel pin missing at /var/lib/prism/automodel-pin" >&2
echo "remote-deploy: stage with: ./deploy/scripts/stage-automodel-pin.sh --dir /var/lib/prism/automodel-pin" >&2
echo "remote-deploy: (Prism AutoModel intake fails closed with code=pin until staged)" >&2
fi

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Validate the pin contents before reporting success.

test -d /var/lib/prism/automodel-pin/.git accepts a stale or modified checkout. deploy/scripts/stage-automodel-pin.sh already verifies the frozen commit and content SHA. Reuse its --verify-only validation, or compare both expected values here. Otherwise, deployment can report the pin as present while Prism intake still returns code=pin.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@deploy/scripts/remote-deploy.sh` around lines 263 - 269, Update the AutoModel
pin check in the remote deployment validation block to run the existing
stage-automodel-pin.sh --verify-only validation instead of only testing for the
.git directory. Report success only when the verification passes; otherwise
retain the warning guidance for staging the pin.

Comment on lines +270 to +275
if ssh_h "test -f /var/lib/prism/docker-compose.automodel-pin.yml"; then
COMPOSE_FILES+=(-f /var/lib/prism/docker-compose.automodel-pin.yml)
echo "remote-deploy: including host AutoModel pin overlay"
fi
fi

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

./deploy/scripts/assert-compose-matrix.sh

Repository: BaseIntelligence/base

Length of output: 375


🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- deploy/scripts/remote-deploy.sh ---'
sed -n '220,290p' deploy/scripts/remote-deploy.sh

printf '%s\n' '--- deploy/scripts/assert-compose-matrix.sh ---'
sed -n '1,240p' deploy/scripts/assert-compose-matrix.sh

printf '%s\n' '--- compose files and relevant references ---'
git ls-files 'deploy/compose/*' 'deploy/scripts/*' 'deploy/env/*' | sort
rg -n --no-heading 'automodel|challenge|digest|profile:|gateway|validator|postgres|BASE_ALLOW_HOST_SIM' \
  deploy/compose deploy/scripts deploy/env 2>/dev/null | head -300

Repository: BaseIntelligence/base

Length of output: 45901


🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- remote deployment Compose invocation ---'
sed -n '290,430p' deploy/scripts/remote-deploy.sh

printf '%s\n' '--- base and role Compose definitions ---'
sed -n '1,260p' docker-compose.yml
sed -n '1,180p' deploy/compose/role-master.yml
sed -n '1,130p' deploy/compose/env-staging.yml
sed -n '1,120p' deploy/compose/env-prod.yml

printf '%s\n' '--- AutoModel staging script ---'
sed -n '1,150p' deploy/scripts/stage-automodel-pin.sh

printf '%s\n' '--- overlay references ---'
rg -n --no-heading 'docker-compose\.automodel-pin|COMPOSE_FILES|config --|docker compose' deploy/scripts/remote-deploy.sh deploy/scripts/stage-automodel-pin.sh

Repository: BaseIntelligence/base

Length of output: 29532


Validate the host AutoModel overlay before including it.

./deploy/scripts/assert-compose-matrix.sh does not load /var/lib/prism/docker-compose.automodel-pin.yml. Extend the deployment check to render the master staging and production stacks with the overlay and reject changes to role constraints, challenge environment files, the read-only AutoModel pin mount, or digest-pinned images.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@deploy/scripts/remote-deploy.sh` around lines 270 - 275, Update the
deployment validation around the AutoModel overlay inclusion in the
remote-deploy flow to invoke assert-compose-matrix.sh against rendered master
staging and production stacks with
/var/lib/prism/docker-compose.automodel-pin.yml applied. Ensure validation
rejects changes to role constraints, challenge environment files, the read-only
AutoModel pin mount, and digest-pinned images before adding the overlay to
COMPOSE_FILES.

Source: Coding guidelines

@echobt
echobt merged commit a6fb36d into main Aug 12, 2026
3 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant