A living inventory: what's actually built, what's built-but-needs-validation,
what's stubbed/data-gated, and what's deliberately deferred. Updated as
milestones land. For why things are the way they are, see ARCHITECTURE.md,
CAPABILITIES.md, and AROMA.md.
- β Built & validated β trained/run, output sanity-checked
- π‘ Built, needs validation β code exists, not yet under an end-to-end test suite
- π© Stub / data-gated β interface exists, returns an honest "not available" until fueled
- π§± Team milestone (Track B) β scaffold only, on the roadmap
- βΈοΈ Deferred β intentionally parked, with a documented reason
- sweet / bitter / umami classifiers (RandomForest on Morgan fingerprints) β AUROC 0.95 / 0.95 / 0.99
- sweetness-intensity regressor (SweetenersDB v2.0) β RΒ² 0.82
- sour: trained indicative head (AUROC 0.90) + acidity SMARTS rule (recall 0.93)
- salty: cation-aware rule + verified dataset-label override
- ranked
taste_profile+multitasteflag - ONNX export with roundtrip self-validation (< 1e-6)
physchemβ MW, logP, TPSA, H-bonds, solubility, volatility, pKa (computed, RDKit)stabilityβ oxidation / hydrolysis / photo watch-flags (rule)chemesthesisβ cooling / pungent / astringent (rule)safetyβ disclaimer, structural alerts, GRAS cross-check, TTC hint, EU allergen labelingcheck_mixtureβ documented dangerous-pair screenanalyze_balanceβ OAV dosing balance (qualitative)
All return chemically-sane output on spot checks (vanillin correctly flags its phenol + aldehyde as oxidation-prone; citric acid; glucose). Validation gap: these aren't yet under a regression-test suite β that's the work to move them to β .
substitute()β Tanimoto / Morgan nearest-neighbor over the labeled molecule set, each neighbor returned with its known tastes- demonstrated: glucose β ribose / sugars (sim 0.94); vanillin β ethyl ferulate / creosol / anisaldehyde (vanillin-adjacent aromatics)
- this is the Track-A implementation; Track B mirrors it as a pgvector ANN query over the same fingerprints (M6)
- FastAPI
app.py(/api/predict,/api/neighbors) +workbench.html
retention_index(Kovats RI) β needs a trained RI QSPR / NIST dataanalyze_balancequantitative dosing β needs odor-threshold tables- GRAS cross-check β needs the FEMA/FDA GRAS list loaded (
gras_reference.parquet) - aroma β see Deferred below
- π§±
api/(.NET) β buildable skeleton +/health; endpoints / rule-port / in-process ONNX serving = M2 (Aaron) - π§±
frontend/(React workbench) β greenfield = M3 (Jamie) - π§±
infra/(Docker Compose, Postgres + pgvector) = M5 (Ty) - π§± substitution at scale (pgvector ANN), auth / per-seat = M6
- βΈοΈ Aroma model. No commercially-clean public data yields a working model
(
keller_2016scored CV-RΒ² β€ 0 across all 20 descriptors; the rich set, GS-LF, is NonCommercial). The engine (OpenPOM β MIT code) is kept and wired; it's unlocked by licensed PMP 2001 or customer data. Full record:AROMA.md.
What we sell, and when:
-
Now β clean public data. Taste + behaviour + safety read on any structure, plus the substitution library (swap an ingredient for a close analogue). This is the public demo and the open-door.
-
Paid pilot β their data. An aroma model trained on the customer's licensed/owned odor data (GC-MS to identify the molecules + their sensory panel's descriptors as labels β both are required; GC-MS alone has no smell labels to learn). Plus blend-ratio suggestions tuned on their formulation archive. The pitch line is literal: "aroma comes with your data."
-
Long-horizon β R&D + a regulatory wall. Novel-molecule generation (propose new flavor molecules) and retrosynthesis (synthesis routes). Technically far harder, and gated by food-safety approval β a newly-generated molecule isn't GRAS and can't be sold as a flavor without a regulatory path. A research direction, not a near-term feature; documented here so the staging is explicit and doesn't get over-promised in a pitch.