Busabase
Busabase는 AI 에이전트를 위한 오픈소스(MIT) 데이터베이스 및 작업 공간입니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Research database for comparing compounds across biological mechanisms without a single toxicity score.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A research database for comparing pharmaceuticals, pesticides, plastic chemicals, PFAS, flame retardants, hormones, and other biologically active compounds across endocrine, developmental, immune, metabolic, mitochondrial, and redox mechanisms.
Scores summarise biological direction and magnitude. They are not a toxicity rank and they are not a human-risk number.
The unit of record is:
compound × exposure context × biological context × mechanism or outcome × evidence finding
These choices were made so later evidence can be added without flattening the science or redesigning the tables for auth.
Compound.effectScore is nullable. A mechanism can be recorded without a number. Physiological activity (melatonin at MT1/MT2) is not stored as +4 disruption. A range that crosses zero (melatonin and metabolism) stays unscored.compoundType and the boolean flags both exist. Melatonin is a hormone, a pharmaceutical, and endogenous. One enum cannot say that.primaryCategory is free text. “SSRI” and “SDHI fungicide” are not the same axis as CompoundType.aggregationGroup is not the same thing as parentMechanismId. The parent is for display. The group is the anti-double-count key. Complex I and complex II share a display parent and do not share a group, so an SDHI is not collapsed into rotenone.scorePolicy = RESEARCH_ONLY on reorganization energy. That row exists. It does not enter a headline, and ATP or oxygen changes are not treated as Marcus-theory evidence.assessmentKey is required. Postgres treats NULLs as distinct in unique indexes, so a nullable exposure id alone could duplicate the default assessment.EvidenceSource is not scored. EvidenceFinding is. One source can support several findings. countsAsScientificEvidence = false keeps the phase-1 structural seed row from being counted as literature.relevanceScore on a finding is not the H0–H4 scale. It is how directly that finding bears on the linked assessment.CausalPathway can cross domains. The profile still shows each domain. The note says they are not added.TSH, THYROID_HORMONE, THYROID_RECEPTOR) so TFA and later amiodarone are not forced into an estrogen-receptor row.User is a side table. Scientific rows do not require it. AssessmentRevision.changedByUserId is the only scientific-adjacent foreign key, and it is nullable. externalAuthId is there for later Clerk or Supabase Auth.EvidenceMeasurement, not JSON. An inequality such as p < 0.05 stays in the finding text. An exact p-value can be a decimal.NOT_ASSESSED.MetabolicTransformation sits beside METABOLITE_OF. The graph edge remains. The transformation row records enzyme and product flags only where the existing seed already said so.parentCompoundId and CompoundRelationship both exist. The foreign key is the single primary parent (DDE of DDT, ETU of mancozeb). The relationship table is the typed graph, including replacements and isomers.Score changes write AssessmentRevision. Re-seeding an unchanged row does not invent a new revision. A changed seed value does.
Signed effect, stored as an integer:
| Score | Meaning |
|---|---|
| −4 | Strongly protective or restorative |
| −3 | Substantially protective |
| −2 | Moderately protective |
| −1 | Weakly protective |
| 0 | No demonstrated meaningful effect |
| +1 | Weak disruptive signal |
| +2 | Plausible or moderate disruption |
| +3 | Substantial disruption |
| +4 | Strong or established disruption |
Blank means no quantitative score. “Phys.” means high physiological activity.
Human relevance, stored separately:
| Code | Meaning |
|---|---|
| H0 | No meaningful human evidence |
| H1 | Mechanistic, cellular, or high-dose animal |
| H2 | Strong experimental evidence, limited human evidence |
| H3 | Substantial human observation plus biological support |
| H4 | Established at clinically or environmentally relevant human exposure |
The headline for a domain is the strongest independent cluster, not a sum.
aggregationGroup contribute one score: the largest absolute effect.The same rules are on /methodology, and each compound page shows the trace.
Phase-1 numbers are seed hypotheses. Where a range was discussed, the stored integer is the end closer to zero. Curated findings have not been loaded yet, except one structural source that exists only to show that one document can support two findings. That source is marked as not scientific evidence.
Postgres is the runtime database. The seed files under src/data/seeds/ are the reconstructable starting set.
createdb edctox
cp .env.example .env
cp .env.example .env.local
# Put the same DATABASE_URL and DIRECT_URL in both files.
npm install
npm run db:migrate
npm run db:seed
npm run dev
Prisma CLI reads .env. Next.js reads .env.local. Keep them in sync locally.
npm run test:scoring
npm run typecheck
/admin is available in development only. It does not edit records.
Production is a Supabase Postgres project (free plan, Tokyo) since 23 Oct 2026. It was
restored from a pg_dump of the earlier Prisma Postgres database, including
_prisma_migrations, so every migration shows as applied. The move is written up in
docs/ops/DATABASE_OPERATIONS_2026-10.md.
On the Supabase project, both strings come from Connect → Connection string → URI:
DATABASE_URL is the transaction pooler (port 6543) with ?pgbouncer=true&sslmode=require. The app uses it.DIRECT_URL is the session pooler (port 5432, same pooler.supabase.com host) with ?sslmode=require. prisma migrate deploy, pg_dump and pg_restore use it. The "direct" db.<ref>.supabase.co host is IPv6-only on the free plan and is not used.NEXT_PUBLIC_ variable. This app does not need it. The browser only talks to the Next.js server.On the Vercel project:
DATABASE_URL and DIRECT_URL are set for Production only, as sensitive variables. Preview has no database variables and vercel.json cancels every non-production build (ignoreCommand), so a branch push never touches production.regions in vercel.json pins functions to Tokyo (hnd1) to sit next to the database.vercel.json is npm run vercel-build, which runs prisma migrate deploy and then next build. postinstall runs prisma generate.scripts/seed-production.sh.To reach production from this machine, copy the two strings into .env.supabase.local (gitignored) and pass them as environment variables for the one command that needs them; never commit them.
Identity checks for BPA, DEHP, and PFOS are a separate command. A dry run calls PubChem and writes nothing:
npm run external:resolve -- --compound bpa,dehp,pfos --dry-run
--apply writes verified identifiers only. There is no --all. CompTox is skipped unless EPA_CTX_API_KEY is set on the server. Do not put that key in a NEXT_PUBLIC_ variable. Pages do not call either provider.
Literature search is also a command, not a page render. Phase 3A searches BPA in the reproductive domain only. PubMed is the main discovery source: 15 records by relevance and 10 by publication date, for each purpose. Europe PMC searches title and abstract fields, uses the same two windows with 10 records each, and can add at most 10 unique candidates per purpose. A paper is kept only when the title or abstract contains Bisphenol A, or the BPA acronym together with that name or CAS 80-05-7, and a reproductive term. HUMAN_REPRODUCTIVE means human-relevant candidates, not confirmed human studies. The contradictory search is a separate, noisy supplement and does not establish a null finding. A dry run writes nothing. --apply writes candidate EvidenceSource rows and a LiteratureSearchRun. It does not write findings, and it does not change mechanism or outcome assessments. A later Europe PMC hit for the same paper can fill an empty PMCID or open-access flag. Imported papers stay non-evidence, at SCREENING_PENDING, unless the provider marks them retracted. Abstracts returned by those APIs are stored for screening and are not rendered on the public site.
npm run literature:search -- --compound bpa --domain reproductive --all-purposes --dry-run
NCBI_API_KEY and NCBI_EMAIL are optional. There is no --all compounds. The build does not run this command, so the site still renders if PubMed is down.
Machine screening is a separate local command. It writes a suggestion for a publication, compound, and domain. It does not set the curator decision.
npm run literature:screen -- --compound bpa --domain reproductive --pending --limit 20 --dry-run
The command refuses a database that is not localhost. /admin/literature is development-only and reads stored rows. It does not call PubMed or Europe PMC.
Abstract claim extraction is a separate local command for five BPA reproductive papers. It writes machine claims only. It does not write findings, and it does not change mechanism or outcome assessments. A claim is not scientific acceptance. The unlisted review list at /admin/literature/claims reads those stored claims. It does not show the full abstract. The screening desk stays off the public site.
npm run literature:claims -- --compound bpa --domain reproductive --limit 5 --dry-run
EDCtox is a synthesis layer. It is not a replacement for EPA CompTox, ToxCast, ToxRefDB, ToxValDB, EDSP models, EU EASIS, ECHA CHEM, EFSA OpenFoodTox, NIEHS CEBS, OECD eChemPortal, OECD Harmonised Templates / IUCLID, AOP-Wiki, AICIS, APVMA PubCRIS, or PubChem.
Provider rows in ExternalDataset record where later imports will come from. They are metadata. This phase does not download or call those systems. ExternalRecord can hold a source payload before anyone normalises it. rawData is a cache. Findings, assay observations, regulatory rows, and assessments stay in their own tables.
An import must not change a curated mechanism score. A ToxCast hit is assay bioactivity, stored on AssayObservation, and it has no effect score. An ECHA endocrine-disruptor conclusion and an EFSA reference dose belong on RegulatoryAssessment, with a conclusion kind so an inventory listing cannot be stored as a hazard value. AICIS listing means the chemical is on the Australian industrial inventory. It is not a safety assessment. APVMA actives and formulated products stay separate compound records.
OECD templates contribute study metadata that the finding does not already have: guideline, GLP, Klimisch reliability, study purpose, strain, assay system, and comparator. Klimisch codes are not copied into study quality. Study quality is not assessment confidence.
AOP-Wiki terms can be mapped from a mechanism, outcome, or causal pathway. The mapping is a crosswalk. It does not replace CausalPathway, and it does not mean every mapped chemical causes the adverse outcome.
Identity precedence, when a later import proposes a match:
Mixtures, formulations, UVCBs, polymers, salts, and stereochemical variants stay on manual review. Two compound rows are not merged because a name matches. A conflicting identifier is stored as a disputed row. It does not overwrite the existing value. DOI and PMID stay on the evidence source. AOP ids stay on the ontology mapping. They are not compound keys.
The convenience casNumber and pubChemCid columns remain. They are not promoted into ExternalIdentifier in this seed, because those values were not re-checked against DSSTox. InChI, InChIKey, and SMILES columns exist and are empty until a verified source supplies them.
EPA ToxPi is a precedent for showing several toxicological domains at once. A later ToxPi-like picture would keep those domains, and any weights would be explicit and chosen by the reader. A priority rank of that kind would not be a clinical or population risk. This phase does not draw one.
Gut, microbiome, and endothelial mechanisms are families inside the existing domains, plus a vascular domain that is stored and is not a profile column. Diversity, composition, and generic dysbiosis stay descriptive unless a later assessment explicitly supports a functional or adverse score. No compound is attached to these mechanisms in this seed. Aggregation groups, not the two new pathway definitions, are what stop a chain from being added into a headline.
AssessmentRevision once curation exists.