Releases: iarjunganesh/continuum
Releases · iarjunganesh/continuum
Release list
v0.6.0
Fixed
- The default Bedrock region pointed at an endpoint known to throttle.
config.py,infra/template.yamland thedocs/DEPLOY.mddeploy command all still defaulted to eu-west-1 — contradicted by the 2026-07-07 probe recorded in.env.example. All defaults now align on eu-north-1, and an ADR 008 addendum records the 2026-07-08 probe result (scripts/probe_bedrock.py): every region throttles every model on the first call — Titan "Too many requests", Claude and first-party Nova "Too many tokens per day" — i.e. an account-level dynamic quota clamp that neither model choice, region choice, nor promotional credits routes around; only an AWS Support escalation or account usage history lifts it - Bedrock clients ran on botocore defaults (60s read timeout, backoff retries) — one throttled/hung call could consume the entire Lambda invocation budget and kill the function mid-step organically, making the recorded demo nondeterministic. Both
bedrock-runtimeclients now setconnect_timeout=5,read_timeout=15, standard-mode retries capped at 2 attempts, and the LambdaTimeoutwent 30s → 60s with the per-step budget math documented in the template - The Gradio "Ask via MCP" panel swallowed the real MCP error. The MCP client raises from inside an anyio
TaskGroup, so a failure surfaced on the Space as the uselessunhandled errors in a TaskGroup (1 sub-exception). The handler now unwrapsExceptionGroups recursively to their leaf errors (e.g.McpError: executing select query: unauthorized) and short-circuits with an actionable setup message when the key/cluster id aren't configured. Exercising the fixed path against the live server also pinned the real failure mode — a service-account key authenticates but every query returnsunauthorizeduntil the account holds the Cluster Operator role on the cluster — now documented indocs/DEPLOY.mdalongside the previously-undocumentedCOCKROACH_MCP_CLUSTER_IDSpace secret - Sharpened the TLS guidance across
.env.example,docs/DEPLOY.mdandinfra/template.yaml.sslmode=requirestays the documented choice (encrypts, no CA file, works in every fresh container — acceptable for synthetic data, ADR 005), but the why is now empirically grounded: this cluster's cert is actually publicly-trusted (Let's Encrypt, verified 2026-07-08), yetsslmode=verify-full&sslrootcert=systemstill fails through psycopg/libpq (certificate verify failed, tested on libpq 18) because libpq'ssystemCA store is empty/unresolved on many platforms. The docs now explicitly warn againstverify-full&sslrootcert=systemand note it's the cause of that exact error, so the guidance doesn't get "corrected" back to a string that doesn't work
Added
scripts/probe_bedrock.py/make probe-bedrock— one InvokeModel + one Converse per candidate region, retries disabled. Run before recording: both Bedrock paths degrade silently by design (no precedent / precedent-replay), so a fully throttled account looks healthy while never touching Bedrock — the probe tells you which mode you're demoing inscripts/demo_run.py --tick --via-lambda— drives an alert tick through the deployedcontinuum-orchestratorfunction, making the runbook's "a fresh Lambda invocation starts cold" literal instead of simulated; first real consumer ofLAMBDA_FUNCTION_NAME(previously dead config)make deploy—sam build --use-container+sam deploy; the container build is required when building on Windows/macOS becausepsycopg[binary]/pydantic-coreship compiled wheels and a host-platform build crashes on Lambda's Linux runtime with import errors (now documented indocs/DEPLOY.md)docs/DEMO_READINESS_CHECKLIST.md— P0/P1 winner-level demo checklist, audited against actual repo state; biggest open blockers called out (no recorded video, Space can't self-trigger an incident,docs/BENCHMARKS.mdnever populated)infra/__init__.pysoinfra.lambda_handlerimports as a regular package rather than relying on namespace-package resolution
Changed
docs/DEMO_RUNBOOK.mdpre-flight now starts withmake probe-bedrock, and the recovery beat documents both drivers: restart-and-retick--via-api(whatchaos_demo.ps1does) or--via-lambdafor a real cold Lambda invocation
v0.5.0
Fixed
- QueryAgent now speaks the Managed MCP Server's current contract. The server scopes each session to a cluster via an
mcp-cluster-idheader and requires adatabaseargument per query; without them every call failed (401 Unauthorizedunauthenticated,cluster_id not providedonce a key was configured). New settingsCOCKROACH_MCP_CLUSTER_ID/COCKROACH_MCP_DATABASE; constructor args passed as explicit blanks stay blank so unit tests remain hermetic whatever the local.envholds. Verified end to end against the live server (auth, session negotiation, query dispatch) .env.examplerealigned with.envafter significant drift: adds the Managed MCP service-account block (endpoint, cluster id, database, API key — with the console steps for creating the key), replaces the now-false "eu-west-1 has full default quota" Bedrock claim with probe-first guidance (2026-07-07: eu-west-1, eu-central-1 and us-east-1 all throttle Titan on this account; eu-north-1 works at a low per-minute rate), and warns that Bedrock retires old model versions (eu.anthropic.claude-3-5-sonnet-20241022-v2:0— found pinned in a stale.env— now returns "invalid model identifier")
Added
.mcp.json— project-scoped CockroachDB Cloud MCP server config for Claude Code (streamable HTTP, cluster-scoped via themcp-cluster-idheader, Bearer auth via${COCKROACH_MCP_API_KEY}environment expansion, so no secret lives in the committed file)- Lambda deploy runbook in
docs/DEPLOY.md - Bedrock-free seeding so the demo Space can be populated without the throttled Bedrock account (ADR 008):
make seed-data-offline/.\scripts\migrate_and_seed.ps1 -Offlineseed deterministic synthetic vectors (scripts/synthetic_vectors.py) with no AWS call, andscripts/capture_seed_embeddings.py+seed_memory.py --from-fixtureload real Titan vectors captured once where Bedrock is reachable - Recovery sequence diagram and a typical-vs-Continuum comparison table in
docs/ARCHITECTURE.md, making the two-cold-invocation handoff through durable CockroachDB state visible at a glance
Changed
- Sharpened the hero positioning across the README, the Hugging Face Space (
ui/app.py), and the DEVPOST elevator pitch to lead with the concrete payoff — resumes the exact step it was killed on, because its memory lives in CockroachDB, not the process — instead of the more abstract earlier tagline - Repo-wide documentation alignment pass. Synced stale version fields (
api/main.py,pyproject.toml→0.4.0); corrected the integration-test count (2 → 3) and surfaced the real-SIGKILLtest_chaos_kill_e2e.pyin the README and DEVPOST test-integrity claims; fixed thedocs/ARCHITECTURE.md§4.1 vector-index DDL to matchinfra/schema.sql(alwaysservice-prefixed,embedding_modelcolumn,service-only filter); standardized the judging criterion name to Production Readiness; aligned theschema.sqlrecovery-query comment with the actual latest-step query; and removed cross-project references fromdocs/SUBMISSION.md - Latency benchmarks (
scripts/benchmark.py,make benchmark,docs/BENCHMARKS.md): p50/p95/p99 for recovery read, per-step transaction commits, C-SPANN vector search, and the full cold-resume path — against a live cluster, no Bedrock dependency - Real-kill chaos integration test (
tests/integration/test_chaos_kill_e2e.py): spawns the orchestrator as a uvicorn subprocess, hard-kills it mid-step withscripts/chaos_kill.py(real SIGKILL/TerminateProcess), and asserts a cold restart resumes the interrupted step exactly-once from CockroachDB — the literal process-kill path thattest_recovery_e2e.pyonly simulated with a SQL UPDATE. Shared integration fixtures moved totests/integration/conftest.py
v0.4.0
Added
- Explicit per-step transaction boundaries (ADR 009). The orchestrator's STEP 3 now goes through
MemoryAgent.checkpoint_step_start/checkpoint_step_done, each an explicitwith conn.transaction()block (CockroachDBSERIALIZABLE), with thetime.sleepexecution window between them so a kill still commitsexecutingand nothing else. Makes the "transactional memory" claim literally true, not just per-statement autocommit - Concurrency-safe exactly-once forward claim (ADR 009). A new step is claimed with
INSERT ... ON CONFLICT (incident_id, step_index) DO NOTHING; a racing invocation that loses the claim skips execution instead of double-running the step.checkpoint_step_doneguards its transition withAND status = 'executing'. Proven on a real cluster bytests/integration/test_recovery_e2e.py::test_forward_step_claim_is_exactly_once - Best-effort correlation. Orchestrator STEP 2 (
embed+find_similar) is wrapped in try/except — a throttled/misconfigured Bedrock endpoint now degrades to "no precedent" (remediation falls back topage_on_call_engineer) instead of throwing before the incident is durable. Removes the single point of failure that a red Bedrock endpoint (ADR 008's 0-quota risk) posed to the whole recovery demo
Changed
- Aligned docs/claims to the code after auditing the whole repo: corrected "6 ADRs" → 9, unit-test count → 46 (100% measured coverage against the 90% gate), and the ARCHITECTURE.md §3 recovery sequence (it inaccurately showed a killed step being skipped; the code re-runs the interrupted step).
docs/DEMO_RUNBOOK.md0:20 now uses--via-api(a bare--tickruns in-process, leaving nothing forchaos_kill.pyto strike) and notesmake chaos-demois POSIX-only
Removed
MemoryAgent.log_step/set_step_status— dead code once STEP 3 moved to the transactional checkpoints; their docstrings described a mechanism the orchestrator no longer used
v0.3.2
Fixed
- eu-central-1 has a
0, non-adjustable Bedrock quota on this account for every model (Titan Embed V2 and every Claude Sonnet variant, both on-demand and cross-region) — confirmed viaaws service-quotas list-service-quotas, not assumed.seed_memory.py's single-transaction seeding was failing silently on the first embedding call and rolling back every record. Addedbedrock_region(BEDROCK_REGION, defaulteu-west-1) used only by thebedrock-runtimeclients incorrelation_agent.py/remediation_agent.py;aws_region/Lambda/CockroachDB stay in eu-central-1 (ADR 007 untouched, split documented in ADR 008) - Anthropic models required a one-time, account-wide "use case details" form (
agreementAvailability: NOT_AVAILABLEon every Claude version checked, not just 4.5) before any Anthropic model could be invoked — submitted viaaws bedrock put-use-case-for-model-access, followed bycreate-foundation-model-agreementto accept Claude Sonnet 4.5's EULA specifically. Confirmed viaget-foundation-model-availability:agreementAvailabilitynowAVAILABLE seed_memory.pynow retriesThrottlingExceptionwith exponential backoff (5s → 160s over 6 attempts) and commits per record instead of one final commit for the whole file, so a mid-run throttle no longer discards already-seeded rows
Known issue (not code — AWS account state)
- Even with the above fixed, this brand-new AWS account still hits sustained
ThrottlingException/"Too many tokens per day"on both Titan Embed V2 and Claude Sonnet 4.5 that a 6-retry/~5-minute backoff didn't clear — an automated new-account trust ramp that published Service Quotas values don't reflect. No CLI lever for this; expect it to loosen with time/usage.remediation_agent.py's deterministic precedent-replay fallback keeps the app functional in the meantime
v0.3.1
Fixed
- The 0.3.0 Space still didn't boot: Gradio's launch-time analytics telemetry compares the app's theme against its built-in themes; built-in themes use
Fontobjects forfont/font_monowhile ours used plain strings, and Gradio's ownFont.__eq__doesn't guard against comparing to a non-Font— crashing withAttributeError: 'str' object has no attribute 'name'whenever analytics is enabled (the Spaces default). Fixed viaanalytics_enabled=Falseon theBlocksconstructor, which also means this read-only demo doesn't phone telemetry home scripts/seed_memory.py,demo_run.py, andchaos_kill.pyhad the same subdir-import bug asui/app.py(fixed for that file in 0.3.0, missed here): runningpython scripts/x.pyputsscripts/— not the repo root — onsys.path, sofrom agents…/from config…/from observability…raisedModuleNotFoundError. This meantmake seed-data,make demo, andmake chaos-demo— the actual kill-and-recover sequencedocs/DEMO_RUNBOOK.mdcalls the thing being graded — never worked via their documented entrypoints, only discovered while running the Windows seed script end to end for the first time. All three now bootstrap the repo root the same wayui/app.pydoesseed_memory.pypaces its Bedrock embedding calls (1s between records) — a tight back-to-back loop of 40 calls was hittingThrottlingExceptionimmediately
Added
scripts/migrate_and_seed.ps1— Windows equivalent ofmake migrate+make seed-data(nomakeon Windows), matching the existingchaos_demo.ps1pattern. ChecksCOCKROACH_DATABASE_URLand (unless-SkipSeed) AWS credentials up front with a clear message instead of a bare traceback, and checks$LASTEXITCODEafter every externalpythoncall —$ErrorActionPreference = "Stop"only covers PowerShell cmdlets/terminating errors, not external command exit codes, so a failed step would otherwise print a traceback and the script would carry on and report success anyway (caught by testing the schema step against an unreachable DB)
Changed
- Space pins Python 3.14 (
python_version: "3.14"in README frontmatter), matching CI (python-version: "3.14") and local dev — previously unset, so the Space picked whatever Hugging Face's own default was (observed: 3.13) rather than the project's actual target - CockroachDB Cloud TLS guidance corrected to
sslmode=require:sslrootcert=systemdoesn't work for CockroachDB Cloud, since its clusters use a cluster-specific CA rather than one chained to a public root —verify-fullfails there withcertificate verify failedeven once the root-cert-file-missing error is resolved.requireencrypts without needing any CA file, an acceptable trade-off since Continuum only ever stores synthetic data (ADR 005) and this connection only ever reaches CockroachDB Cloud's own endpoint
v0.3.0
Added
ui/app.pyrebuilt into a dark, NOC-style incident console (from a single Dataframe). The resilience story is now visible on screen, not only in the video:- Recovery timeline drill-down — pick an incident and replay its
remediation_stepslog; the step stuck inexecutingpulses and is flagged "the process died here — the next cold invocation resumes at exactly this step" - Resilience banner that reads the live count of in-flight (
executing) steps and states the resume guarantee in plain terms - KPI tiles (Open · In-flight now · Resolved · Steps committed) using the accessible status palette (icon + label, never colour alone)
- Incident cards with a per-incident mini step-tracker, and
gr.Timerauto-refresh (5s) so the feed stays live during the demo - Still read-only: direct psycopg for the feed,
query_agent(MCP) for the "Ask via MCP" panel —memory_agent.pyremains the only write path
- Recovery timeline drill-down — pick an incident and replay its
- Static preview of the console for design review (rendered from the app's own functions over synthetic incidents)
Changed
- Space now pins Gradio 6 (
sdk_version: 6.19.0in README frontmatter;requirements.txtfloorgradio>=6.0), matching the development environment - README Screenshots / Demo-UI wording updated to describe the console + recovery timeline rather than a bare incident feed
docs/DEPLOY.mdanddocs/DEMO_RUNBOOK.mdupdated to reflect the new UI (recovery-timeline drill-down as the demo's visual proof) and the Gradio-6 pin
Fixed
- HF Space build was broken in 0.2.0:
app_file: ui/app.pyis in a subdirectory, so running it as a script putui/(not the repo root) onsys.path, andfrom agents…/from config…failed withModuleNotFoundError.ui/app.pynow bootstraps the repo root ontosys.pathbefore those imports - Gradio 5→6 API move:
css/theme/jsrelocated fromBlocks()tolaunch(). The stylesheet is now injected as a<style>component (renders on any version) andlaunch()kwargs are guarded by a signature check, so the app can't crash on a version mismatch
v0.2.0
Added
- Real Amazon Bedrock wiring: Titan Text Embeddings V2 (1024-dim, matching
VECTOR(1024)schema) in the Correlation Agent; Claude-on-Bedrock reasoning with deterministic precedent-replay fallback in the Remediation Agent - Genuinely interruptible remediation loop: each invocation drives one step through
proposed → executing → executedwith a simulated execution window; a kill mid-step leavesexecutingdurably in CockroachDB and the next cold invocation re-runs that exact step - Cross-platform
chaos_kill.py(psutil) +scripts/chaos_demo.ps1for Windows; fixedmake chaos-demoto actually kill the process doing the work - Seeded historical incidents now include their remediation step history, so precedent replay has real precedent
- CI quality gate (
.github/workflows/ci.yml): Ruff → pytest → coverage → Codecov pyproject.toml(Python 3.14, Ruff, pytest/coverage config)agents/query_agent.py— a real client of the CockroachDB Cloud Managed MCP Server (officialmcpSDK, streamable HTTP), called by the running app itself viaGET /api/v1/incidents/openand the Gradio UI's "Ask via MCP" panel, not only by Claude Code during development (ADR 003 amended). This and Distributed Vector Indexing are Continuum's two CockroachDB tools; ccloud CLI was evaluated and cut (ADR 004 resolution, ADR 006)- Real integration test (
tests/integration/test_recovery_e2e.py) exercising the actual kill-and-recover cycle against a live CockroachDB instance — previously a stub that always skipped itself - CI now provisions an ephemeral single-node CockroachDB container so the integration suite runs on every push, not only when a developer happens to have a cluster handy
- Unit test suite grew from 5 to 42 tests (one file per agent/module: memory, correlation, remediation, query agent, API, observability) — coverage 60% → 100%; CI gate raised 60% → 90%
.github/workflows/release.yml— tags matchingv*.*.*cut a GitHub Release with notes pulled from this filedocs/adr/007-eu-central-1-region.md— documents the deployment region and cross-region inference profile choice- Project-level
.claude/settings.json— safe read-only + build/test command allowlist, ruff-autofix-on-edit hook
Changed
- Python 3.12 → 3.14; psycopg2 → psycopg 3 (no cp314 wheels for psycopg2); dependencies switched to floor pins that resolve to latest
- Schema:
VECTOR(1536)→VECTOR(1024)(Titan v2's max output dimension — 1536 was unsatisfiable) - README rebuilt to submission grade: logo, CI/coverage badges, brand-colored Mermaid architecture, recovery-timeline table, tech-stack badge table, CI/CD + screenshots sections
- AWS region
us-east-1→eu-central-1; Bedrock reasoning model toeu.anthropic.claude-sonnet-4-5-20250929-v1:0(EU cross-region inference profile) — kept in sync across.env.example,config.py,infra/template.yaml(ADR 007) infra/template.yamlLambda runtimepython3.12→python3.14, matching the rest of the codebase- CLAUDE.md expanded (Key Commands, Architecture, Testing Strategy, Deployment, Judging Criteria) to match sibling-repo conventions
Fixed
config.Settingscrashed at import — and thus the whole app failed to start — for anyone with ordinaryAWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEYin their environment (pydantic-settings defaults toextra="forbid", and those two vars were never declared fields). Nowextra="ignore"infra/template.yamltargeted a Lambda runtime (3.12) that couldn't run this codebase's 3.14-only dependencies
Removed
docs/continuum-DEPLOY.md— an exact duplicate ofdocs/DEPLOY.md
Earlier (scaffold)
- Initial project scaffold: README, ARCHITECTURE, ADRs 001–006, SUBMISSION checklist, DEMO_RUNBOOK
- CockroachDB schema:
incidents,remediation_steps,incident_embeddingswith vector index (infra/schema.sql) - Agent module stubs: orchestrator, correlation, memory, remediation
- Synthetic data generation scripts (stubs)
- Chaos-kill script for resilience demo (stub)
- Hugging Face Spaces deployment: README frontmatter,
.github/workflows/sync-to-hf-space.yml,docs/DEPLOY.md— free, cardless public hosting for the Gradio demo UI, replacing the Railway/Vercel/Next.js stack considered and rejected for this project (no frontend framework needed, judged surface is the CockroachDB memory layer)
Planned (before submission)
- Demo video recording per
docs/DEMO_RUNBOOK.md - Deploy orchestrator to AWS Lambda (SAM) and confirm the Hugging Face Space is live
- Complete the
docs/SUBMISSION.mdchecklist end to end