An always-on scan of every public Australian tender source a slurry-piping supplier could care about, every weekday. It files only the notices that fit Beaver Process's business. And when a catch is worth a person's minute, it opens the pack, reads it, and writes the brief. Running unattended since 26 July 2026.
It looks for the right product wanted by the right buyer: valves, lined pipe, slurry hose, spools, actuators, expansion joints and pump skids, wanted by mining, mineral processing, the EPCM channel, or resources-adjacent ports and refineries.
It keeps a record of everything it has ever seen, so a tender alerts once and never again. It keeps the near-misses too: the council and water-utility supply tenders Beaver's products fit, held one rank lower as evidence of the wider public market. And when a live tender clears both filters, it downloads the pack, reads it against Beaver's catalog and bid rules, and writes a one-page brief with a recommendation. A person says yes or no.
What that means in volume, from the record on 23 August 2026:
The point of the funnel: a person decides on one thing when there is one thing, and the agent has already read the pack.
| # | Key | Source | Endpoint | Cadence |
|---|---|---|---|---|
| 1 | vp | VendorPanel open RSS | vendorpanel.com.au/PublicTendersRssV2.aspx?mode=all | Daily, Mon-Fri |
| 2 | vpc | VendorPanel closed history (~18.4k items) | same, ?mode=closed | Weekly, Mon |
| 3 | icn | ICN Gateway projects + work packages (logged-in browser, 9 keywords) | gateway.icn.org.au/projects?keywords=… | Weekly, Mon + every login |
| 4 | bfv | Buying for Victoria (5 keywords) | tenders.vic.gov.au/tender/quickSearch | Daily |
| 5 | ntq | NT Quotations & Tenders Online | tendersonline.nt.gov.au/Tender/Search/Current | Weekly, Mon |
| 6 | aust | AusTender RSS (liveness ping; Defence-only supply) | tenders.gov.au/public_data/rss/rss.xml | Daily |
| 7 | buynsw | buy.nsw opportunities (browser) | buy.nsw.gov.au/opportunity/search | Weekly, Mon |
| 8 | qt | QTenders JSON API (open + closed/awarded sweep) | qtenders.hpw.qld.gov.au/api/search/tenders | Weekly, Mon |
| 9 | tl | TenderLink public lists (browser, 23 org slugs, list pages only) | portal.tenderlink.com/<slug>/alltenders/ | Weekly, Mon |
| 10 | epa | EPA WA referrals (browser; approvals precede procurement) | epa.wa.gov.au/proposal-search | Weekly, Mon |
| 11 | inbox | Agent inbox sweep (IMAP, label + INBOX, 30-day lookback) | imap.gmail.com | Daily |
The agent inbox is agenticbuild@gmail.com. Portal alert subscriptions land there from Tenders WA, SA Tenders & Contracts and Tenders ACT. The reader parses each portal's digest format; a watch-mail on a tender Mark has subscribed to bypasses the filter entirely, so an addendum on a watched tender never drops. Credentials sit in a secrets vault, never in the project files.
Outside the eleven: the Sydney Water contract register is scraped by hand, quarterly or pre-pitch, into a panel-expiry calendar and incumbent map.
The scheduled task BeaverFleetScan fires at 12:00 Mon-Fri. Mondays run all eleven; Tuesday to Friday run the daily four (vp, bfv, aust, inbox). Weekends: nothing. Monday catches up, and the record means nothing is lost. A notification goes out only when a run finds new live tenders, and when a brief is ready.
icn_login.py: log in, close the window) the script banks a sweep on the fresh session. Monday's scheduled attempt notes "expired session" when there isn't one. Expected, not an error.Every fetched notice is scored twice, in order. The market layer was added on 21 August 2026.
Beaver Process sells mining slurry piping systems through EPCMs and mine owners. A VendorPanel listing titled "Supply of knife gate valves" from GR Engineering says nothing about mining; you only know GRES is a mining EPCM because you know GRES. So the market layer is built from three signals, in order of precedence.
| Signal | What it reads | Result |
|---|---|---|
| 1 · The buyer map | A registry of 39 companies the scan has been taught to recognize as Beaver's market: 20 miners (Roy Hill, Fortescue, Rio Tinto, BHP, Pilbara Minerals, AngloGold, Newmont, Alcoa, South32…), 15 EPCMs and process contractors (Lycopodium, Hatch, Ausenco, Worley, Bechtel, Fluor, GR Engineering, Monadelphous…), and 4 resources-adjacent buyers (Pilbara Ports, NQBP, Gladstone Ports, QAL). Each carries an evidence pointer to why it is on the list: a corpus case study, Beaver's own hiring copy, or the research files. A tender from any of them is promoted one tier even when the text never says "mining", because that is the knowledge a tender listing leaves out. Short and place-name aliases match the buyer field only, so "hatch" never fires on an access hatch. The map is a taught list, not a count of opportunities, and it grows as the record teaches it. | POSITIVE |
| 2 · Project keywords | For buyers not in the registry: slurry, tailings, TSF, concentrator, process plant, mineral processing, mine site, magnetite, iron ore, lithium, nickel, bauxite, alumina, refinery, gold mine, copper project, coal mine, thickener, hydrocyclone, flotation, heap leach. Keyed on the project, not the buyer, so a state-government tender for a mine-access pipeline counts. Bare gold, copper, coal, crushing, dewatering, quarry are excluded on purpose: council false positives. | POSITIVE |
| 3 · Negative classes | Buyer words (council, shire, city of, water corporation / utility / authority, the named water corps, health, education, police, defence, department of) and municipal end-uses (water meters, hydrants, sewer, STP / WTP, potable, reticulation, irrigation). | NEGATIVE |
| Anything else | The product tier stands as judged. | NEUTRAL |
Positive promotes one tier (cap STRONG). Negative demotes one tier (floor WATCH, never dropped). Two narrow exceptions keep a notice with no product word as WATCH for forward intel: an EPCM registry buyer, whose public notices are project packages, or a project referral from ICN or the EPA in a positive market. A miner's forklift EOI has no product match and drops.
Why one tier down, and never drop. The council and utility supply tenders are the evidence for the "why not Government" conversation and for the miss report's market-volume claim. POSSIBLE is the accurate label for "Beaver's product, outside Beaver's market."
Every record keeps both views: the product tier, the final fit, the market signal, and the exact rule that fired.
On 21 August all 19,853 stored notices were re-judged, with the VendorPanel closed history refetched so those items carried their descriptions again. 55 rose, 107 fell. Every item that fell is a council or utility tender demoted one tier with the buyer class named. Items that rose include the Carmichael mine pipe-supply EOIs and ICN "Slurry Pumps" packages the product-only filter had dropped outright. A rollback copy of the record was taken first.
A catch that clears both filters on a live tender enters a queue. From there the agent does the reading and a person does the deciding. This ran end to end for the first time on 23 August 2026.
Every claim in the brief is cited or marked UNSURE. Beaver facts come only from a facts table sourced to the catalog and the company profile; a gate the table does not cover is UNKNOWN.
That NO is the credibility moment. A tool that only ever says yes is a tool nobody trusts; this one declined the work and showed why, in a page that took 1 minute 38 seconds to write from a pack that would take a person an afternoon.
Most of Beaver's market never appears as a downloadable tender. It appears as a project: an EPA referral for a magnetite mine, an ICN Gateway listing for a concentrator, a work-package title such as "Slurry Pumps" under a lithium project. There is no pack to fetch, so these go to a watchlist instead: 62 projects today, with owner and EPCM filled where the buyer map knows them, and a next-check date. This is the spec-embedding list, the call list for the job Beaver's Capital Projects ads describe as "access to 100% of target package tenders." The scan finds them; a person opens the relationship.
The re-judgement also measured each source's mining yield, and that reranked the fleet.
| Source | Items in record | Mining-market catches | Council / utility catches |
|---|---|---|---|
| ICN Gateway | 145 | 77 | 3 |
| EPA WA referrals | 67 | 29 | 0 |
| VendorPanel closed history | 18,327 | 11 | 234 |
Primary, the radar: ICN Gateway and EPA WA, the forward project pipeline where specifications get written, plus the rare mining EOIs that surface on VendorPanel and QTenders. The 22 August ICN sweep with the four new mining keywords banked 68 new projects in one pass: Mulga Downs iron ore, Jervois and Eva copper, Aurukun bauxite, Hemi gold.
Secondary, market-volume evidence: VendorPanel, Buying for Victoria, buy.nsw, QTenders, TenderLink, the Sydney Water register, the state portal alerts. They feed the miss report and the public-sector pillar; their catches rank one tier lower and never drop.
Still to assess: BHP Local Buying (C-Res), Felix, and the process EPCs Mintrex, Sedgman and Wave.
| Output | Where | What it holds |
|---|---|---|
| Daily digest | sourcing/digests/YYYY-MM-DD.md | One file per day; same-day re-runs add, never wipe. New live tenders by fit with the rule that fired, recently closed, forward intel, and a fleet-health table. "Nothing suitable today" on a clean day. |
| The record | sourcing/engine/state/seen.json | ~19.9k ids, held on the machine outside the shared project archive. The dedupe memory: a candidate alerts once, ever. Every row keeps both the product view and the market view. |
| The ledger | sourcing/triage/queue.tsv | One row per tender that ever entered triage: status (NEW, FETCHED, BRIEFED, DECIDED, BLOCKED), the agent's recommendation, the person's decision and reason. The only place a decision is real. |
| The brief and its trail | sourcing/triage/<id>/ | brief.md, evidence.json (what code found, cited), judgement.json (what the model decided), meta.json (the fetch manifest); pack/ and text/ on disk only. |
| Decisions log | sourcing/triage/decisions-log.md | One line per human decision with the reason. The rules learn from these. |
| Closed items | sourcing/triage/closed/<id>/ | A NO moves here with its brief and trail. A YES moves to responses/<date>-<tender>/, where the response half of the OS begins. The live queue holds only open items. |
| Watchlist | sourcing/triage/watchlist.tsv | Resources projects with owner, EPCM, stage, packages seen, next-check date. |
| Miss report | sourcing/digests/miss-report.md | Tier 1: the two verified Sydney Water EOI misses. Tier 2: 118 supply tenders matching Beaver's products that opened and closed on VendorPanel, mining subset split out. |
| Panel-expiry calendar | sourcing/digests/sydney-water-panel-expiry.md | When each Sydney Water supply panel reopens, and who holds it now. |
Files land on disk automatically; they join the shared project archive only when a working session is reviewed and saved. The run's console line "new this run" counts live tenders only; project intel appears under "forward".
| When | Do | Check |
|---|---|---|
| any morning | Run icn_login.py, log in, close the window | ICN health row in today's digest |
| a brief is announced | Read brief.md; write YES or NO and a reason in the ledger; run triage.py --decide | Decisions log gains a line; the item leaves the live queue |
| an item holds at NEW | Run vp_login.py, log in, then immediately triage.py --run | Status moves to FETCHED, then BRIEFED |
| Monday afternoon | Read the Monday digest | No ERROR rows; market tags look right |
| after a filter or registry edit | Run rescore.py dry, read the diff, then --apply | Rose and fell make sense |
| quarterly / pre-pitch | Run sw_register.py | Panel-expiry calendar |
| something looks wrong | Copy seen.json.pre-market-filter.bak over the record | Then tell Claude |