For Agents
Reverse-chronological session log. Newest entries at top, grouped by date (
## YYYY-MM-DD). Each bullet: one piece of work, short summary, wikilinks to docs touched. Updated byobsidian-documenteron every project doc write. Read byhistorianat bootstrap (top ~15 entries).
Log was stale until 2026-06-09
Entries between the 2026-05-04 init stub and the 2026-06-09 reconciliation were never recorded as the code shipped. The ~late-April build history below was backfilled on 2026-06-09 from git (
feature/tender-pipeline, merged via PR #5), not captured live. Dates track the commit window and are approximate.
2026-06-15 — Phases 2 & 3 built (on master, NOT pushed)
State: local
master, not pushed; 2 operator blockersBoth phases are committed + code-reviewed clean (web tests + build green) but not pushed, and not live end-to-end. Full writeup: qualification-phase-2-3.
- Phase 2 — company profile DONE: editable singleton
company_profile(id integer pk default 1 check (id = 1), migration20260615093853_company_profileapplied live tomkofmdtdldxgmmolxxhc), SettingsCompanyProfileForm,useCompanyProfile/useUpdateCompanyProfile(upsert{id:1}), en/hu i18n. Gotcha: form clobbered unsaved edits on focus-refetch → fixed with a hydrate-once guard. — qualification-phase-2-3 - Phase 3 — on-demand qualification DONE (mirrors
/disclosure): tablestender_qualification_request(queue) +tender_qualification(one verdict/tender, upsert ontender_id), RLS authenticated SELECT/INSERT + service_role ALL (migration20260615163827_tender_qualificationapplied live).tender-qualifyedge fn DEPLOYED: verifyAuth bearer-or-secret → newest-pending → claim-race → load tender+profile → empty-criteria short-circuit tounknown(no LLM) → else Claudeclaude-opus-4-8thinking:adaptive+ structured output. — qualification-phase-2-3 - Phase 3 landmines:
VERDICT_SCHEMAmust avoidminimum/maximum/minLength/pattern/recursion or the raw fetch 400s; parse thecontent[]block wheretype==='text'(adaptive thinking puts the thinking block first, socontent[0]is wrong). — qualification-phase-2-3 - Phase 3 frontend:
lib/tender-qualification.ts(parsers/tone/i18n-key helpers), hooks (useRequestTenderQualification,useTenderQualificationRequestpolling 8s while pending/running w/ 15-min bound + verdict invalidation ondone,useTenderQualification(s)/List),TenderQualifyButton+QualificationVerdictPanel+ eligibility-prose onTenderOverviewTab, en/hu i18n viat(). — qualification-phase-2-3 - Blocker 1:
ANTHROPIC_API_KEYNOT set in Supabase secrets → every real LLM assessment landsstatus='error'("ANTHROPIC_API_KEY not set"). Fix:supabase secrets set ANTHROPIC_API_KEY=sk-ant-... --project-ref mkofmdtdldxgmmolxxhc(same secret backs_shared/llm.ts). — qualification-phase-2-3 - Blocker 2: web SPA deploy parked on
wrangler login/CLOUDFLARE_API_TOKEN→ Phase 1+2+3 frontend not live. Plus: edge fn not self-verifiable (browser-driven invoke) and empty-criteria short-circuit untestable (all 101 live tenders have eligibility_criteria, 0 null). — qualification-phase-2-3
2026-06-09 — Refocus to Hungary/EKR-only + Qualification feature, Phase 1 shipped
Direction change — pricing intelligence is OUT
This session supersedes the old EU-wide / pricing-model direction. The pipeline is now Hungary / EKR-only, and the strategic goal shifts from “undercut the awarded value” to “does Levandor qualify to bid on this tender?“. The unbuilt pricing-intelligence half (Szerződéstár / CoRe / enrich-pricing / score / FX) is no longer the plan — see TOPICS for the superseded theme.
New direction
- Refocused discovery from EU/TED → Hungary/EKR-only. TED is removed end-to-end; EKR Eljárástár is the sole source.
- New feature: an on-demand LLM qualification assessment of each tender’s eligibility criteria against an editable company profile — mirroring the CRM’s
/disclosureanalyzer pattern (queue + verdict UI). This replaces pricing intelligence as the value thesis. - Executed via subagent-driven development with two-stage review per group; pushed to
origin/master(~36 commits, both gates green). - New design docs live in the repo (not the vault — do not duplicate here):
docs/superpowers/specs/2026-06-09-hungarian-tender-qualification-design.mdanddocs/superpowers/plans/2026-06-09-tender-hu-only-phase1.md.
Phase 1 — DONE, on master
- Full TED removal across the pipeline package +
tender-syncedge fn + web UI.tenders.sourceCHECK is now'ekr'-only (kept theted_publication_number/ted_urlfields, which EKR also populates). - New
config.tscentralizing CPV codes + tag map + defense buyer allowlist/keywords + accent-foldingisDefenseBuyerhelper. - Defense-sector OR-gate inside the EKR source:
cpvOk || defenseOkbeforeyield, so defense-sector buyers (Magyar Honvédség, Védelmi Beszerzési Ügynökség) are ingested + taggeddefense_sectoreven with non-IT / null CPV (cpvCodesrelaxed to allow empty). - Eligibility prose captured: 6
alkalmassagiKovetelmenyReszletekfields + documents flow types → adapter → zod → upsert into newtenders.eligibility_criteria/tenders.documentsjsonb columns. - Live migration
20260609192522_tender_hu_onlyapplied to project mkofmdtdldxgmmolxxhc: purged 42 TED tenders + their sync rows, rewrote the CHECK to'ekr'-only, added the 3 jsonb columns, recreatedtenders_view. - Gates:
pnpm --filter @levandor/tender-pipeline test20/20 green;pnpm --filter web buildexit 0.
The
tenderstable is now EMPTYThe migration purged all 42 TED rows and 0 EKR rows were ever persisted historically, so the table is empty. EKR ingestion still needs a real verification run before the feature is usable.
Pending (Phases 2–4)
- Phase 2 — editable
company_profilesingleton + Settings form. - Phase 3 — on-demand
tender-qualify(Opus 4.8 + structured outputs), queue + verdict UI cloning/disclosure. - Phase 4 — null-criteria enrichment from PDF / TED-notice fallback.
Gotchas to carry forward
- Defense is not in EKR as CPV. There are no CPV-35 / military procurement codes in EKR — only defense-sector civilian buyers (caught via the buyer allowlist/keywords +
isDefenseBuyer), not weapons/CPV-35 tenders.- Eligibility criteria are free-text Hungarian prose (the
alkalmassagiKovetelmenyReszletekfields). They need LLM extraction in Phase 3 — they are not structured/machine-comparable as captured.- Seed defense roots unconfirmed:
HM EI ZrtandKatonai Nemzetbiztonsági Szolgálatin the allowlist are not yet confirmed against live EKR buyer names — validate during the first ingestion run.
2026-06-09 (earlier — status reconciliation)
- Status reconciliation: documented that tender discovery + tracking UI shipped and merged (
feature/tender-pipeline,84ae43f, PR #5) while the entire pricing-intelligence half remains unbuilt. Recorded the spec-vs-code divergence (SQLite/Drizzle/FTS5 → Supabase/Postgres; 5 sources → 2; enrich-pricing + score stages → never built). Feature is dormant / operator-driven (not requested via the cross-agent handoff channel). Original plan: source-strategy-spec + implementation-guide; divergence and unbuilt-remainder index: TOPICS.
2026-04-27 (UI completion + API-drift fix)
04b5b3btender UI defaults to open / closing-soon filter; added a status filter sidebar.7bb267eAPI-drift fix: adapted the pipeline to TED Search API v3 and changed EKR API response shapes - the first time upstream APIs drifted and broke ingestion. A future re-run may need another such fix.e1ed0c6sync button wired into the tenders page.84ae43f/4b2518bmerged PR #5: completed the CRM tender UI (web/src/pages/tenders/,Tender*.tsxcomponents,/tenders+/tenders/:tenderIdroutes intoApp.tsx+ Sidebar) and mergedfeature/tender-pipelineintomaster.
2026-04-26 (pipeline + schema + runner build)
441f0f1…f38e05dscaffolded@levandor/tender-pipelineatpackages/tender-pipeline/: Zod schemas for Tender and Contract (theContractschema is exported but nothing ingests it yet - a placeholder for the unbuilt Szerződéstár stage), plus throttle + pagination utils.4a32a7a/9d9c978adapters:adapters/ted.ts(TED Search API v3) andadapters/ekr-procedure.ts(EKR Eljárástár public JSON API).e12fcfb/e6ecd8cstages:stages/normalize.tsandstages/dedupe.ts(Levenshtein fuzzy matching), both with tests. No enrich-pricing or score stage was built, despite the spec calling for them.f1b0d8ccompose runner with time-budget support;4db195bCPV reference table populated from the EKR dictionary;bd1f73dDB helpers (db/client, sync-state, tender upsert).db8a7b3tender-syncedge function (web/supabase/functions/tender-sync/index.ts) for incremental daily sync - 120s budget, service-role key, optionalx-webhook-secret, 7-day lookback. This is the runner; there is no standalone SQLite process (contrary to spec).e8adb81cli/backfill.tsentry point with resume support;2aefaf7migrations003_tender_pipeline.sql(tenders, cpv_codes) +004_tender_tracking.sql(tender_trackinglifecycle enum watching→evaluating→bidding→decided,tenders_view, FTSsearch_vector).
2026-05-04
- Initialized activity log. (Stub - the build above actually predates this entry; the log simply was not kept current until the 2026-06-09 reconciliation.)