Verified 2026-08-13. Method: full read of app.html (the original 8,027-line "Scan" monolith) against os.html + assets/os-views.js (the Capture OS shell that replaced it), plus the pages os.html hands off to. Anything living in proposal.html or coach.html counts as moved, not lost.
Scale. app.html is 8,027 lines and ~200 functions. os.html + os-views.js is 2,518 lines, and 5 of the 10 view renderers are ~30-line list views. There is zero export code and zero charting code in the shell. That ratio is the finding: this was a re-skin that lost roughly two thirds of the surface, not a port.
Sixteen of 25 were fixed or substantially restored on 2026-08-13: rows 1-9, 12, 14, 15, 17, 18, 20, 22, 23.
A correction that matters: the earlier versions of this register said "nothing consumes webhook_url". That was wrong — worker/alerts.js has posted saved-search alerts to the webhook URL all along, through safeFetch with https-only and private-range SSRF blocking. Row 3 is therefore more complete than claimed: cadence and webhook now have UI, and delivery already worked. Only the test-fire button is genuinely missing.
The larger pattern, confirmed twice more today: the per-notice AI review (row 12) and the pipeline sharing/amendment RPCs (rows 14, 20) all existed server-side — grounded, guarded, credit-metered — with no UI calling them. The rewrite didn't lose features so much as orphan their backends.
| # | Feature | Where it was | Status in Capture OS |
|---|---|---|---|
| 1 | ~~Opportunity filters~~ | currentFilters(), searchOpps() | ~~Missing~~ RESTORED 2026-08-13 in assets/os-search.js — all nine filters with removable active-filter chips. |
| 2 | ~~Saved searches~~ | saveCurrentSearch, applySavedSearch | ~~Missing~~ RESTORED 2026-08-13. Save, apply, delete. Match preview still absent. |
| 3 | Alert cadence + webhook | editSavedSearchAlerts | Partial 2026-08-13. Per-search cadence (daily/weekly/off) and an https-only webhook field now save. Test-fire still missing, and nothing consumes webhook_url yet — the worker still has to be taught to post to it. |
| 4 | ~~Opportunity exports~~ | exportOppsCsv and siblings | ~~Missing~~ PARTLY RESTORED 2026-08-13. Opportunity CSV, JSON and deadline ICS ship. Intel CSV, subaward CSV, pipeline CSV/ICS and SAM-expiry ICS still missing. |
| 5 | ~~Price-to-win benchmarks~~ | winPatternFromRows | RESTORED 2026-08-13 in assets/os-intel.js — nearest-rank p25/median/p75 over real award amounts. GSA CALC link still absent. |
| 6 | ~~Win-pattern cards~~ | renderWinPatternCard | RESTORED 2026-08-13 — peak month, low-competition share, set-aside mix. |
| 7 | ~~Awardee concentration~~ | incumbentRollup | RESTORED 2026-08-13 — top-8 by dollars with top-3 share. |
| 8 | ~~Recompete radar~~ | recompeteScore | RESTORED 2026-08-13 — end-date ordering with sole-source / thin-competition flags, 12/18/24-month windows. |
| 9 | ~~Competition-intensity lenses~~ | intelLensRows | RESTORED 2026-08-13 — offers ≤1/≤3/≤5/known, end-date windows, set-aside filter. |
| 10 | Subaward / teaming rollup (FSRS) and partner suggestions | loadSubawardsForNaics, suggestTeamingPartners | Missing. |
| 11 | Per-row GAO bid-protest and CPARS deep links | inline in intel rows | Missing. |
| 12 | ~~Per-notice AI review~~ | runOpportunityAiReview | RESTORED 2026-08-13. POST /ai/opportunity-review existed all along (notice + shred grounding, cite-or-blank, credits on success only); every search result row now carries an AI review button for Pro+AI. Fit score and bid-brief download still absent. |
| 13 | Proposal coverage tracking (shalls mapped %, section mapping) | get_proposal_coverage / upsert_proposal_coverage | **Missing from os and proposal.html.** The RPCs are orphaned — the database supports a feature no UI reaches. |
| 14 | ~~Amendment history~~ | showPipelineAmendments | RESTORED 2026-08-13 in the Pipeline view via pipeline_amendments_since, with a persisted last-checked timestamp. Per-document revision viewer still absent. |
| 15 | ~~Calendar view~~ | renderOppCalendar | RESTORED 2026-08-13 — month grid in the Pipeline view with due dates placed on their days. |
| 16 | Lane counts summary bar | loadLaneCounts, syncLaneBar | Missing. |
| 17 | SAM link/merge/unlink; profile fields | mergeSamProfile, #vp-* | Partial 2026-08-13. Branch, CAGE, UEI, contact email/phone and the contact-visibility toggle are back, and browse now goes through the masking view. SAM link/merge/sync/unlink still missing. |
| 18 | ~~Agency forecast rows~~ | loadForecastBrowse | RESTORED 2026-08-13 as a Forecasts nav item calling list_agency_forecasts, with the official .gov portals as the empty-state fallback. |
| 19 | "What would help you win" Pro request form | mountProRequestForm | Missing. |
| 20 | ~~Pipeline sharing~~ | sharePipelinePrompt | RESTORED 2026-08-13 via the existing share_pipeline_with_email / list_shared_pipeline RPCs. |
| 21 | Paste-to-shred compliance matrix | runPasteShred | Moved to proposal.html. |
| 22 | ~~Market dashboard: charts, set-aside table, KPI tiles, FY switch~~ | renderMega, renderSetAsides, #chart-* | ~~Missing~~ restored 2026-08-13 as assets/os-dash.js. |
| 23 | ~~Certification path, guides, academy inside the shell~~ | standalone pages | ~~Ejected the user~~ restored 2026-08-13 as native views in assets/os-pages.js. |
| 24 | EZ guide / plain-English easy search | startEzGuide, easySearch | Missing. Partially echoed by the new Desk setup track. |
| 25 | Weekly market digest preview | previewMarketDigest | Missing. |
for calendar, saved searches, forecasts, subawards or exports. There is no URL a customer could visit even if the code existed.
location.assign. Three (Get Certified, Guides, Academy) were ported to native views on 2026-08-13. Proposal Assist, Bid Coach, plus Plans and Support still leave the shell — they carry a return bar, but the left menu disappears.
Rows 1–4 were Basic tier promises and are now substantially delivered. Rows 5–12 remain Pro and Pro+AI promises that are not: the pricing page sells award intel, recompetes, price-to-win, awardee concentration and cite-backed notice review, and the shell delivers a keyword search over each table. That is the remaining honesty gap, and it is the next thing worth doing.
Still open, in the order I would take them: row 9 (competition-intensity lenses) and row 8 (recompete radar) are the cheapest Pro wins because the award data is already ingested. Row 12 (per-notice AI review) is the whole Pro+AI pitch and is entirely absent. Rows 13 and 18 are odd cases — the database supports proposal coverage and agency forecasts via RPCs that no UI calls, so the work is a view, not a feature.