A hydroponics-and-e-commerce client
AI systems built to refuse.
Four connected systems for growing, publishing, selling and shipping. Each one stops rather than guessing. The client is anonymized here and no performance figures are quoted, because none were measured. What follows is what was built.
- solid
- Wired and running today.
- dashed
- Built or available, and deliberately not switched on.
That convention holds across every diagram on this page. Nothing below is a screenshot. Every figure is drawn from the same set of primitives.
Hydroponics knowledge base
It reads the open scientific and horticultural literature on hydroponic growing and turns it into structured, machine-readable facts, each one carrying a citation back to the exact sentence it came from. Instead of a chatbot that sounds confident, it produces numbers you can trace. When it does not know something, it says so.
Two refusals sit on the path. A source whose terms are not cleared is never requested, and a fact whose quote cannot be found in the retrieved text is rejected and kept as a tuning signal.
- 01
Every fact is anchored to the words that produced it.
Before a value is written to the database, the system checks that its quoted evidence is literally present in the stored source text. Anything it cannot find is rejected and kept as a labelled failure.
- 02
It refuses to crawl sources it is not permitted to use.
Crawler permission and terms of use are treated as two separate questions. A source whose terms have not been cleared is never fetched at all, rather than fetched and then discarded.
- 03
Disagreement between sources is reported, not averaged away.
For each growing parameter the system publishes the median, the spread, and an explicit disagreement flag when sources genuinely conflict. It refuses to call anything a consensus when the evidence is too thin.
- 04
One knowledge base, three ways to read it.
A command line, a web API and a read-only connector for AI agents all resolve through a single query layer, so no surface can drift from the others.
- 05
The gaps in its own knowledge become a work queue.
When a real question arrives and the base has nothing, that miss is logged and aggregated into a prioritised list of what to source next, derived from what people actually asked rather than from a maintained wish list.
Registry scope as built: 52 crops, 36 of them active. 26 growing parameters. 81 pest, disease and disorder entries. 35 registered sources, 5 of which are recorded as deliberately excluded. Depth varies by crop, which is exactly why the gap backlog exists.
The base is designed to be operated by agents on both sides. On the write side a scheduled incremental cycle discovers, fetches and extracts without an external scheduler: what is due lives in the database itself, and re-crawl intervals adapt so static documents settle into a slow cadence while active pages stay warm.
On the read side, a read-only connector exposes the base to any AI assistant with no ability to trigger fetching or spending. It is structurally incapable of writing.
Commercially, this is the asset that makes downstream automation safe to publish. Marketing content, sales conversations and support answers all need the same plant-care numbers, and all three fail the same way when the numbers are invented. A cited knowledge base turns work that has to be fact-checked by hand into work that can carry a brand.
SEO and GEO publishing
A publishing system that writes hydroponics content optimised for both search engines and AI answer engines, and refuses to publish anything it cannot cite. It pulls plant-care facts live from the knowledge base, filters them for relevance to the article being written, validates that every claim resolves to a real and correctly attributed source, then creates the article in the online store.
- 01
Articles are written from retrieved, cited facts, never from model memory.
A single shared retrieval path resolves the article topic to crops and parameters, pulls the matching facts with their citations, and hands them to the writer. There is no second path a new feature could use to bypass it.
- 02
A relevance gate removes facts that are true but wrong for this article.
Retrieved facts are judged against the article brief and discarded with a recorded reason when they do not apply. If too few survive, the run stops rather than drafting on thin evidence.
- 03
Every citation is verified against the live knowledge base before publishing.
A referenced fact must exist, still be active, and actually belong to the source it was attributed to. A fabricated reference, a retired fact and a misattributed one all hard-fail the article.
- 04
Uncited material is confined to one labelled section, and that boundary is enforced.
Content drawn from general knowledge lives under a single explicit heading. A near-miss heading is rejected so the exemption cannot be approximated into existence, and a citation appearing inside that section is treated as a fabrication.
- 05
It measures whether AI assistants mention the brand, not just where the page ranks.
Buyer-intent questions are put to a live assistant and scored for brand presence, competitor share of voice, and the list of questions where the brand is absent.
Store articles are created through the commerce platform's official API with search metadata attached, and default to an unpublished draft. Going live is a human action.
Rank tracking answers a question customers are increasingly not asking. When someone asks an assistant what to buy, the page ranking third is not in the answer at all.
So the system measures both. Alongside rank and impressions, it puts buying questions to a live assistant and scores brand presence, competitor share of voice, and the questions where the brand never appears. That absence list is the content plan, derived from measurement rather than from a brainstorm.
The whole loop runs as one command and is built for unattended scheduling with a human approval point at the end. An agent takes a keyword opportunity, resolves it to crops and parameters, retrieves cited facts, filters them, drafts on a switchable model runtime, runs the gates, and files the result as a draft. Any gate failure stops the run and records which step failed and why.
The commercial effect is content marketing without the usual liability. The bottleneck in AI-written content is not volume, it is trust. Making citation a publishing precondition rather than a review step turns production from a staffing problem into a scheduling problem.
CRM, and the voice sales agent
A customer platform built around a voice agent that actually makes the calls. It phones leads, holds a real spoken conversation, qualifies them against a structured questionnaire, and writes what it learned straight into the customer record. The call is not a recording somebody listens to later. It is structured data the rest of the system acts on immediately.
The compliance layer is drawn as a bar the lifecycle has to cross, because that is what it is in the code: one module computes contactability and every outbound path calls it.
- 01
The agent calls leads and holds a real spoken conversation.
A live voice bridge handles the call with explicit turn control. The agent speaks, the microphone opens, silence is detected, the turn is committed. The whole call is traced as one structured record rather than leaning on generic interruption handling.
- 02
Every call ends as structured sales data, not a transcript.
A fixed qualification contract captures fit assessment, budget band, pain points, product interest, preferred channel and contact time. The contract is enforced, so a field can never be declared, stored, and silently never asked for.
- 03
One compliance layer that every outbound channel must pass through.
A global do-not-contact flag blocks every channel outright, and per-channel opt-outs block only their own. The same rule is expressed once for bulk audience queries and once for single sends, so the two cannot disagree. Texts additionally honour quiet hours and carry a guaranteed opt-out notice.
- 04
Scripts are edited without a deployment, and calls never fail if that fails.
Call scripts for each conversation type are maintained on a hosted prompt platform and pulled at call time with a short cache window. The loader falls back through a local copy to a built-in default, so a platform outage cannot stop a call.
- 05
Support answers are mined from the company resolved tickets.
Real question and answer pairs are extracted from closed support conversations and from approved reply templates into one searchable index. When the best match is not confident enough, the question is queued for a human and no answer is returned.
Around the call sits the full lifecycle: lead capture from ads, compliance-checked text and email follow-up, A/B tested outreach with deterministic assignment and order-derived conversion, order-driven segmentation, and a support index mined from resolved tickets.
Turn-taking is controlled explicitly rather than delegated. The bridge disables the platform automatic turn detection and manages the microphone, the buffer and the commit points itself, because a sales call has a different interruption tolerance than a generic assistant conversation.
Script control belongs to whoever runs sales, not to whoever deploys code. A wording change takes effect on the next call with no release, and the three-tier fallback means that convenience never becomes a single point of failure.
The agent is the caller and the CRM is its workplace. Leads arrive from ad-platform webhooks, are de-duplicated into the unified contact record, and are routed by campaign intent. A background scheduler then runs the funnel on a tick: due nurture texts and emails go out through the compliance layer, call-trigger rules create tasks for human reps, and cross-sell gaps in order history become draft campaigns that land in a review queue rather than sending themselves.
The honest commercial framing is speed and consistency at the top of the funnel. Every lead gets called, gets called promptly, gets asked the same qualifying questions and gets logged the same way, which is the part of outbound sales that degrades first when a human team is busy. The agent does not close deals unattended. It qualifies, routes, and hands a scored, structured lead to a person, and the places where a human stays in the loop are deliberate.
Work in progress
ERP
An operations system that pulls the online store and the overseas warehouses into one place, so stock, orders, fulfilment and warehouse costs can be read against each other instead of in three separate logins. It is deliberately built read-first.
Where it stands today
The reading and reconciliation layer is built. Every call that could change something in a live system is blocked by a safety gate that has to be opened explicitly, and both flags are off. Blocked attempts are logged rather than silently dropped.
The warehouse-facing reads are implemented but not currently connected. That is waiting on a production credential being issued, not on code. Syncing is manually triggered in the delivered phase, and fulfilment routing is an explicit exclusion from it.
Nothing in the lower lane has been switched on. The write path is built, previewable and tested, and it stays closed until someone opens it deliberately.
- 01
A two-flag safety gate stands in front of every mutating call, and it is shut.
No write reaches a live system unless both flags are on. A blocked attempt throws, is logged with the payload it would have sent, and surfaces as a distinct locked status rather than as an error.
- 02
What would have been sent is inspectable without sending it.
Every gated operation has a matching preview that returns the exact structured payload and the reason it is blocked, contacting no network at all.
- 03
Store orders, products, inventory and fulfilments sync into one local ledger.
Paginated, cursor-based reads populate a single database, so the whole operation can be queried in one place instead of three separate logins.
- 04
Batch-level stock tracking across warehouses.
Stock is tracked per batch, not only per product per warehouse, keyed uniquely on product, warehouse and batch number and carrying inbound date, expiry date and quantity. Warehouse SKU codes reconcile to local products with drafts kept separate from confirmed mappings.
- 05
Warehouse cost lines are read and reconciled against fulfilments.
Outbound billing lines are pulled and summarised so fulfilment cost can be read against revenue rather than estimated after the fact.
Eleven operational screens over thirteen backend route modules: dashboard, orders, products, inventory, inbound, customers, finance, sync, push, logs and settings.
Tracking batch number, inbound date and expiry alongside quantity is a schema decision made before the write path exists, which is what makes expiry-aware and age-aware stock reporting possible later without migrating historical data.
The commercial relevance here is margin visibility and exception handling, not automation volume. Reconciling store revenue against warehouse fulfilment cost per order is what turns a product catalogue into a margin picture, and an exception feed is the difference between finding a stuck shipment when the customer complains and finding it the same day.
The ERP is the layer that keeps the customer-facing systems honest about what can actually ship.
Where an agent belongs, and where it does not
This is the written position in the repository for a later phase. None of it is running today, and it is here because the boundary is the interesting part.
Earns its keep, read-only, proposes for a person to act on
- Exception triage: inbound lines with discrepancies, outbound orders stuck past their expected window, shipments with tracking but no scan, cost lines that reconcile to no fulfilment.
- SKU-mapping proposals, surfaced for one-click human approval.
- Drafting warehouse dispute tickets for a person to send.
- Proposing a fee-category table from real invoices rather than guessing at the split.
Must not go
- Anything behind the safety gate. Order creation, cancellation and inbound delegation move physical goods in a warehouse.
- Browser-driving a third-party warehouse console, which means storing warehouse credentials against an interface that can change silently.
- Deciding which system owns a sales channel. That is a policy written down once, not adjudicated per order.
One chain, from evidence to order.
These are not four unrelated products. Cited plant science feeds the content engine, the content engine and the sales systems all meet at the store, and the operations layer decides what can actually ship. Three of the joins are wired in code today. Two are not, and the difference is drawn.
- wiredKnowledge base to publishing
- The publishing system reads the knowledge base live rather than holding a copy of it. Every citation is re-checked before an article is created, so a fact retired between drafting and publishing fails the article instead of shipping inside it.
- wiredPublishing back to the knowledge base
- When the publisher asks for something the knowledge base does not have, that miss is reported back and joins a prioritised sourcing backlog. Content demand sets research priority, with no maintained wish list in between.
- wiredEverything meets at the store
- The publishing system creates articles there. The CRM reads orders and customers from there and derives customer classification from that order history. The ERP syncs orders, products, inventory and fulfilments from there into its own ledger.
- not wiredKnowledge base to conversational agents
- The knowledge base ships a read-only connector built for exactly this, and one consumer documents the intent. No such connection exists in the CRM today. Its support answers come from its own index of resolved tickets, a different corpus answering a different question.
- not wiredERP to the overseas warehouses
- The warehouse reads are implemented, and the write path is built and gated shut. Connecting it is waiting on a production credential being issued, not on code.
Want a system that behaves like this?
The four systems above are one suite built around a hydroponics store. The patterns behind them, gated writes, cited claims, and human approval where confidence is low, transfer to most operations that need to be right rather than merely fast.