{"url":"https://ticulate.com/nick/recentcomp","live":true,"project":{"slug":"recentcomp","owner":"Nick","ownerHandle":"nick","name":"recentcomp","summary":"Citation-anchored valuation reports for luxury-asset lenders. Next.js app plus a comp-discovery engine spanning nine auction, dealer and marketplace sources, piloted with Luxury Asset Capital.","status":"ontrack","visibility":"public","next":"Walk LAC stakeholders through the shipped workspace and collect answers on RapNet access, asking-prices-in-the-math, and the TheRealReal contact","started":"2026-05-14","target":null,"updated":"1w ago","updatedAt":"2026-09-08T17:02:30.877Z","done":24,"total":24,"health":null,"logo":null,"links":[],"purpose":{"why":"Lenders against luxury assets need defensible valuations fast. Comparable sales are scattered across auction archives, dealers and marketplaces, and most tooling produces numbers without receipts. recentcomp generates reports where every figure traces to a cited, timestamped comparable sale.","who":"Luxury Asset Capital (LAC) is the pilot customer — loan officers and valuation analysts underwriting watches, handbags and cars. Built to generalize to other lending desks after the pilot.","success":"LAC underwrites on recentcomp: reports move draft to approved inside the product, the team's verified-comp history compounds with use, and every valuation survives scrutiny — audit ledger, per-figure citations, 90-day reproducibility."}},"features":[{"id":"valuation-reports","name":"Citation-anchored valuation reports","area":"reports","state":"live","version":null,"shipped":"2026-05-14","summary":"Structured intake for watches, handbags and cars produces a report with a central estimate, conservative low, IQR, coverage stats, an AI-drafted executive summary, and a numbered citation for every retained comparable.","detail":null,"review":{"status":"none"},"links":[]},{"id":"pdf-export","name":"PDF export","area":"reports","state":"live","version":null,"shipped":"2026-05-14","summary":"One-click PDF of any ready report via headless Chrome, print-tuned layout, rate-limited per user.","detail":null,"review":{"status":"none"},"links":[]},{"id":"engine-search","name":"Nine-source comp discovery","area":"engine","state":"live","version":null,"shipped":"2026-05-25","summary":"Every search fans out across eBay, Bring a Trailer, Phillips, Sotheby's, Christie's, Bonhams, TheRealReal, Hagerty and Tavily-backed long-tail sources, with live progress streamed into the report screen.","detail":null,"review":{"status":"none"},"links":[]},{"id":"ai-match-filter","name":"AI match filter with disclosed rejections","area":"engine","state":"live","version":null,"shipped":"2026-05-25","summary":"Haiku judges every candidate against the queried asset; rejects are disclosed under the comp table with one-line reasons and can be re-included by a reviewer in one click.","detail":null,"review":{"status":"none"},"links":[]},{"id":"vision-filter","name":"Photo-to-photo match filter","area":"engine","state":"live","version":null,"shipped":"2026-06-16","summary":"Photos uploaded at intake become reference images; the engine compares each comp's listing photo against them and rejects visual mismatches (wrong body style, accessory listings, scale models).","detail":null,"review":{"status":"none"},"links":[]},{"id":"comp-images","name":"Comp thumbnails with lightbox","area":"reports","state":"live","version":null,"shipped":"2026-06-15","summary":"Listing photos on every comp row where the source provides one, click to enlarge, with a category tile fallback for auction-house sources without images.","detail":null,"review":{"status":"none"},"links":[]},{"id":"lender-policy-filter","name":"Sold-as-new exclusion","area":"reports","state":"live","version":null,"shipped":"2026-06-15","summary":"Comps sold as new, sealed or unworn are excluded before stats are computed — on by default per LAC's reseller policy, toggleable per report. Drops are disclosed with reasons.","detail":null,"review":{"status":"none"},"links":[]},{"id":"ltv-conservative-low","name":"LTV off the conservative low","area":"reports","state":"live","version":null,"shipped":"2026-06-15","summary":"Loan values size off the conservative low rather than the median, with a per-report toggle to the central estimate.","detail":null,"review":{"status":"none"},"links":[]},{"id":"hierarchy-ordering","name":"LAC hierarchy ordering","area":"reports","state":"live","version":null,"shipped":"2026-07-07","summary":"Every price is labeled realized or ask; reports sort realized first, then by LAC's per-class source rankings, with a visible divider where asking prices begin.","detail":null,"review":{"status":"none"},"links":[]},{"id":"verified-comps","name":"Verified comps that resurface","area":"workspace","state":"live","version":null,"shipped":"2026-07-07","summary":"Reviewers mark comps as internally verified; verified comps enter a private LAC archive and resurface automatically on future reports for matching assets, badged with who verified them.","detail":null,"review":{"status":"none"},"links":[]},{"id":"workspace","name":"Shared LAC workspace","area":"workspace","state":"live","version":null,"shipped":"2026-08-09","summary":"Everyone at LAC sees all LAC reports. Members and roles (Owner, Approver, Analyst, Viewer — multiple Owners supported), invite links, and an append-only audit ledger with CSV export.","detail":null,"review":{"status":"none"},"links":[]},{"id":"approval-workflow","name":"Review and approval pipeline","area":"workspace","state":"live","version":null,"shipped":"2026-08-09","summary":"Reports move draft, in review, approved — with locking, reopen, a per-reviewer approvals queue, and Owner-editable policy: preparer/approver separation, a two-signature dollar threshold, verification gates and lock-on-approval, all enforced at action time.","detail":null,"review":{"status":"none"},"links":[]},{"id":"approval-harvest","name":"Approved reports feed the comp history","area":"workspace","state":"live","version":null,"shipped":"2026-08-09","summary":"Approving a report saves its entire retained comp set to the shared history, badged distinctly from hand-verified comps. Reopening withdraws the harvest.","detail":null,"review":{"status":"none"},"links":[]},{"id":"comp-history","name":"Comp history library","area":"workspace","state":"live","version":null,"shipped":"2026-08-09","summary":"Browse, search and govern everything that resurfaces: retire a bad entry globally, promote entries a reviewer endorses, and see imported internal sales alongside verified comps.","detail":null,"review":{"status":"none"},"links":[]},{"id":"template-reports","name":"Manual template reports","area":"reports","state":"live","version":null,"shipped":"2026-08-10","summary":"When the engine finds no comps, the failure screen offers a template report: the reviewer adds sales by hand, each one joins the workspace history, and Re-summarize computes the valuation.","detail":null,"review":{"status":"none"},"links":[]},{"id":"status-page","name":"Live status page","area":"Operations","state":"live","version":null,"shipped":"28 Aug","summary":"A /status page shows engine reachability, every source with its last success and last error, report success rates for the last day and week, why reports failed, comp-library counts and app configuration. Refreshes every minute; /api/status is the JSON twin for monitors.","detail":null,"review":{"status":"none"},"links":[{"url":"https://github.com/mcinnisdev/recentcomp/commit/14a220f","label":"Commit 14a220f"}]},{"id":"url-paste-comps","name":"Paste-a-URL comp entry","area":"Reports","state":"live","version":null,"shipped":"27 Aug","summary":"Paste a listing link and the price, date, venue, condition, photo and realized-vs-asking status fill in for review.","detail":"Direct fetch first, then Scrapfly datacenter anti-bot mode, then the residential pool; JSON-LD and Open Graph parsed deterministically, Claude fills the rest from the page text. Verified on Phillips, eBay and TheRealReal. Non-USD prices are flagged rather than converted. Requires SCRAPFLY_API_KEY on the recentcomp deployment for bot-protected hosts; without it those links fall back to manual entry with the venue pre-filled. Manual comps now carry the listing photo.","review":{"status":"none"},"links":[{"url":"https://github.com/mcinnisdev/recentcomp/commit/1255c61","label":"Commit 1255c61"}]},{"id":"query-normalization","name":"Query normalization","area":"Search","state":"live","version":null,"shipped":"27 Aug","summary":"Long descriptive model strings collapse to the short listing name before the engine call, so token matching can find real listings.","detail":"Cavalcadour Toile De Camp Kelly II Sellier 32 becomes Kelly 32 with Sellier, Cavalcadour and Toile de Camp set aside and logged in the report trail. Gated so clean queries such as Rolex 126610LN never pay for it; fails open. LAC's failed Hermès report reproduced: 0 comps before, 22 comps and a 4,600 median after.","review":{"status":"none"},"links":[{"url":"https://github.com/mcinnisdev/recentcomp/commit/1255c61","label":"Commit 1255c61"}]},{"id":"search-guardrails","name":"Search guardrails and honest failures","area":"Search","state":"live","version":null,"shipped":"27 Aug","summary":"Brand-only searches are refused at intake and on the API; failed searches say what was found and rejected, and point to building the report manually.","detail":"A brand alone matched every model the brand ever made (one LAC report: 134 Rolexes of every era, 2,559 on a watch worth about 76,000). Intake and POST /api/reports now require a model or reference. Failure copy reads, for example, 21 candidates found, none usable, 21 rejected by the photo/details match, and the primary action is to build the report manually with the note that every comp added resurfaces on future searches. The comp table shows the analyst's own photos above it; handbag intake recommends a photo.","review":{"status":"none"},"links":[{"url":"https://github.com/mcinnisdev/recentcomp/commit/1255c61","label":"Commit 1255c61"}]},{"id":"photo-first-intake","name":"Photo-first intake","area":"Search","state":"live","version":null,"shipped":"28 Aug","summary":"A vague loan request - photos and a brand name - becomes a runnable search: the asset is identified from the pictures, the fields fill in with stated confidence and alternates, the analyst confirms, and every returned comp is photo-checked against the same pictures.","detail":"Benchmarked on all 31 of LAC internal applicant photos with only their brand hint: correct brand and model family on 31 of 31; exact reference whenever legible (116500LN read off the warranty card); identified the asset on all three reports where the analyst typed only a brand, including the Daytona Rainbow behind the August 52k-vs-476k miss. References are never invented - sibling references appear as tap-to-swap alternates.","review":{"status":"none"},"links":[{"url":"https://github.com/mcinnisdev/recentcomp/commit/57aa91e","label":"Commit 57aa91e"}]},{"id":"on-demand-summaries","name":"On-demand bullet summaries","area":"Reports","state":"live","version":null,"shipped":"28 Aug","summary":"Reports complete without an executive summary; a Generate summary button produces 4-7 one-sentence bullets on request. LAC found the auto prose long and mostly unread. Reports are about 20 seconds faster to ready.","detail":null,"review":{"status":"none"},"links":[{"url":"https://github.com/mcinnisdev/recentcomp/commit/d7af70f","label":"Commit d7af70f"}]},{"id":"query-ladder","name":"Query ladder","area":"Search","state":"live","version":null,"shipped":"28 Aug","summary":"Every search runs as a ladder of variants, narrowest first, broadening automatically when a rung returns fewer than 5 usable comps - per-class templates take the phrase-it-exactly-right burden off the analyst. The canonicalizer names the model line behind a recognized reference (126603 -> Sea-Dweller) for the broadened rung. Every rung is logged in the report trail.","detail":null,"review":{"status":"none"},"links":[{"url":"https://github.com/mcinnisdev/recentcomp/commit/289d0e4","label":"Commit 289d0e4"},{"url":"https://github.com/mcinnisdev/valuations-engine/issues/55","label":"Engine #55: batched queries[]"}]},{"id":"simplified-intake","name":"Simplified intake","area":"Search","state":"live","version":null,"shipped":"28 Aug","summary":"The form reads the way a vague loan request arrives: category, a describe-the-asset box, photos. Exact brand/reference/serial fields collapse into an optional details section that opens automatically when prefilled by chips, photo identification, or the analyst. Notes-only submissions run through the canonicalizer instead of the token heuristic.","detail":"Verified end-to-end: raw applicant text (two tone rolex sea dweller, black dial, complete box and papers) parsed to Rolex Sea-Dweller and returned 33 comps.","review":{"status":"none"},"links":[{"url":"https://github.com/mcinnisdev/recentcomp/commit/a898faa","label":"Commit a898faa"}]},{"id":"review-then-generate","name":"Review-then-generate","area":"Reports","state":"live","version":null,"shipped":"08 Sep","summary":"Searches land on a candidate review screen before any valuation exists: the analyst unticks anything that is not the asset (badges show photo match, variant, realized/ask, unjudged), sees a live median preview, and generates the report only from what they keep. Adjust-search-and-rerun works from the same screen and from failed reports, on the same report id.","detail":"Workflow change requested by LAC principal review 08 Sep. New selecting report status; deselected candidates become removed comps so the audit trail records the choice.","review":{"status":"none"},"links":[{"url":"https://github.com/mcinnisdev/recentcomp/commit/3822f34","label":"Commit 3822f34"}]}],"roadmap":{"doing":[{"note":"LAC's top-ranked missing sources for cars and handbags (engine #22, #21)","title":"Cars & Bids and Fashionphile/Rebag adapters"},{"note":"Alternate route after the Marketplace Insights denial — converts the largest ask-only source into realized prints (engine #28)","title":"eBay sold-price capture"},{"note":"Tenant-archive comps currently sort in the Other tier, below external sources (engine #32)","title":"Rank LAC's own comps first"}],"planned":[{"note":"Heritage and Doyle appear in six of LAC's asset classes; Classic.com is gated on cross-source dedup (engine #18, #19, #20, #23, #4)","title":"Heritage, Doyle, Chrono24, Classic.com adapters"},{"note":"Engine /v1/extract (#31) plus a small intake change (recentcomp#23)","title":"Paste-a-URL comp entry"},{"note":"maxAgeMonths is already supported by the engine (recentcomp#16)","title":"Recency selector on the search form"},{"note":"First new asset class — its top-ranked sources are already integrated (engine #25, recentcomp#17)","title":"Signed jewelry category"}],"considering":[{"note":"Rollout order pending LAC volume data","title":"Fine art and clothing/accessories classes"},{"note":"Commodity quote rather than comps (engine #26)","title":"Gold/precious metals via live spot price"},{"note":"Blocked on LAC access (engine #27)","title":"Certified diamonds via RapNet"},{"note":"Org-wide list visibility covers discovery today; email later if LAC asks","title":"Review-workflow notifications"}]},"updates":[{"timestamp":"1w ago","at":"2026-09-08T17:02:30.836Z","statusChange":null,"title":"LAC principal review (Rich): workflow reshaped around human comp selection","body":"Rich reviewed the new features live. Photo identification impressed; three gaps drove immediate work. Shipped same day: a review-then-generate step (candidates surfaced for selection before any valuation exists), adjust-search-and-rerun on the same report, visible sort affordances on every column, and a query-hash fix. Filed to the engine: stricter watch matching (a 16610 search surfaced 16610LV Kermits and modern larger cases, issue 59), run-to-run consistency (photo-keyed caching defeats cache hits across reports, issue 60), and the requested WatchCharts market-value benchmark (issue 61, gated on API access).","tags":["lac","feedback","workflow"],"links":[{"url":"https://github.com/mcinnisdev/recentcomp/commit/3822f34","label":"Commit 3822f34"},{"url":"https://github.com/mcinnisdev/valuations-engine/issues/59","label":"Engine #59"},{"url":"https://github.com/mcinnisdev/valuations-engine/issues/60","label":"Engine #60"},{"url":"https://github.com/mcinnisdev/valuations-engine/issues/61","label":"Engine #61"}]},{"timestamp":"3w ago","at":"2026-08-27T15:08:20.168Z","statusChange":null,"title":"LAC August queries replayed: 5 of 7 failures now resolve, and the two brand-only searches are refused","body":"Replayed all 15 August inputs with the original reference photos re-attached, against the engine after its #33 to #38 fixes plus query normalization on the recentcomp side. Hermès Kelly 32: 0 to 22 comps. Louboutin Cabata Mini: 0 to 19 comps, 3 realized. Pochette Accessoires: 18 to 37 comps with 14 realized TheRealReal sales. Rolex 126603: 5 to 26 comps, 7 exact photo matches. Rolex 116000: 2 to 176 realized sales. The two brand-only searches, one of which produced the 134-Rolex, $52,559 report, are now refused at intake. Still open: Chrome Hearts ring finds nothing (jewelry is not a category yet), and handbag photo tiers came back all variant with no exact matches on three runs, raised with the engine. The comp table now sinks unjudged comps and orders exact photo matches ahead of variants, with the engine note shown.","tags":["lac","engine","quality"],"links":[{"url":"https://github.com/mcinnisdev/recentcomp/commit/bc8583d","label":"Commit bc8583d"}]},{"timestamp":"3w ago","at":"2026-08-27T13:31:08.418Z","statusChange":null,"title":"LAC's August results reviewed: 7 of 18 reports failed, and the causes are now itemized","body":"Root causes from the persisted report trails: TheRealReal never ran (missing Scrapfly key, now set), Sotheby's returns no hits on any sale, Christie's crawls one sale, long model strings defeat token matching, the match filter fails open under load (one report valued a watch at $52,559 against a reference-based $476,000), and the photo filter passed every colorway of a Fendi bag because it was told not to reject on color. Six engine issues filed (#33 to #38). On the recentcomp side, query normalization, brand-only refusal, honest failure copy and paste-a-URL comp entry shipped in commit 1255c61. LAC's failed Hermès Kelly query now returns 22 comps.","tags":["lac","engine","reliability"],"links":[{"url":"https://github.com/mcinnisdev/recentcomp/commit/1255c61","label":"Commit 1255c61"},{"url":"https://github.com/mcinnisdev/valuations-engine/issues/33","label":"Engine #33 tiered vision"},{"url":"https://github.com/mcinnisdev/valuations-engine/issues/36","label":"Engine #36 blocked sources"},{"url":"https://github.com/mcinnisdev/valuations-engine/issues/38","label":"Engine #38 filter passthrough"}]},{"timestamp":"10 Aug","at":"2026-08-10T12:00:00.000Z","statusChange":null,"title":"Template reports for thin markets","body":"A zero-comp engine result now offers a manual template report instead of a dead end. Manually added comps join the workspace history, so documenting a thin-market asset seeds every future search for similar pieces.","tags":[],"links":[]},{"timestamp":"09 Aug","at":"2026-08-09T12:00:00.000Z","statusChange":null,"title":"Shared workspace shipped","body":"Org model, org-wide report visibility, roles with multiple Owners, invite links, the review pipeline from draft to approved with locking and reopen, Owner-editable policy enforced at action time, and an append-only audit ledger with CSV export. Built from Nick's claude.ai/design workspace design.","tags":[],"links":[]},{"timestamp":"07 Jul","at":"2026-07-07T12:00:00.000Z","statusChange":null,"title":"LAC hierarchy live end to end","body":"The engine shipped saleKind and per-class source ranks; reports now sort realized first, then by LAC's rankings, with realized/ask chips and a tier divider. Verified comps shipped the same day: reviewer-endorsed comps enter a private archive and resurface on future matching reports.","tags":[],"links":[]},{"timestamp":"16 Jun","at":"2026-06-16T12:00:00.000Z","statusChange":null,"title":"Vision filter compares listing photos to the customer's own photos","body":"Photos uploaded at intake become reference images; the engine's Haiku vision pass rejects comps whose photos show a different asset. Intake upload was moved ahead of pipeline start so first runs benefit.","tags":[],"links":[]},{"timestamp":"27 May","at":"2026-05-27T12:00:00.000Z","statusChange":null,"title":"LAC stakeholder demo set the lender-policy direction","body":"LAC's chief valuations officer asked for LTV off the conservative low and comp images in reports. Both shipped in the following weeks, along with the sold-as-new exclusion for their reseller policy.","tags":[],"links":[]},{"timestamp":"25 May","at":"2026-05-25T12:00:00.000Z","statusChange":null,"title":"AI match filter live with disclosed rejections","body":"Haiku judges every candidate comp; rejected comps appear under the comp table with one-line reasons. TheRealReal and Hagerty adapters shipped the same day via Scrapfly. Per-comp confidence surfaced in the UI.","tags":[],"links":[]},{"timestamp":"14 May","at":"2026-05-14T12:00:00.000Z","statusChange":null,"title":"Initial product shipped","body":"Report pipeline, Postgres schema, Supabase auth, live-progress analyzing screen, reviewer edit affordances, photo attachments, PDF export via Browserless, and the marketing landing — phases A through D in one push.","tags":[],"links":[]}],"feedback":[]}