agentleFS
shuxiachaishuxiachai/academic-commercialization-agent/AGENTS.md

academic-commercialization-agent

AGENTS.md804 starsChanged 4 months agoMITView on GitHub

An index, not a summary. Almost everything worth knowing is already in the repository — the point of this file is to tell you where, and to stop you redoing a handful of things that have already been tried and measured. A six-agent CrewAI pipeline that assesses whether a piece of academic research is commercially viable. Three evidence agents (academic / patent / market) run in parallel, then a report writer, a reviewer, and a scorer. Served two ways from…

We split this AGENTS.md into the rules it gives an agent

22 rules. About 1 is common, 17 are distinctive, and 4 are very specific to this project.

  • ≈1

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈17

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 4

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Before writing or modifying CrewAI code specifically — the crew, the agents, the task definitions — read docs/crewai-reference.md.

    line 76
  2. Distinctive:

    Every calibration figure this project reports comes from 30 runs scored under the current rules (26/30 TRL calibration, 30/30 formula …

    line 88
  3. Distinctive:

    When you change behaviour, the sentence next to it is part of the change.

    line 143
  4. Very specific:

    Keep missing/unreadable/empty/no-match states distinct, untrusted strings inert and ID matching exact.

    line 252
  5. Distinctive:

    Read-only lookup requires the same valid code for code-owned entries.

    line 279
  6. Distinctive:

    Keep explicit public-origin handling confined to the production wrapper.

    line 345
  7. Distinctive:

    Default CLI is identity-only.

    line 373
  8. Distinctive:

    Keep aggregate four-request/USD 0.05 admission, first-failure stop and reference agreement separate from mechanical delivery.

    line 375
  9. Distinctive:

    Use the pre-live hash erratum: the SLCQ gate binds unmodified Python JSON, not the historically recorded integer-normalized encoding.

    line 395
  10. Distinctive:

    Keep process-global test guards scoped to the operation, not fixture teardown: pytest may read terminal configuration before teardown.

    line 486
  11. Distinctive:

    Default CLI verifies identity only.

    line 500
  12. Distinctive:

    Do not relocate experimental modules as a cosmetic cleanup: frozen runners bind fixture bytes, source files and dependency hashes.

    line 542
  13. Distinctive:

    Add them only against a concrete task, not a technology-stack checklist.

    line 581
  14. Distinctive:

    Do not reopen the occupied output or treat missing answers as semantic success.

    line 607
  15. Very specific:

    Keep preparation outside main at 34228f3b54767d20dd3b22cc67e0bdcc23ad348d.

    line 613
  16. Distinctive:

    Keep production integration and provider obedience unestablished.

    line 620
  17. Very specific:

    Never reconstruct it from a historical 3.5 score or trust a model-supplied receipt.

    line 629
  18. Distinctive:

    All 20 candidate pages now have separate agent-only observations across two dates, but zero fully comparable real pairs.

    line 641
  19. Distinctive:

    Do not rewrite old experiment hashes to evolve production checks.

    line 666
  20. Distinctive:

    Update the current ledger and link a dated result.

    line 670
  21. Distinctive:

    Keep historical preregistrations, results, errata, frozen bytes and long reasoning commits unchanged.

    line 672
  22. Common:

    Do not stage raw reviews or credentials into this public repository.

    line 678

≈ “Common” is an estimate: at least 1 in 5 of the 36,368 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
AGENTS.md

AGENTS.md — working on this project

An index, not a summary. Almost everything worth knowing is already in the repository — the point of this file is to tell you where, and to stop you redoing a handful of things that have already been tried and measured.

What it is

A six-agent CrewAI pipeline that assesses whether a piece of academic research is commercially viable. Three evidence agents (academic / patent / market) run in parallel, then a report writer, a reviewer, and a scorer. Served two ways from one codebase: a FastAPI + vanilla-JS web client and a CLI.

Live at https://academic-commercialization-agent.up.railway.app

Baseline at 0fdaa76 (2026-09-05 documentation audit): 2071 tests and 678 subtests. CI covers Linux + Windows × Python 3.11/3.12; Railway hosts the demo. See current evidence status for qualified results, not an ever-growing chronological paragraph here.

Commands

uv run pytest -q                       # the whole suite; zero provider calls
uv run --with ruff ruff check .        # CI uses latest ruff, the local pin is older
uv sync --group e2e                    # opt-in real-browser dependency; not part of the default suite
uv run --group e2e playwright install chromium
uv run --group e2e python -m e2e.browser_smoke   # loopback only; zero provider calls
uv run --group e2e python -m e2e.composer_smoke  # static-only server; intercepted paid POSTs
uv run uvicorn api.main:app --reload   # web client on :8000
uv run academic_agent --topic "<topic>"          # one run from the CLI

uv run --with ruff is deliberate. The pinned local ruff is 0.12.0 and CI resolves latest; they disagree, and the flag is what makes a local check mean what CI will say.

Hard conventions

  • filterwarnings = ["error::UserWarning"]. What it mainly guards: code paths that would reach a paid API warn and fall back rather than raising, so a test that leaks would otherwise pass silently. When a test trips it, read which warning fired before concluding anything. If it is the network one, the test is calling something real — fix the test's isolation, never add an ignore. But the project also warns deliberately on an unrecognised weight profile and on an audit screen that failed, and two test files assert those on purpose (assertWarns), so not every UserWarning is a leak.
  • No bare except Exception without a # noqa: BLE001 and a reason. This is a review convention; the current Ruff selection does not enable BLE001. Do not assume a green lint job enforces it.
  • CI also runs pylint, narrowly, for bad exception order, unreachable code, used-before-assignment and undefined variables. The exception-order check caught HTTPError placed after URLError: dead code that retried auth failures as transient. Use the exact command in CONTRIBUTING.md.
  • Commit messages carry the reasoning. They are long on purpose and are a primary record — see below. Do not add Co-Authored-By lines.
  • Reply to the user in Chinese. The code, comments, and commit messages stay in English.

Where the reasoning lives

This project deliberately keeps its "why" out of chat logs and inside artifacts that travel with the repo. When you want to know why something is the way it is, in this order:

QuestionWhere
Why is this code like this?The comment above it. Non-obvious decisions are commented, including rejected alternatives
Why does this test exist?Its docstring names the specific failure it caught
Why was this change made?git log — bodies run to ~25 lines and explain the alternative that was rejected
Was this hypothesis tested?docs/prereg-*.md — predictions and falsification criteria registered before paid runs
How does crash recovery work?docs/checkpoint-recovery.md — identity, persistence, authorization, observable states, the 30/30 offline process audit, and the at-least-once boundary
How are timeout and partial usage facts preserved?docs/runtime-terminal-integrity.md — deadline ownership, immutable terminal records, monotonic usage snapshots, and complete/lower-bound/unavailable semantics
Full decision history, first personnotes/简历项目说明.md — a separate private repo (shuxiachai/academic-agent-notes), gitignored here. Numbered postmortems and supporting decision records; historical entries retain their dates. Ask the user for access if you need it

Before writing or modifying CrewAI code specifically — the crew, the agents, the task definitions — read docs/crewai-reference.md. That is the vendor's auto-generated reference, and the library moves faster than most training data. It used to occupy this filename, which meant an assistant opening the repo got 1,000 lines about the framework and nothing about the project.

Do not redo these

Each of these was implemented or measured and then rejected on data. The numbers are the point; if you want to revisit one, beat the number.

  • Do not change the scoring formula or the evidence_confidence floor. Every calibration figure this project reports comes from 30 runs scored under the current rules (26/30 TRL calibration, 30/30 formula correct, 30/30 completed). Changing the computation retires that baseline, which is the only external anchor the project has. The floor is knowingly asymmetric — it only ever raises confidence — and evidence.py says so explicitly.
  • Do not add a "maturity language vs TRL" consistency check. Built, measured on all 30 baseline reports, produced 2 flags and both were wrong: a paragraph attributes properties to several subjects and phrase matching cannot tell which one carries it. Requiring the topic's words nearby does not help — the incumbent in a carbon-capture report is also called "capture". The reasoning is preserved in consistency.py so nobody tries it a third time.
  • Do not make the uncited-claim screen blocking. Measured on 30 delivered reports: 134 warnings across 30/30 reports, so blocking would have failed every run. After four exclusions it is 62 across 20/30 — still two thirds. The precision work is worth continuing; the blocking is not viable yet.
  • Do not add prompt caching. Measured: 3.4% cache hit. A run is 6 requests and the six agents have different prefixes, so there is nothing reusable within a run.
  • Do not "improve" claim-grounding coverage by scraping more abstracts. Checked: academic sources are already 68/68 with real abstracts. The only remaining headroom is the patent domain, which would need a Lens API key. On 2026-10-24 the maintainer decided not to adopt Lens because of its cost, so treat patent-domain coverage as fixed rather than proposing Lens again.
  • Do not upgrade CrewAI on main. Pinned at 1.14.7. If it needs upgrading, do it on a branch with a full benchmark comparison.

Two TRL rubric hypotheses were pre-registered and both falsified (see docs/). If you want to improve calibration, the next step is a different method — independent scores from several models, compared — not another rubric edit.

How work is done here

These are not style preferences; each came from a specific failure.

  • Measure before you change. Twice now an external review's premise was correct and its proposed implementation was wrong, and the only thing that distinguished them was running the check over the 30 reports already on disk first. That data is free.
  • Re-inject the defect after fixing it. Confirm the new test actually goes red. Twice this caught a weak test rather than a weak implementation.
  • Test the seam, not the field. The worst class of bug here has been a value computed correctly and stored correctly that never reached the client: response_model silently drops undeclared fields, and two features never worked in a browser while 948 tests passed. Assert at the boundary, and assert the rule ("every key on the payload reaches both endpoints"), not the instance.
  • Precision over recall for every heuristic screen. These report; they do not reject. A false positive on a finished six-agent run discards a paid assessment over a wording choice.
  • Silence is not a pass. "0 unsupported out of 0 checked" and "everything passed" produce the same two numbers. Anywhere a check can fail to run, say so distinctly — the reliability panel and claim_grounding.py both do.
  • Prose is not covered by tests. One recent round found five places where a comment, a docstring, or UI copy described behaviour the code did not have. When you change behaviour, the sentence next to it is part of the change.
  • New semantic reviews use LLMs, not a human-review prerequisite. Follow the explicit AI-only policy: fresh judging context, honest provenance and uncertainty, no rewriting old human declarations or substituting simulated judgment for observed adoption. Budget and private-data publication permissions remain separate.

Layout and boundary-specific reading

Change surfaceStart hereRead before changing
Production entry pointsapi/, web/, src/academic_agent/main.pyOperating guide, tests/test_api.py, browser-contract tests
Default-off saved-source production entryapi/saved_source_production*.py, web/source-locator/Gated locator contract; preserve frozen labs, consent before intent, owner-only billing, receipt-only rollback and actual-thread drain
Retrieval and title recoverysource_pipeline.py, source_clients.py, source_title_recovery.py under src/academic_agent/Nearby precision-first comments, frozen baseline, ultrasound applicability result
CrewAI and structured outputcrew.py, config/agents.yaml, config/tasks.yaml, evidence.pyCrewAI reference, unchanged scoring baseline
Decision applicability and citation checksreport_applicability.py, report_audit.py, claim_grounding.py, consistency.pyReport seams, threshold precision result
Checkpoint/recoverycheckpoint_runtime.py, checkpoints.py, run_spec.pyRecovery design
Timeouts, terminal state and usagepipeline_worker.py, runtime_budget.py, run_terminal.py, token_usage.py, api/runs.py, ui/run_reader.pyTerminal integrity
LLM identity and BYOKllm_config.py, pdf_extractor.py, API schemas and browser provider controlsQwen adapter, first live canary
Trace exportsrc/academic_agent/observability/Observability contract
Tool Calling experimentsevidence_gap*.py, openalex_*.py, src/academic_agent/tools/Version ledger, exact experiment pre-registration
Isolated saved-evidence follow-upreport_evidence_snapshot.py, report_evidence_followup.py, report_evidence_guarded_followup.py, report_evidence_stage_qwen_transport.py, report_evidence_qwen_transport.py, report_evidence_qwen_canary.pyRead-only conversation contract, offline stage policy, stage-aware transport protocol and frozen synthetic canary; never reuse the old runner/authorization for the new transport; no production route
Offline evidence and user studiesoutputs/benchmark/, benchmark_check.py, ops_report.py, user_utility_audit.py, experiments/pipeline_audits/checkpoint_fault_audit.pyExperiment index, source locks and method declarations
Stage-aware synthetic canaryreport_evidence_stage_qwen_canary.py, experiments/report_evidence_canaries/report_evidence_stage_canary.pyNew protocol; default identity check only, fresh commit/fixture authorization required for live use; keep old manifests and allowances separate
Final-only JSON follow-up candidatereport_evidence_final_json_qwen_transport.py, report_evidence_final_json_qwen_canary.py, experiments/report_evidence_canaries/report_evidence_final_json_canary.pyJQ protocol; JSON Object only in final-only requests, strict parser unchanged; freeze new identity and keep SQ/FQ closed, no production route
Bounded metadata discovery candidatereport_evidence_catalog_followup.py, scripts/demos/report_evidence_catalog_demo.pyOffline catalog protocol; title/ID metadata is not read evidence; callback-only wrapper/demo, one visible-ID read then final-only, no production route
Catalog-native Qwen wire contractreport_evidence_catalog_qwen_transport.pySeparate offline protocol; bind the trusted snapshot/catalog and single conversation, preserve the full HTTP byte bound and usage ledger; no production route
Catalog-native synthetic canaryreport_evidence_catalog_qwen_canary.py, experiments/report_evidence_canaries/report_evidence_catalog_canary.pySeparate CQ protocol; two fresh synthetic cases, four total requests, first failure stops; offline manifest is not live authority, no old batch reuse or production activation
Public documentationREADME.md, README.zh-CN.md, docs/tests/test_public_docs.py; both languages must retain the full executable benchmark contract
Real saved-report follow-up preparationreport_evidence_real_saved_eval.pyLocal-only RS protocol; private raw report/source/question/label binding, explicit scripted callbacks only, no live runner or real-data transmission authority
Isolated real saved-report Qwen pilotreport_evidence_real_saved_qwen_canary.py, experiments/report_evidence_canaries/report_evidence_real_saved_canary.pySeparate RS live protocol; exact private packet and current-code identities, four sequential requests maximum, fixed single-batch output, first failure stops, separate LLM review never human gold; no production route
Offline claim-relative follow-upreport_evidence_claim_relation.pyNew offline contract; caller-owned claim, unverified model relationship, code-derived delivery, actual callback byte/delivery checks; no provider adapter or historical relabeling
Claim-relative native Qwen candidatereport_evidence_claim_qwen_transport.pySeparate offline wire protocol; bind trusted claim/snapshot before the first request, preserve four-field native content and complete receipt/window checks, compare full wire bytes to the journal; no live runner or production route
Claim-relative synthetic Qwen canaryreport_evidence_claim_qwen_canary.py, experiments/report_evidence_canaries/report_evidence_claim_canary.pySeparate CLQ protocol; three fresh single-source controls, six requests maximum, first-failure stop and separate blind LLM review; fixed single-batch output, no private RS data or production route

CLQ is closed: six requests passed per-case mechanical checks but matched only 2/3 frozen relation labels. Blind LLM review diagnosed the recording-versus- physical-value reference mismatch; do not relabel or rerun the consumed batch. The intended live insufficiency lane is still unproven. See the qualified result.

Unless qualified, the Python module names in this table are under src/academic_agent/. The dated experiment documents and their code comments carry the detailed lineage, not this index.

Runtime boundaries that must survive edits

The saved report's applicability paragraph is code-owned. A marker copied into model prose is not proof of authorship: reassert the current gate at delivery, preserve legacy no-gate bytes, and do not call this general semantic validation. See the authority regression.

Runs are subprocesses writing to outputs/<run_id>/. API, browser and CLI read those shared artifacts. A completed, failed, cancelled or timed-out API run also has write-once terminal.json: workers commit their own exits; the API commits only after an external stop. Monotonic per-node snapshots distinguish complete, lower_bound and unavailable usage. An interrupted request is not free, and a normal-completion canary does not validate timeout/fallback.

A run URL is a read capability. Code-owned mutation requires owner/admin code; ownerless BYOK has no second server-side identity. Recovery requires fresh credentials and creates an immutable child from the longest validated prefix, snapshotting its parent before launch. Persistence and reuse are separate states. Local committed-node reuse is not provider-level exactly-once delivery.

First-party Cancel/Delete requests must preserve explicit mutation intent: cancel cannot fall through to removal, delete cannot terminate live work, and unknown UI states expose neither. Legacy unqualified DELETE still retains its dual-purpose contract; see the verified boundary.

The shared run/PDF admission and persistent daily paid-operation ledger protect a single process. Do not increase replica/worker counts without redesigning ownership, quota transactions and persistence. Do not infer permission to restart Railway, invoke a paid canary or publish private run links.

Maintenance stages fail independently and expose their state in health; a failed supervisor cannot skip shutdown. PDFium calls and native closes share a process mutex, separate from paid admission and model work. PDF export publishes atomically under a per-run striped cache lock. Accepted run navigation must survive optional browser-history failures; pending resume state belongs to the parent, not the button. See the maintenance regression and limits.

An external stop retains its run slot through physical exit and terminal publication. Competing mutations return conflict; a failed stop retains the worker instead of freeing capacity. Do not pop handles to claim cancellation. See the stop-ownership seam.

Synchronous maintenance stays off the ASGI loop but remains serial and owned. Cancellation must drain the current stage before worker shutdown; cancelling an await does not stop its thread. See the scheduling/drain boundary. Health/readiness timestamps distinguish current dispatch from last completion; elapsed facts use monotonic clocks and do not change readiness policy. See the observation-age contract. Cleanup summaries distinguish complete/partial scans from absent, disabled or unavailable observation; legacy normal-return checks are not proof of complete deletion. See safe outcome counts.

Composer submission/extraction locks are tab-local, not server idempotency. Readiness checks the effective selected credential without contacting providers; 429 reasons remain distinct. See the HTTP/browser contract and limits.

Optional step logs cannot override run truth. Progress cursors count complete physical lines, not valid events; preserve partial tails and explicit read loss. Score/grounding/consistency detail faults must not become zero or agreement. Denied storage is page-local fallback, not authentication bypass; failed logout must not reload stale credentials. See the delivery boundary and limits.

The Sources viewer searches only budget-admitted saved fields and displays their exact saved text, not original full papers or verified claim support. Keep missing/unreadable/empty/no-match states distinct, untrusted strings inert and ID matching exact; its limits are post-JSON display limits. See the operating guide.

Normalized score dimensions include fractions in 1..maximum. Malformed BYOK must not select operator billing; logout waits for paid acknowledgements and clears old attachment/context. Progress read loss is not worker failure, and its bounded GET must never become a paid-POST timeout. See the combined boundary regression.

An open document keeps its selected access code when other tabs change shared storage. Late/candidate 401s cannot clear a newer local selection; a conflicting persistent removal returns to the gate without reloading into another identity. This is not global logout or transactional shared storage. Receipt recovery now has a separate opt-in contract below. See the cross-tab identity contract.

First-party paid requests also leave a credential-free tab-session warning before dispatch. Refresh and uncertain replies block new paid intent until explicit acknowledgement, not server work; denied storage remains visibly memory-only. Parsing success is not view delivery, and one settled request cannot erase a peer uncertainty. The original warning alone is not idempotency; see its historical boundary.

First-party run/PDF/resume requests now persist a random tab-session receipt key before dispatch. The opt-in server journal reserves that intent before admission, binds the target before launch, and never repeats unresolved work. Read-only lookup requires the same valid code for code-owned entries; ownerless BYOK uses the high-entropy receipt key as a capability. Keys expire after 24h; pruning cannot make an expired retry new. Corrupt storage is unavailable, not an empty ledger. The actual PDF thread commits its receipt and keeps completed derived metadata after waiter cancellation; queued abandonment still costs no provider call. Preserve these seams and the independent receipt maintenance stage. This is not provider exactly-once, automatic recovery, disk-loss safety, or distributed ownership. See the receipt contract.

Upload transport is bounded before multipart parsing, separately from paid admission. History replies must match the current view/session generation. PDF finalization belongs to the actual thread, not a cancellable HTTP waiter; post-finalization cancellation may retain derived metadata until normal expiry. See the ingress/history/finalization contract.

Tool Calling: do not turn experimental code into production by accident

The positive saved-source native development batch is closed: 4/4 mechanical checks, 3/4 frozen reference matches and one title-only decline. Its immutable preparation revision remains outside main; do not import its runner merely to reopen this occupied output or treat a post hoc LLM audit as blind validation. No new allowance or production activation follows.

The offline candidate-search library keeps literal results and lexical-separator additions separate. Its one explicit query callback receives no snapshot/catalog; it is trusted synchronous code, not a network sandbox or paid-call limit. Preserve pre-callback snapshot binding, strict proposal admission and metadata-only delivery. Do not wire it into a provider, production route, automatic read or generated answer by implication.

The separate candidate-query Qwen adapter binds only the question and fixed policy, with a new single-request journal and explicit in-memory credential guard. Preserve reserve-before-POST, strict native query versus text-JSON admission and unknown usage. It is network-capable only when explicitly invoked; intercepted tests and scope labels grant no live call, new data transfer or production registration. Do not reuse a closed batch.

The NQ synthetic query protocol uses four new question-only controls and a separate fixed output. Its default is identity-only. Preserve aggregate slot/native-intent distinction, exact preview identity and NQ04's unconditional no-search rule. Mechanical faults stop; valid reference misses remain visible and do not trigger repair/retry. NQ03 is already a known development case/separator challenge, not held-out data. NQ is now closed after four native requests: mechanics 4/4, positive coverage 1/3, explicit decline 1/1. The long English proposals missed literal lookup; do not repair/replay the batch or treat zero visible distractors from empty results as precision evidence. No production admission.

The separate ordered-window offline comparison is also closed: the unchanged baseline and augmented result both covered 1/11 positive questions, with zero additions. Its isolated evals/ archive is not a production search module or a new default test suite. Preserve its LLM reference uncertainty and disclosed early self-test execution; do not retune the consumed cohort or interpret zero returned candidates as useful precision.

The production saved-source wrapper is a distinct default-off successor. Its new /source-locator page and API paths must preserve owner-code authorization, explicit question/catalog transfer consent, bounded paid admission, durable receipts and independent accounting. Both deployment exposure and new execution default off; do not infer activation or a new paid allowance from a merge. Rollback keeps receipt-only observation, drains actual threads and preserves the journal. Old lab paths, frozen modules, closed batches and their absence assertions remain unchanged. Shared links, ownerless/BYOK reports and admin read privilege cannot fund a new selection.

The first production browser pilot failed before dispatch at the origin gate. Keep explicit public-origin handling confined to the production wrapper; never replace frozen lab checks or trust arbitrary forwarded headers to repair TLS termination. A disabled-execution origin check is not a paid canary. See the origin boundary and qualified observation.

One later bounded production acceptance observed native source selection, exact saved-text delivery and the same receipt after execution closure and redeployment. The original POST body was unavailable to the independent observer; DOM and actual GET evidence are qualified separately. Execution is closed again with zero feature budgets. Do not reopen the consumed attempt or promote its prepared-case match to unseen accuracy or user benefit.

The separate saved-source locator uses one selector callback and one existing local read, followed by code-owned saved-text JSON, not a generated answer or claim relation. Its new module/test/ demo are callback-only; the old CQ prompt/schema, native adapters and closed allowances cannot be reused. Local callback/read facts are not HTTP, cost or browser-delivery evidence. Never expose this callback-only candidate directly; the separately gated production wrapper does not activate its old lab factory.

Its dedicated Qwen boundary binds the exact question/catalog request and one durable reservation per new single-owner ledger. Its tests intercept HTTP and grant no paid allowance. Preserve pre-dispatch persistence, safe errors and unknown usage; neither the old six-request cap nor a new transport instance resets this limit.

The separate SLQ protocol freezes four synthetic development cases and a new single-batch executor. Default CLI is identity-only; native use needs exact source/fixture identity, review and green CI plus the applicable bounded low-cost authorization. Keep aggregate four-request/USD 0.05 admission, first-failure stop and reference agreement separate from mechanical delivery. No production route follows.

SLQ is now closed after four native synthetic controls passed. This is one-selection compatibility and development-reference agreement, not unseen accuracy or production admission. Do not reopen its occupied output.

The SLC public-title comparison reuses the unchanged Sources observer on a public bibliography, not private saved-source text. Preserve exact assisted queries, set-valued references, explicit unavailable observations and the not_run model lane; neither long- question zero hits nor multiple acceptable candidates prove a model advantage. The observed SLC baseline covers 5/5 positive references with assisted keywords; four are unique and one has two valid candidates. Its historical model lane remains not_run.

The separate SLCQ native comparison binds those same six questions/public titles to a fresh six-request/USD 0.10 batch. Preserve set-valued references, missing-text delivery and distinct refusal; identity-only preparation is not a native result or production admission. Use the pre-live hash erratum: the SLCQ gate binds unmodified Python JSON, not the historically recorded integer-normalized encoding. Do not silently admit both hashes. SLCQ is now closed after six native cases: 6/6 mechanical/reference checks, matching the assisted baseline's positive and no-fit dispositions. Five reads delivered no text; title location is not evidence support, measured user benefit or production Tool Calling.

The isolated saved-source entry has its own app factory, loader and browser assets; it is not mounted in api.main. Preserve default-disabled selection, read-capability confinement, actual-thread slot ownership and explicit billing/receipt non-integration. No provider or paid quota is enabled by its scripted browser tests.

The separate prepared paid controller adds shared admission and a distinct locator receipt journal. Its separate receipt entry wraps it in an isolated HTTP factory/browser, not the original lab, api.main or a native provider. Keep current-code authorization separate from the report read capability; pending/unknown receipts cannot redispatch, and replay cannot manufacture new callback facts. Dedicated thread leases remain occupied through physical exit. Do not generalize the old run/resume/paper receipt schema or copy private source text into the new journal. The receipt browser stores only a random key before POST; refresh must never redispatch. Preserve explicit GET recovery, request/identity generation checks, failed-storage blocking and exact response-field delivery. No production mount or model activation follows from this isolated integration.

The separate RQ synthetic native protocol composes the unchanged native locator with the receipt app only in a dedicated fixed-case browser runner. Keep its two-request/USD 0.05 aggregate gate, fresh occupied-output refusal, exact code/fixture identity and first-failure stop. Identity-only CLI and offline browser rehearsal cannot read a real provider key. The HTTP usage/cost fields remain unobserved; native accounting is a separate side ledger. This is not a generic provider factory or public feature switch.

RQ is now closed after two native synthetic cases: 2/2 mechanical/reference gates and explicit lost-ack receipt recovery, with no additional selection or charge on refresh/GET. Native accounting remains separate from HTTP unobserved fields. This is not real-report utility or production admission.

The separate usage delivery contract is an opt-in accounting successor, not a rewrite of the closed RQ batch. Preserve the legacy receipt fields, operation-specific binding, unknown-versus-zero distinction and actual-thread finalization. Its versioned HTTP/browser entry stays unmounted; intercepted native tests do not authorize a new paid run or real-data transfer.

The RU real saved-source preparation keeps full historical registries and four new questions in a private local packet. Its title-only Sources baseline and internally intercepted usage rehearsal are not native efficacy or unseen evaluation. References remain AI-authored drafts with blind review not_run; no caller-supplied live callback, key or paid flag is accepted. Preserve separate scripts/labels and all closed RS/RQ artifacts.

The separate RUQ preparation binds a later LLM reference sidecar and a current execution identity without rewriting RU bytes or weakening its old validator. Default CLI is identity-only; four-request/USD 0.05 ceilings are proposed limits, not native authority. Keep its fixed output separate, first-fault stop and usage uncertainty visible; no production mount or reuse of a closed grant follows from preparation. RUQ is now closed after four native cases: three exact saved excerpts and one decline reached the isolated HTTP/accounting path. This is development reference agreement, not unseen accuracy or a native browser/user-value result. Do not reopen the occupied output or its allowance.

The separate PCQ preparation distinguishes a physical-value claim from a recording claim. Its blind-reviewed synthetic references and scripted rehearsal do not reopen CLQ, validate live insufficiency, authorize a new paid runner or change runtime semantic flags.

The separate PCQ native protocol binds a dedicated runner and fixed output, not a replacement CLQ fixture. Default CLI is identity-only; native dispatch requires the exact committed identity, independent review and green CI. Mechanical acceptance, frozen-label agreement, publication and later LLM judgment remain separate. No production connection.

PCQ is now closed and failed: two requests, one mechanical pass and one reference mismatch; PCQ02/03 unrun. Context-limited LLM review judged the answer mixed. Keep the occupied batch and frozen prompt unchanged; nonempty-evidence abstention remains unproven live.

The explicit relation-policy successor is offline callback preparation only. Preserve the frozen inner result and separate policy-to-callback delivery from inner-to-policy delivery. New synthetic reference agreement is context-limited LLM review, not native accuracy; do not reuse an old Qwen adapter, closed batch or production route.

The separate RP native adapter owns positional-request admission and a new offline ledger. Preserve exact policy/claim/history/read-result comparison and final HTTP bytes. Its callback audit is not proof of HTTP dispatch; intercepted responses are not provider validation. No live runner or production route follows from this adapter. Keep process-global test guards scoped to the operation, not fixture teardown: pytest may read terminal configuration before teardown. The CI isolation correction preserves strict adapter assertions and the original failed CI observation.

The separate RPQ batch protocol fixes RP01-RP03 as dependent synthetic development controls, not unseen data. It requires the new runner/output identity and both RP callback audit and native journal gates. Six requests and USD 0.10 are ceilings, not proof of dispatch or consent. Exact-tree validation, independent review and green CI precede any native use; old PCQ/CLQ outputs and private RS data stay separate. The new report_evidence_relation_policy_qwen_canary.py under src/academic_agent/ and experiments/report_evidence_canaries/report_evidence_relation_policy_canary.py have a separate verification record. Default CLI verifies identity only. A successful script/intercepted HTTP test is not a live result, a new private-data grant or production admission.

RPQ is now closed and failed: one native request returned an early unavailable final without calling read_source. The frozen gate stopped before any read or second request; RP02/RP03 are unrun, label checks are zero and semantic review is not_reviewable. Preserve the occupied batch. Any successor must address first-stage read admission separately, not reinterpret this as tested insufficiency or a provider outage.

The separate read-first RF contract keeps the frozen RP callback but requires a named full read on the native wire. Its new transport and canary are under src/academic_agent/report_evidence_read_first*. Scope is zero/one saved source of at most 1,500 code points. Preserve separate inner, policy-callback and native request facts; forced execution is not autonomous selection. Default CLI is identity-only; no old batch or production route is reopened.

RF is now closed and failed: two requests completed one actual full read, but RF01 declared refuted instead of the frozen insufficient reference. RF02/RF03 are unrun. A separate context-limited LLM review judged the answer mixed. Preserve this batch and stop automatic generative-relation expansion; read mechanics are not semantic success.

The separate saved-evidence stage canary delivered a synthetic excerpt through native lookup/read but failed the strict final JSON envelope; SQ02 is unrun. Keep this batch closed, its frozen bytes unchanged and general semantic support unassessed. A future final-output contract must not retrospectively repair this result or enable production.

  • Supplementary retrieval is phase-1 zero-call shadow mode. Its phase-2 execution, provider adapters and later OpenAlex/Qwen evidence-gap selectors are production-disconnected; the saved-source locator is a separate scope.
  • Adaptive Role-Gap v8 passed AC development and failed AD unseen evaluation: only three of six gates passed. Routing was 5/8, closure-role value 2/7 and coverability gain +1. See the final result and provenance limits.
  • AC/AD are consumed and v8 is sealed. Earlier D/U/V/W/Y/AA cohorts are also consumed in the roles described by their protocols. Do not open reserved cohorts, tune consumed evaluation labels and call it validation, or rewrite historical failures as passes.
  • A new method needs a new pre-registration, fresh development/evaluation cohorts and separate live authorization. Source truth, planner precision, report improvement and production authorization are separate gates.
  • Do not relocate experimental modules as a cosmetic cleanup: frozen runners bind fixture bytes, source files and dependency hashes. A path or hash change can invalidate a paid protocol before it makes a request. The one relocation made, root scripts to experiments/<study>/ on 2026-10-31, was done after every study had closed, keeps the recorded layout at the tag archive/root-experiments-2026-10, and is accounted for in a dated erratum; experiments/ is now the frozen location.
  • Raw reviewer files stay private. A declaration correction must retain the original, the amendment and the limits of its provenance. Never infer a missing judgment merely to complete a denominator.

Known-open work, not implied permission to implement it

  1. Qualitative citation entailment and invented decision thresholds: narrow non-blocking checks exist, but general correctness is unestablished. The 110-report threshold replay removed seven known false positives and retained six qualifying candidates; it is not an independent precision estimate.
  2. Decision value: the five-person utility study failed its success rule and the two-target-user pilot did not establish adoption. Both studies are closed; new participants belong in a new protocol, not their old denominator.
  3. Metadata reads: the core status/progress/history/browser fault seam now distinguishes absent and unreadable records; see the fault verification. Nine display-facing audit-summary fields have field-local isolation; see the nested contract and limits. Selected usage/accounting/checkpoint/recovery summaries also have read isolation, not writer validation or proof of actual recovery. The report-audit detail renderer also has local shape/counter validation and explicit coverage states; see the maintenance boundary. Other nested payloads, detailed artifacts and unused auxiliary readers are not comprehensively validated; this is not a main-pipeline outage.
  4. Input distribution: language/shape admission is tested, but the 30-run benchmark does not validate Chinese, very short or non-technical requests.
  5. Scale and long-term operations: one replica, no distributed ownership or repeated production SLO measurement. Recovery and RTI02 each have explicitly bounded live observations.
  6. Code-package analysis and longitudinal report comparison remain unbuilt. Add them only against a concrete task, not a technology-stack checklist.

Current provider transport: logical qwen over the pinned OpenAI-compatible transport, exact default qwen3.5-plus, non-thinking JSON output. Five pipeline nodes require that JSON contract. Explicit empty BYOK sentinels prevent CrewAI's import-time dotenv from restoring operator keys. Old DeepSeek frozen experiments keep their original provider identities.

Language helpers and the CrewAI factory now share complete configuration resolution, not just detection. BYOK pins all destinations; auxiliary redirects are refused. Do not restore private excerpts/keys in failure diagnostics. See the identity/logging regression and accounting limits.

Keeping this index short without erasing decisions

Patent relevance preserves the battery-free compound rather than using its negated noun as positive evidence. Content-shaped URLs are not proof of first-party ownership. Writer/Reviewer comparison instructions are mitigation, not a semantic validator; do not rewrite the motivating saved report or claim scripted correction delivery proves native reasoning. See the RFID repair and qualified replay.

The Reviewer comparison batch closed before dispatch on selected-credential syntax: zero requests/deliveries, semantic review not_run. Its immutable preparation remains outside main at aa1c591526db40683413073e3c759ab690e7b013. Do not reopen the occupied output or treat missing answers as semantic success.

The Reviewer v2 closeout records one HTTP 200 response and zero applied reports. Both reasons exceeded the local 300-character bound, which the actual direct request did not transmit. The batch stopped; five requests are unrun and semantic gain is unmeasured. Keep preparation outside main at 34228f3b54767d20dd3b22cc67e0bdcc23ad348d. Any successor first needs an offline common-output-contract check; do not clip this response, relax the old bound or reopen its occupied output.

The offline common Reviewer contract appends a caller-owned complete schema to newly prepared request bytes. Its explicit checks cover local HTTP delivery; it has no dispatcher or new batch. Keep production integration and provider obedience unestablished.

Market score delivery must disclose non-assessment, not promote the legacy untyped spread flag to verified USD disagreement. Reassert fresh/restored JSON metadata and retain the legacy browser fallback without changing score values. See the disclosure contract.

New validated scores also carry a pre/post cap receipt captured by the production wrapper, with schema/arithmetic read validation and hash-bound checkpoint reuse. Never reconstruct it from a historical 3.5 score or trust a model-supplied receipt. Whole scientific/sign/unit tokens must not match only their suffixes; unsupported expressions abstain. See the repair and coverage tradeoff.

Market-metric v1 is an offline diagnostic, not a replacement scoring cap. Its 30 local units are 29 live + 1 fixture and cannot establish original CSV identity; zero complete comparable pairs is not agreement. See the snapshot-qualified audit. The separate sample-preparation tool keeps synthetic control checks and unreviewed source-summary drafts in different denominators. Null annotations must not become equal definitions or completed review. See the sample contract. All 20 candidate pages now have separate agent-only observations across two dates, but zero fully comparable real pairs. Do not promote that coverage to human labels or relax missing pricing/revenue boundaries. See the follow-up and concrete collection gate.

PDF candidates never become A1 citation identity, including legacy conversion. Numeric sign/unit uncertainty must not become support; known PDF thread failures must finalize receipts even without a waiter, while journal write failure stays unresolved. See the boundary repair and coverage tradeoff.

Crew-node accounting now publishes scope separately from temporal/price completeness. Legacy benchmark inspection is not paid reuse authorization: new batches bind source/model/config/fixture identity and refuse occupied invalid units; summaries never overwrite the archived calibration CSVs. See the cost/batch regression and limits.

The independent auxiliary ledger observes new helper calls without rewriting Crew totals or terminal v1. Preserve actual-thread PDF settlement, unknown SDK retries, fault snapshot reconciliation, and historical PDF references that never become new child costs. No prompt, credential or arbitrary model identity belongs in these records. Receipt reads cannot settle, redispatch or manufacture known-zero spend.

Production scoring citation admission now wraps the hash-locked evidence factory in scoring_contract.py; include it in local recovery identity. Do not rewrite old experiment hashes to evolve production checks. PDF locator reachability is not manuscript identity, and ops outcomes follow terminal truth. See the evidence/PDF/ops repair and remaining audit scope.

  • Update the current ledger and link a dated result; do not append the complete experiment narrative to both READMEs and this file.
  • Keep historical preregistrations, results, errata, frozen bytes and long reasoning commits unchanged. The experiment index links them and the immutable pre-consolidation README/AGENTS snapshots.
  • Current guides describe current behaviour. Release notes and dated result documents describe what existed then; do not overwrite their old counts.
  • First-person decision history belongs in the separate private notes repo. Do not stage raw reviews or credentials into this public repository.

Download now (ZIP)

  • Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.

    Of the AGENTS.md files we read, the 28,693 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.

  • In this repositoryOne other file it gives its agents.

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.