{"id":50398712,"url":"https://github.com/martelogan/autoclanker","last_synced_at":"2026-05-30T22:01:59.380Z","repository":{"id":350965084,"uuid":"1207206092","full_name":"martelogan/autoclanker","owner":"martelogan","description":"A bayesian harness designed for Agent auto-eval loops","archived":false,"fork":false,"pushed_at":"2026-05-22T09:41:02.000Z","size":2193,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-22T16:19:27.936Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/martelogan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-10T17:32:24.000Z","updated_at":"2026-05-22T09:41:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/martelogan/autoclanker","commit_stats":null,"previous_names":["martelogan/autoclanker"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/martelogan/autoclanker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/martelogan%2Fautoclanker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/martelogan%2Fautoclanker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/martelogan%2Fautoclanker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/martelogan%2Fautoclanker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/martelogan","download_url":"https://codeload.github.com/martelogan/autoclanker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/martelogan%2Fautoclanker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33711018,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-30T22:01:58.314Z","updated_at":"2026-05-30T22:01:59.369Z","avatar_url":"https://github.com/martelogan.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg height=\"120\" alt=\"autoclanker logo\" src=\"docs/assets/autoclanker-logo.svg\" /\u003e\n\n# autoclanker\n\n### Bayesian Harness over Agent Eval Loops\n\n[![Python](https://img.shields.io/badge/python-3.11%2B-3776AB?logo=python\u0026logoColor=white)](https://www.python.org/)\n[![License](https://img.shields.io/badge/license-Apache%202.0-1E3A5F)](LICENSE)\n[![Typed](https://img.shields.io/badge/typing-py.typed-0B1220)](autoclanker/py.typed)\n[![Interface](https://img.shields.io/badge/interface-CLI%20%2B%20library-143D59)](#quickstart)\n[![Adapters](https://img.shields.io/badge/adapters-autoresearch%20%7C%20cevolve%20%7C%20external-214E34)](docs/INTEGRATIONS.md)\n\n**[Quickstart](#quickstart)** ·\n**[Demo Paths](#demo-paths)** ·\n**[How It Works](#how-it-works)** ·\n**[Session Flow](#session-flow)** ·\n**[Run Artifacts](#run-artifacts)** ·\n**[Live Exercises](#live-exercises)** ·\n**[Documentation](#documentation)**\n\n\u003c/div\u003e\n\n*Guide the search you already trust with typed, previewable Bayesian priors and locked eval feedback.*\n\n`autoclanker` sits between an outer search or evolutionary loop and an eval\nharness. It turns rough optimization ideas into typed, previewable priors that\ncan influence ranking, active querying, and commit decisions without replacing\nthe underlying loop, so explicit candidate lanes can stay inspectable instead of\ngetting buried inside prompt history.\n\n## Why autoclanker\n\n- Keep your existing eval harness instead of rebuilding around a new optimizer.\n- Keep several candidate lanes explicit so an outer harness can explore them in parallel when practical.\n- Add inspectable human \u0026 LLM beliefs instead of relying on prompt-only steering.\n- Preview compiled priors before they affect a session.\n- Lock the eval contract for a session so benchmark drift is visible instead of implicit.\n- Fit an exact joint linear posterior over explicit main and screened pair features when that math is safe, then fall back automatically when it is not.\n- Use real finite-pool Thompson-style sampling when the posterior is sampleable, with an optimistic deterministic fallback when it is not.\n- Separate utility and feasibility so risky candidates stay visible but bounded.\n- Persist surface snapshots, append-only eval observations, canonicalization summaries, and influence summaries to disk.\n- Work with generic external adapters, plus built-in `autoresearch` and `cevolve` integrations.\n\n## How It Works\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/autoclanker_simple_loop.png\" width=\"460\" alt=\"Autoclanker workflow diagram\"\u003e\n\u003c/p\u003e\n\nThe core idea is simple: keep the outer loop you already trust, but make it\nbelief-aware in a way that is typed, previewable, resumable, and friendly to\nexplicit multi-lane exploration.\n\nThe loop itself is simpler than the full belief machinery:\n\n```text\nideas / hints\n     |\n     v\npick next lanes: [A] [B] [A+B] ---\u003e run evals ---\u003e record results\n      ^          (fixed eval snapshot)  (parallel)        |\n      |                                                   |\n      +---------- rank / refine / query \u003c-----------------+\n```\n\nFor a more detailed diagram, see [here](docs/assets/autoclanker_mermaid.png).\n\nIn practice, that means `suggest` can rank an explicit candidate pool instead of\none opaque prompt thread, an outer harness can evaluate the available lanes in\nparallel when practical, and the session keeps a locked eval contract plus each\nobserved eval result on disk so the same comparison can be revisited later\nwithout quietly drifting the benchmark surface.\n\nWhen enough typed signal and usable explicit features are present, the objective\nmodel is a small exact joint Bayesian linear posterior over explicit candidate\nfeatures: main effects, screened pair effects, and compact metadata like\nactive-gene count. When that feature set is empty, or when the exact solve or\nits sampling path is numerically unsafe, `autoclanker` records the reason and\nfalls back to the earlier heuristic objective path instead of failing the\nsession.\n\nLikewise, `constrained_thompson_sampling` is now a real sampled finite-pool\nacquisition path over the explicit candidate frontier once there is observed\nsignal to sample against. Prior-only cold starts and numerically unsafe sampling\npaths fall back to the deterministic optimistic scorer, and that backend choice\nis reported in JSON artifacts.\n\nThe outer-layer adapter and session-boundary outer loop over\n[Autoresearch](https://github.com/karpathy/autoresearch) here was inspired by\n[cEvolve](https://github.com/jnormore/cevolve), which remains a first-party\nintegration target.\n\n## What You Get\n\n- A non-interactive `autoclanker` CLI.\n- A typed belief schema with beginner and expert lanes.\n- Deterministic and model-assisted canonicalization for rough ideas.\n- Era-local objective and feasibility models with an exact explicit-feature\n  posterior when safe, plus explicit fallback metadata when not.\n- A filesystem-backed session store.\n- A standalone `bigbets` portfolio compiler for ranked strategy registries,\n  dependency graphs, and host-neutral static views.\n- Public examples for Bayes-first, `autoresearch`, and `cevolve` workflows.\n\n## Plain-Language Vocabulary\n\nThe smallest useful mental model is:\n\n- `optimization lever (gene)`: one explicit upstream knob the adapter exposes\n- `setting (state)`: one concrete value of that lever\n- `candidate lane` or `pathway`: one concrete combination being evaluated\n- `frontier`: the explicit set of lanes under comparison\n- `belief`: a typed claim about one lever, relation, risk, or preference\n- `fit`: update the era-local model from eval observations\n- `suggest`: rank the current frontier and ask what to test next\n- `comparison query`: a concrete lane-vs-lane or family-vs-family question that\n  would reduce uncertainty next\n\nThe important honesty boundary is that `autoclanker` learns over explicit\ncandidate features and typed relations, not hidden prompt state.\n\n## Installation\n\nFrom a source checkout:\n\n```bash\nuv sync --dev\n```\n\nOr use the repo front door:\n\n```bash\n./bin/dev setup\n```\n\nOr with pip:\n\n```bash\npython -m venv .venv\nsource .venv/bin/activate\npip install -e \".[dev]\"\n```\n\nThe installed CLI entry point is:\n\n```bash\nautoclanker --help\nbigbets --help\n```\n\nIf `autoresearch` or `cevolve` are already installed on your machine, the\nrecommended first-party adapter shape is `mode: auto` plus either `python_module`\nor `command`. A checkout-backed `repo_path` is still supported, but it is not the\nonly integration route.\n\nIf you do want checkout-backed optional upstreams for the shipped smoke exercises,\nthe quickest provisioning commands are:\n\n```bash\n./bin/dev deps upstreams\n./bin/dev deps autoresearch\n./bin/dev deps cevolve\n```\n\nEquivalent task surfaces are available through `mise` and `make`.\n\nFor local secrets or live-test overrides, copy\n[`/.env.example`](.env.example) to `.env.local`. The repo ignores `.env`,\n`.env.local`, and `.env.*.local`.\n\n## Big Bets Portfolio Compiler\n\n`bigbets` is a sibling CLI packaged with this repo for maintaining ranked\noptimization portfolios. It validates one structured registry and renders the\nderived JSON graph, CSV ranking, Mermaid graph, SVG visual, Markdown snapshot,\nExcalidraw board, static `index.html`, and editable static site scaffold.\n\n```bash\nbigbets validate --input examples/bigbets/basic_portfolio.yaml\nbigbets render --input examples/bigbets/basic_portfolio.yaml --output-dir tmp/bigbets-site\nbigbets site scaffold --input examples/bigbets/basic_portfolio.yaml --output-dir ~/bigbets-site\nautoclanker bigbets validate --input examples/bigbets/basic_portfolio.yaml\n```\n\nRegistries and rendered artifacts are schema-versioned so durable meeting\nsurfaces can be audited and regenerated when `bigbets` evolves.\n\nUse it when individual idea-family issues need to roll up into a smaller set of\nranked big bets. See [`docs/BIGBETS.md`](docs/BIGBETS.md).\n\n## Quickstart\n\nStart with the parser-oriented beginner lane.\n\nThe smallest reusable input in the repo is:\n\n```json\n{\n  \"ideas\": [\n    \"Compiled regex matching probably helps this parser on repeated log formats.\",\n    {\n      \"idea\": \"A wide capture window is likely to run out of memory on long traces.\",\n      \"confidence\": 3,\n      \"effect\": \"hurt\",\n      \"risks\": [\"oom\"]\n    }\n  ]\n}\n```\n\nThat is the exact shape from\n[`examples/idea_inputs/minimal.json`](examples/idea_inputs/minimal.json).\n\nThis intake stays intentionally small: plain rough ideas plus optional light\ndirectional hints. Keep the first preview easy to author, then introduce an\nexplicit candidate pool or frontier only when you are actually ready to compare\nlanes.\n\nInspect the available optimization surface:\n\n```bash\nautoclanker adapter registry\nautoclanker adapter surface\n```\n\nPreview that file directly:\n\n```bash\nautoclanker beliefs preview \\\n  --input examples/idea_inputs/minimal.json \\\n  --era-id era_log_parser_v1\n```\n\nOr try the same idea flow inline:\n\n```bash\nautoclanker beliefs preview \\\n  --era-id era_log_parser_v1 \\\n  --ideas-json '[\n    \"Compiled regex matching probably helps repeated incident formats.\",\n    \"Keeping breadcrumbs beside each alarm probably pairs well with the context-pair plan.\"\n  ]'\n```\n\nIf you want the typed canonical beliefs back explicitly:\n\n```bash\nautoclanker beliefs canonicalize-ideas \\\n  --era-id era_log_parser_v1 \\\n  --ideas-json '[\n    \"Compiled regex matching probably helps repeated incident formats.\",\n    \"Keeping breadcrumbs beside each alarm probably pairs well with the context-pair plan.\"\n  ]'\n```\n\nIf you prefer a reusable file, start from\n[`examples/idea_inputs/minimal.json`](examples/idea_inputs/minimal.json) or\n[`examples/idea_inputs/minimal.yaml`](examples/idea_inputs/minimal.yaml).\n\nThat beginner path works well when the underlying harness may later evaluate\nseveral explicit lanes in parallel under the same locked eval contract. The\nbelief intake stays small; the comparison surface grows only when the search\nneeds it.\n\n## Demo Paths\n\nIf you are deciding where to start, use these in order:\n\n| Demo | Best for | Start with |\n| --- | --- | --- |\n| [`bayes_quickstart`](examples/live_exercises/bayes_quickstart/README.md) | clearest first demo; parser-based rough-ideas workflow | [`minimal.json`](examples/idea_inputs/minimal.json) or [`bayes_quickstart.json`](examples/idea_inputs/bayes_quickstart.json) |\n| [`autoresearch_simple`](examples/live_exercises/autoresearch_simple/README.md) | real-upstream `autoresearch`; mostly additive landscape | [`autoresearch_simple.json`](examples/idea_inputs/autoresearch_simple.json) |\n| [`cevolve_synergy`](examples/live_exercises/cevolve_synergy/README.md) | real-upstream `cevolve`; interaction-heavy landscape | [`cevolve_synergy.json`](examples/idea_inputs/cevolve_synergy.json) |\n| [`bayes_complex`](examples/live_exercises/bayes_complex/README.md) | advanced priors, feasibility, and graph directives | [`docs/LIVE_EXERCISES.md`](docs/LIVE_EXERCISES.md) |\n\nFirst commands for each path:\n\n- `bayes_quickstart`: `autoclanker beliefs preview --input examples/idea_inputs/minimal.json --era-id era_log_parser_v1`\n- `autoresearch_simple`: `./bin/dev test-upstream-live`\n- `cevolve_synergy`: `./bin/dev test-upstream-live`\n- `bayes_complex`: follow section `3.4` in [`docs/LIVE_EXERCISES.md`](docs/LIVE_EXERCISES.md)\n\nThe first row is the simplest product demo. The `autoresearch` and `cevolve`\nrows are contrast exercises over different upstream-flavored workloads, not the\nsame parser app in three different modes.\n\nIf you are browsing the repo tree directly,\n[`examples/README.md`](examples/README.md) separates the runnable demos from the\nsecondary toy examples.\n\n## Session Flow\n\nThe intended flow is:\n\n```text\nrough ideas\n→ preview or canonicalize\n→ session init (store preview + locked eval contract)\n→ apply previewed beliefs\n→ run-eval or ingest eval results\n→ fit\n→ suggest against an explicit candidate pool or frontier\n→ recommend-commit\n```\n\nThe important additive behavior in this phase is:\n\n- `fit` now records whether the objective backend was the exact joint linear\n  posterior or the heuristic fallback, plus condition diagnostics and fit time;\n- `suggest` records whether acquisition used real constrained Thompson sampling\n  or the optimistic fallback path;\n- `query.json` now prefers concrete candidate or family comparison prompts when\n  uncertainty is localized enough to ask a clean lane-vs-lane question.\n\nA minimal session kickoff looks like:\n\n```bash\nautoclanker session init \\\n  --session-id parser-demo \\\n  --era-id era_log_parser_v1 \\\n  --ideas-json '[\n    \"Compiled regex matching probably helps repeated incident formats.\",\n    \"Keeping breadcrumbs beside each alarm probably pairs well with the context-pair plan.\"\n  ]'\n```\n\n`session init` returns a `preview_digest`. Apply that digest before fitting or\nsuggesting so beliefs become active:\n\n```bash\nautoclanker session apply-beliefs \\\n  --session-id parser-demo \\\n  --preview-digest \u003cdigest-from-session-init\u003e\n```\n\nIf you want `autoclanker` itself to execute the evals under the locked contract,\nuse `run-eval` for one candidate or `run-frontier` for a multi-path frontier:\n\n```bash\nautoclanker session run-frontier \\\n  --session-id parser-demo \\\n  --frontier-input examples/frontiers/parser_frontier.json\n```\n\nThose hardened execution commands use the locked eval contract as the trust\nboundary. They isolate the candidate workspace, and when the active eval policy\nmarks the benchmark as measurement-sensitive they also serialize the measured\nphase behind a contract-scoped lease and record soft-stabilization metadata on\nthe eval result.\n\nThat is the intended operational shape: keep the eval surface fixed, let the\nouter harness parallelize what it safely can, and let `autoclanker` preserve\nthe trust boundary plus the belief-aware ranking and query state around those\nresults.\n\nOnce the session has observations, `fit`, `suggest`, `frontier-status`,\n`review-bundle`, `recommend-commit`, and `render-report` keep a small\nhuman-readable report bundle refreshed inside the session root. When you have\nseveral candidate lanes to compare, `suggest` can rank them together from\n`--candidates-input` while the underlying eval runs stay parallelizable in\nwhatever outer harness you already trust.\n\n## Run Artifacts\n\nThe session root now keeps machine-readable Bayesian state, a reproducible\nsurface snapshot, append-only eval observations, and a compact report bundle:\n\n```text\n.autoclanker/\u003csession_id\u003e/\n  session_manifest.yaml\n  eval_contract.json\n  beliefs.yaml\n  compiled_preview.json\n  compiled_priors.json\n  observations.jsonl\n  frontier_status.json\n  posterior_summary.json\n  belief_delta_summary.json\n  query.json\n  commit_decision.json\n  proposal_ledger.json\n  influence_summary.json\n  eval_runs/\n  RESULTS.md\n  convergence.png\n  candidate_rankings.png\n  belief_graph_prior.png\n  belief_graph_posterior.png\n```\n\nThe key files are:\n\n- `RESULTS.md`: current run summary with top candidates, belief-change and\n  proposal sections, follow-up queries, and commit state\n- `eval_contract.json`: locked benchmark tree, eval harness, adapter, and\n  environment digests for the session, plus the effective measurement policy\n- `observations.jsonl`: append-only eval results recorded for the session\n- `frontier_status.json`: persisted family representatives, pending queries, and\n  heuristic merge suggestions for the active frontier\n- `belief_delta_summary.json`: machine-readable prior-vs-posterior change\n  summary for strengthened or weakened features, promoted or dropped lanes, and\n  remaining uncertainty worth highlighting downstream\n- `proposal_ledger.json`: machine-readable per-era proposal state for the\n  current best lane, alternatives, blockers, and recommendation linkage\n- `eval_runs/`: per-candidate execution records written by `run-eval` and\n  `run-frontier`, including contract echo and lease/stabilization metadata\n- `convergence.png`: observed utility over time plus best-so-far progress\n- `candidate_rankings.png`: current ranked candidates with acquisition scores\n- `belief_graph_prior.png`: the prior interaction structure implied by active\n  beliefs\n- `belief_graph_posterior.png`: the posterior interaction structure learned from\n  the current era\n\nFor wrappers or dashboards, you can derive one normalized review surface without\ncreating another persisted artifact:\n\n```bash\nautoclanker session review-bundle \\\n  --session-id parser-demo \\\n  --format json\n```\n\nThat derived bundle summarizes the same session as Prior / Run / Posterior /\nProposal briefs plus lane, proposal, lineage, trust, evidence, and next-action\nstate. `RESULTS.md` renders the same review model for human readers.\n\nTreat those charts as evidence views:\n\n- prior graph: what the session believed before evidence\n- posterior graph: what still looks plausible after evals\n- candidate rankings: which lanes currently look strongest\n- convergence: whether new evals are still changing the picture\n\nYou can refresh that bundle explicitly at any point:\n\n```bash\nautoclanker session render-report \\\n  --session-id parser-demo\n```\n\n## Model-Assisted Canonicalization\n\n`autoclanker` can canonicalize rough ideas with a real model provider, but free\ntext still never updates the posterior directly. The provider must emit typed\nbeliefs or explicit metadata-only proposals.\n\nWith Anthropic configured:\n\n```bash\nautoclanker beliefs canonicalize-ideas \\\n  --era-id era_log_parser_v1 \\\n  --canonicalization-model anthropic \\\n  --ideas-json '[\n    \"Bias the search toward reusing the parse path for recurring incident families.\"\n  ]'\n```\n\nWith any OpenAI-compatible chat endpoint configured:\n\n```bash\nexport OPENAI_API_KEY=\"...\"\nexport AUTOCLANKER_OPENAI_MODEL=\"gpt-5.5\"\n# Optional for proxies or self-hosted gateways:\nexport AUTOCLANKER_OPENAI_API_URL=\"https://api.openai.com/v1/chat/completions\"\n\nautoclanker beliefs canonicalize-ideas \\\n  --era-id era_log_parser_v1 \\\n  --canonicalization-model openai-compatible \\\n  --ideas-json '[\n    \"Bias the search toward reusing the parse path for recurring incident families.\"\n  ]'\n```\n\n## Advanced Beliefs\n\nThe beginner lane is intentionally small. When you need direct prior geometry or\nexplicit pair-screening rules, use the advanced skill in\n[`skills/advanced-belief-author/SKILL.md`](skills/advanced-belief-author/SKILL.md).\n\nThat workflow is:\n\n```text\nrough ideas\n→ inspect registry and surface\n→ canonicalize\n→ preview\n→ escalate only the unresolved or high-impact beliefs\n→ emit a compact advanced JSON belief batch\n```\n\n## Live Exercises\n\nRecommended runnable demos:\n\n- [`examples/live_exercises/bayes_quickstart`](examples/live_exercises/bayes_quickstart)\n- [`examples/live_exercises/autoresearch_simple`](examples/live_exercises/autoresearch_simple)\n- [`examples/live_exercises/cevolve_synergy`](examples/live_exercises/cevolve_synergy)\n- [`examples/live_exercises/bayes_complex`](examples/live_exercises/bayes_complex)\n\nSecondary toy examples:\n\n- [`docs/toy_examples/README.md`](docs/toy_examples/README.md)\n- [`docs/TOY_EXAMPLES.md`](docs/TOY_EXAMPLES.md)\n\nUseful validation lanes:\n\n- `./bin/dev check`: self-contained required gate\n- `./bin/dev test-upstream-live`: real-upstream non-billed smoke lane\n- `AUTOCLANKER_ENABLE_LLM_LIVE=1 ./bin/dev test-live`: billed real-model-provider lane\n\n## Documentation\n\n- [`docs/SPEC.md`](docs/SPEC.md): normative product contract\n- [`docs/DESIGN.md`](docs/DESIGN.md): architecture and workflow decisions\n- [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md): adapter model and upstream behavior\n- [`docs/BELIEF_INPUT_REFERENCE.md`](docs/BELIEF_INPUT_REFERENCE.md): belief fields, bounds, and beginner inputs\n- [`docs/LIVE_EXERCISES.md`](docs/LIVE_EXERCISES.md): runnable demos and live lanes\n- [`docs/BENCHMARKS.md`](docs/BENCHMARKS.md): deterministic comparison targets and report script\n- [`docs/LOOP_DIAGRAM.md`](docs/LOOP_DIAGRAM.md): compact loop visual\n- [`docs/TOY_EXAMPLES.md`](docs/TOY_EXAMPLES.md): secondary toy examples for code-level intuition\n- [`docs/WHITEPAPER.md`](docs/WHITEPAPER.md): research framing and design rationale\n- [`docs/COMPLIANCE_MATRIX.md`](docs/COMPLIANCE_MATRIX.md): machine-readable acceptance mirror\n\n## Development\n\nFrom a checkout:\n\n```bash\n./bin/dev setup\n./bin/dev check\n```\n\nThe main local quality commands are:\n\n```bash\n./bin/dev format\n./bin/dev lint\n./bin/dev typecheck\n./bin/dev pylint\n./bin/dev test\n./bin/dev test-full\n./bin/dev check\n```\n\nSee [`.github/CONTRIBUTING.md`](.github/CONTRIBUTING.md), [`docs/STYLE.md`](docs/STYLE.md), and\n[`docs/developer-environment.md`](docs/developer-environment.md) for contributor\nguidance.\n\n## License\n\nApache 2.0. See [`LICENSE`](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmartelogan%2Fautoclanker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmartelogan%2Fautoclanker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmartelogan%2Fautoclanker/lists"}