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
- Very specific: line 76
Before writing or modifying CrewAI code specifically — the crew, the agents, the task definitions — read docs/crewai-reference.md.
- Distinctive: line 88
Every calibration figure this project reports comes from 30 runs scored under the current rules (26/30 TRL calibration, 30/30 formula …
- Distinctive: line 143
When you change behaviour, the sentence next to it is part of the change.
- Very specific: line 252
Keep missing/unreadable/empty/no-match states distinct, untrusted strings inert and ID matching exact.
- Distinctive: line 279
Read-only lookup requires the same valid code for code-owned entries.
- Distinctive: line 345
Keep explicit public-origin handling confined to the production wrapper.
- Distinctive: line 373
Default CLI is identity-only.
- Distinctive: line 375
Keep aggregate four-request/USD 0.05 admission, first-failure stop and reference agreement separate from mechanical delivery.
- Distinctive: line 395
Use the pre-live hash erratum: the SLCQ gate binds unmodified Python JSON, not the historically recorded integer-normalized encoding.
- Distinctive: line 486
Keep process-global test guards scoped to the operation, not fixture teardown: pytest may read terminal configuration before teardown.
- Distinctive: line 500
Default CLI verifies identity only.
- Distinctive: line 542
Do not relocate experimental modules as a cosmetic cleanup: frozen runners bind fixture bytes, source files and dependency hashes.
- Distinctive: line 581
Add them only against a concrete task, not a technology-stack checklist.
- Distinctive: line 607
Do not reopen the occupied output or treat missing answers as semantic success.
- Very specific: line 613
Keep preparation outside main at 34228f3b54767d20dd3b22cc67e0bdcc23ad348d.
- Distinctive: line 620
Keep production integration and provider obedience unestablished.
- Very specific: line 629
Never reconstruct it from a historical 3.5 score or trust a model-supplied receipt.
- Distinctive: line 641
All 20 candidate pages now have separate agent-only observations across two dates, but zero fully comparable real pairs.
- Distinctive: line 666
Do not rewrite old experiment hashes to evolve production checks.
- Distinctive: line 670
Update the current ledger and link a dated result.
- Distinctive: line 672
Keep historical preregistrations, results, errata, frozen bytes and long reasoning commits unchanged.
- Common: line 678
Do not stage raw reviews or credentials into this public repository.
≈ “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.
Files
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 CLIuv 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 Exceptionwithout a# noqa: BLE001and 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
HTTPErrorplaced afterURLError: dead code that retried auth failures as transient. Use the exact command inCONTRIBUTING.md. - Commit messages carry the reasoning. They are long on purpose and are a
primary record — see below. Do not add
Co-Authored-Bylines. - 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:
| Question | Where |
| 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 person | notes/简历项目说明.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_confidencefloor. 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 — andevidence.pysays 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.pyso 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_modelsilently 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.pyboth 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 surface | Start here | Read before changing |
| Production entry points | api/, web/, src/academic_agent/main.py | Operating guide, tests/test_api.py, browser-contract tests |
| Default-off saved-source production entry | api/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 recovery | source_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 output | crew.py, config/agents.yaml, config/tasks.yaml, evidence.py | CrewAI reference, unchanged scoring baseline |
| Decision applicability and citation checks | report_applicability.py, report_audit.py, claim_grounding.py, consistency.py | Report seams, threshold precision result |
| Checkpoint/recovery | checkpoint_runtime.py, checkpoints.py, run_spec.py | Recovery design |
| Timeouts, terminal state and usage | pipeline_worker.py, runtime_budget.py, run_terminal.py, token_usage.py, api/runs.py, ui/run_reader.py | Terminal integrity |
| LLM identity and BYOK | llm_config.py, pdf_extractor.py, API schemas and browser provider controls | Qwen adapter, first live canary |
| Trace export | src/academic_agent/observability/ | Observability contract |
| Tool Calling experiments | evidence_gap*.py, openalex_*.py, src/academic_agent/tools/ | Version ledger, exact experiment pre-registration |
| Isolated saved-evidence follow-up | report_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.py | Read-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 studies | outputs/benchmark/, benchmark_check.py, ops_report.py, user_utility_audit.py, experiments/pipeline_audits/checkpoint_fault_audit.py | Experiment index, source locks and method declarations |
| Stage-aware synthetic canary | report_evidence_stage_qwen_canary.py, experiments/report_evidence_canaries/report_evidence_stage_canary.py | New protocol; default identity check only, fresh commit/fixture authorization required for live use; keep old manifests and allowances separate |
| Final-only JSON follow-up candidate | report_evidence_final_json_qwen_transport.py, report_evidence_final_json_qwen_canary.py, experiments/report_evidence_canaries/report_evidence_final_json_canary.py | JQ 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 candidate | report_evidence_catalog_followup.py, scripts/demos/report_evidence_catalog_demo.py | Offline 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 contract | report_evidence_catalog_qwen_transport.py | Separate 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 canary | report_evidence_catalog_qwen_canary.py, experiments/report_evidence_canaries/report_evidence_catalog_canary.py | Separate 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 documentation | README.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 preparation | report_evidence_real_saved_eval.py | Local-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 pilot | report_evidence_real_saved_qwen_canary.py, experiments/report_evidence_canaries/report_evidence_real_saved_canary.py | Separate 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-up | report_evidence_claim_relation.py | New 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 candidate | report_evidence_claim_qwen_transport.py | Separate 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 canary | report_evidence_claim_qwen_canary.py, experiments/report_evidence_canaries/report_evidence_claim_canary.py | Separate 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 tagarchive/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
- 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.
- 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.
- 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.
- Input distribution: language/shape admission is tested, but the 30-run benchmark does not validate Chinese, very short or non-technical requests.
- Scale and long-term operations: one replica, no distributed ownership or repeated production SLO measurement. Recovery and RTI02 each have explicitly bounded live observations.
- 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.
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.
- CLAUDE.mdCLAUDE.md
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
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.

