openalice-lab
**Alice Incubator, Arena & Evolution Factory**
Architecture rating
67 unreferenced test/bin functions visible in inspector (indicating ~40+ actual test functions across bench-harness, bench-integrity, lab-harness), 5 tiered integration test suites (22 YAML scenarios), probe-lint and assertion-sanity coverage of data invariants, but CI is red and no coverage metric reported.
Valid manifest with 25 @feature annotations, AGENTS.md + CLAUDE.md + HARNESS.md + PLAN.md + README.md all present, docs/ directory exists, but README excerpt is a single tagline and no architecture diagram or API doc evidence beyond endpoint declarations.
Clean circular-dependency graph, manifest valid with full feature annotations (25 features), conventional Cargo workspace with 14 crates following lab-* naming, tiered test YAML structure (tier-0 through tier-4), but 67 unreferenced definitions and massive env drift (180+ undeclared) indicate convention decay.
Prometheus /metrics endpoint declared, tests assert oa_ metric prefix and known-allowlist enforcement, structured harness-traces directory with probe reports, but service is down so metrics are not flowing; no evidence of distributed tracing or structured log format beyond log directory.
ed25519 bench-integrity certs for attestation, keygen rejects insecure perms (test confirms), but health probe returns 404, CI failing, massive env drift (180+ undeclared vars including ANTHROPIC_API_KEY/OPENAI_API_KEY/HF_TOKEN leaked into scope), no evidence of rate-limiting or SSRF guards on exposed endpoints.
12 owned tables declared in manifest (lab_runs, prompt_blocks, ab_tests, etc.) with schema_meta table suggesting versioning, but no migrations directory found, SQLite lab.db with WAL present (not Postgres), no evidence of RLS/tenant isolation or FK constraints enforcement, no GDPR handling visible.
Health probe returning 404, 0% uptime over 24h, latest CI conclusion=failure, no evidence of graceful shutdown/retries/idempotency in structure; budget_guard test exists but service itself is down — reliability posture is broken in practice.
source · auto-grader-2026-07-18
Ecosystem manifest
.atlas-deps.ymlCI/CD harness for testing stateful AI agents — Docker incubator + Inspect-style Task/Solver/Scorer + ed25519 bench-integrity certs + Prompt Evolution Studio (block CRUD, A/B tests, reflexion review).
- openalicehttpvia ALICE_URLSystem-under-test: lab spins up and probes the openalice agent binary inside the Docker incubator
- via SHARED_JWT_SECRETPrompt Evolution Studio verifies oa_session JWTs (HS256) minted by alice's /v1/auth/login on every write route.
- ALICE_URL
- GITHUB_TOKEN
- SAMPLE_FILTER
- PROBE_FILTER
- LAB_DB_PATH
- LAB_DASHBOARD_KEY
- LAB_SOLVER_TIMEOUT_SECS
- LAB_POST_SNAPSHOT_DELAY_MS
- MOCK_LLM_URL
- MOCK_TELEGRAM_URL
- OPENALICE_LAB_KEY_PATH
- PROMPTS_DB_PATH
- OPENALICE_PROMPT_STUDIO_DB
- PORT
- PROMPTS_STUDIO_BIND
- JWT_SECRET
- SHARED_JWT_SECRET
- STUDIO_AUTH_BYPASS
- INSPECTOR_PATH
- OPENALICE_SOURCE_DIR
- OPENALICE_PROMPTS_ROOT
- docker_image: openalice-lab-dashboard
- docker_image: openalice-lab-prompts-studio
- http_endpoint: https://lab.blal.pro/api/v1/*
- http_endpoint: https://lab.blal.pro/metrics
- http_endpoint: https://prompts.blal.pro/v1/prompts/*
- http_endpoint: https://prompts.blal.pro/healthz
- lab_runs
- lab_tasks
- lab_scores
- lab_snapshots
- lab_recordings
- lab_patches
- schema_meta
- prompt_blocks
- prompt_versions
- prompt_assemblies
- ab_tests
- reflexion_proposals
Atlas grepped the repo's source for env reads (rust env::var · ts process.env · py os.environ · shell $VAR) and diffed against the manifest's consumes_env. Two lists below: stale declarations and undeclared reads.
- A2A_BINARY
- ACTIONS_ID_TOKEN_REQUEST_TOKEN
- ACTIONS_ID_TOKEN_REQUEST_URL
- AGENT
- AIOHTTP_NOSENDFILE
- AIOHTTP_NO_EXTENSIONS
- ALICE_BINARY
- ALICE_CLI_BINARY
- ALICE_CPU_LIMIT
- ALICE_MEM_LIMIT
- ALICE_MODEL
- ALICE_PRIMARY_AGENT_ID
- ALICE_PRIMARY_AGENT_ID_2
- ANDROID_DATA
- ANDROID_ROOT
- ANTHROPIC_API_KEY
- APPENGINE_RUNTIME
- ARROW_HOME
- ARROW_PRE_0_15_IPC_FORMAT
- ARROW_PRE_1_0_METADATA_VERSION
- COLORTERM
- COMPOSE_PROFILES
- COMP_CWORD
- COMP_WORDS
- CURL_CA_BUNDLE
- DATABRICKS_RUNTIME_VERSION
- DATASETS_VERBOSITY
- DISABLE_TELEMETRY
- DOCKER_CONFIG
- DOMAIN
- DO_NOT_TRACK
- EAGER_IMPORT
- ENSUREPIP_OPTIONS
- FOO
- FROZENLIST_NO_EXTENSIONS
- FSSPEC_CONFIG_DIR
- GHAPI_DEBUG
- GH_HOST
- GID
- GITHUB_JWT_TOKEN
- GITHUB_TOKENS
- GIT_COMMON_DIR
- GIT_DIR
- GIT_PYTHON_TRACE
- GIT_WORK_TREE
- HF_ASSETS_CACHE
- HF_DATASETS_CACHE
- HF_DATASETS_DISABLE_PROGRESS_BARS
- HF_DATASETS_DOWNLOADED_DATASETS_PATH
- HF_DATASETS_EXTRACTED_DATASETS_PATH
- HF_DATASETS_IN_MEMORY_MAX_SIZE
- HF_DATASETS_OFFLINE
- HF_DATASETS_STACK_MULTIPROCESSING_DOWNLOAD_PROGRESS_BARS
- HF_DEBUG
- HF_DEVICE_CODE_OAUTH_CLIENT_ID
- HF_ENDPOINT
- HF_HOME
- HF_HUB_CACHE
- HF_HUB_DISABLE_EXPERIMENTAL_WARNING
- HF_HUB_DISABLE_IMPLICIT_TOKEN
- HF_HUB_DISABLE_PROGRESS_BARS
- HF_HUB_DISABLE_SYMLINKS
- HF_HUB_DISABLE_SYMLINKS_WARNING
- HF_HUB_DISABLE_TELEMETRY
- HF_HUB_DISABLE_UPDATE_CHECK
- HF_HUB_DISABLE_XET
- HF_HUB_DOWNLOAD_TIMEOUT
- HF_HUB_ENABLE_HF_TRANSFER
- HF_HUB_ETAG_TIMEOUT
- HF_HUB_OFFLINE
- HF_HUB_USER_AGENT_ORIGIN
- HF_HUB_VERBOSITY
- HF_INFERENCE_ENDPOINT
- HF_MODULES_CACHE
- HF_OIDC_ID_TOKEN
- HF_OIDC_RESOURCE
- HF_TOKEN
- HF_TOKEN_PATH
- HF_UPDATE_DOWNLOAD_COUNTS
- HF_XET_CACHE
- HF_XET_HIGH_PERFORMANCE
- HUGGINGFACE_ASSETS_CACHE
- HUGGINGFACE_CO_STAGING
- HUGGINGFACE_HUB_CACHE
- HUGGING_FACE_HUB_TOKEN
- IID
- IIDS
- IPC_ENABLE
- LAB_BINARY
- LAB_DATA_HOST_DIR
- LAB_DATA_HOST_DIR_2
- LAB_PROFILE
- LAB_RANKER_SWEBENCH_SNAPSHOT
- LESS
- LLM_MOCK_MODE
- MODAL_CLOUD_PROVIDER
- MODAL_CONFIG_PATH
- MODAL_CONTAINER_ARGUMENTS_PATH
- MODAL_ENABLE_SNAP_RESTORE
- MODAL_IMAGE_ALLOW_GLOBAL_DEPLOYMENT
- MODAL_IS_REMOTE
- MODAL_LAUNCH_ARGS
- MODAL_LOGLEVEL
- MODAL_LOG_FORMAT
- MODAL_PROFILE
- MODAL_RICH_CLI
- MODAL_TASK_ID
- MODAL_TELEMETRY_SOCKET
- MODAL_TOKEN_ID
- MODAL_TOKEN_SECRET
- MODAL_USE_LEGACY_FILESYSTEM_SNAPSHOT
- MSGPACK_PUREPYTHON
- MULTIDICT_NO_EXTENSIONS
- NCCL_HOSTID
- NCCL_NSOCKS_PERTHREAD
- NCCL_SOCKET_NTHREADS
- NETRC
- NO_COLOR
- NPY_AVAILABLE_MEM
- NPY_PROMOTION_STATE
- NUMPY_EXPERIMENTAL_DTYPE_API
- NUMPY_MADVISE_HUGEPAGE
- OAB_IMAGES
- OAUTH_CLIENT_ID
- OAUTH_CLIENT_SECRET
- OAUTH_SCOPES
- OPENAI_API_KEY
- OPENID_PROVIDER_URL
- PAGER
- PANDAS_CI
- PANDAS_COPY_ON_WRITE
- PANDAS_FUTURE_DISTINGUISH_NAN_AND_NA
- PANDAS_FUTURE_INFER_STRING
- PANDAS_FUTURE_PYTHON_SCALARS
- PATHEXT
- PB
- PEP517_BACKEND_PATH
- PEP517_BUILD_BACKEND
- PIP_CONFIG_FILE
- PIP_EXISTS_ACTION
- PIP_NO_INPUT
- PIP_USER_AGENT_USER_DATA
- PKG_CONFIG
- PKG_CONFIG_PATH
- PREFIX
- PRE_COMMIT_ALLOW_NO_CONFIG
- PRE_COMMIT_COLOR
- PRE_COMMIT_HOME
- PRE_COMMIT_RUNNING_LEGACY
- PRE_COMMIT_USE_MAMBA
- PRE_COMMIT_USE_MICROMAMBA
- PROCESSOR_ARCHITEW6432
- PROPCACHE_NO_EXTENSIONS
- PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION
- PYPARSINGENABLEALLWARNINGS
- PYTHONASYNCIODEBUG
- PYTHON_DOTENV_DISABLED
- PYTHON_EGG_CACHE
- REQUESTS_CA_BUNDLE
- RUN_TAG
- R_HOME
- SCRIPT_NAME
- SERVER_SOFTWARE
- SOURCE_DATE_EPOCH
- SPACE_HOST
- SPACE_ID
- SSLKEYLOGFILE
- SSL_CERT_DIR
- SSL_CERT_FILE
- SYNCHRONICITY_TRACEBACK
- TEMPORARILY_DISABLE_PROTOBUF_VERSION_CHECK
- TERM_PROGRAM
- TF_CPP_MIN_LOG_LEVEL
- TOKENIZERS_PARALLELISM
- TQDM_POSITION
- TRANSFORMERS_OFFLINE
- UNICODE_VERSION
- UNIXCONFDIR
- UNIXUSRLIBDIR
- USE_JAX
- USE_TF
- USE_TORCH
- UV_PYTHON_INSTALL_DIR
- VERTEX_PRODUCT
- VIRTUAL_ENV
- VIRTUAL_ENV_DISABLE_PROMPT
- VIRTUAL_ENV_PROMPT
- VSCMD_ARG_TGT_ARCH
- WATCHFILES_CHANGES
- WATCHFILES_DEBUG
- WATCHFILES_FORCE_POLLING
- WATCHFILES_IGNORE_PERMISSION_DENIED
- WATCHFILES_POLL_DELAY_MS
- WAYLAND_DISPLAY
- WEBHOOK_SECRET
- XDG_CACHE_HOME
- XDG_CONFIG_DIRS
- XDG_DATA_DIRS
- XDG_DESKTOP_DIR
- XDG_DOCUMENTS_DIR
- XDG_DOWNLOAD_DIR
- XDG_MUSIC_DIR
- XDG_PICTURES_DIR
- XDG_PROJECTS_DIR
- XDG_PUBLICSHARE_DIR
- XDG_STATE_HOME
- XDG_TEMPLATES_DIR
- XDG_VIDEOS_DIR
- YARL_NO_EXTENSIONS
- GITHUB_TOKEN
- OPENALICE_PROMPTS_ROOT
- PORT
Roadmap · what's planned next
- lab.harness.solver-timeout-tuningP3in progress55%Calibrate LAB_SOLVER_TIMEOUT_SECS per probe tier (Tier-0 mock = 5s, Tier-3 real = 120s) and surface the budget guard in the dashboard heatmap.
- lab.prompts-studio.live-llm-playgroundP2planned15%Wire real provider calls (Codex / OpenRouter) into POST /v1/prompts/playground; currently ships a deterministic stub pending explicit NAO sign-off (Phase 8NNNN).
- lab.prompts-studio.svc-deployP2planned15%Bring prompts-studio-svc (port 8090) live at prompts.blal.pro behind Traefik; Dockerfile exists and binary compiles, awaiting explicit operator deploy approval.
- lab.harness.swebench-baselineP3planned9%Run full SWE-bench lite dataset through AliceSolver and record a signed IntegrityCertificate baseline so future regressions are quantifiable.
- lab.bench.codeclash-runnerP4planned6%Implement the CodeClash TinyRunner slice (bench-harness/runners/codeclash.rs TODO slice-5) once the public dataset URL is confirmed.
Code composition
tokei · loc- Rust73.9%
- JSON16.2%
- YAML3.4%
- JavaScript1.7%
- TOML1.4%
- Other3.4%
- Rust73.9%
- JSON16.2%
- YAML3.4%
- JavaScript1.7%
- TOML1.4%
- Other3.4%
- Rust73.9%· 26,804
- JSON16.2%· 5,874
- YAML3.4%· 1,230
- JavaScript1.7%· 605
- TOML1.4%· 522
- CSS1.2%· 439
- Python0.9%· 325
- HTML0.5%· 183
- +3 more0.8%· 274 · 5 files
| Language | % code | code | comments | blanks | files |
|---|---|---|---|---|---|
| Rust | 73.9% | 26,804 | 3,553 | 3,106 | 111 |
| JSON | 16.2% | 5,874 | 0 | 0 | 147 |
| YAML | 3.4% | 1,230 | 426 | 55 | 51 |
| JavaScript | 1.7% | 605 | 15 | 4 | 1 |
| TOML | 1.4% | 522 | 148 | 88 | 21 |
| CSS | 1.2% | 439 | 20 | 37 | 1 |
| Python | 0.9% | 325 | 5 | 40 | 3 |
| HTML | 0.5% | 183 | 10 | 18 | 3 |
| Shell | 0.4% | 158 | 91 | 23 | 3 |
| SQL | 0.2% | 90 | 39 | 12 | 1 |
| BASH | 0.1% | 26 | 17 | 6 | 1 |
| Markdown | 0.0% | 0 | 3,343 | 947 | 28 |
Telemetry ribbon · last 90 days
38 eventslab/arena
1 feature- lab.arena.agent-comparisoncrates/lab-arena/src/lib.rs:9Registers arbitrary agents via agent.yaml + Dockerfile. Loads YAML benchmark suites (tool-calling, memory-recall, safety, latency, multi-turn). Scores each agent with the same 5-metric engine used by the Incubator, producing a LeaderboardEntry per agent. Head-to-head comparison and historical tracking across agent versions. ═══════════════════════════════════════════════════════
lab/bench
1 feature- lab.bench.cost-gated-portfoliocrates/bench-harness/src/lib.rs:9BudgetGuard enforces a daily USD limit so accidental full-suite runs don't drain Codex quota. CacheBackend (SQLite-backed or in-memory) deduplicates identical (model, prompt, tool-hash) calls — cache-hit = zero tokens. CostModel provides calibrated per-provider rates. TinyRunner orchestrates adapters: swe_bench, humaneval_mini, terminal_bench, codeclash. Tier-1 target cost ≈ $0.30/commit. @feature lab.bench.integrity-certificate bench-integrity OIC M1: ed25519-signed IntegrityCertificate wraps each benchmark run. AttestationSurface captures git SHA, model ID, provider, workspace allowlist SHA256, harness provenance SHA256, sample counts, cost, and a terminator_test_passed flag. Bundle written as certificate.json + bundle.tar.zstd for offline third-party verification without re-running Alice. WHY: Codex subscription quota is finite. Running SWE-bench Verified unmetered would burn a month's budget in one commit. Every design choice here is subordinate to "first runs must be cheap". Layout: error.rs — `BenchError` enum. FULL IMPL. budget.rs — `BudgetGuard` daily-limit enforcement. FULL IMPL. cost.rs — `CostModel` pure cost estimator. FULL IMPL. cache.rs — `CacheBackend` trait + rusqlite + in-mem impls. FULL IMPL. adapter.rs — `BenchAdapter` trait + `Tier` + `TinyRunner` (stub). report.rs — `RunReport` + `render_markdown()` (stub). runners/ — one adapter impl per bench (stubs; slices 3–5). Related docs: openalice-lab/docs/bench-harness-spec-2026-04-22.md — full design. openalice-lab/HARNESS.md — generic lab-harness (this crate layers on). ═══════════════════════════════════════════════════════════════════════════
lab/control
1 feature- lab.control.sqlite-persistencecrates/lab-control/src/lib.rs:10SQLite control plane (WAL mode, 6 tables, 9 indexes) storing every run, test result, score, xray snapshot, session recording, and patch proposal. Provides heatmap(), score_history(), list_runs() aggregates consumed by lab-dashboard and lab-cli. Migrations are idempotent (IF NOT EXISTS) — safe to re-run on every startup. ═══════════════════════════════════════════════════════
lab/dashboard
1 feature- lab.dashboard.live-uicrates/lab-dashboard/src/lib.rs:8Axum WebSocket server broadcasting real-time test progress to a vanilla-JS frontend. REST endpoints: /api/runs (pass/fail per run), /api/scores (trend data), /api/stats (table counts), /api/heatmap (feature × tier grid), /api/capsules (live Docker container states), /metrics (Prometheus format). Optional LAB_DASHBOARD_KEY API-key auth via X-Lab-Key header or ?key= query param. Served at atlas.blal.pro. ═══════════════════════════════════════════════════════
lab/evolution
1 feature- lab.evolution.self-improvement-pipelinecrates/lab-evolution/src/lib.rs:12Root-cause heuristic classifies failures as prompt/code_bug/config/ missing_feature/flaky_test/external. Patch proposals auto-trigger when the same cause recurs 3+ times. A/B testing computes score delta with statistical significance (p<0.05). Canary gate: tier-0=100%, tier-1>90%, regression<10% — produces a CanaryDecision with reason. ═══════════════════════════════════════════════════════
lab/harness
4 features- lab.harness.cdp-rendercrates/lab-harness/src/cdp_render.rs:8`render_html(html, out_dir, opts) -> RenderOutput`. Locates a Chromium binary across the common install locations, writes the HTML to a temp file under `out_dir`, and shells out to `--headless=new --screenshot`. No new browser-driver dependency: we reuse the same headless-Chrome substrate the streaming / Tier-3 stack already relies on, invoked through `std::process::Command` so the helper stays dependency-light. Determinism (design doc §5): fixed viewport, a fixed virtual-time budget (`settle_ms`) that advances the page's clock deterministically before the snapshot, and `--force-color-profile=srgb` so the PNG bytes are stable across hosts. This module is intentionally LLM-free. The render path is fully validatable without any model call — the only LLM cost (the vision judge) lives behind the `VisionJudge` trait in `vision_judge`. ═══════════════════════════════════════════════════════════════════════════
- lab.harness.inspect-primitivescrates/lab-harness/src/lib.rs:8Task/Solver/Scorer triad modelled on UK AISI Inspect. Solver and Scorer receive physically split views of each Sample — the solver never sees the reference answer (oracle_mode is the single documented exception for ReferenceSolver pipeline validation). BudgetTracker enforces per-sample caps on tokens, tool calls, wall-time, and USD cost. @feature lab.harness.alice-solver AliceSolver: HTTP client to Alice /v1/chat with budget recording. AliceMultiTurnSolver: multi-turn loop for stateful probes — copies fixtures into the bind-mount before turn 1, captures Prometheus pre/post snapshots, honours delay_ms_after between turns. @feature lab.harness.side-effect-scorer SideEffectScorer: offline scorer for master-plan probes. Asserts file_exists, dir_nonempty, audit_row (JSONL scan), prometheus_inc, prometheus_lte_delta, prometheus_eq_delta. Never touches the network at score time — reads only the bind-mounted data dir and the Prometheus snapshots captured by AliceMultiTurnSolver. @feature lab.harness.trace-regression TraceStore persists per-(task, solver) JSONL traces. compare() diffs two runs and returns a RegressionReport. probe_alice exits 2 on regression so CI catches it without human review. @feature lab.harness.master-plan-probes Five JSONL datasets (memory, speaker, skill, subagent, coalesce) covering Wave Q1–Q8 Alice capabilities. MasterPlanProbe loader with typed multi-turn input schema. SAMPLE_FILTER env for single-sample iteration without burning full budget. Layout: task.rs — Task + Sample types. A Task is "a dataset + what a solver must produce + how to score it". `Dataset` is a sync or async stream of samples. solver.rs — Solver trait. The "agent under test". Implementors include Alice (HTTP), Aider (CLI), Claude Code (CLI), raw model APIs. Each gets a `SolverContext` with sandbox access + budget + approved tools. scorer.rs — Scorer trait. Given (Sample, SolverOutput) → Score. Built-ins: ExactMatch, TestsPass, ModelGraded. budget.rs — Token + time caps enforced per sample. Any solver going over is terminated; its sample counts as failure. report.rs — Aggregation: per-task summary + per-sample trace. Feeds lab-dashboard. Stored as JSONL so diffs across versions are grep-able. runner.rs — The orchestrator: iterate samples, call the solver within budget, score the output, roll up to a Report. Handles parallelism (configurable) + cost tracking. error.rs — Harness-specific error enum. The crate is intentionally dependency-light: every concrete agent / benchmark lives in a downstream crate that pulls `lab-harness`. This keeps the core stable while we iterate on individual adapters. ═══════════════════════════════════════════════════════════════════════════
- lab.harness.ui-bench-static-gatecrates/lab-harness/src/ui_bench.rs:12`check_self_contained(html)` — the "Completeness pre-filter" from the pipeline. Pure logic, no network, no LLM: returns the list of violations so reports can show exactly why an artifact was rejected before any (paid) vision judge runs. @feature lab.harness.ui-bench-dataset `UiBench::from_jsonl` loads the 12 version-pinned UI tasks. Each row is {slug, title, prompt, rubric[], interaction_script?}. The solver sees the prompt; the scorer-side reference carries the rubric so the vision judge can score against concrete checkable items. The render itself lives in `cdp_render`; the scoring lives in `vision_judge` (the only LLM cost, behind a trait). This module never calls a model. ═══════════════════════════════════════════════════════════════════════════
- lab.harness.vision-judgecrates/lab-harness/src/scorers_ext/vision_judge.rs:9`VisionJudge` trait: given a rendered PNG + task title + rubric, return a `VisionVerdict` (completeness / visual_quality / interactivity, each 0–100, plus notes). `VisionJudgeScorer` turns a verdict into a single 0–100 score via configurable weights (default 0.4 / 0.4 / 0.2). `build_judge_prompt` assembles the rubric-anchored prompt text: it lists each rubric item, asks the judge to score every dimension 0–100 with brief justification, and demands strict JSON back. Pinning the prompt here (versioned) is what lets the attestation surface record "which judge + which prompt" produced a score. v1 scope: trait + a `MockVisionJudge` for tests. NO real network judge is invoked by any test. A real Codex/OpenRouter-backed judge is a later, explicitly-gated slice (the trait makes that a drop-in). v1 INTERACTIVITY NOTE: scripted interaction (arrow-key / click events) is deferred (the dataset's `interaction_script` is null for every task). Until then the judge returns a fixed `interactivity` value (a coarse "does it look like it would respond" prior) and `VisionJudgeScorer` weights it lightly (0.2). When the scripted-interaction slice lands, this dimension becomes execution-verified rather than judged. ═══════════════════════════════════════════════════════════════════════════
lab/incubator
2 features- lab.incubator.docker-sandboxcrates/lab-incubator/src/lib.rs:10Isolated Docker sandbox for Alice under test. Four profiles (minimal/standard/full/stress) controlling LLM backend, worker set, browser, A2A, and token budget. Security: lab-internal network (no internet), cap_drop ALL, no-new-privileges, read-only rootfs. Bind-mounted data dir (Phase 8L) lets the host scorer read Alice's filesystem side-effects. UID mapping (Phase 8S-perm) ensures host user can write fixtures pre-run. ═══════════════════════════════════════════════════════
- lab.incubator.yaml-fixture-runnercrates/lab-incubator/src/harness.rs:11Parses YAML TestFixture files (inject / expect / verify / wait steps) from tests/tier-{0..4}-* directories. Executes steps sequentially: inject via mock /_lab/inject, expect via mock /_lab/messages poll, verify via Alice REST calls. Computes 5-metric scores per fixture, stores TestResult + Score to lab-control SQLite, returns pass/fail summary. Filters by --tier and --feature flags for targeted runs. ═══════════════════════════════════════════════════════ FLOW: 1. Load YAML fixtures from tests/tier-{N}-*/ directories 2. For each fixture: a. Reset mock services (POST /_lab/reset) b. Execute steps sequentially: - inject: POST to mock-telegram /_lab/inject - expect: wait + GET mock-telegram /_lab/messages + compare - verify: GET Alice API endpoints + check conditions c. Compute metrics (correctness, latency, tokens, safety, memory) d. Record TestResult + Score to database 3. Return summary with pass/fail counts and scores
lab/mocks
1 feature- lab.mocks.fake-platform-apiscrates/lab-mocks/src/lib.rs:9In-process axum servers that impersonate Telegram (sendMessage / getUpdates / /_lab/inject), Discord, and LLM providers (OpenAI /v1/chat/completions + Codex /v1/responses in echo|canned|record|replay modes). Zero real API calls; all interactions are recorded for assertion. Service discovery via shared MockPorts JSON file. ═══════════════════════════════════════════════════════
lab/prompts-studio
8 features- lab.prompts-studio.ab-testscrates/lab-prompts-studio/src/routes/ab.rs:1GET /v1/prompts/ab-tests — list all A/B tests for a block. POST /v1/prompts/ab-tests — create a new A/B test comparing two block versions with a configurable traffic split. Results and status (running / concluded) stored in ab_tests table in prompts.db.
- lab.prompts-studio.assemblecrates/lab-prompts-studio/src/routes/assemble.rs:1POST /v1/prompts/assemble — render the stored prompt blocks for a given (model, mode, domain, speaker_ctx) triple and persist the resulting assembly in prompt_assemblies for diffing and replay. Delegates rendering to assembler::assemble(); records the actor from the JWT AuthUser extension.
- lab.prompts-studio.blockscrates/lab-prompts-studio/src/routes/blocks.rs:1Read-only block endpoints: GET /v1/prompts/blocks — paginated list with category/mode_gate/tag filters. GET /v1/prompts/blocks/{slug} — full block detail including current body. GET /v1/prompts/blocks/{slug}/versions — version timeline (all statuses). GET /v1/prompts/blocks/{slug}/diff — unified diff between two semver refs.
- lab.prompts-studio.bootstrapcrates/lab-prompts-studio/src/lib.rs:1Axum Router factory for the Prompt Evolution Studio microservice. Wires PromptStudioStore (SQLite), JWT middleware, all 15 /v1/prompts/* routes, the /healthz endpoint, and the embedded studio.html SPA. Entry point for both the library binary (port 3700) and the standalone prompts-studio-svc (port 8090). Auth: HS256 JWT verified via SHARED_JWT_SECRET; STUDIO_AUTH_BYPASS=1 disables check for dev. Boot-time inspector seed via INSPECTOR_PATH + OPENALICE_SOURCE_DIR if prompt_blocks table is empty.
- lab.prompts-studio.draftscrates/lab-prompts-studio/src/routes/drafts.rs:1Draft lifecycle: POST /v1/prompts/blocks/{slug}/draft — create a new draft version (status=draft, semver auto-bumped or explicit hint). POST /v1/prompts/blocks/{slug}/rollback — roll the block back to a prior published version. POST /v1/prompts/drafts/{id}/approve — publish the draft (flips prompt_versions.status draft→published, archives prior head, bumps block's current_version). POST /v1/prompts/drafts/{id}/reject — mark draft as rejected (status=archived), preserving audit trail.
- lab.prompts-studio.playgroundcrates/lab-prompts-studio/src/routes/playground.rs:1POST /v1/prompts/playground — LLM round-trip test bench for assembled prompts. Phase 8MMMM ships a deterministic stub (PLAYGROUND_STUB response) so the SPA can be built end-to-end without live LLM cost. Phase 8NNNN (goal: lab.prompts-studio.live-llm-playground) wires real Codex / OpenRouter calls behind explicit NAO sign-off.
- lab.prompts-studio.reflexioncrates/lab-prompts-studio/src/routes/reflexion.rs:1DB-backed reflexion proposal review (legacy path): GET /v1/prompts/reflexion-proposals — list proposals filterable by status (pending / approved / rejected). POST …/{id}/approve — mark proposal approved + record approver + decision_note; persisted to reflexion_proposals table. POST …/{id}/reject — mark rejected. Distinct from reflexion_b (file-backed YAML proposals from the alice runtime scheduler).
- lab.prompts-studio.reflexion-bcrates/lab-prompts-studio/src/routes/reflexion_b.rs:1File-backed reflexion B-hybrid proposal review (Phase 8MMMM-PPPP): GET /v1/reflexion/proposals — lists YAML proposals written by the alice runtime scheduler under OPENALICE_PROMPTS_ROOT/prompts/proposals/*.yaml. POST …/{id}/accept — materialises an overlay YAML + removes source file. POST …/{id}/reject — renames to *.yaml.rejected (archive sweep picks up after 30d). NEVER deletes (feedback-memory-archive-not-delete). Distinct from routes::reflexion (DB-backed, at /v1/prompts/reflexion-proposals).
lab/prompts-studio-svc
1 feature- lab.prompts-studio-svc.maincrates/prompts-studio-svc/src/main.rs:1Standalone binary wrapping the lab-prompts-studio library (NAO task #454, 2026-05-22). Binds on PROMPTS_STUDIO_BIND (default 0.0.0.0:8090) — a distinct port from the library's own binary (:3700) so both can run side-by-side in dev. Boot sequence: open/create SQLite at PROMPTS_DB_PATH → optional inspector seed → JWT setup → serve. Deployment surface (Dockerfile.prompts-studio-svc, compose stanza, Traefik labels) evolves independently of the library. «без деплоев» — NOT live until NAO approval (goal: lab.prompts-studio.svc-deploy).
lab/ranker
1 feature- lab.ranker.competitive-intelligencecrates/lab-ranker/src/lib.rs:10Rust rewrite of openalice-ranker (Python). Consumes Alice's features.json and competitor YAML fixtures; produces CoverageDiff, GapRanker priority list, and a ranked leaderboard. Pipeline: FeaturesCatalog + CompetitorRegistry → CoverageDiff → FuzzyGapRanker → JsonRenderer / MarkdownRenderer. Token-free — pure data analysis. ═══════════════════════════════════════════════════════
lab/scoring
1 feature- lab.scoring.five-metric-enginecrates/lab-scoring/src/lib.rs:10Pure-Rust scoring engine: correctness (40%), safety (20%), latency (15%), tokens (15%), memory quality (10%). Aggregates by feature and tier (T0-T4 weighted). Regression detection: >5% drop = warn, >10% = block. Cost estimator in USD per 1K tokens. Zero I/O — every function is synchronous and deterministically testable. ═══════════════════════════════════════════════════════
lab/types
1 feature- lab.types.shared-domain-modelcrates/lab-types/src/lib.rs:9Canonical domain types shared across all lab crates: Run, TestResult, Score, XraySnapshot, Recording, Patch, TestFixture, LabConfig. Every struct maps to a SQLite table or API wire contract. Zero I/O — pure data definitions with serde + full unit-test coverage. ═══════════════════════════════════════════════════════
lab/xray
1 feature- lab.xray.three-stage-scannercrates/lab-xray/src/lib.rs:11Stage-1 AST (zero tokens): subprocess call to openalice-inspector for module/function/import inventory. Stage-2 LLM: priority-ranked file list (prompt=10, safety=9, agent-loop=8, tools/memory=7, config=4) — top 30 files, ~5-15 K tokens. Stage-3 Diff: snapshot comparison for competitor change detection. WatchedRepo git-pull + diff pipeline runs on zero LLM tokens until a significant change is detected. ═══════════════════════════════════════════════════════