Rentv 2026

repo: ~/Projects/rentv-2026 · 1254 commits · 0 in last 24h, 0 in last 7d ·

Search the build

1254 commits indexed

  1. f19f6ee4 2026-08-25 initial scaffold + creds-safe fetch guard (gitify per standing rule)
  2. 437aa93c 2026-08-15 TK-10569: port /api/advertise + /api/advertise-inquiries from rentv to rentv-2026
  3. 5a59077e 2026-08-15 rentv: per-IP write-form rate limits on /api/subscribe + /api/ad/reserve (TK-10559)
  4. f2bf7551 2026-08-15 rentv: P1+P2+P3 public-launch hardening (TK-10564/10575, Steve-approved 2026-08-14)
  5. d5a4141e 2026-08-15 pr-intelligence: add CAN-SPAM List-Unsubscribe header + address footer to buildMime (TK-10578)
  6. a415d241 2026-08-10 chore: v0.24.1 (session close — ad-slots correctness fixes + coverage)
  7. fc7ec801 2026-08-10 fix(adslots): 5 ad-system.cjs correctness fixes + regression guards (TK-10364)
  8. f709ec78 2026-08-10 test(adslots): +124 coverage (buildInventory sources/dedup, reserve soft-hold lifecycle, exact price ladder, admin gating) + replace a pricing tautology with live-value asserts
  9. 423cfa3d 2026-08-08 test(adslots): cover ad-system admin write paths (video/placement/site-template)
  10. 9af4fe93 2026-08-08 chore: sync package-lock version to 0.24.0 (trailing the v0.24.0 bump)
  11. adcaafca 2026-08-08 test(adslots): rate-card data contract + rate-card/slot endpoint coverage
  12. e15f5398 2026-08-08 test(adslots): cover ad-system + fix filtered inventory summary mismatch
  13. 4295511a 2026-08-07 chore: v0.24.0 (session close — View-all toggle wired + preview synced)
  14. d71f0c89 2026-08-07 fix(login): resolve /api/login against location.origin so Basic-Auth creds-in-URL access can't taint the fetch base
  15. ee2f9802 2026-08-07 fix: inject template-toggle.js (View-all compare) site-wide — was orphaned, only /toggle.js (front/backend switcher) was wired
  16. ed7346a7 2026-08-07 chore: gitignore node_modules symlink (was leaking as untracked) + package-lock
  17. a6b6120d 2026-08-07 5x sweep 2: 'Make this the site' works in preview mode (PUBLIC/OPEN), stays adminOnly on prod
  18. fb82cb6c 2026-08-07 5x sweep 1: add favicon.ico + favicon.svg (fixes /favicon.ico 404 site-wide)
  19. 3a9785bd 2026-08-07 selector: bake rank + why-it-wins + competitor into each full-screen preview modal
  20. cfd849be 2026-08-07 selector: add Classic (original) as 6th option + rank all 6 + why-it-wins + CRE competitor landscape
  21. a28939c1 2026-08-07 chore: v0.23.0 (session close — admin View all template-compare toggle)
  22. 72de4de2 2026-08-07 TK-10350: render-proof screenshots for the 5 template variants (A/C/D/E)
  23. 93172711 2026-08-07 TK-10350: verify 5 distinct template variants + wire template D video cards into ad inventory (all 123 videos sponsorable)
  24. 1add61c9 2026-08-07 docs: surgical deploy handoff for claude-rentv-max (toggle + templates + ad-slots)
  25. cf5c27a7 2026-08-07 TK-10105: fix heygen 'Not logged in' auth wiring in buildloop
  26. 3e325c5f 2026-08-07 template-toggle: add admin 'View all — compare' overlay (all 6 templates live side-by-side)
  27. e6e748c4 2026-08-07 rentv 2026: admin front-end template toggle
  28. 23094df1 2026-08-07 rentv: re-gate site behind un/pw (reverse 2026-08-06 public launch)
  29. 089da29b 2026-08-07 RENTV 2026: element-numbering overlay (all templates) + demo sold-sponsorship creatives
  30. 827eb166 2026-08-07 RENTV 2026: 5-template selector + ad-slots-for-sale system (all videos as sponsorable inventory)
  31. 5b0ae439 2026-08-07 auto-data-snapshot: 2026-08-07T10:41:58 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  32. 7061d199 2026-08-07 auto-data-snapshot: 2026-08-07T10:09:04 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  33. 10285af7 2026-08-07 auto-data-snapshot: 2026-08-07T09:37:33 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  34. 3e204fc8 2026-08-07 chore: v0.21.5 → v0.22.0 (session close — All Star Group section + 5-theme picker)
  35. 4bfeb75c 2026-08-07 allstar: default theme → Capital (Blackstone dark+gold) for first load
  36. 0521e012 2026-08-07 auto-data-snapshot: 2026-08-07T09:05:06 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  37. 0a9bf943 2026-08-07 allstar: 5 firm-inspired themes with distinct UI per theme (toggle + persist)
  38. 6b98f166 2026-08-07 auto-data-snapshot: 2026-08-07T08:32:43 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  39. da2aa3f6 2026-08-07 Add All Star Group section to RENTV backend — RENTV-style rebuild, 2026
  40. f3f859ab 2026-08-07 auto-data-snapshot: 2026-08-07T08:00:20 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  41. 557f42ea 2026-08-07 auto-data-snapshot: 2026-08-07T07:29:27 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  42. 4cf0c4ad 2026-08-07 consulting portal: sync refreshed CRCP growth page + daynight readability fix from consulting-rentv-com@55f002c (TK-10299/TK-10319)
  43. 8e9b0dd5 2026-08-07 auto-data-snapshot: 2026-08-07T06:58:19 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  44. 5908c9c8 2026-08-07 auto-data-snapshot: 2026-08-07T06:27:13 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  45. 7200a545 2026-08-07 auto-data-snapshot: 2026-08-07T05:56:28 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  46. 8c92dd65 2026-08-07 auto-data-snapshot: 2026-08-07T05:25:40 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  47. 1a4a5cda 2026-08-07 auto-data-snapshot: 2026-08-07T04:54:46 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  48. 3039ae02 2026-08-07 auto-data-snapshot: 2026-08-07T04:23:46 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  49. 51ae0ace 2026-08-07 auto-data-snapshot: 2026-08-07T03:53:01 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  50. 7c16d0b4 2026-08-07 auto-data-snapshot: 2026-08-07T03:22:15 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  51. a1de2be7 2026-08-07 auto-data-snapshot: 2026-08-07T02:51:26 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  52. 1df4a642 2026-08-07 auto-data-snapshot: 2026-08-07T02:20:18 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  53. f12c8ab2 2026-08-07 auto-data-snapshot: 2026-08-07T01:49:10 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  54. 1af72918 2026-08-07 auto-data-snapshot: 2026-08-07T01:18:25 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  55. 96d1ede2 2026-08-07 auto-data-snapshot: 2026-08-07T00:47:33 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  56. ac9af4fd 2026-08-07 auto-data-snapshot: 2026-08-07T00:16:37 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  57. eb01e95d 2026-08-06 auto-data-snapshot: 2026-08-06T23:45:50 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  58. 55fdc7ec 2026-08-06 auto-data-snapshot: 2026-08-06T23:15:02 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  59. 735b79ac 2026-08-06 auto-data-snapshot: 2026-08-06T22:44:16 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  60. 026b9613 2026-08-06 auto-data-snapshot: 2026-08-06T22:13:22 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  61. a7dacdd9 2026-08-06 auto-data-snapshot: 2026-08-06T21:42:38 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  62. 30954cd4 2026-08-06 auto-data-snapshot: 2026-08-06T21:11:53 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  63. 66c560a5 2026-08-06 auto-data-snapshot: 2026-08-06T20:41:05 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  64. 8e4a3989 2026-08-06 auto-data-snapshot: 2026-08-06T20:10:15 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  65. 4865af4c 2026-08-06 auto-data-snapshot: 2026-08-06T19:39:21 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  66. d2db9fcc 2026-08-06 auto-data-snapshot: 2026-08-06T19:08:34 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  67. db9cc1f3 2026-08-06 auto-data-snapshot: 2026-08-06T18:37:41 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  68. 59a60b88 2026-08-06 fix(archive): dedup parse-article's STALE parser fork → import the hardened deal-parse (single source of truth). parse-article.mjs kept its own OLD copies of parseAmount/txnOf/typeOf/classify/parseSize/summarize — the news-archive pipeline (pull-archive→parseArticle) was silently running WITHOUT every deal-parse fix. Proven live-divergent: $153/sf→153 (now null), $5 billionaire→$5B (now 5), 104k sf→lost (now 104000), summarize '$1. 625' (now '$1.625'). Deleted the 6 duplicates, import+re-export from deal-parse. +5 tests (parseHeadline/parseDate/bodyText/parseArticle + a dedup-lock), 70/0.
  69. 01984a25 2026-08-06 auto-data-snapshot: 2026-08-06T18:06:44 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  70. f2f651fd 2026-08-06 auto-data-snapshot: 2026-08-06T17:35:56 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  71. 47c3761d 2026-08-06 polish(services): trade chips — specialty trades lead, General buckets trail muted
  72. 47cb4fdb 2026-08-06 feat(services): contractor trade filter (CSLB class) for Construction
  73. 9911142f 2026-08-06 auto-data-snapshot: 2026-08-06T17:04:50 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  74. 04680821 2026-08-06 harden(brief): stale-lock TTL — a hard-killed run (SIGKILL/OOM) that leaves the brief-gen lock behind can't silently disable brief refresh forever; a run >15min old (≫ any real run) is stolen with a WARN, else a live concurrent run holds it → skip. Closes the one lock caveat Cody raised on the concurrent-run fix.
  75. 3e79a22d 2026-08-06 harden(agents review): spend-safety + robustness pass on this session's code (2 read-only reviewers, findings verified before applying). gen-deal-brief: (1) ledger write wrapped so a post-TTS ENOSPC surfaces LOUD instead of silently under-counting the cap; (2) --force now bypasses dedupe ONLY, cap needs explicit --force-overcap; (3) lockfile prevents two overlapping runs double-spending; (4) DRY_RUN=0 no longer treated as dry. parseAmount: (?![a-z]) kills the '$5 billionaire'→$5B fabrication (0/30 corpus regressions; now feeds paid TTS). brief.html: scheme-guard t.href (no javascript: URLs). +1 test, 65/0.
  76. 9c83657e 2026-08-06 fix(firm): profile KPIs drill deeper (every-datum-hrefs rule) — 'Largest deal' → that deal's page, 'Top asset class' → /sector?type=. KPIs with no clean deeper target (Total volume/Deals/Markets) left unlinked rather than forced. Verified targets valid (/sector accepts ?type=), profile serves 200.
  77. 1a6901b5 2026-08-06 feat(brief): hard monthly spend cap (BRIEF_MONTHLY_CAP, default 40 ≈ $6/mo) — a dollar backstop beyond the top-deal-change dedupe. Even if the top deal flaps, spend is bounded; ledger in rsync-excluded public/audio (prod-owned, survives deploys). Verified: cap=0 skips before any TTS call (no mp3, no spend).
  78. 35d978b2 2026-08-06 auto-data-snapshot: 2026-08-06T16:33:58 (8 data files) — .deploy.conf data/deals-registry.json data/deals.json data/markets.json data/news.json
  79. ab40d2bf 2026-08-06 feat(brief): auto-refresh the Boomer 'Deal of the Day' — pull-deals chains generateBrief() after writing deals.json (dedupe-guarded → spends ~$0.15 ONLY when the top deal changes; NON-FATAL so a TTS error never breaks the crawl). Keeps /brief current on prod via the existing pull-deals cron — no crontab edit. gen-deal-brief refactored to export generateBrief() + run standalone only when invoked directly. 64/0.
  80. 6574a4ff 2026-08-06 feat(services): Property Management now registry-backed (162 DRE-licensed PM firms)
  81. fd1945d5 2026-08-06 nav: surface /firm (💼 Active Dealmakers) in the site-wide Explore drawer (rentv-nav.js) — the live Broker/Firm feature was only in its own page's drawer, undiscoverable elsewhere. One-line additive edit next to the deal-data links. Discoverability for a shipped feature.
  82. 48878dbe 2026-08-06 feat(brief): Boomer 'Deal of the Day' audio brief (REPOINT feature #3, Steve-approved) — gen-deal-brief.mjs composes a factual script from the top deal (reuses acquirer) + ElevenLabs TTS in Boomer's voice (czUPGx5phxE6qpQ46nRS), with a top-deal-change spend guard (~$0.15/day not per-cron) + DRY_RUN; brief.html gains a graceful audio player. ALSO fixes a real summarize() bug the brief surfaced: the sentence splitter broke decimals ('$1.625'→'$1. 625') on every deal card — now splits only on a terminator+space+capital. +1 test, 64/0. Generated 1 brief ($0.147, local).
  83. 21845887 2026-08-06 auto-data-snapshot: 2026-08-06T16:03:07 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  84. 8e0541c9 2026-08-06 feat(services): CSV export + per-view SEO/JSON-LD + provider detail pages
  85. 6190cac5 2026-08-06 feat(deals): parseAcquirer recall 19→23/30 — handle development announcements (dev verbs: starts work on / breaks ground / underway → GO Industrial, Meta Housing) + passive voice ('Acquired by <Firm>' / 'sold to <Firm>' → WareSpace, Blackstone). Still zero asset-as-firm false positives (asset/place-fronted guard unchanged). +5 test cases, 63/0.
  86. e393d66a 2026-08-06 feat(services): DTD-verdict guardrails on the Featured layer (keep-with-guardrails)
  87. b63cb339 2026-08-06 auto-data-snapshot: 2026-08-06T15:32:11 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  88. 8d3f54a3 2026-08-06 feat(firm): dedicated firm PROFILE view on /firm?name= — header + KPI strip (total volume, deals, markets, top asset class, largest deal) + that firm's deals as full cards, with a back link. This completes the 'Broker/Firm profile page' vision (REPOINT #1); index leaderboard unchanged. Client-side, reuses build() data, verified computation + both modes 200.
  89. 04e22ebe 2026-08-06 consulting portal: revert stray theme-aware --dim/--panel indirection (forced-black bg already handles readability)
  90. 8d29e427 2026-08-06 feat(firm): /firm 'Active Dealmakers' page — deal flow grouped by acquiring firm (ranked by volume/count, expandable to each firm's deals, deep-linkable ?name=), + acquirer link on deal cards → /firm (href-deeper rule). REPOINT feature #1 visible layer, built on parseAcquirer/acquirer. Pure client-side off /api/deals (zero server.js edits — express.static serves it at /firm); null-acquirer deals honestly excluded + disclosed, never bucketed as a phantom firm.
  91. 9aa5412f 2026-08-06 feat(deals): parseAcquirer() extracts the leading firm from a deal title + persist as 'acquirer' — the data substrate for the Broker/Firm profile pages (REPOINT feature #1, Steve-approved). HIGH precision: 19/30 clean firms on the live corpus, 0 asset-as-firm false positives (asset-fronted/place-fronted/passive → honest-null). +2 tests, 63/0. Field populates on next pull-deals cron run.
  92. e8a2e401 2026-08-06 chore(services): localhost-only ?reset=outreach to clear the outreach basket
  93. 44ff063a 2026-08-06 auto-data-snapshot: 2026-08-06T15:00:51 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  94. 0007cc49 2026-08-06 auto-data-snapshot: 2026-08-06T14:29:57 (8 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  95. ef48e64f 2026-08-06 fix(deals): summarize() collapses whitespace runs — the sentence class absorbed leading spaces so join yielded 'end. Start' (2-3 spaces) on 30% of the LIVE corpus's customer-facing deal-card summaries. \s+→' ' normalizes (also flattens tab/newline from fetched bodies). Updated 2 tests that pinned the artifact + added a source-multispace test. 61/0
  96. 4c3bc491 2026-08-06 feat(services): per-firm pitch note rides into the /social letter
  97. 980b5351 2026-08-06 chore: remove dead looksPlace helper + vN patch bump (session close) — parseAmount \s* + sanitizeLocation state-name map hardening
  98. d0acfe5e 2026-08-06 auto-data-snapshot: 2026-08-06T13:58:45 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  99. 971e9e4b 2026-08-06 harden(deals): parseAmount \s* binds magnitude across a typographic double space ($52 million→$52M, was $52); document range + billionaire as zero-occurrence follow-ons. Pure superset — real corpus uses ≤1 space, no existing input changes. +1 test, 60/0
  100. 206b9954 2026-08-06 Gate E (TK-10076): /services degraded-state banner on realestate outage (was silent 'No providers found') + zero-row services canary (4x/day → CNCP)
  101. a3ae8ad5 2026-08-06 auto-data-snapshot: 2026-08-06T13:27:53 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  102. 0250fee3 2026-08-06 feat(services): 'Solicit all visible' bulk action (admin)
  103. 17716ea2 2026-08-06 harden(location): Cody gate — normalize whitespace before the state-name lookup + add a bare 'dc' key so 'D.C.' and double-spaced 'New Mexico' resolve instead of silently dropping to null
  104. 33804967 2026-08-06 auto-data-snapshot: 2026-08-06T12:57:07 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  105. 3b60464d 2026-08-06 fix(location): sanitizeLocation maps a full state NAME to its code instead of blind slice(0,2) — a model returning 'Arizona' was truncated to 'AR' (Arkansas!), 'Nevada'→'NE' (Nebraska!), 'Texas'→'TE' (dropped), silently mis-attributing RENTV's core states. Valid 2-letter codes unchanged; non-US dropped. +6 tests, 59/0
  106. d3fe7c22 2026-08-06 feat(services): admin-only 'Solicit' → pipes firm into /social outreach generator
  107. 427a4cf2 2026-08-06 feat(services): rank big multi-location firms first (solicitation view) + add Arizona
  108. b2b4b8c8 2026-08-06 harden(llm-extract): Cody gate — anchor num() at the LEADING number + a >=100k 'already a full dollar value' guard, fixing a CATASTROPHE my first pass introduced ('51800000 (51.8M)' concatenated digit runs then scaled → $5e15). Also covers mln/bn abbrevs; anchoring rejects 'lot 5b'. 17/17 verified
  109. 869dd436 2026-08-06 auto-data-snapshot: 2026-08-06T12:25:51 (1 data files) — package-lock.json
  110. 1683930c 2026-08-06 chore: v0.21.4 (session close — /consulting black bg + daynight-skip cleanup)
  111. 4b1f148b 2026-08-06 harden(llm-extract): magnitude-aware num() — if the model returns '51.8 million'/'$1.2 billion'/'$51.8M'/'985k' instead of the requested integer, scale it (was signed as 52/1/52/985 by the digits-only strip). Compliant integers unchanged. Defensive: no verified live occurrence (archive stores no amounts) but the num() mangling is a real reproducible code weakness feeding customer-facing amounts
  112. e61ee419 2026-08-06 chore: dynamic featured-video + latest-article hero + image-pipeline fix, v0.21.3 (session close)
  113. 0121172a 2026-08-06 fix(deploy-frontpage): zsh array for ssh opts (plain string errored 'connecttimeout extra arguments' on first real use)
  114. 78a39e80 2026-08-06 PR-intel: add found_role_corroborated status (DTD verdict C) — role-backed search hit distinct from URL-identity-confirmed; same-run promotion; score 60; UI badge + filter + migration 011
  115. 8d4a638e 2026-08-06 feat(services): guarantee >=1 vendor per category — curated Featured layer
  116. 71ec8d49 2026-08-06 fix(auth): bridge server-admin session into /api/pr so deals.html deal-notes work
  117. f8daa54d 2026-08-06 Fix /consulting/slideshow dead 403: INTERNAL_STATIC guard now redirects anon browser hits to /login (mirrors adminOnly)
  118. 0960554d 2026-08-06 consulting portal: remove dead theme-aware CSS (superseded by forced-black bg)
  119. b1faccd8 2026-08-06 harden(feeds): Cody sweep — xmlEsc the channel-level <link> in feed.xml + deals.xml too (their item links were escaped but the Host-derived channel link wasn't — the same gap just closed in sitemap.xml). feed.json is safe (JSON.stringify). TDZ non-issue: handlers run post-load
  120. 9cf5e94e 2026-08-06 consulting: skip daynight injection on /consulting (DTD verdict A — kill the dead toggle button on the dark-locked deliverable; scoped to /consulting, admin/versions/desk keep the toggle)
  121. 3cc78886 2026-08-06 deploy.sh: reload procs separately + retrying health check (auto-deploy hook)
  122. 1f840675 2026-08-06 fix(sitemap): xmlEsc the <loc> (sibling-drift — feed.xml/deals.xml already escape) so the sitemap stays valid XML if a slug carries an '&' and the client-controlled Host header can't inject into it. Defensive: current slugs/ids are all clean
  123. 55129020 2026-08-06 nav(services): add CRE Services to shared masthead drawer (rentv-nav.js) + homepage nav row
  124. bc6ded37 2026-08-06 feat(services): metro switcher (LA/OC/SD/IE/Ventura) + fleet nav link
  125. 03e43133 2026-08-06 harden(content-studio): Cody gate — also drop 'reports? that' + 'covered by' from the attribution scrub (they mangled 'annual report that…' / 'parking covered by a canopy'), and clean a connective left DANGLING by the outlet strip only when it precedes punctuation (so 'per unit'/'covered by a canopy' stay intact). Verified 8/9; rare mid-clause dangling-via residual documented
  126. ac3c0985 2026-08-06 chore: v0.21.2 (session close — nav: Regions + Market Snapshot to right hamburger)
  127. f35eeeac 2026-08-06 auto-data-snapshot: 2026-08-06T11:23:39 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  128. 5d632c19 2026-08-06 add /consulting black-bg post-deploy verifier
  129. ceb68708 2026-08-06 consulting portal: pin bright accents unconditionally so text stands out on the forced-black bg (day + night)
  130. d72a1293 2026-08-06 consulting portal: make gold + semantic accents theme-aware so text is readable in day mode
  131. 0e0b17f3 2026-08-06 consulting portal: force permanent black background (override daynight day-mode washout)
  132. f57a571a 2026-08-06 Move Regions + Market Snapshot into the right hamburger (Sections) drawer
  133. 95adcfbf 2026-08-06 fix(content-studio): stop the attribution scrub from deleting bare 'per'/'via' — they mangled common CRE prepositions in generated copy ('$928k per unit'→'$928k unit', '6% per annum'→'annum', 'via a JV'→'a JV'). Real 'per <outlet>' attribution already neutralized by the outlet-name strip above
  134. d7e04f05 2026-08-06 feat(services): /services — Greater LA CRE services directory from real license registries
  135. a8efed7c 2026-08-06 PR-intel: soft-delete (Discard) for outreach drafts
  136. 46664637 2026-08-06 PR-intel CA gate: count a verified general_press_email as a contact
  137. 41fe6207 2026-08-06 rentv front page: feature Boomer's CRE Talk video (vimeo 1178561985) front & center above the news hero (static block, persists through wire re-render)
  138. 48c93722 2026-08-06 rentv front page: fold Market Snapshot stats strip into a collapsed-on-load module too (restores grid, not block, when expanded)
  139. faad4bab 2026-08-06 rentv front page: drawer groups collapse on load — click a title to expand (accordion, both hamburgers, covers async Regions group)
  140. cd119d7c 2026-08-06 fix(topic-hubs): word-boundary hub-keyword matching so a mid-word substring can't mis-file an article — 'bank' no longer tags Burbank as lenders-banks, 'mall'∉small, 'sale'∉wholesale, 'loan'∉Sloan. Leading-\b keeps intentional prefixes (refinanc→refinancing, bank→bankruptcy); space-padded ' ai ' stays a whole word
  141. 1280b163 2026-08-06 nav: add /deals-log (Deals Log) to map hamburger + Explore drawer (TK-10296)
  142. 30df559d 2026-08-06 PR CRM notes: attach to deals too (string entity_id) + deals.html wiring
  143. 81770f55 2026-08-06 rentv front page: split single left drawer into 2 corner hamburgers (Explore left / Sections right) — parity with masthead nav
  144. ce079996 2026-08-06 nav: surface /market-pulse (charts) in map hamburger + site-wide Explore drawer
  145. b83fd44b 2026-08-06 harden(news-dedup): Cody gate — word-boundary the single-char units (b/m/k) so '$985,000 Multifamily' / '$1,000 Monthly' don't capture the next word's first letter as a unit (the false 'm' had made '$1,000 monthly' sign identical to '$1 billion'). Full-word units unchanged
  146. 6b792cc9 2026-08-06 PR CRM: user-authored notes on any entity (org/broker/person/property/deal)
  147. 14e137d5 2026-08-06 fix(news-dedup): newsSig amount normalization strips commas + scales a no-unit raw-dollar amount to millions — '$985,000' was captured as '985' and signed as $985M, risking a false same-deal merge (hiding a distinct story). Mil/Bil/k cases unchanged
  148. f4d659e3 2026-08-06 auto-data-snapshot: 2026-08-06T10:21:57 (6 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/ticker.json
  149. 2837beed 2026-08-06 Split nav into TWO hamburgers: upper-left (Explore+Regions) + upper-right (Sections+Tools)
  150. ba9f632d 2026-08-06 logo: make it genuinely LIQUID — animated specular sweep + flowing tint + frosted glass
  151. 4600ddf8 2026-08-06 auto-data-snapshot: 2026-08-06T10:13:41 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  152. 39ea230c 2026-08-06 docs: mark multi-tenant RLS isolation DONE + operational notes (superuser migrations)
  153. 9d3b82a9 2026-08-06 Sitewide nav: collapse all tab strips into a hamburger + center the logo
  154. b14737eb 2026-08-06 fix(pr-intelligence): graceful 404 on people?id=<dead> — openPerson caught PR.api's throw on a non-existent person id (e.g. deep-link ?id=2539, which isn't among the 844 real people) and the detail drawer crashed unhandled. Now shows 'Person not found' instead of throwing.
  155. ea0ef6cd 2026-08-06 PR intel (b2 complete): tenant isolation via Postgres RLS
  156. 0044e5f8 2026-08-06 News map: collapse ALL controls into one LEFT hamburger; strip the busy top bar
  157. f47b2a57 2026-08-06 harden(dealdesk): Cody gate — coveredBy matches the needle segment as a WHOLE WORD (not substring), fixing the sf→transfers false-cover (27 titles) AND recovering legit short-firm coverage (CBRE→2 real matches) a length threshold would drop; <4-char floor drops state/initialism noise. (Verified Cody's >4-substring would've reintroduced hines∈machines)
  158. 8c370f63 2026-08-06 fix(dealdesk): coveredBy guards the matched SEGMENT length, not the full needle — a needle like 'SF, CA 94105' was matching on 2-char 'sf' (∈ tranSFers) and falsely marking deals already-covered, skipping good Deal Desk candidates
  159. cb99f313 2026-08-06 auto-save: 2026-08-06T09:51:16 (8 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  160. 5c689bb6 2026-08-06 News map: collapse nav into a hamburger + log all articles in sitemap
  161. 89d927a8 2026-08-06 chore: bump version to 0.21.1 (session close — cycles 16-40 deal-quality + admin-grid + Boomer voice, all deployed live)
  162. 108b7392 2026-08-06 PR intel (b2 partial): scope outreach reads by tenant + completion checklist
  163. f6e1cf9d 2026-08-06 PR intel (a): also delegate the no-trailing-slash /admin/pr-intelligence index so the empty shell isn't anon-accessible (data was already 401 either way)
  164. 88858d33 2026-08-06 Public polish: hide all admin nav links from public + SEO for /map
  165. a3ed3e45 2026-08-06 PR intel (a): clean client login — server delegates PR surface to the PR auth layer
  166. 12d0f414 2026-08-06 harden(boomer-voice): Cody gate — digit-anchor every forSpeech size rule so bare 'SF' (San Francisco) and 'MSF Capital' aren't read as 'square feet'; also consumes the 'sq. ft.' trailing dot. Legit sizes (1.27 msf/104k sf/538,000 sf) still normalize
  167. 1be2f46b 2026-08-06 PR intel: router-level capability gate (b1) — every /api/pr route self-protects
  168. 749cf6e9 2026-08-06 fix(boomer-voice): correct the stale comment naming the WRONG voice_id (EoZq → the current czUP clone) + normalize CRE shorthand for TTS ('1.27 msf'→'1.27 million square feet') + strip title trailing punctuation and fix empty-core double-space in the VO
  169. 27f2cd04 2026-08-06 News map: market-activity stats panel (count + deal volume + top metros)
  170. ca159afb 2026-08-06 PR intel: correspondence timeline on the contact drawer
  171. df653c37 2026-08-06 auto-save: 2026-08-06T09:20:28 (10 files) — .deploy.conf data/deals-registry.json data/deals.json data/markets.json data/news.json
  172. ee669c0a 2026-08-06 fix(logo): keep header brand centered — .rentv-logo's position:relative clobbered .brand's absolute centering
  173. f3b16410 2026-08-06 harden(deals): Cody gate — scope parseOccupancy 'pre-' to 'leased' only so '90% preoccupied' isn't read as occupancy (my pre- addition had extended the occup root); \bbuilt ships as-is (Cody's 'custom built' critique was a misfire — that IS the build year)
  174. f0ce5eb3 2026-08-06 PR intel: tenant-scope core entity reads + 2nd-tenant safety guard
  175. eacf3831 2026-08-06 News map: add Street/Satellite base-layer toggle (Esri World Imagery, $0 no key)
  176. 83953f44 2026-08-06 fix(deals): parseOccupancy counts 'N% pre-leased' (new-dev pre-leasing recall); parseYearBuilt uses \bbuilt so 'rebuilt in YYYY' (renovation year) isn't recorded as original construction year
  177. 0884d55a 2026-08-06 PR intel: Gmail correspondence sync + per-contact timeline
  178. 7ac0a3d5 2026-08-06 News map: add From/To year-range filter (2015-present)
  179. 10ac233d 2026-08-06 harden(deals/closings): Cody gate — word-boundary match for short firm codes so a party drill on 'CT'/'PRI' stops hitting substrings ('ct' in transaction = 1611 deals → 13 real); JLL/CBRE/Cushman drills unchanged. Cody's >=4 length guard rejected (would revert legit 3-char firms JLL/IPA)
  180. 0e3b12bc 2026-08-06 PR intel: self-service login + credentials pages (Gmail integration under the account)
  181. 5707ef5f 2026-08-06 Add 'News Map' to sitewide nav + resolve straggler cities to 98.9%
  182. 773a0d05 2026-08-06 fix(deals/closings-admin): party drill-downs filter by FIRM not the full 'Firm (agent, agent…)' string — clicking a broker chip now finds the firm's 449/806 deals instead of just itself (dead-drill → live). Display keeps full attribution; both twins fixed
  183. 46c1d8d2 2026-08-06 PR intel: CRM auth routes + capability middleware (login/logout/me/users)
  184. f8c4a1bd 2026-08-06 Complete geo-cache: all 563 corpus cities geocoded (538 located, 98% articles pinned)
  185. 75001ae6 2026-08-06 Grow geo-cache to 442 geocoded cities for /map (94%+ corpus coverage)
  186. 424c6244 2026-08-06 harden(deals): Cody gate — parseAmount handles bare $NM/$NB shorthand (was $150M→150) and skips more per-sf spellings (psf/sqft/per sq ft/per foot); latent gaps (live data uses spelled Mil/Bil) but real, guarded 'per <non-unit>' stays a total
  187. f1043d95 2026-08-06 PR intel: multi-tenant + RBAC auth foundation (template for more clients)
  188. aa6f0b5e 2026-08-06 Add public geolocated news map (/map): green<3mo / red older, 'news around you'
  189. 2765e5d0 2026-08-06 fix(deals): parseAmount skips per-unit/per-sf figures so a derived price isn't shown as the deal total ('$153/sf' office campus → no bogus $153; '$928k per unit' → not the price); walks all $ to find the real total
  190. 65458b63 2026-08-06 Refresh RENTV wordmark → 2026 liquid-glass logo from rentv.com brand
  191. 6033166b 2026-08-06 feat(closings-admin): sibling-drift fix — mirror the created date+time chip to closings.html (/api/closings joins registry first_seen; corpus rows use article date, date-only, no fabricated time). 100% card coverage
  192. 5de160cc 2026-08-06 harden(deals-admin): Cody gate — every card now shows a created chip (was 1.1%→100%): corpus rows use the article date as created_at (date-only, no fabricated time), feed deals keep the real first_seen timestamp; fmtDateTime local-parses date-only to avoid the UTC-midnight off-by-one
  193. 939f491c 2026-08-06 Build missing topic.html + topics.html — fix broken /topic/* and /topics routes (TK-10282)
  194. 0ece69ca 2026-08-06 auto-save: 2026-08-06T08:19:59 (6 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/ticker.json
  195. 97b029c8 2026-08-06 feat(deals-admin): show record created date+time on each deal card (Steve admin-card rule) — join registry first_seen as created_at in /api/deals-manage + '🕓 Added <date, time>' chip via toLocaleString
  196. ba45532d 2026-08-06 Add rentv.com region+category tab panel + /region/:slug landing pages (TK-10278)
  197. f6e330bb 2026-08-06 harden(deals): Cody gate — lower SF/unit plausibility threshold 100→50 so it stops false-dropping legit self-storage SF (~60-90 sf/unit) while still catching the <11 sf/unit residential body leaks
  198. 72561ee4 2026-08-06 fix(deals): drop an implausibly small SF (<100 sf/unit) next to a unit count — a body-leaked per-unit avg/amenity size, not the asset total ('406 units · 669 SF' → '406 units')
  199. fa57d846 2026-08-06 auto-save: 2026-08-06T07:49:47 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  200. 2930a208 2026-08-06 harden(deals): Cody gate — parseSize picks the EARLIEST-in-text sqft match, not by magnitude precedence, so a body 'N msf' comp can't override the title's real 'Nk sf' (branch-order bug: million scanned whole string first)
  201. 28068930 2026-08-06 fix(deals): magnitude-aware parseSize — parse '104k sf'/'1.27 msf' so a title's real size (104,000 SF) isn't skipped and replaced by a stray body 'N sf' leak (was rendering 104k-sf buildings as '26 SF')
  202. 9300439d 2026-08-06 harden(deals): Cody gate — add 5 summarize() tests (prod path, was untested), hoist the deal-parse import to the top import block, fix .js→.mjs comment typo
  203. 8f038295 2026-08-06 test(deals): extract pull-deals field parsers to testable lib/deal-parse.mjs + add 18-case regression suite locking in cycle 28-31 fixes (parseAddress/typeOf/txnOf/parseLocation); wire into npm test
  204. 9a19d50d 2026-08-06 auto-save: 2026-08-06T07:19:35 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  205. 530f1843 2026-08-06 harden(deals): Cody gate — anchor the new Development verbs (starts/begins work-on|construction, kicks-off construction) so 'kicks off marketing' / 'starts building a portfolio' aren't false Development; drop redundant 'gets underway' (bare 'underway' already matches)
  206. ca6bd634 2026-08-06 fix(deals): recognize 'starts work/construction', 'begins construction', 'kicks off' as Development in txnOf so a groundbreaking (GO Industrial Starts Work on...) isn't mislabeled Sale from a body land-acquisition leak
  207. 172ad546 2026-08-06 auto-save: 2026-08-06T06:49:23 (8 files) — data/.archive-crawl.lock data/deals-registry.json data/deals.json data/markets.json data/news.json
  208. 827944b1 2026-08-06 harden(deals): Cody gate — classify senior/independent/assisted-living facilities as Multifamily (fixes live 'Oxnard Independent Living → Retail' body-leak); senior anchored to housing/living so 'senior loan' stays correct
  209. 8e36e545 2026-08-06 fix(deals): demote building-form tower/high-rise below explicit use-types so a firm name ('Granite Towers') stops mislabeling a 229-unit multifamily asset as Office; add unit-count → Multifamily signal
  210. 71c6cae2 2026-08-06 auto-save: 2026-08-06T06:19:10 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  211. db6ec30d 2026-08-06 harden(deals): Cody gate — lookbehind so period-cut spares St./Mt./Ft. cities; narrow title-state to CA|AZ|NV|TX|WA so OR/ID/CO title tokens can't null a correct city
  212. d088ba4f 2026-08-06 fix(deals): two location misparses — trust explicit title state over body-leaked city (AZ deal no longer labeled CA) + stop 'in <City>. <Word>' swallowing a next-sentence word (Sunnyvale. Located → Sunnyvale/CA)
  213. b0c8d34c 2026-08-06 auto-save: 2026-08-06T05:48:58 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  214. 63833d1a 2026-08-06 fix(deals): word-boundary-anchor street suffixes so 'St' stops truncating names like 'North State St' → full 'North State Street'
  215. c9a19a7c 2026-08-06 fix(deals): word-boundary-anchor the bare 'at' address cue so it stops false-extracting addresses from format/that/flat
  216. 0a0f1273 2026-08-06 auto-save: 2026-08-06T05:18:46 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  217. 88db348a 2026-08-06 auto-save: 2026-08-06T04:48:33 (8 files) — data/.archive-crawl.lock data/deals-registry.json data/deals.json data/markets.json data/news.json
  218. afca6a93 2026-08-06 auto-save: 2026-08-06T04:18:20 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  219. 5bb00f14 2026-08-06 server: Cody gate — add buyer/seller/broker to DEALS_FIELDS. My deals-manage gap-fill now SHOWS the corpus-enriched parties, but the PUT/POST handlers iterate DEALS_FIELDS to save — which omitted parties (unlike CLOSE_FIELDS) — so an admin could see a wrong buyer but their correction was silently dropped. Now DEALS_FIELDS matches CLOSE_FIELDS; party corrections persist through /api/deals-manage POST+PUT
  220. d1a58814 2026-08-06 server: /api/deals-manage now gap-fills feed rows from the corpus, mirroring /api/closings (TK-10254). The closings admin surface got corpus gap-fill (buyer/seller/broker/summary/property_type/etc. — the deals-pull feed lacks the LLM-extracted fields) but its sibling deals-manage never did, so the same feed deal showed enriched in closings but blank parties/summary in deals-manage. Added the same fill-blanks-only enrich. Verified live: 23/30 feed rows now carry parties, 30/30 carry summary
  221. b901cbaf 2026-08-06 auto-save: 2026-08-06T03:48:10 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  222. 556ba576 2026-08-06 auto-save: 2026-08-06T03:18:00 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  223. e9b3e49f 2026-08-06 server: Cody gate — proper DRILL-DOWN faceting in /api/unified-search (two independent passes). My first fix counted facets ignoring BOTH build and type; the correct model is per-facet exclusion: by_build honors an active type filter (excludes its own build), by_type honors an active build filter (excludes its own) — so each chip's count matches what selecting it yields even with the other facet active. Verified live: build=rentv → by_build.rentv === total
  224. e8952c25 2026-08-06 server: fix broken facet counts in /api/unified-search (the /re-search admin search). The build+type filters ran BEFORE the facet-count computation, contradicting the code's own comment ('over the term/amount-filtered set, before build/type narrowing'). So selecting a build/type zeroed out the OTHER facet chips — you couldn't see counts for or switch to other builds/types. Moved the facet count above the build/type filters. Verified live: facets now stable across a build filter while results still narrow correctly
  225. ff82d81d 2026-08-06 auto-save: 2026-08-06T02:47:50 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  226. aae957c2 2026-08-06 pr/registry: give ncuaCreditUnions its own 'ncua' throttle key. It used 'fdic' (a copy-paste artifact from fdicBanks), which shared one 350ms rate-limit bucket across two INDEPENDENT gov hosts (api.fdic.gov vs mapping.ncua.gov), needlessly serializing them. Safe — no correctness depends on the shared throttle; separate keys just let the two independent APIs proceed independently
  227. b37f2aba 2026-08-06 auto-save: 2026-08-06T02:17:40 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  228. b2de6f40 2026-08-06 pr/edgar: Cody gate — cache company_tickers.json (1h TTL). The ~1MB static file (SEC publishes daily) was fetched + deserialized + O(n)-scanned on EVERY searchCompanies call; now fetched at most once per process-hour via getTickersData(). Removed dead-code cleanup exposed this as the real latency/SEC-fair-access cost. Verified: 3 searches in-window → 1 fetch; after TTL → refetch
  229. fd7ccfda 2026-08-06 pr/edgar: remove a guaranteed-failing wasted SEC request in searchCompanies. It fetched browse-edgar with output=atom (XML) via edgarFetch, whose r.json() can't parse XML → it ALWAYS threw and was swallowed, its result discarded (void j) — a doomed HTTP round-trip (latency + SEC rate-budget) before every real company_tickers.json search. Removed it + the dead unused 'url' var; error url now references the actual endpoint. Behavior-preserving (items always came from the tickers file)
  230. 9bdae722 2026-08-06 auto-save: 2026-08-06T01:47:30 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  231. e246fdef 2026-08-06 pr/adapters: Cody gate — decode &amp; LAST in stripTags (after the numeric passes). Decoding it first turned a double-encoded '&amp;#38;' (literal '&#38;') into '&#38;' then the numeric pass collapsed it to '&' — corrupting the intended literal. Moved to last so double-encoded refs survive; single-encoded &#38;/&amp; still decode. Verified
  232. 8d77a6f0 2026-08-06 pr/adapters: stripTags now decodes numeric character references (decimal + hex) + &hellip;/&reg;/&copy;/&trade;. It only decoded a handful of named entities, so scraped text (RSS titles, website extraction, press contacts across every adapter) leaked literals like 'Smith &#38; Co', 'Q3 &hellip;', 'Caf&#233;', 'A&#x26;B'. Generic num-ref decode with a control-char guard (never emit <32/127 from malformed feeds). Verified new decodes + existing entities unregressed + control chars neutralized
  233. 88150cf6 2026-08-06 auto-save: 2026-08-06T01:17:20 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  234. 0ada77c4 2026-08-06 auto-save: 2026-08-06T00:47:08 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  235. a1432cf2 2026-08-06 pr/jobs: revert cycle-18 verify-person same-run corroboration (Cody gate → HOLD-FOR-STEVE). The stale read defers LinkedIn corroboration to a future re-verify; fixing it to corroborate same-run is DEFENSIBLE (eventual state is identical — old code corroborates on the next run) but its SOLE effect touches a contested trust behavior: whether org+title site evidence should promote a search-LOCATED, surname-matched LinkedIn URL to found_corroborated at all (site evidence corroborates the ROLE, not the URL identity). That's a trust-model decision for Steve. Left a NOTE comment; drafted the question to pending-approval
  236. 5df9e1d2 2026-08-06 pr/jobs: fix stale-read in verify-person that deferred LinkedIn corroboration. p is loaded at the top; when a LinkedIn URL is located mid-handler it's written to the DB but the in-memory p wasn't updated, so the corroboration check (site-backed + found_uncorroborated → found_corroborated) read a stale null linkedin_url and skipped a person who should corroborate SAME run — deferring it to a future re-verify that may never run. Now updates local p after locate. Verified logic
  237. a57db1ed 2026-08-06 auto-save: 2026-08-06T00:16:57 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  238. eed7cbc8 2026-08-05 pr/jobs: Cody gate — dedup the convergence-halt admin task. Concurrent workers both hitting duplicate_controller, or repeated re-arm→halt cycles, would pile up stale OPEN 'Coverage research halted' tasks (no auto-close path). Now checks for an existing open halt task first (count-query idiom) → at most one at a time. Still best-effort try/catch
  239. 35976af2 2026-08-05 pr/jobs: surface anomalous convergence halts as an admin task (Cody cycle-16 follow-up). pending_stuck / duplicate_controller stops would otherwise halt the whole research pipeline SILENTLY (only convergence_state + audit, which nobody reads in real time). Now creates a pr_tasks item so an admin notices + can unstick. Normal terminal reasons (target_reached/sweep_dry/round_cap/budget_exhausted) don't alert. Best-effort try/catch so it never blocks the stop. Internal task write — safe, non-customer-facing
  240. d6396bdc 2026-08-05 auto-save: 2026-08-05T23:46:47 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  241. af6ccef9 2026-08-05 pr/jobs: Cody gate on convergence-controller — (1) singleton guard: the self-re-enqueue chain changes tick each hop so it doesn't dedupe on payload; a second chain (admin re-trigger over a waiting one) would poll in parallel → count convergence-controller jobs, stop('duplicate_controller') if >1. (2) pending correctness: the drain count included jobs in retry-backoff (run_after in the future) which aren't actually draining and could inflate the wait / false-trip pending_stuck → added AND run_after <= now(). Verified premises against schema (run_after NOT NULL, indexed)
  242. 7c58dbc9 2026-08-05 pr/jobs: cap convergence-controller re-ticks (runaway guard). The pending>0 branch re-enqueued the controller every 3min with tick+1 but never checked a max — a single job wedged in queued/running would re-tick FOREVER (none of the round/budget caps are reached while waiting), reintroducing exactly the unbounded-loop anti-pattern a prior Cody gate flagged. Added max_ticks (default 15 ≈ 45min) → stop('pending_stuck'). Verified bounded on a stuck job, normal drain unaffected
  243. f1d77cee 2026-08-05 auto-save: 2026-08-05T23:16:37 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  244. 0d18fabb 2026-08-05 pr/geo+jobs: Cody gate — make the coverage major-metro model STATE-AWARE. My tier-aware gap fix used the CA-only MAJOR_METRO_KEYS in the state-parameterized generate-coverage-report, so for AZ (no metro in the CA set) all 15 major-tier categories were silently dropped from gap detection — a latent bug that would misfire when Arizona unlocks. Added geo.MAJOR_METRO_KEYS_BY_STATE + majorMetrosFor(state) (AZ = Phoenix/Maricopa cluster + Tucson); job now uses majorMetrosFor(state). CA unchanged, AZ major-type gaps correctly detected in the big AZ metros
  245. d76172e5 2026-08-05 pr/jobs: make generate-coverage-report gap detection TIER-AWARE, consistent with the /coverage denominator. It flagged count===0 for every scoped type in every metro, so up to 60 FALSE gaps (15 major-tier types × 4 secondary metros — e.g. pr_agency in Central Valley) inflated gap_count and misdirected the research pipeline. The tier 'denominator fix' was applied to the /coverage API (index.js) but never to this gap report. Now: universal types are gaps in any metro; major types only in the big metros. Verified
  246. e21420df 2026-08-05 auto-save: 2026-08-05T22:46:27 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  247. 035683ac 2026-08-05 pr/letters: Cody gate — lowercase-normalize extractMergeFields too, so the stored merge_fields metadata matches render()'s now-case-insensitive fill (they described the same template in two case dialects). Bonus: {{First_Name}} and {{first_name}} now dedupe to one field. merge_fields is display/validation metadata (not a key/join), forward-only, verified
  248. bcf70d2e 2026-08-05 pr/letters: case-insensitive merge-field lookup in render(). The {{...}} regex is /gi (case-insensitive match) but the fill did context[key] (case-sensitive), and mergeContext keys are all lowercase — so a mixed-case field like {{First_Name}} silently failed to fill and rendered as a literal broken placeholder in the SENT letter. Now context[key.toLowerCase()]. Verified any-case fields resolve, genuinely-absent fields still show + flag missing
  249. 61c09db7 2026-08-05 auto-save: 2026-08-05T22:16:18 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  250. 8aac7922 2026-08-05 pr/replies: Cody gate — guard the broadened opt-out regex against IRREVERSIBLE false positives. (1) negation lookbehind so 'don''t/do not/never stop sending' is NOT an opt-out (was permanently suppressing engaged leads); (2) redirect lookahead so 'stop sending TO my old address / IT to X' (lead giving a new address) isn't suppressed; (3) dropped bare 'no longer interested' — a soft-no/timing reply ('no longer interested in a Q3 close'), NOT a legal opt-out, was over-suppressing CRE leads. Verified 18 opt-outs caught, 0 false positives on 13 negation/non-opt-out cases
  251. dbb25bf7 2026-08-05 pr/replies: broaden opt-out detection (CAN-SPAM). The old regex missed 8 common opt-out phrasings — 'don''t email me' (contraction of do-not), 'take me off (your list)', 'remove my email/name' (only 'remove me' matched), 'stop sending', 'no longer wish to receive', 'cease all communication' — so those recipients were NOT suppressed and could be re-emailed (compliance violation). New OPT_OUT_RE catches 17+ phrasings with 0 false positives on non-opt-outs (verified 'remove the typo'/'stop by'/'I don''t think' etc. stay clear)
  252. 430a62a6 2026-08-05 auto-save: 2026-08-05T21:46:07 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  253. 685e6ac4 2026-08-05 pr/search: Cody gate — (1) strip internal double-quotes in term() so a name like The "Best" Group can't corrupt the phrase query; (2) short-circuit a degenerate bare 'site:linkedin.com/in|company' query (person+company both empty, reachable via locateCompany w/ null org) to an empty DEGENERATE_QUERY report — don't burn a paid search API call on a random LinkedIn sampling. Verified
  254. 4cc523f8 2026-08-05 pr/search: fix findLinkedIn query building — a null/undefined/'' companyName (a person with no org; jobs/index.js:292 passes p.org_name) injected the LITERAL string "null"/"undefined"/empty "" into the search query, constraining it to garbage and tanking the LinkedIn match rate. Now built from non-empty trimmed quoted terms only. Verified null/undef/empty/whitespace all clean, normal queries unchanged
  255. 0c981cc9 2026-08-05 auto-save: 2026-08-05T21:15:47 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  256. f1f7cb33 2026-08-05 pr/linkedin: Cody gate — extract shared LI_SEP so stripLinkedIn AND the discoverCommsPeople name/title split use the SAME separators. They'd drifted (strip covered pipe/middot, split only dashes), so middot/pipe-separated LinkedIn SERP titles were silently DROPPED at the Name-Case gate — proven, now recovered. Also collapse \\s+ (handles embedded newlines that defeated the non-dotAll .*). Verified strip + name-recovery across all separators
  257. 2221ee51 2026-08-05 pr/linkedin: anchor stripLinkedIn to the LAST separator-before-LinkedIn (greedy ^(.*)) — self-gate caught that the first-match .* form (in the old code AND my first pass) truncated real 'LinkedIn Marketing Manager'-type titles to just the name. Now the trailing SERP tag is stripped while LinkedIn-as-content is preserved; verified 6 cases
  258. dc165ff3 2026-08-05 pr/linkedin: unify the ' | LinkedIn' SERP-suffix strip into one stripLinkedIn() helper. The two call sites had drifted to different separator classes (locatePerson [|–-] vs discoverComms [|·]), so 'LinkedIn' leaked into stored indexed_title on middot/en-dash/em-dash separators. One helper covers [|·–—-]; verified all separators stripped, legit + mid-word-LinkedIn titles preserved
  259. 3c791fc6 2026-08-05 auto-save: 2026-08-05T20:45:35 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  260. 0f85ba30 2026-08-05 pr/website: Cody gate — (1) wire the THIRD email-scan (profileOrganization L283, which populates general_press_email) to the shared isJunkContactEmail — my first pass missed it, so noreply/image emails still leaked into the main enrichment output. (2) DROP the @2x arm entirely: it false-positived real '2x' domains (pr@2xmedia.com, contact@2x.vc) and was redundant — retina image emails always end in an image extension already caught by the \.(png|…) arm. (3) \bexample\. avoids theexample.com. All 3 call sites now share one predicate; 15 predicate cases + both extractors verified
  261. d308a6f1 2026-08-05 pr/website: shared isJunkContactEmail() filter for BOTH extractors — extractPressContacts had NO junk filter (proven: it stored 'photo@2x.png' / 'noreply@firm.com' as press emails, skipping the real one), and extractPeople's inline filter missed no-reply/.gif/.svg/.webp/.jpeg. Both now pick the first NON-junk email per block (a junk match no longer blocks the real one). Verified junk skipped, real+press@ emails preserved
  262. 270d4b18 2026-08-05 auto-save: 2026-08-05T20:15:24 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  263. d1859231 2026-08-05 pr/taxonomy: Cody gate — collapse whitespace at the top of classifyTitle. The fixed-width (?<!vice[\\s-]) lookbehinds were defeated by dirty input ('Vice President' w/ double-space, tab), re-mislabeling VPs as president/c_suite — exactly the bug class the guards fix. .replace(/\\s+/g,' ') normalizes before any pattern runs, fixing both rules + all [\\s-] separators. Verified double/triple-space + tab VPs now classify correctly, clean titles unregressed
  264. 1bdfc17d 2026-08-05 pr/taxonomy: fix two title-classification bugs (proven by execution). (1) bare 'president' in both the ROLE and SENIORITY rules matched 'Vice President', so every spelled-out VP/EVP/SVP was mislabeled role=president + seniority=c_suite — added a (?<!vice[\\s-]) lookbehind so VPs fall through to evp_svp/vp. (2) '^c[emc]o' only caught CEO/CMO/CCO at string-start, missing 'Regional CEO'/'Divisional CMO' → used \\bc[emc]o\\b. Verified 28 title cases across role+seniority
  265. bbcd07e6 2026-08-05 auto-save: 2026-08-05T19:45:13 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  266. ecc4c6ce 2026-08-05 pr/normalize: Cody gate — anchor the N.A.-suffix strip to END-OF-STRING ($), not \\b. The \\b form fired at position 0 / after a hyphen too, wrongly collapsing PREFIX/MID uses ('N.A. Williams'→'williams', 'Corp N.A. Trust'→'trust') into false AUTO-merges (data loss — worse than the dedup miss). Now only a trailing N.A. is stripped: 4 suffix forms dedup, 3 prefix/mid cases stay distinct
  267. 6c77b91a 2026-08-05 pr/normalize: fix dedup miss on dotted bank 'N.A.' suffix — the 'na'/'n.a' ORG_STOPWORDS were unreachable (punctuation stripped to spaces before the filter), so 'First National Bank, N.A.' normalized to '...bank n a' and failed to dedup against 'First National Bank'. Fold the dotted N.A. form to a bare 'na' token first (leading \\b avoids matching 'national'/'john.adams'); verified 4 dotted/spaced forms now dedup, Nationwide/Santa Ana/distinct-banks unaffected
  268. fd31c4e6 2026-08-05 auto-save: 2026-08-05T19:14:58 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  269. 6ea87b32 2026-08-05 social (Content Studio): escape x.platform (stored admin input) + x.id in the draft-card render — closes a stored self-XSS Cody caught one line below the fmtTopic fix (admin-only surface, so low severity, but no raw string should touch innerHTML). renderDrafts is now fully output-encoded
  270. 115fabd2 2026-08-05 social (Content Studio): fmtTopic now delegates to the full esc() (& < > ") instead of escaping only '<' — defense-in-depth output-encoding across its 5 innerHTML sites (draft text/topic, featured-video title, calendar). Safe today in text-content, but robust if a string ever moves to an attribute context; also fixes rare &-entity misrender. Removes a redundant weaker escape
  271. c014ea30 2026-08-05 auto-save: 2026-08-05T18:44:47 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  272. 27c93660 2026-08-05 newsSig: document that money amounts normalize to MILLIONS (k÷1000, m×1, b×1000) + guard against a wrong 'fix' — a defect-hunt agent misread k/=1000 as a bug (it's correct at a millions base; *=1000 would equate $100k with $100B and break news dedup). Comment-only, no behavior change
  273. f84bac8c 2026-08-05 auto-save: 2026-08-05T18:14:36 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  274. 7c02e37a 2026-08-05 desk KPI: Cody gate — position the drill chevron top-right (::after on a block card was rendering as a dangling glyph below the value) + drop the .lk .v white override (removes a latent drillable-vs-not color delta if a non-drillable KPI is ever added)
  275. 13fd2b86 2026-08-05 desk analytics: KPI cards (CA Brokers/Firms/Top firm/Marquee assets) now drill into their directory scope per the counts-must-href rule — added gotoScope() reusing the rail scope/view machinery; kpi-link hover/›/keyboard(role=button,Enter/Space) affordances. Previously dead-text numbers
  276. c7e15594 2026-08-05 auto-save: 2026-08-05T17:44:25 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  277. 0e665e94 2026-08-05 review density: Cody gate — flex-shrink:0 on .revdens + .live so the toolbar slider doesn't float/squish between the flex:1 search and margin-auto indicator at 981-1100px; cap density at 5 (6-col dropped video thumbs to ~170px, too small for 16/9); aria-valuetext announces 'N columns' to screen readers
  278. 48440b95 2026-08-05 review (The REview): add density slider to the video catalog grid (fixed 4-col → adjustable --cols, localStorage) per the every-grid-gets-density rule; desktop-only (mobile keeps the responsive column rules). Sort omitted by design — catalog is category-rail grouped w/ chips+search, and /api/videos carries no date to sort by
  279. 15dedf60 2026-08-05 auto-save: 2026-08-05T17:14:13 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  280. 4b0dfdfe 2026-08-05 la-commercial: Cody gate — add esc() and escape all API-data interpolations (brief/name/address/city/type_label) going into innerHTML, closing an XSS vector on server/LLM-generated briefs + fixing raw '&' in firm names (e.g. 'Nourmand & Associates'). Kept the full-legal-name firm drill (verified it returns the exact firm, 1 result — more precise than a trimmed query)
  281. c98cd596 2026-08-05 la-commercial: wire every datum to deeper data per the all-data-points-href rule — marquee assets + recent-activity rows now drill to their LA County Assessor parcel record (by AIN, the cited source); firm cards drill into the CRE Directory filtered to that firm (internal, no external firm link-out). Hover affordances + ↗ on external source links
  282. b69f5973 2026-08-05 blog density: Cody gate — hide the density slider on phones (auto-fill is 1-col under ~490px so --min was inert there; sort stays, it works on a 1-col list) + aria-label conveys direction. Rejected Cody's --cols suggestion (would force unreadable fixed columns on mobile)
  283. fc0ee30d 2026-08-05 blog: add sort (Newest/Oldest/Title/Category) + density slider to the RENTV Originals grid per the every-grid-gets-sort+density rule — posts load client-side in full so the sort is honest (whole-set reorder, not a page); refactored fetch→render, both controls persist to localStorage
  284. 050f7edc 2026-08-05 PR intel: add Tavily as a 3rd free-tier search backend + PR_SEARCH_BACKEND override
  285. 214a147e 2026-08-05 directory density: Cody gate fixes — hide slider on mobile (dead below 560px where grid is 1fr!important), ellipsis+min-width:0 so cards stay uniform height at 4-col, min=2 + clamp stale localStorage (no degenerate 1-col)
  286. 1ba53ee1 2026-08-05 directory: add density slider (card-grid --cols, localStorage) to the flagship CRE Directory per the every-grid-gets-density rule; sort left for a usre server-side ordering task (registry ignores ?sort, client sort would mislead a 34k paginated set)
  287. 07989393 2026-08-05 auto-save: 2026-08-05T16:43:55 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  288. ce6805c1 2026-08-05 Boomer voice/byline: on-air name is BOOM not Bloom (Steve) — narration 'This is Boom with RENTV' + byline 'Boom · RENTV'; real surname stays only in the email + clone-provenance comments
  289. 49947825 2026-08-05 Audience: CRM contacts now surface their REAL enriched LinkedIn (✓) instead of a search guess — fetchCrmContacts pulls linkedin_url; the 👤 action links the actual profile when we have it, falls back to search otherwise
  290. e8fc556f 2026-08-05 PR intel: paginate linkedin-enrich target pool (Cody cycle 3)
  291. 39587e39 2026-08-05 org drawer: surface each contact's LinkedIn as a clickable 🔗 (org detail now returns per-person linkedin_url) — see a firm's contacts' LinkedIn right where you pitch them, now that ~500 have it enriched
  292. f2a81c1c 2026-08-05 auto-save: 2026-08-05T16:13:44 (8 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  293. 05adbf9e 2026-08-05 rentv social-video-gen: enforce shared per-video cost cap before ElevenLabs TTS (trim narration if over)
  294. 96574cc1 2026-08-05 auto-save: 2026-08-05T15:43:31 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  295. ea4a72c8 2026-08-05 PR intel: safe org dedup (page-title captures → canonical brand)
  296. 02cf415b 2026-08-05 PR intel: yoloforever cycle 2 — enrich lockfile + linkedin re-check
  297. 7701c773 2026-08-05 auto-save: 2026-08-05T15:13:13 (8 files) — data/closings-overrides.json data/deals-registry.json data/deals.json data/markets.json data/news.json
  298. b6a773ff 2026-08-05 RENTV Path A: additive session-cookie login + CSRF + service-token, v0.21.0 — TK-10257
  299. bf2e528d 2026-08-05 Cody-gate: Deal Desk corpus /find is HONEST — the corpus IS rentv.com's own articles, so a corpus deal was ALREADY covered by RENTV; label it covered:{RENTV corpus} + mode:repurpose, reframe UI from 'uncovered deal' to 'pull a RENTV closing to repurpose'. True-uncovered stays the Gemini engine.
  300. 6a4fdee5 2026-08-05 Deal Desk: /find now defaults to a $0 corpus path (723 real uncovered closed deals from articles-corpus) instead of the credits-depleted Gemini — restores the dead feature; Gemini kept as opt-in engine=gemini
  301. 8d2c596e 2026-08-05 deals-log: change-history opens as a LEFT drawer, not a centered modal — Steve inline/left-panel directive
  302. caa3fa7c 2026-08-05 re-search: click items expand INLINE + left detail panel (no modal, no navigate-away) — Steve directive
  303. dfe922fe 2026-08-05 Cody-gate: buyer/seller/broker are now admin-editable (added to CLOSE_FIELDS + F + modal inputs) — an admin can correct a wrong LLM-extracted party, and the GET merge's edits-last precedence makes the correction win over the corpus
  304. 676a7464 2026-08-05 PR intel: tighten LinkedIn slug guard to require surname (Cody fix)
  305. dbc79b26 2026-08-05 RENTV closings+deals editors: drill-down on every datum — badge→type, txn badge→txn, location & parties→search filters (href-everything rule), v0.20.1 — TK-10255
  306. 1b924b35 2026-08-05 closings: FIX enrichment merge — feed deals now gap-fill buyer/seller/broker (+summary/size/year/type) from their matching corpus article; before, all 23 feed closings showed NO party data despite the corpus having it for 22 (the whole corpus pipeline's payoff was defeated for feed rows)
  307. e6da0a92 2026-08-05 auto-save: 2026-08-05T14:42:56 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  308. 2ec421b3 2026-08-05 Cody-gate: trim party value before filtering (whitespace-safe match)
  309. d7aca3d5 2026-08-05 RENTV: Deals page → backend-only + editable override layer (mirror closings, all txn types), v0.20.0 — TK-10255
  310. 279335d4 2026-08-05 closings: buyer/seller/broker are now clickable → filter the feed to that party's deals (every data point hrefs deeper); hover affordance
  311. 1663154b 2026-08-05 PR intel: CRM name/title hygiene tool (byline + trailing-punct cleanup)
  312. 1fd2ec07 2026-08-05 Cody-gate: posts public-status now published|live in lockstep with /api/search (was published-only → a future 'live' post would 404 on its page while showing in search); cross-ref comment on the parallel search filter
  313. f40b0bc9 2026-08-05 PR intel: linkedin-enrich prioritizes media/PR contacts (org-id set sort)
  314. 493127a2 2026-08-05 chore: session close — search buyer/seller/broker on closings (party-search fix), v0.19.1
  315. 548ec200 2026-08-05 security: /api/posts + /api/posts/:id never serve DRAFTS to non-admin callers (user-tier past the site auth got all posts incl. unpublished outside-wire content) — force published-only, 404 drafts by id
  316. 80087c0b 2026-08-05 Cody-gate fixes: harden PR.date with isNaN guard (was rendering 'Invalid Date' for bad values, app-wide); org 'Added' column reuses the robust adminDt helper (ISO title + guards)
  317. 74c3fba9 2026-08-05 People + Organizations lists: add sortable 'Added' column (created date+time, ISO in title) — recency curation per Steve's admin date-time rule; backend already returns created_at + supports created sort
  318. 1edf0c45 2026-08-05 PR intel: LinkedIn enrichment via Brave search (local, key stays on Mac2)
  319. 45863c90 2026-08-05 RENTV: incremental corpus-crawl wrapper (LOCK-aware, cursor-reset-only, $0 local) — completes crawl→sync→serve chain, TK-10254 follow-up
  320. f1e911ce 2026-08-05 Cody-gate fixes: by_metro bar routes to organizations (org-level data, was mis-pointed at people); people dept filter adds editorial + media_business options (were unlisted → filter indicator snapped to all)
  321. 7825d5f2 2026-08-05 pr-intelligence dashboard: PR-agency rows drill into the org record (organizations?id=) — completes dashboard href-rule compliance
  322. 8911db12 2026-08-05 auto-save: 2026-08-05T14:12:38 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json
  323. 72bdf169 2026-08-05 RENTV: corpus→Kamatera hourly sync script (keeps live /closings fresh, no restart via mtime re-read, shrink-guarded) — TK-10254 follow-up
  324. ba1e3bf2 2026-08-05 fix: KPI card links inherit text color (was rendering numbers link-blue) — caught pre-deploy
  325. b34da7ac 2026-08-05 pr-intelligence dashboard: KPI cards now drill to filtered lists (href rule) — stale→people?status=stale, no-PR→orgs?no_pr_contact=1, drafts→review, replies→inbox, followups→tasks, coverage/AZ→orgs?state=
  326. 25e5df28 2026-08-05 PR intel: OpenClaw masthead extractor + per-person phone/email capture
  327. 5c464c00 2026-08-05 pr-intelligence dashboard: every data point hrefs deeper — by_category→orgs?type=, by_role→people?department=, by_metro→people?metro=, coverage-gap cells→orgs?metro=&type= (was dead-end bars)
  328. 75b7680c 2026-08-05 search-index: HomesOnSpec LIVE from Kamatera (InventoryHome, ~40k spec homes) — TK-10253
  329. fc57490b 2026-08-05 Audience perf: precompute per-contact search index once on load (was JSON.stringify over 2,162 contacts per keystroke) — Cody's queued follow-up
  330. f44b4fff 2026-08-05 RENTV closings: merge article corpus into /api/closings (Sale-only, listings filtered, deduped vs deals feed) — closes reporting gaps, self-heals as crawl grows; surface buyer/seller/broker on cards — TK-10254
  331. 80e38cfe 2026-08-05 ops: persistent (launchd) RENTV build loop — sandboxed claude -p (no deploy/spend tool, drafts gated to pending-approval), hourly, sonnet; activation is Steve-run
  332. 97ad44f2 2026-08-05 search-index: resolve psql by full path so launchd (minimal PATH) keeps the usre source — TK-10253
  333. ddbcba2e 2026-08-05 RENTV: launchd job for unified search index rebuild (all builds, every 30min) — TK-10253
  334. f143ba69 2026-08-05 RENTV: unified full-text search — /api/unified-search (adminOnly) + re-search.html + build-search-index.mjs + generated search-index.jsonl (internal/admin pages excluded from index)
  335. 784b3fe6 2026-08-05 deploy: rentv Review Queue narrow-viewport fix + national CRE media seed (54 orgs); refresh deals/markets/news/ticker + news-posting-playbook (TK-10249)
  336. 9da8b6b0 2026-08-05 PR intel: daily media/PR refresh crawl ($0 local)
  337. 3c345857 2026-08-05 Consulting portal: RENTV brand film — Boom avatar (headshot) + corrected Boomer voice, HeyGen Avatar-IV render (heygen-brandfilm.mp4)
  338. b39b469c 2026-08-05 auto-save: 2026-08-05T13:42:25 (8 files) — data/deals-registry.json data/deals.json data/markets.json data/news-posting-playbook.json data/news-posting-playbook.md
  339. b881b5e3 2026-08-05 RENTV: pull archive with LOCAL MODELS (qwen3:14b on Mac2+Mac1, $0) — TK-10250
  340. 0432aa44 2026-08-05 RENTV: move Property Closings to backend-only + editable override layer (add/edit/hide over live Sale feed) — TK-10251
  341. f3a0f639 2026-08-05 RENTV: News Playbook backend view + corpus/playbook API — TK-10250
  342. f53f85cb 2026-08-05 Audience (Cody gate): top-level try/catch on /api/audience (safe empty payload, never blank-500); empty-state names all 3 sources incl CRM
  343. f5984832 2026-08-05 RENTV: full rentv.com article corpus crawler + news-posting playbook — TK-10250
  344. 8c7c2767 2026-08-05 Audience: CRM contacts drill into their pr-intelligence person + org records (href-rule); fix CRM persona icon (was newsletter emoji)
  345. ccbda3ed 2026-08-05 PR intel: better editorial-contact extraction for news publications
  346. f6d63f54 2026-08-05 Audience: surface the 2,162-contact pr-intelligence CRM (was showing only empty newsletter+sublease); add Category segment by org type; segments view now collapsible tabs (open collapsed, persisted)
  347. 1658be9d 2026-08-05 auto-save: 2026-08-05T13:12:15 (5 files) — data/deals.json data/markets.json data/news.json data/ticker.json public/admin/pr-intelligence/review.html
  348. d777700d 2026-08-05 pr-intelligence Organizations: left-panel category rail (PR firms / builders / lenders / etc.), all columns sortable with ▲/▼, expandable inline rows, density slider, grid+list toggle, Reset — backend group filter (types=) + people/pr sort keys
  349. 06fe8285 2026-08-05 deploy: exclude data/deals-registry.json so deploys never clobber prod's accumulating deal history — TK-10246
  350. 875aaec0 2026-08-05 PR intel: add national CRE media + association-media + PR agencies
  351. 955211ec 2026-08-05 RENTV: deals+registry ride the 20-min news cron (auto-accumulate) — TK-10246
  352. a15c8be0 2026-08-05 RENTV: persistent deal registry + per-deal change history — TK-10246
  353. 9ea3fd53 2026-08-05 Boomer voice fix: re-clone from verified 7/31 VO (VOICE_ID czUPGx5phxE6qpQ46nRS); prior EoZqh clone sounded wrong
  354. eb29d4a1 2026-08-05 auto-save: 2026-08-05T12:42:02 (6 files) — data/markets.json data/news.json data/ticker.json src/pr/index.js src/pr/lib/geo.js
  355. d1b78915 2026-08-05 Content Studio: Boomer voice + video buttons — narrate the generated post in Boom's cloned ElevenLabs voice (mp3 or photo+Ken-Burns mp4), reuses async social-video job infra
  356. 64a70630 2026-08-05 auto-save: 2026-08-05T12:11:52 (3 files) — data/markets.json data/news.json data/ticker.json
  357. c3c9f6ba 2026-08-05 auto-save: 2026-08-05T11:41:42 (3 files) — data/markets.json data/news.json data/ticker.json
  358. c5edf510 2026-08-05 George draft auth: try Basic <GEORGE_AUTH> (secrets-master value)
  359. b1efd88a 2026-08-05 Content Studio: Email-to-Boom now creates a Gmail DRAFT in steve-office (no send-gate; Steve reviews + sends)
  360. 6d2fbcd3 2026-08-05 Deal Desk: viewer for an uncovered closed CRE deal — chat-adjust any field + generate social (local LLM $0); Gemini find endpoint
  361. 3cdd23d7 2026-08-05 chore: v0.19.0 (session close — Content Studio + photo tracking + email + Boom rename)
  362. 7d1be369 2026-08-05 Content Studio: one-button Email-to-Boom now includes images + video links (rich send)
  363. c0aff668 2026-08-05 auto-save: 2026-08-05T11:11:27 (3 files) — data/markets.json data/news.json data/ticker.json
  364. 46857003 2026-08-05 auto-save: 2026-08-05T10:41:17 (3 files) — data/markets.json data/news.json data/ticker.json
  365. 3ddffc69 2026-08-05 auto-save: 2026-08-05T10:11:08 (3 files) — data/markets.json data/news.json data/ticker.json
  366. b0007cbd 2026-08-05 auto-save: 2026-08-05T09:40:57 (3 files) — data/markets.json data/news.json data/ticker.json
  367. 4ffccdc6 2026-08-05 auto-save: 2026-08-05T09:10:47 (3 files) — data/markets.json data/news.json data/ticker.json
  368. 9b0cf781 2026-08-05 auto-save: 2026-08-05T08:40:35 (3 files) — data/markets.json data/news.json data/ticker.json
  369. b4364477 2026-08-05 auto-save: 2026-08-05T08:10:17 (4 files) — data/markets.json data/news.json data/ticker.json server.js
  370. 70045f71 2026-08-05 Content Studio email: use raw GEORGE_AUTH token for local George :9850
  371. 14ea3125 2026-08-05 Content Studio: track building photo from credited broker/developer (Gemini-grounded) + photo credit + Email-to-Boom via George; Bloom→Boom fix; retire rentv-website
  372. 88f6724f 2026-08-05 auto-save: 2026-08-05T07:40:04 (8 files) — data/markets.json data/news.json data/ticker.json docs/FORSALE-OUTREACH.md public/admin/pr-intelligence/linkedin-posting.html
  373. 6be18486 2026-08-05 Drafts UI: escape data-id + plain-text drawer title + String() id compare (Cody hardening)
  374. f7026ca8 2026-08-05 auto-save: 2026-08-05T07:09:54 (3 files) — data/markets.json data/news.json data/ticker.json
  375. ff6d1c63 2026-08-05 auto-save: 2026-08-05T06:39:44 (5 files) — data/markets.json data/news.json data/ticker.json public/admin/pr-intelligence/pr-shared.js public/admin/pr-intelligence/content-drafts.html
  376. 6462c58f 2026-08-05 auto-save: 2026-08-05T06:09:34 (3 files) — data/markets.json data/news.json data/ticker.json
  377. 07420bfb 2026-08-05 auto-save: 2026-08-05T05:39:25 (3 files) — data/markets.json data/news.json data/ticker.json
  378. 8f516527 2026-08-05 auto-save: 2026-08-05T05:09:15 (3 files) — data/markets.json data/news.json data/ticker.json
  379. 1a4a2c7c 2026-08-05 auto-save: 2026-08-05T04:39:04 (3 files) — data/markets.json data/news.json data/ticker.json
  380. 5e99d586 2026-08-05 auto-save: 2026-08-05T04:08:53 (3 files) — data/markets.json data/news.json data/ticker.json
  381. 5894cf02 2026-08-05 auto-save: 2026-08-05T03:38:44 (3 files) — data/markets.json data/news.json data/ticker.json
  382. e92ee960 2026-08-05 auto-save: 2026-08-05T03:08:35 (3 files) — data/markets.json data/news.json data/ticker.json
  383. 6f8ad3a0 2026-08-05 auto-save: 2026-08-05T02:38:25 (3 files) — data/markets.json data/news.json data/ticker.json
  384. 22ea0b60 2026-08-05 auto-save: 2026-08-05T02:08:15 (3 files) — data/markets.json data/news.json data/ticker.json
  385. 92b3b969 2026-08-05 auto-save: 2026-08-05T01:38:06 (3 files) — data/markets.json data/news.json data/ticker.json
  386. e3f0bbbd 2026-08-05 auto-save: 2026-08-05T01:07:57 (3 files) — data/markets.json data/news.json data/ticker.json
  387. 5f5fde95 2026-08-05 auto-save: 2026-08-05T00:37:47 (3 files) — data/markets.json data/news.json data/ticker.json
  388. 0927632e 2026-08-05 auto-save: 2026-08-05T00:07:36 (3 files) — data/markets.json data/news.json data/ticker.json
  389. 80fe6121 2026-08-04 auto-save: 2026-08-04T23:37:27 (3 files) — data/markets.json data/news.json data/ticker.json
  390. 411cf9b4 2026-08-04 auto-save: 2026-08-04T23:07:17 (3 files) — data/markets.json data/news.json data/ticker.json
  391. 368659cd 2026-08-04 auto-save: 2026-08-04T22:37:08 (3 files) — data/markets.json data/news.json data/ticker.json
  392. ec8312de 2026-08-04 auto-save: 2026-08-04T22:06:54 (3 files) — data/markets.json data/news.json data/ticker.json
  393. d5bd3f49 2026-08-04 auto-save: 2026-08-04T21:36:45 (3 files) — data/markets.json data/news.json data/ticker.json
  394. 89cbdb8a 2026-08-04 auto-save: 2026-08-04T21:06:36 (3 files) — data/markets.json data/news.json data/ticker.json
  395. 658d67eb 2026-08-04 auto-save: 2026-08-04T20:36:27 (3 files) — data/markets.json data/news.json data/ticker.json
  396. 2c32774c 2026-08-04 auto-save: 2026-08-04T20:06:17 (6 files) — data/markets.json data/news.json data/ticker.json scripts/build-news-archive.mjs scripts/pull-cre-news.mjs
  397. 163f9fff 2026-08-04 Content Studio: copyright Option 1 — outside-wire stories save as draft (UI + server-enforced), RENTV-sourced publish live
  398. bb10f92e 2026-08-04 auto-save: 2026-08-04T19:36:08 (3 files) — data/markets.json data/news.json data/ticker.json
  399. 7cbb2d95 2026-08-04 auto-save: 2026-08-04T19:05:58 (3 files) — data/markets.json data/news.json data/ticker.json
  400. 8d7917c1 2026-08-04 Content Studio UX: feed category filter + copy-to-clipboard on blog/social (Cody-gated, HTTPS guard)
  401. 657151c6 2026-08-04 auto-save: 2026-08-04T18:35:48 (3 files) — data/markets.json data/news.json data/ticker.json
  402. e100458d 2026-08-04 Content Studio UX: tone/angle selector (news/analysis/punchy) + Regenerate + raw/deduped feed toggle (Cody-gated)
  403. d924c448 2026-08-04 auto-save: 2026-08-04T18:05:34 (5 files) — data/markets.json data/news.json data/ticker.json public/admin/pr-intelligence/content-studio.html server.js
  404. 9f00a2c9 2026-08-04 auto-save: 2026-08-04T17:35:24 (3 files) — data/markets.json data/news.json data/ticker.json
  405. dd0317e8 2026-08-04 Content Studio: cross-source dedup in feed (strict, Cody-hardened — no false merges) + '+N more sources' chip
  406. 4d3751bd 2026-08-04 Content Studio hardening: localize blog images on publish/edit (no third-party hotlinks) + scrub all known wire names (Cody gate)
  407. 4ce9fdce 2026-08-04 auto-save: 2026-08-04T17:05:12 (4 files) — .deploy.conf data/markets.json data/news.json data/ticker.json
  408. 2e7caa4b 2026-08-04 server: dependency-free .env loader (durable prod config across deploys)
  409. 8c9901f9 2026-08-04 CRM Content Studio: deep multi-source dated news feed → original blog + social (local LLM $0, source-scrubbed)
  410. 761151eb 2026-08-04 auto-save: 2026-08-04T16:35:00 (5 files) — data/markets.json data/news.json data/ticker.json server.js public/admin/pr-intelligence/content-studio.html
  411. 9bd88e88 2026-08-04 auto-save: 2026-08-04T16:04:49 (3 files) — data/markets.json data/news.json data/ticker.json
  412. 2cef1f2a 2026-08-04 chore: v0.18.0 — Property Closings feature (session close)
  413. 7ac88855 2026-08-04 CRM: add LinkedIn Posting section (setup + composer preview, gated non-live)
  414. ad9276b6 2026-08-04 rentv: add Closings link to site-wide nav across 22 public pages
  415. 00c04564 2026-08-04 auto-save: 2026-08-04T15:34:32 (47 files) — data/markets.json data/news.json data/ticker.json public/about.html public/advertise.html
  416. 28220187 2026-08-04 rentv: make /closings customer-facing (public card grid, date-forward, nav link)
  417. 89f3741f 2026-08-04 auto-save: 2026-08-04T15:04:21 (1 files) — public/closings.html
  418. 45ac1811 2026-08-04 rentv closings: parse full-month-name dates (June/July) → 18/21 coverage
  419. 8a06b7a9 2026-08-04 rentv backend: Property Closings view (Sale deals w/ address·date·price, sortable+searchable)
  420. 3e8842dc 2026-08-04 auto-save: 2026-08-04T14:34:11 (3 files) — data/markets.json data/news.json data/ticker.json
  421. f8bdede1 2026-08-04 CRM: add LinkedIn Network page — TOS-safe import of Bloom's self-exported connections into People
  422. e32c9d29 2026-08-04 auto-save: 2026-08-04T14:04:01 (3 files) — data/markets.json data/news.json data/ticker.json
  423. b0e2eac5 2026-08-04 Add site-wide user day/night toggle (sun/moon icon) with FOUC guard
  424. 15a1f9ba 2026-08-04 auto-save: 2026-08-04T13:33:48 (3 files) — data/markets.json data/news.json data/ticker.json
  425. a30c778d 2026-08-04 auto-save: 2026-08-04T13:03:31 (3 files) — data/markets.json data/news.json data/ticker.json
  426. b9d061b1 2026-08-04 auto-save: 2026-08-04T12:33:18 (3 files) — data/markets.json data/news.json data/ticker.json
  427. 63ceb532 2026-08-04 auto-save: 2026-08-04T12:03:05 (3 files) — data/markets.json data/news.json data/ticker.json
  428. f1b733e5 2026-08-04 auto-save: 2026-08-04T11:32:54 (3 files) — data/markets.json data/news.json data/ticker.json
  429. 97f9f8a1 2026-08-04 auto-save: 2026-08-04T11:02:41 (3 files) — data/markets.json data/news.json data/ticker.json
  430. 3ced0b49 2026-08-04 auto-save: 2026-08-04T10:32:27 (3 files) — data/markets.json data/news.json data/ticker.json
  431. 87ab09a6 2026-08-04 auto-save: 2026-08-04T10:02:15 (3 files) — data/markets.json data/news.json data/ticker.json
  432. 55e4bd2c 2026-08-04 auto-save: 2026-08-04T09:32:01 (3 files) — data/markets.json data/news.json data/ticker.json
  433. abd44438 2026-08-04 auto-save: 2026-08-04T09:01:48 (3 files) — data/markets.json data/news.json data/ticker.json
  434. eec8d279 2026-08-04 auto-save: 2026-08-04T08:31:34 (3 files) — data/markets.json data/news.json data/ticker.json
  435. ad3d3ad8 2026-08-04 auto-save: 2026-08-04T08:01:22 (3 files) — data/markets.json data/news.json data/ticker.json
  436. b5124f22 2026-08-04 auto-save: 2026-08-04T07:31:10 (3 files) — data/markets.json data/news.json data/ticker.json
  437. ee79bdb1 2026-08-04 auto-save: 2026-08-04T07:00:57 (3 files) — data/markets.json data/news.json data/ticker.json
  438. 4be3a789 2026-08-04 auto-save: 2026-08-04T06:30:44 (3 files) — data/markets.json data/news.json data/ticker.json
  439. eb6462e3 2026-08-04 auto-save: 2026-08-04T06:00:27 (3 files) — data/markets.json data/news.json data/ticker.json
  440. a37eed65 2026-08-04 auto-save: 2026-08-04T05:30:13 (3 files) — data/markets.json data/news.json data/ticker.json
  441. d0e16706 2026-08-04 auto-save: 2026-08-04T04:59:56 (3 files) — data/markets.json data/news.json data/ticker.json
  442. 8104aa9d 2026-08-04 auto-save: 2026-08-04T04:29:46 (3 files) — data/markets.json data/news.json data/ticker.json
  443. b21f07a6 2026-08-04 auto-save: 2026-08-04T03:59:36 (3 files) — data/markets.json data/news.json data/ticker.json
  444. 9e392bc3 2026-08-04 auto-save: 2026-08-04T03:29:25 (3 files) — data/markets.json data/news.json data/ticker.json
  445. 1f0c6302 2026-08-04 auto-save: 2026-08-04T02:59:16 (3 files) — data/markets.json data/news.json data/ticker.json
  446. 425363bb 2026-08-04 auto-save: 2026-08-04T02:29:06 (3 files) — data/markets.json data/news.json data/ticker.json
  447. 7989b277 2026-08-04 auto-save: 2026-08-04T01:58:56 (3 files) — data/markets.json data/news.json data/ticker.json
  448. 53e495f4 2026-08-04 auto-save: 2026-08-04T01:28:47 (3 files) — data/markets.json data/news.json data/ticker.json
  449. e1d1143f 2026-08-04 auto-save: 2026-08-04T00:58:37 (3 files) — data/markets.json data/news.json data/ticker.json
  450. 92199068 2026-08-04 auto-save: 2026-08-04T00:28:28 (3 files) — data/markets.json data/news.json data/ticker.json
  451. 06ea7270 2026-08-03 auto-save: 2026-08-03T23:58:19 (3 files) — data/markets.json data/news.json data/ticker.json
  452. eba5afa4 2026-08-03 auto-save: 2026-08-03T23:28:09 (3 files) — data/markets.json data/news.json data/ticker.json
  453. 3051b04d 2026-08-03 auto-save: 2026-08-03T22:57:59 (3 files) — data/markets.json data/news.json data/ticker.json
  454. ada2a948 2026-08-03 auto-save: 2026-08-03T22:27:49 (3 files) — data/markets.json data/news.json data/ticker.json
  455. 9b33c2ba 2026-08-03 auto-save: 2026-08-03T21:57:39 (3 files) — data/markets.json data/news.json data/ticker.json
  456. 8a9579b1 2026-08-03 auto-save: 2026-08-03T21:27:28 (3 files) — data/markets.json data/news.json data/ticker.json
  457. 0b31aebd 2026-08-03 auto-save: 2026-08-03T20:57:17 (3 files) — data/markets.json data/news.json data/ticker.json
  458. e03c639e 2026-08-03 auto-save: 2026-08-03T20:27:06 (3 files) — data/markets.json data/news.json data/ticker.json
  459. c5dd7c5d 2026-08-03 auto-save: 2026-08-03T19:56:54 (3 files) — data/markets.json data/news.json data/ticker.json
  460. a0813565 2026-08-03 auto-save: 2026-08-03T19:26:44 (3 files) — data/markets.json data/news.json data/ticker.json
  461. e14a01a5 2026-08-03 auto-save: 2026-08-03T18:56:31 (3 files) — data/markets.json data/news.json data/ticker.json
  462. 47e8c56b 2026-08-03 auto-save: 2026-08-03T18:26:20 (3 files) — data/markets.json data/news.json data/ticker.json
  463. 4955ddfe 2026-08-03 auto-save: 2026-08-03T17:56:09 (3 files) — data/markets.json data/news.json data/ticker.json
  464. 3374b4d1 2026-08-03 auto-save: 2026-08-03T17:25:58 (3 files) — data/markets.json data/news.json data/ticker.json
  465. cde04fc6 2026-08-03 auto-save: 2026-08-03T16:55:48 (3 files) — data/markets.json data/news.json data/ticker.json
  466. a535b65c 2026-08-03 auto-save: 2026-08-03T16:25:38 (3 files) — data/markets.json data/news.json data/ticker.json
  467. b9dd38ac 2026-08-03 auto-save: 2026-08-03T15:55:27 (3 files) — data/markets.json data/news.json data/ticker.json
  468. 1e214500 2026-08-03 auto-save: 2026-08-03T15:25:17 (3 files) — data/markets.json data/news.json data/ticker.json
  469. 30854617 2026-08-03 auto-save: 2026-08-03T14:55:07 (3 files) — data/markets.json data/news.json data/ticker.json
  470. 3f50968f 2026-08-03 auto-save: 2026-08-03T14:24:54 (3 files) — data/markets.json data/news.json data/ticker.json
  471. 6528480b 2026-08-03 auto-save: 2026-08-03T13:54:39 (3 files) — data/markets.json data/news.json data/ticker.json
  472. ebb5282c 2026-08-03 auto-save: 2026-08-03T13:24:27 (3 files) — data/markets.json data/news.json data/ticker.json
  473. 31dfdd91 2026-08-03 auto-save: 2026-08-03T12:54:16 (3 files) — data/markets.json data/news.json data/ticker.json
  474. 243eea12 2026-08-03 auto-save: 2026-08-03T12:23:59 (3 files) — data/markets.json data/news.json data/ticker.json
  475. 8a4971fc 2026-08-03 auto-save: 2026-08-03T11:53:46 (3 files) — data/markets.json data/news.json data/ticker.json
  476. 73283a53 2026-08-03 auto-save: 2026-08-03T11:23:33 (3 files) — data/markets.json data/news.json data/ticker.json
  477. 7291febb 2026-08-03 auto-save: 2026-08-03T10:53:14 (3 files) — data/markets.json data/news.json data/ticker.json
  478. af23c3e5 2026-08-03 auto-save: 2026-08-03T10:23:02 (3 files) — data/markets.json data/news.json data/ticker.json
  479. b8ac6f1f 2026-08-03 auto-save: 2026-08-03T09:52:50 (3 files) — data/markets.json data/news.json data/ticker.json
  480. 18e60284 2026-08-03 auto-save: 2026-08-03T09:22:36 (3 files) — data/markets.json data/news.json data/ticker.json
  481. 361d43e2 2026-08-03 auto-save: 2026-08-03T08:52:19 (3 files) — data/markets.json data/news.json data/ticker.json
  482. 99431571 2026-08-03 auto-save: 2026-08-03T08:22:05 (3 files) — data/markets.json data/news.json data/ticker.json
  483. c307d83a 2026-08-03 auto-save: 2026-08-03T07:51:47 (3 files) — data/markets.json data/news.json data/ticker.json
  484. 8ce703ea 2026-08-03 chore: v0.17.1 (session close — pinned-video merge)
  485. e7079af1 2026-08-03 auto-save: 2026-08-03T07:21:35 (3 files) — data/markets.json data/news.json data/ticker.json
  486. 49fe1fce 2026-08-03 auto-save: 2026-08-03T06:51:19 (3 files) — data/markets.json data/news.json data/ticker.json
  487. 9bd7674d 2026-08-03 auto-save: 2026-08-03T06:21:04 (3 files) — data/markets.json data/news.json data/ticker.json
  488. 6601aa74 2026-08-03 auto-save: 2026-08-03T05:50:52 (3 files) — data/markets.json data/news.json data/ticker.json
  489. 6d8a2e7c 2026-08-03 auto-save: 2026-08-03T05:20:38 (3 files) — data/markets.json data/news.json data/ticker.json
  490. 224067ca 2026-08-03 auto-save: 2026-08-03T04:50:22 (3 files) — data/markets.json data/news.json data/ticker.json
  491. bb1ad50e 2026-08-03 auto-save: 2026-08-03T04:20:12 (3 files) — data/markets.json data/news.json data/ticker.json
  492. 6f5ac63f 2026-08-03 auto-save: 2026-08-03T03:50:03 (3 files) — data/markets.json data/news.json data/ticker.json
  493. 755f8917 2026-08-03 auto-save: 2026-08-03T03:19:54 (3 files) — data/markets.json data/news.json data/ticker.json
  494. 49dbb2f3 2026-08-03 auto-save: 2026-08-03T02:49:45 (3 files) — data/markets.json data/news.json data/ticker.json
  495. b9bf9688 2026-08-03 auto-save: 2026-08-03T02:19:36 (3 files) — data/markets.json data/news.json data/ticker.json
  496. f724a570 2026-08-03 auto-save: 2026-08-03T01:49:27 (3 files) — data/markets.json data/news.json data/ticker.json
  497. c7ff26db 2026-08-03 auto-save: 2026-08-03T01:19:18 (3 files) — data/markets.json data/news.json data/ticker.json
  498. 55c36fd4 2026-08-03 auto-save: 2026-08-03T00:49:10 (3 files) — data/markets.json data/news.json data/ticker.json
  499. 0acd0dd0 2026-08-03 auto-save: 2026-08-03T00:19:00 (3 files) — data/markets.json data/news.json data/ticker.json
  500. a548c31f 2026-08-02 auto-save: 2026-08-02T23:48:52 (3 files) — data/markets.json data/news.json data/ticker.json
  501. 2d599f5e 2026-08-02 auto-save: 2026-08-02T23:18:42 (3 files) — data/markets.json data/news.json data/ticker.json
  502. 97fcbc97 2026-08-02 auto-save: 2026-08-02T22:48:33 (3 files) — data/markets.json data/news.json data/ticker.json
  503. bd558c0c 2026-08-02 auto-save: 2026-08-02T22:18:24 (3 files) — data/markets.json data/news.json data/ticker.json
  504. 0359d376 2026-08-02 auto-save: 2026-08-02T21:48:15 (3 files) — data/markets.json data/news.json data/ticker.json
  505. 77db6b36 2026-08-02 auto-save: 2026-08-02T21:18:05 (3 files) — data/markets.json data/news.json data/ticker.json
  506. a13eb32c 2026-08-02 auto-save: 2026-08-02T20:47:56 (3 files) — data/markets.json data/news.json data/ticker.json
  507. b6999867 2026-08-02 auto-save: 2026-08-02T20:17:45 (3 files) — data/markets.json data/news.json data/ticker.json
  508. 196da353 2026-08-02 auto-save: 2026-08-02T19:47:35 (3 files) — data/markets.json data/news.json data/ticker.json
  509. 8375564d 2026-08-02 auto-save: 2026-08-02T19:17:27 (3 files) — data/markets.json data/news.json data/ticker.json
  510. 67fca9ee 2026-08-02 auto-save: 2026-08-02T18:47:17 (3 files) — data/markets.json data/news.json data/ticker.json
  511. 8d54e682 2026-08-02 auto-save: 2026-08-02T18:17:08 (3 files) — data/markets.json data/news.json data/ticker.json
  512. 885dd11b 2026-08-02 auto-save: 2026-08-02T17:46:59 (3 files) — data/markets.json data/news.json data/ticker.json
  513. 98ccc9fa 2026-08-02 auto-save: 2026-08-02T17:16:50 (3 files) — data/markets.json data/news.json data/ticker.json
  514. 4147b814 2026-08-02 auto-save: 2026-08-02T16:46:41 (3 files) — data/markets.json data/news.json data/ticker.json
  515. a0df8a7e 2026-08-02 auto-save: 2026-08-02T16:16:32 (3 files) — data/markets.json data/news.json data/ticker.json
  516. 2aeff9fa 2026-08-02 auto-save: 2026-08-02T15:46:24 (3 files) — data/markets.json data/news.json data/ticker.json
  517. 7476a304 2026-08-02 auto-save: 2026-08-02T15:16:13 (3 files) — data/markets.json data/news.json data/ticker.json
  518. ea300adb 2026-08-02 auto-save: 2026-08-02T14:46:02 (3 files) — data/markets.json data/news.json data/ticker.json
  519. 82912bea 2026-08-02 auto-save: 2026-08-02T14:15:51 (3 files) — data/markets.json data/news.json data/ticker.json
  520. e2f512cf 2026-08-02 auto-save: 2026-08-02T13:45:41 (3 files) — data/markets.json data/news.json data/ticker.json
  521. 1c672b1a 2026-08-02 auto-save: 2026-08-02T13:15:28 (3 files) — data/markets.json data/news.json data/ticker.json
  522. e92ff481 2026-08-02 auto-save: 2026-08-02T12:45:17 (3 files) — data/markets.json data/news.json data/ticker.json
  523. 715b846e 2026-08-02 auto-save: 2026-08-02T12:15:06 (3 files) — data/markets.json data/news.json data/ticker.json
  524. 13771e96 2026-08-02 auto-save: 2026-08-02T11:44:56 (3 files) — data/markets.json data/news.json data/ticker.json
  525. d7d51b51 2026-08-02 auto-save: 2026-08-02T11:14:47 (3 files) — data/markets.json data/news.json data/ticker.json
  526. 768e4db0 2026-08-02 auto-save: 2026-08-02T10:44:36 (3 files) — data/markets.json data/news.json data/ticker.json
  527. 1bb829a6 2026-08-02 auto-save: 2026-08-02T10:14:26 (3 files) — data/markets.json data/news.json data/ticker.json
  528. 2d625f11 2026-08-02 auto-save: 2026-08-02T09:44:11 (3 files) — data/markets.json data/news.json data/ticker.json
  529. af424410 2026-08-02 auto-save: 2026-08-02T09:14:01 (3 files) — data/markets.json data/news.json data/ticker.json
  530. ba4cb3e1 2026-08-02 auto-save: 2026-08-02T08:43:50 (3 files) — data/markets.json data/news.json data/ticker.json
  531. 42cc2470 2026-08-02 auto-save: 2026-08-02T08:13:37 (3 files) — data/markets.json data/news.json data/ticker.json
  532. 912bb887 2026-08-02 auto-save: 2026-08-02T07:43:26 (3 files) — data/markets.json data/news.json data/ticker.json
  533. d2117c9e 2026-08-02 auto-save: 2026-08-02T07:13:15 (3 files) — data/markets.json data/news.json data/ticker.json
  534. 2b137e04 2026-08-02 harden(review): coerce id in openVideo find so /review?play=<id> deep-link survives numeric-vs-string api ids (flagged in /cs, parallel session now idle)
  535. b1e2d8e8 2026-08-02 auto-save: 2026-08-02T06:43:03 (3 files) — data/markets.json data/news.json data/ticker.json
  536. 41d0de37 2026-08-02 auto-save: 2026-08-02T06:12:47 (3 files) — data/markets.json data/news.json data/ticker.json
  537. 3d563e69 2026-08-02 auto-save: 2026-08-02T05:42:34 (3 files) — data/markets.json data/news.json data/ticker.json
  538. 0ba9baa4 2026-08-02 auto-save: 2026-08-02T05:12:23 (3 files) — data/markets.json data/news.json data/ticker.json
  539. 1b868b30 2026-08-02 auto-save: 2026-08-02T04:42:12 (3 files) — data/markets.json data/news.json data/ticker.json
  540. 4927808c 2026-08-02 auto-save: 2026-08-02T04:12:02 (3 files) — data/markets.json data/news.json data/ticker.json
  541. 1920e4e5 2026-08-02 auto-save: 2026-08-02T03:41:50 (3 files) — data/markets.json data/news.json data/ticker.json
  542. 5f8dda93 2026-08-02 auto-save: 2026-08-02T03:11:39 (3 files) — data/markets.json data/news.json data/ticker.json
  543. 6e63c468 2026-08-02 auto-save: 2026-08-02T02:41:29 (3 files) — data/markets.json data/news.json data/ticker.json
  544. 947eabf5 2026-08-02 auto-save: 2026-08-02T02:11:19 (3 files) — data/markets.json data/news.json data/ticker.json
  545. 28df6c09 2026-08-02 auto-save: 2026-08-02T01:41:08 (3 files) — data/markets.json data/news.json data/ticker.json
  546. a12e5a6c 2026-08-02 auto-save: 2026-08-02T01:10:57 (3 files) — data/markets.json data/news.json data/ticker.json
  547. 0105f071 2026-08-02 auto-save: 2026-08-02T00:40:47 (3 files) — data/markets.json data/news.json data/ticker.json
  548. 9ef999a7 2026-08-02 auto-save: 2026-08-02T00:10:36 (3 files) — data/markets.json data/news.json data/ticker.json
  549. 2425b1f5 2026-08-01 auto-save: 2026-08-01T23:40:26 (3 files) — data/markets.json data/news.json data/ticker.json
  550. 82d912bb 2026-08-01 auto-save: 2026-08-01T23:10:15 (3 files) — data/markets.json data/news.json data/ticker.json
  551. 7ab66d57 2026-08-01 auto-save: 2026-08-01T22:40:01 (3 files) — data/markets.json data/news.json data/ticker.json
  552. 6fe9e4da 2026-08-01 rentv (main): href-to-deeper-data on the news feed — LOCAL only, deploy Steve-gated (TK-10126)
  553. 10699fc9 2026-08-01 auto-save: 2026-08-01T22:09:48 (4 files) — data/markets.json data/news.json data/ticker.json package-lock.json
  554. 08f037e3 2026-08-01 chore: v0.17.0 — social presence surfaced (admin /social + front-page Follow footer) (session close)
  555. 95353a69 2026-08-01 auto-save: 2026-08-01T21:39:39 (3 files) — data/markets.json data/news.json data/ticker.json
  556. 5bd2ea93 2026-08-01 auto-save: 2026-08-01T21:09:29 (3 files) — data/markets.json data/news.json data/ticker.json
  557. 8fc7f6ff 2026-08-01 feat(front-page): add 'Follow RENTV' footer column (Instagram/Facebook/LinkedIn) per Steve override of DTD-A
  558. b65dd53a 2026-08-01 auto-save: 2026-08-01T20:39:19 (3 files) — data/markets.json data/news.json data/ticker.json
  559. 0dd48061 2026-08-01 chore(deploy): protect prod-owned data/social-drafts.json from rsync --delete clobber
  560. c93c877e 2026-08-01 auto-save: 2026-08-01T19:38:57 (1 files) — docs/heygen-brandfilm-scripts.DRAFT.md
  561. fa3ecbc9 2026-08-01 feat(review): /review?play=<id> deep-link auto-opens a video's in-app modal; /social featured clip now drills to the SPECIFIC video (Cody gate: drill to record not firehose)
  562. 148ec5fb 2026-08-01 chore(rentv): stage Vimeo auto-refresh launchd plist (gated install)
  563. fea33005 2026-08-01 fix(social): featured video drills to in-app /review, not rentvreview.com link-out (RENTV no-link-out + href-drill HARD rules)
  564. c88d6e4f 2026-08-01 chore(social): note no X account per Steve; Instagram + featured video stay admin-only
  565. ed30a7bf 2026-08-01 review: pin video 3103 (Steven Bloom / RenTV founder) into The REview library
  566. cf61759d 2026-08-01 feat(social): add Instagram + featured RENTV Review video to /social; new 'RENTV on the Web' section
  567. 871a02b4 2026-08-01 chore: lint (py with-context), refactor (Invalid-Date guard, magic-number doc), v0.16.0 (session close)
  568. c06e94ce 2026-07-31 fix(metros): metro deal items drill to the specific deal (/news/:id), not generic /deals
  569. 4e674a28 2026-07-31 fix(watchlist): deal cards drill to the specific deal (/news/:id), not the generic /deals list
  570. afcf869a 2026-07-31 feat(watchlist): add sort + density to the deal watchlist grid (HARD-rule compliance)
  571. b4f52715 2026-07-31 auto-save: 2026-07-31T16:29:30 (1 files) — public/watchlist.html
  572. fccef3ba 2026-07-31 feat(deals): add sort + density controls to the CRE deal grid (HARD-RULE compliance)
  573. 7f6b537b 2026-07-31 fix(social): harden Vimeo refresh — empty-result guard + atomic write so a bad cron run can't clobber the deploy-protected library
  574. d3c7c5c9 2026-07-31 chore(social): daily prod cron to auto-refresh Vimeo library + protect it from deploy clobber (v0.15.1)
  575. 35320f6b 2026-07-31 feat(social): full Vimeo catalog (123 videos via viewer-JWT pagination) + reusable pull-vimeo-library.py refresh
  576. eda14bfa 2026-07-31 feat(social): RENTV Video Library panel — 60 Vimeo CRE Talk assets (localized thumbs, sort/filter/density, copy-link/embed/draft-post) (v0.15.0)
  577. d55d5b82 2026-07-31 feat(social): use Boomer's dedicated VO clone (EoZqhGRrFYVEnxL4P2So) as studio voice; archive VO sample (v0.14.0)
  578. 8bf8de3f 2026-07-31 fix(social): cross-platform fonts (DejaVu/Liberation fallback) + robust ElevenLabs key resolution for Kamatera prod (v0.13.1)
  579. 8336bfb8 2026-07-31 feat(social): article→video studio — Boomer-voiced 5/15/30s teasers from live rentv.com headlines (v0.13.0)
  580. 1e7f9942 2026-07-31 chore: v0.12.0 (session close — RENTV Growth console + realestate licensed-targets platform)
  581. 8eff89bc 2026-07-31 chore: v0.10.0 → v0.11.0 (session close — licensed-CRE console + realestate integration)
  582. 749d9773 2026-07-31 console: surface existing phone/website (60,861 contractors have phone) as tel/site links + CSV export + fix Los Angeles→Greater LA market-map bug
  583. 7a41e57b 2026-07-31 console: split 'Title & Escrow' facet → Escrow (registry-backed, 967) + Title (honest LinkedIn lens, no title data) — DTD contrarian fix so the label never overpromises
  584. b76ca06b 2026-07-31 yoloforever: DTD-C punch-list COMPLETE (triage scoped, outreach proven end-to-end to provider-draft, send gated); loop retired
  585. 2413bbdd 2026-07-30 yoloforever ledger: autonomous tick — state-aware gate shipped (AZ first-class, passes); 2 items held for Steve
  586. 0bad92c3 2026-07-30 pr-intelligence: state-aware quality gate (stateGate(state)) — Arizona now a first-class gate/dashboard number; /api/pr/gate/check?state=AZ; californiaGate() back-compat wrapper; test (30/30). DTD-C punch-list item 2.
  587. cf8d9dc2 2026-07-30 yoloforever: cycle 7 ledger — AZ coverage 81%, name gate hardened; both states verified >70% after honest junk sweep
  588. 14d950ab 2026-07-30 pr-intelligence: c7 structural name rule — trailing role/category noun ⇒ title not name (kills 'Utilities Field Inspector' class without word-chasing)
  589. 7b2724ce 2026-07-30 yoloforever: cycle 6 ledger — Arizona Phase 2 bootstrapped (116 orgs/265 people), multi-state dedupe fixed
  590. 6993ec48 2026-07-30 pr-intelligence: Cody c6 — multi-state geo merge on exact-domain match (national firms gain AZ footprint instead of dropping it, audited)
  591. 312a68db 2026-07-30 console: add Developers facet → realestate (usre proxy + AZ DRE, 9830 devs); realestate now 74,350 targets across 5 roles
  592. 9166e347 2026-07-30 pr-intelligence: headless tool state-parametrized (PR_STATE, per-org state_presence)
  593. 2ed7c872 2026-07-30 pr-intelligence: Arizona Phase-2 seed (67 real AZ CRE orgs, gate-guarded) + pr:seed:az script
  594. 13b6880c 2026-07-30 console: /api/summit/licensed (realestate DB) + facet wiring — title/escrow/contractor/lender/attorney load real licensed names, grounded letters
  595. 2d3f9477 2026-07-30 yoloforever: 🎯 CALIFORNIA QUALITY GATE PASSED (71% coverage, bank-excluded scope) — Arizona unlocked, Phase 2 parked for Steve
  596. f08f88a2 2026-07-30 pr-intelligence: headless tool skips coverage-excluded org types (non-bank targeting)
  597. bc9f1e63 2026-07-30 pr-intelligence: coverage-scope exclusion (Steve — skip bank/credit_union from gate denominator, dashboard no-PR count, gap report); configurable via coverage_exclude_types setting + Settings UI; migration 003
  598. 4a1cb2d0 2026-07-30 yoloforever: cycle 4 ledger — SHIP-AND-PAUSE; public-channel saturation reached, FDIC lever disproven, loop paused pending a Steve-gated next-lever
  599. bd17052e 2026-07-30 social console F1: Role×Market×Sector facet builder — composes LinkedIn search, honest registry✓ vs lens tag, pin segment, load real names from CA-metro registry
  600. 3db0aeaf 2026-07-30 social console: /api/firm/:id proxy + firm→people drilldown, role icons on rows, RENTV-menu-grounded offer letters (real events/prices/contact)
  601. aed80d09 2026-07-30 pr-intelligence: Cody c4 — person.rejected audit logging, company-suffix HARD words, senior-title→leadership dept default; 28 industry associations added (Steve-directed)
  602. eaccaf1f 2026-07-30 role icons: 13-icon SVG vocabulary for all CRE user/role types + /role-icons preview page
  603. 835146a0 2026-07-30 social: collapsible left Growth·LinkedIn target rail — CRE conference-attendee roles + registry pull + per-name letter generator
  604. 47c8ac14 2026-07-30 pr-intelligence: cycle-4 extractor upgrades — single-line Name,Title parsing; common bank-path probes + two-hop about crawl in headless tool
  605. 6ffb2d7c 2026-07-30 yoloforever: cycle 3 ledger (SHIP 3/3 local)
  606. b3dfe478 2026-07-30 pr-intelligence: Cody c3 — two-tier name predicate (HARD title/product words reject anywhere; SOFT filler needs all-tokens), 16/16 known junk rejected, 10/10 real names pass
  607. d37f9138 2026-07-30 pr-intelligence: headless team-page extractor (local Playwright → audited prod API), ranked leadership-first link selection; name-gate stoplist extended with UI verb+noun leaks
  608. cf59aa53 2026-07-30 yoloforever: cycle 2 ledger (SHIP 5/5); local-models directive recorded
  609. 41924b74 2026-07-30 pr-intelligence: Cody-gate c2 fixes — isLikelyPersonName chokepoint gate in people.create (+manual override), press-contact name/label swap-fix, caller guards, periodic stale-claim recovery (5min), comms-only coverage lens on gate
  610. 284c46a9 2026-07-30 pr-intelligence: press-contact extractor — RSS-first release discovery (JS-rendered newsrooms), contact-block parser; discover-press-contacts job; registry orgs auto-queue verification
  611. 67f5fba7 2026-07-30 people UI: stacked Public info column (email/LinkedIn/phone/address/notes each on its own line) + editable notes in drawer; list API exposes office_location+notes
  612. 3976b916 2026-07-30 yoloforever: cycle 1 ledger (SHIP 5/5)
  613. a52862d9 2026-07-30 pr-intelligence: Cody-gate fixes — hard search-query budget + persistent spend counter (dashboard-visible), durable convergence-controller job (race-free sweep-dryness via audit actor, logged stop reasons)
  614. 8ed15735 2026-07-30 pr-intelligence: full HTML-entity decode in extraction paths (ndash/mdash/8217); yoloforever c1 data-quality pass
  615. 1bcdcd8d 2026-07-30 pr-intelligence: alias-qualify all whole-row reads (fleet pre-deploy lint: no bare SELECT *)
  616. fbe5b696 2026-07-30 pr-intelligence: discover-people-linkedin job + adapter (permitted site:linkedin.com/in public-index query) — closes the contact-coverage gap; candidates stored search_indexed/found_uncorroborated
  617. 697cc25b 2026-07-30 growth: add 7 concrete conference lead-gen tactics to the RENTV growth board
  618. 57c7ec07 2026-07-30 rentv/forsale: re-attribute outreach to Steven Bloom (RENTV founder/CEO, ex-C&W) + Cushman warm-intro angle
  619. fb013dc7 2026-07-30 auto-save: 2026-07-30T14:48:53 (1 files) — docs/FORSALE-OUTREACH.md
  620. b0bc9e51 2026-07-30 rentv/forsale: set suggested ad rate card + add sublease.com competitive-process outreach pack (prep-only)
  621. eb15d0a9 2026-07-30 rentv: add /forsale admin board — assets + known-advertiser prospect pipeline + sublease.com sale (DTD time-boxed LATER)
  622. 69355a23 2026-07-30 pr-intelligence: operator review pass (256 orgs verified on evidence), gate dedupe check counts run-level dedupe, NUL-strip at fetch boundary; final verification green (28/28 tests)
  623. 3317fa1c 2026-07-30 pr-intelligence: website adapter — stopword guard against nav-heading false positives in team-page extraction
  624. eea88b78 2026-07-30 pr-intelligence: docs (data-sources, research-ops, email-setup, compliance, admin-guide), .env.example, Playwright browser-test scaffolds
  625. d0589dad 2026-07-30 pr-intelligence: CA seed (178 curated + FDIC registry), unit+integration tests (28 passing), merge NULL-array fix, FDIC API host update
  626. 762a11ea 2026-07-30 pr-intelligence: mount /api/pr/* + /admin/pr-intelligence shells; 12-page admin workspace (dashboard, research, orgs, people, 3-col review, campaigns, letter builder, inbox, tasks, sources, runs, settings)
  627. 7a3217d0 2026-07-30 auto-save: 2026-07-30T11:17:19 (4 files) — package.json server.js public/admin/pr-intelligence/ src/pr/index.js
  628. 14c23d86 2026-07-30 pr-intelligence: lib (geo/taxonomy/normalize/dedupe/scoring/status), services, adapters, job queue + worker
  629. 459558da 2026-07-30 pr-intelligence: plan doc, isolated pg layer (rentv_pr), schema + seed-config migrations
  630. fecb50bb 2026-07-30 auto-save: 2026-07-30T10:47:06 (1 files) — docs/
  631. 07c5e2f9 2026-07-29 Front page: move Deal Wire video row to the top (above Market Pulse)
  632. 4e43e75d 2026-07-29 Fix news narrations: strip fabricated 'reported first' claims + invented market commentary (contrarian gate → DTD FIX-THEN-SHIP)
  633. 45440dc5 2026-07-29 Deal Wire: add 2 newest rentv.com stories (Longpoint AZ industrial, Santa Monica multifamily) — front page + library
  634. d216c648 2026-07-29 chore: v0.10.0 (session close — front-page Deal Wire video row, cache-bust, 11 news videos)
  635. 762628be 2026-07-29 All 4 Sublease promos now real lip-synced talking-Boomer (15/30/60 rendered on funded wallet)
  636. 5fec1971 2026-07-29 Extend Deal Wire to 11 news videos (5 more rentv.com stories) on front page + library
  637. 6d664788 2026-07-29 Front page: add Deal Wire Video row (6 news videos, public /vid path)
  638. 5dd7950a 2026-07-29 Add 6 RENTV News deal-wire videos (latest rentv.com stories, cloned voice, no music)
  639. c674d281 2026-07-29 rentv: harden Desk backend proxies (contrarian fixes)
  640. a32a5225 2026-07-29 rentv Desk: fuller default loads for New Homes + Commercial
  641. d4310389 2026-07-29 rentv Desk: add Commercial scope (crcp LA commercial-RE CRM) + durable crcp cred
  642. 1caab77d 2026-07-29 5s Sublease promo: real lip-synced talking-Boomer avatar (face-cropped from rentv.com headshot)
  643. 940fdce8 2026-07-29 Add Sublease × RENTV promos (5/15/30/60s, Boomer photo, Steve voice) to press library
  644. 116662d3 2026-07-29 Master Reel + Walkthrough updated with deep growth section; add Growth Engine deep-dive film
  645. 482ee13d 2026-07-29 rentv Desk: add New Homes scope (homesonspec spec-home inventory)
  646. 3c12ff4c 2026-07-29 rentv: proxy homesonspec + crcp backends into the admin Desk
  647. 689e1cd6 2026-07-29 Replace build slideshow with full front+backend walkthrough (deep every-screen narration, wall-to-wall Steve voice, no music)
  648. 0c99aca6 2026-07-29 RENTV: add admin login boomer for rentv.agentabrams.com
  649. 7d6069af 2026-07-29 press library: cache-bust videos.json fetch so new films appear without hard-refresh
  650. 6649775d 2026-07-29 Add RENTV build slideshow presentation (Steve voice, HyperFrames) to press library
  651. 6d46d5c4 2026-07-28 Master Reel: brighten+lift music bed so gaps carry on laptop/phone speakers (bass-rolloff fix); small-speaker audit clean
  652. d4c5df3f 2026-07-28 Move LA Commercial + market-pulse sections to admin-only (APIs, page shells, nav links, search)
  653. d9294f44 2026-07-28 Master Reel: replace bed with crossfade-looped real music (fix loop-seam silence); continuous audio verified whole-file
  654. 935c3ffa 2026-07-28 Master Reel: mix continuous ducked music bed under narration (kill dead-silence pan-gaps), re-mux fixed audio
  655. 6feeb395 2026-07-28 Fix: person/sign-in icon opens the menu drawer instead of jarring redirect to /subscribe (index + desk)
  656. dcf6c8c9 2026-07-28 Master Reel: LONG detailed cut (14.3min, full-page slow pans, Steve voice + ambient bed, 20s real-avatar Boomer intro)
  657. 55f6f843 2026-07-28 Master Reel: rebuilt Boomer walkthrough (recap-v2 expanded to 22 scenes, current-site captures, Steve cloned voice throughout, 20s real-avatar PIP intro)
  658. 99237b79 2026-07-28 Restore original 15.8-min detailed Master Reel (was wrongly replaced); keep short montage as Sizzle Reel
  659. eb831aaa 2026-07-28 Pitch films rebuilt: Growth/Deep-Dive/SWOT/Ad-Plan (current data, Steve voice, 15s real-avatar PIP intro) replace stale July set
  660. 76148e6f 2026-07-28 Master Reel: real bearded-Steve avatar PIP (current data) replaces stale July reel
  661. b10b0ae5 2026-07-28 Video Library: add 18 Component Videos (each feature/tool, Steve cloned voice) — 41 videos total
  662. e9c26f23 2026-07-28 Add professional full-width site footer (front-end pages)
  663. 9f5655f8 2026-07-28 Video Library: refresh walkthrough with clean-header captures (no top tabs, hamburger UL + person UR)
  664. d83ecd5c 2026-07-28 Admin: add Social Media command center at /social (LinkedIn-forward, draft-only)
  665. c7d9db4c 2026-07-28 Video Library: voiced walkthrough (Steve cloned VO) + created date/time on every card
  666. 4ae1c769 2026-07-28 Video Library: add RENTV full-site walkthrough as lead Feature Film (23 videos)
  667. 11ac5376 2026-07-28 Complete consulting fold: rewrite /portal/* asset paths -> /consulting/* in portal.html
  668. 9df21f11 2026-07-28 Admin Video Library: gather all RENTV films/walkthroughs/recaps into /press (22 videos)
  669. d2865684 2026-07-28 Add Front End <-> Backend toggle: site-wide injected widget + /backend admin hub
  670. 6660ab36 2026-07-28 Fold /consulting dynamic API inline (intake + admin buckets), admin-only, namespaced under /consulting/api/*
  671. 0dfdf6c3 2026-07-28 Unify RENTV: two-tier user/admin auth + fold consulting (/consulting) & promos (/press); rename rentv-v1 -> rentv (v0.9.0)
  672. f2f1c0a7 2026-07-28 auto-save: 2026-07-28T09:59:38 (3 files) — data/markets.json data/news.json data/ticker.json
  673. b3291f14 2026-07-28 auto-save: 2026-07-28T09:29:05 (3 files) — data/markets.json data/news.json data/ticker.json
  674. e19a7651 2026-07-28 auto-save: 2026-07-28T08:58:52 (3 files) — data/markets.json data/news.json data/ticker.json
  675. e9aea1bc 2026-07-28 auto-save: 2026-07-28T08:28:39 (3 files) — data/markets.json data/news.json data/ticker.json
  676. a9b66119 2026-07-28 auto-save: 2026-07-28T07:58:26 (3 files) — data/markets.json data/news.json data/ticker.json
  677. 0d5caece 2026-07-28 auto-save: 2026-07-28T07:28:16 (3 files) — data/markets.json data/news.json data/ticker.json
  678. 2936fe0f 2026-07-28 auto-save: 2026-07-28T06:58:06 (3 files) — data/markets.json data/news.json data/ticker.json
  679. fcf9d715 2026-07-28 auto-save: 2026-07-28T06:27:56 (3 files) — data/markets.json data/news.json data/ticker.json
  680. e56d37a4 2026-07-28 auto-save: 2026-07-28T05:57:47 (3 files) — data/markets.json data/news.json data/ticker.json
  681. c2c9ea36 2026-07-28 auto-save: 2026-07-28T05:27:36 (3 files) — data/markets.json data/news.json data/ticker.json
  682. bf4d0fc1 2026-07-28 auto-save: 2026-07-28T04:57:26 (3 files) — data/markets.json data/news.json data/ticker.json
  683. fe00f3d1 2026-07-28 auto-save: 2026-07-28T04:27:17 (3 files) — data/markets.json data/news.json data/ticker.json
  684. e8ae5a31 2026-07-28 auto-save: 2026-07-28T03:57:08 (3 files) — data/markets.json data/news.json data/ticker.json
  685. 2d81b56a 2026-07-28 auto-save: 2026-07-28T03:26:56 (3 files) — data/markets.json data/news.json data/ticker.json
  686. e946bd14 2026-07-28 auto-save: 2026-07-28T02:56:47 (3 files) — data/markets.json data/news.json data/ticker.json
  687. 7b50f7c5 2026-07-28 auto-save: 2026-07-28T02:26:37 (3 files) — data/markets.json data/news.json data/ticker.json
  688. b3f7954f 2026-07-28 auto-save: 2026-07-28T01:56:27 (3 files) — data/markets.json data/news.json data/ticker.json
  689. 65170356 2026-07-28 auto-save: 2026-07-28T01:26:17 (3 files) — data/markets.json data/news.json data/ticker.json
  690. a283d16d 2026-07-28 auto-save: 2026-07-28T00:56:07 (3 files) — data/markets.json data/news.json data/ticker.json
  691. 0f640a22 2026-07-28 auto-save: 2026-07-28T00:25:56 (3 files) — data/markets.json data/news.json data/ticker.json
  692. 2c4b3044 2026-07-27 auto-save: 2026-07-27T23:55:46 (3 files) — data/markets.json data/news.json data/ticker.json
  693. 875ab59e 2026-07-27 auto-save: 2026-07-27T23:25:34 (3 files) — data/markets.json data/news.json data/ticker.json
  694. 496afdfb 2026-07-27 auto-save: 2026-07-27T22:55:20 (3 files) — data/markets.json data/news.json data/ticker.json
  695. 5f2cf8f8 2026-07-27 auto-save: 2026-07-27T22:25:06 (3 files) — data/markets.json data/news.json data/ticker.json
  696. 0a1a872c 2026-07-27 auto-save: 2026-07-27T21:54:54 (3 files) — data/markets.json data/news.json data/ticker.json
  697. 36d4bea1 2026-07-27 auto-save: 2026-07-27T21:24:43 (3 files) — data/markets.json data/news.json data/ticker.json
  698. f3679336 2026-07-27 auto-save: 2026-07-27T20:54:34 (3 files) — data/markets.json data/news.json data/ticker.json
  699. 528c78ef 2026-07-27 auto-save: 2026-07-27T20:24:23 (3 files) — data/markets.json data/news.json data/ticker.json
  700. 82af5c61 2026-07-27 auto-save: 2026-07-27T19:54:12 (3 files) — data/markets.json data/news.json data/ticker.json
  701. 209979f2 2026-07-27 auto-save: 2026-07-27T19:23:22 (3 files) — data/markets.json data/news.json data/ticker.json
  702. 71108395 2026-07-27 auto-save: 2026-07-27T18:53:10 (3 files) — data/markets.json data/news.json data/ticker.json
  703. 8da8f9db 2026-07-27 auto-save: 2026-07-27T18:22:43 (3 files) — data/markets.json data/news.json data/ticker.json
  704. a0b4bfda 2026-07-27 auto-save: 2026-07-27T17:52:34 (3 files) — data/markets.json data/news.json data/ticker.json
  705. f5781deb 2026-07-27 auto-save: 2026-07-27T17:22:24 (3 files) — data/markets.json data/news.json data/ticker.json
  706. 0abdf539 2026-07-27 auto-save: 2026-07-27T16:52:13 (3 files) — data/markets.json data/news.json data/ticker.json
  707. 76beed96 2026-07-27 auto-save: 2026-07-27T16:21:58 (3 files) — data/markets.json data/news.json data/ticker.json
  708. 29080baa 2026-07-27 auto-save: 2026-07-27T15:51:48 (3 files) — data/markets.json data/news.json data/ticker.json
  709. 7e9266d8 2026-07-27 auto-save: 2026-07-27T15:21:37 (3 files) — data/markets.json data/news.json data/ticker.json
  710. 7d577c00 2026-07-27 auto-save: 2026-07-27T14:51:27 (3 files) — data/markets.json data/news.json data/ticker.json
  711. 56b5b42d 2026-07-27 rentv-v1: reconcile pull-news.mjs to prod authority (revert redundant 0b6f1d1 pull-markets import)
  712. 9ab56265 2026-07-27 auto-save: 2026-07-27T14:21:14 (3 files) — data/markets.json data/news.json data/ticker.json
  713. 0fc1e27d 2026-07-27 auto-save: 2026-07-27T13:51:03 (3 files) — data/markets.json data/news.json data/ticker.json
  714. 11ed87bb 2026-07-27 auto-save: 2026-07-27T13:20:51 (3 files) — data/markets.json data/news.json data/ticker.json
  715. 8ac7ec7a 2026-07-27 auto-save: 2026-07-27T12:50:40 (3 files) — data/markets.json data/news.json data/ticker.json
  716. dab16840 2026-07-27 auto-save: 2026-07-27T12:20:30 (3 files) — data/markets.json data/news.json data/ticker.json
  717. 2e2276fb 2026-07-27 auto-save: 2026-07-27T11:50:21 (3 files) — data/markets.json data/news.json data/ticker.json
  718. 8c154dcf 2026-07-27 auto-save: 2026-07-27T11:20:11 (3 files) — data/markets.json data/news.json data/ticker.json
  719. 365df92d 2026-07-27 auto-save: 2026-07-27T10:49:50 (3 files) — data/markets.json data/news.json data/ticker.json
  720. 9debc8d7 2026-07-27 auto-save: 2026-07-27T10:19:40 (3 files) — data/markets.json data/news.json data/ticker.json
  721. 4f5efcd5 2026-07-27 auto-save: 2026-07-27T09:49:31 (3 files) — data/markets.json data/news.json data/ticker.json
  722. 1f398b36 2026-07-27 auto-save: 2026-07-27T09:19:22 (3 files) — data/markets.json data/news.json data/ticker.json
  723. 3c0ac0e1 2026-07-27 auto-save: 2026-07-27T08:49:12 (3 files) — data/markets.json data/news.json data/ticker.json
  724. 9a5469be 2026-07-27 auto-save: 2026-07-27T08:19:05 (3 files) — data/markets.json data/news.json data/ticker.json
  725. eb4a3511 2026-07-27 auto-save: 2026-07-27T07:48:56 (3 files) — data/markets.json data/news.json data/ticker.json
  726. 6951a562 2026-07-27 auto-save: 2026-07-27T07:18:47 (3 files) — data/markets.json data/news.json data/ticker.json
  727. 0266f493 2026-07-27 auto-save: 2026-07-27T06:48:37 (3 files) — data/markets.json data/news.json data/ticker.json
  728. e4fb6cfa 2026-07-27 auto-save: 2026-07-27T06:18:28 (3 files) — data/markets.json data/news.json data/ticker.json
  729. e6f6aa59 2026-07-27 auto-save: 2026-07-27T05:48:20 (3 files) — data/markets.json data/news.json data/ticker.json
  730. 81ad68ab 2026-07-27 auto-save: 2026-07-27T05:18:10 (3 files) — data/markets.json data/news.json data/ticker.json
  731. a3528ddb 2026-07-27 auto-save: 2026-07-27T04:48:02 (3 files) — data/markets.json data/news.json data/ticker.json
  732. 337d37ba 2026-07-27 auto-save: 2026-07-27T04:17:53 (3 files) — data/markets.json data/news.json data/ticker.json
  733. a517cea3 2026-07-27 auto-save: 2026-07-27T03:47:45 (3 files) — data/markets.json data/news.json data/ticker.json
  734. 07d80f29 2026-07-27 auto-save: 2026-07-27T03:17:36 (3 files) — data/markets.json data/news.json data/ticker.json
  735. 8e4c0e11 2026-07-27 auto-save: 2026-07-27T02:47:28 (3 files) — data/markets.json data/news.json data/ticker.json
  736. d8ba53ef 2026-07-27 auto-save: 2026-07-27T02:17:19 (3 files) — data/markets.json data/news.json data/ticker.json
  737. d6ad58a1 2026-07-27 auto-save: 2026-07-27T01:47:10 (3 files) — data/markets.json data/news.json data/ticker.json
  738. 0183f091 2026-07-27 auto-save: 2026-07-27T01:17:03 (3 files) — data/markets.json data/news.json data/ticker.json
  739. c3742abf 2026-07-27 auto-save: 2026-07-27T00:46:55 (3 files) — data/markets.json data/news.json data/ticker.json
  740. 7d21bd55 2026-07-27 auto-save: 2026-07-27T00:16:47 (3 files) — data/markets.json data/news.json data/ticker.json
  741. a97a5413 2026-07-26 auto-save: 2026-07-26T23:46:40 (3 files) — data/markets.json data/news.json data/ticker.json
  742. db8c7b2f 2026-07-26 auto-save: 2026-07-26T23:16:32 (3 files) — data/markets.json data/news.json data/ticker.json
  743. 9860b438 2026-07-26 auto-save: 2026-07-26T22:46:25 (3 files) — data/markets.json data/news.json data/ticker.json
  744. 5db0bb47 2026-07-26 auto-save: 2026-07-26T22:16:17 (3 files) — data/markets.json data/news.json data/ticker.json
  745. 0cdc95cc 2026-07-26 auto-save: 2026-07-26T21:46:09 (3 files) — data/markets.json data/news.json data/ticker.json
  746. 9a14fb0f 2026-07-26 auto-save: 2026-07-26T21:15:59 (3 files) — data/markets.json data/news.json data/ticker.json
  747. 4b36afea 2026-07-26 auto-save: 2026-07-26T20:45:50 (3 files) — data/markets.json data/news.json data/ticker.json
  748. 0b6f1d1c 2026-07-26 rentv-v1: wire pull-markets into pull-news cron so /markets stays fresh (MARKETS-PATCH step 3)
  749. 567d67ef 2026-07-26 auto-save: 2026-07-26T20:15:38 (3 files) — data/markets.json data/news.json data/ticker.json
  750. 87c7b4f1 2026-07-26 auto-save: 2026-07-26T19:45:29 (3 files) — data/markets.json data/news.json data/ticker.json
  751. b2bd73bb 2026-07-26 auto-save: 2026-07-26T19:15:21 (3 files) — data/markets.json data/news.json data/ticker.json
  752. e572739d 2026-07-26 auto-save: 2026-07-26T18:45:13 (3 files) — data/markets.json data/news.json data/ticker.json
  753. 12be3d27 2026-07-26 auto-save: 2026-07-26T18:15:03 (3 files) — data/markets.json data/news.json data/ticker.json
  754. e4e7c9dd 2026-07-26 auto-save: 2026-07-26T17:44:55 (3 files) — data/markets.json data/news.json data/ticker.json
  755. 93277e04 2026-07-26 auto-save: 2026-07-26T17:14:46 (3 files) — data/markets.json data/news.json data/ticker.json
  756. 20b462e4 2026-07-26 auto-save: 2026-07-26T16:44:36 (3 files) — data/markets.json data/news.json data/ticker.json
  757. bdf3fe3a 2026-07-26 auto-save: 2026-07-26T16:14:26 (3 files) — data/markets.json data/news.json data/ticker.json
  758. 6bea8cc2 2026-07-26 auto-save: 2026-07-26T15:44:17 (3 files) — data/markets.json data/news.json data/ticker.json
  759. 9b4558f2 2026-07-26 auto-save: 2026-07-26T15:14:10 (3 files) — data/markets.json data/news.json data/ticker.json
  760. 1567aff5 2026-07-26 auto-save: 2026-07-26T14:44:02 (3 files) — data/markets.json data/news.json data/ticker.json
  761. 2ab2282f 2026-07-26 auto-save: 2026-07-26T14:13:54 (3 files) — data/markets.json data/news.json data/ticker.json
  762. 9cc6c257 2026-07-26 auto-save: 2026-07-26T13:43:45 (3 files) — data/markets.json data/news.json data/ticker.json
  763. 4a5f6231 2026-07-26 auto-save: 2026-07-26T13:13:36 (3 files) — data/markets.json data/news.json data/ticker.json
  764. ae31d737 2026-07-26 auto-save: 2026-07-26T12:43:27 (3 files) — data/markets.json data/news.json data/ticker.json
  765. fd5f9bff 2026-07-26 auto-save: 2026-07-26T12:13:19 (3 files) — data/markets.json data/news.json data/ticker.json
  766. 10242e77 2026-07-26 auto-save: 2026-07-26T11:43:10 (3 files) — data/markets.json data/news.json data/ticker.json
  767. fde74c09 2026-07-26 auto-save: 2026-07-26T11:13:01 (3 files) — data/markets.json data/news.json data/ticker.json
  768. f05a5c58 2026-07-26 auto-save: 2026-07-26T10:42:53 (3 files) — data/markets.json data/news.json data/ticker.json
  769. 052b12ff 2026-07-26 auto-save: 2026-07-26T10:12:44 (3 files) — data/markets.json data/news.json data/ticker.json
  770. 4e671a12 2026-07-26 auto-save: 2026-07-26T09:42:34 (3 files) — data/markets.json data/news.json data/ticker.json
  771. 05acce75 2026-07-26 auto-save: 2026-07-26T09:12:24 (3 files) — data/markets.json data/news.json data/ticker.json
  772. e33ce4f7 2026-07-26 auto-save: 2026-07-26T08:41:50 (3 files) — data/markets.json data/news.json data/ticker.json
  773. 4505a49e 2026-07-26 auto-save: 2026-07-26T08:11:40 (3 files) — data/markets.json data/news.json data/ticker.json
  774. 30075672 2026-07-26 auto-save: 2026-07-26T07:41:30 (3 files) — data/markets.json data/news.json data/ticker.json
  775. d2c4db94 2026-07-26 auto-save: 2026-07-26T07:11:20 (3 files) — data/markets.json data/news.json data/ticker.json
  776. 932114c5 2026-07-26 auto-save: 2026-07-26T06:41:11 (3 files) — data/markets.json data/news.json data/ticker.json
  777. 31fb8756 2026-07-26 auto-save: 2026-07-26T06:11:02 (3 files) — data/markets.json data/news.json data/ticker.json
  778. 6aa9fe19 2026-07-26 auto-save: 2026-07-26T05:40:54 (3 files) — data/markets.json data/news.json data/ticker.json
  779. 6bd6e759 2026-07-26 auto-save: 2026-07-26T05:10:45 (3 files) — data/markets.json data/news.json data/ticker.json
  780. 9b8a8a6b 2026-07-26 auto-save: 2026-07-26T04:40:35 (3 files) — data/markets.json data/news.json data/ticker.json
  781. 38da7deb 2026-07-26 auto-save: 2026-07-26T04:10:27 (3 files) — data/markets.json data/news.json data/ticker.json
  782. 637cd571 2026-07-26 auto-save: 2026-07-26T03:40:20 (3 files) — data/markets.json data/news.json data/ticker.json
  783. 5f9a9b46 2026-07-26 auto-save: 2026-07-26T03:10:13 (3 files) — data/markets.json data/news.json data/ticker.json
  784. 6198c372 2026-07-26 auto-save: 2026-07-26T02:40:05 (3 files) — data/markets.json data/news.json data/ticker.json
  785. 644c5c8b 2026-07-26 auto-save: 2026-07-26T02:09:57 (3 files) — data/markets.json data/news.json data/ticker.json
  786. 8b1563db 2026-07-26 auto-save: 2026-07-26T01:39:48 (3 files) — data/markets.json data/news.json data/ticker.json
  787. dc36adc1 2026-07-26 auto-save: 2026-07-26T01:09:40 (3 files) — data/markets.json data/news.json data/ticker.json
  788. baff5679 2026-07-26 auto-save: 2026-07-26T00:39:31 (3 files) — data/markets.json data/news.json data/ticker.json
  789. 78c51795 2026-07-26 auto-save: 2026-07-26T00:09:22 (3 files) — data/markets.json data/news.json data/ticker.json
  790. f5f6900f 2026-07-25 auto-save: 2026-07-25T23:39:14 (3 files) — data/markets.json data/news.json data/ticker.json
  791. 5d34cebd 2026-07-25 auto-save: 2026-07-25T23:09:06 (3 files) — data/markets.json data/news.json data/ticker.json
  792. 1995657b 2026-07-25 auto-save: 2026-07-25T22:38:58 (3 files) — data/markets.json data/news.json data/ticker.json
  793. e7922c9c 2026-07-25 auto-save: 2026-07-25T22:08:51 (3 files) — data/markets.json data/news.json data/ticker.json
  794. cd696c67 2026-07-25 auto-save: 2026-07-25T21:38:42 (3 files) — data/markets.json data/news.json data/ticker.json
  795. 0840144a 2026-07-25 auto-save: 2026-07-25T21:08:35 (3 files) — data/markets.json data/news.json data/ticker.json
  796. 3ca4bdfb 2026-07-25 auto-save: 2026-07-25T20:38:27 (3 files) — data/markets.json data/news.json data/ticker.json
  797. 97d5e1f8 2026-07-25 auto-save: 2026-07-25T20:08:18 (3 files) — data/markets.json data/news.json data/ticker.json
  798. 46bc1ac2 2026-07-25 auto-save: 2026-07-25T19:38:10 (3 files) — data/markets.json data/news.json data/ticker.json
  799. 2e3a247b 2026-07-25 auto-save: 2026-07-25T19:08:03 (3 files) — data/markets.json data/news.json data/ticker.json
  800. 8d11b70c 2026-07-25 auto-save: 2026-07-25T18:37:55 (3 files) — data/markets.json data/news.json data/ticker.json
  801. bb5f251f 2026-07-25 auto-save: 2026-07-25T18:07:45 (3 files) — data/markets.json data/news.json data/ticker.json
  802. fd8a5da2 2026-07-25 auto-save: 2026-07-25T17:37:37 (3 files) — data/markets.json data/news.json data/ticker.json
  803. 4d7dea26 2026-07-25 auto-save: 2026-07-25T17:07:29 (3 files) — data/markets.json data/news.json data/ticker.json
  804. 985db03c 2026-07-25 auto-save: 2026-07-25T16:37:21 (3 files) — data/markets.json data/news.json data/ticker.json
  805. 1bb6f42d 2026-07-25 auto-save: 2026-07-25T16:07:12 (3 files) — data/markets.json data/news.json data/ticker.json
  806. 98bafbca 2026-07-25 auto-save: 2026-07-25T15:37:05 (3 files) — data/markets.json data/news.json data/ticker.json
  807. 5baa7c7c 2026-07-25 auto-save: 2026-07-25T15:06:58 (3 files) — data/markets.json data/news.json data/ticker.json
  808. 87ef5747 2026-07-25 auto-save: 2026-07-25T14:36:51 (3 files) — data/markets.json data/news.json data/ticker.json
  809. 7bb14be1 2026-07-25 auto-save: 2026-07-25T14:06:43 (3 files) — data/markets.json data/news.json data/ticker.json
  810. a0d212ed 2026-07-25 auto-save: 2026-07-25T13:36:34 (3 files) — data/markets.json data/news.json data/ticker.json
  811. c4669a33 2026-07-25 auto-save: 2026-07-25T13:06:24 (3 files) — data/markets.json data/news.json data/ticker.json
  812. 37c9fce2 2026-07-25 auto-save: 2026-07-25T12:36:15 (3 files) — data/markets.json data/news.json data/ticker.json
  813. 83e43dd3 2026-07-25 auto-save: 2026-07-25T12:06:06 (3 files) — data/markets.json data/news.json data/ticker.json
  814. 878e39e9 2026-07-25 auto-save: 2026-07-25T11:35:57 (3 files) — data/markets.json data/news.json data/ticker.json
  815. 9eb66092 2026-07-25 auto-save: 2026-07-25T11:05:48 (3 files) — data/markets.json data/news.json data/ticker.json
  816. b314b353 2026-07-25 auto-save: 2026-07-25T10:35:38 (3 files) — data/markets.json data/news.json data/ticker.json
  817. a1d6961e 2026-07-25 auto-save: 2026-07-25T10:05:29 (3 files) — data/markets.json data/news.json data/ticker.json
  818. c4b16a29 2026-07-25 auto-save: 2026-07-25T09:35:20 (3 files) — data/markets.json data/news.json data/ticker.json
  819. 281581fc 2026-07-25 auto-save: 2026-07-25T09:05:11 (3 files) — data/markets.json data/news.json data/ticker.json
  820. 514c5a7c 2026-07-25 auto-save: 2026-07-25T08:35:01 (3 files) — data/markets.json data/news.json data/ticker.json
  821. 78bf7440 2026-07-25 auto-save: 2026-07-25T08:04:52 (3 files) — data/markets.json data/news.json data/ticker.json
  822. 0a8881ce 2026-07-25 auto-save: 2026-07-25T07:34:42 (3 files) — data/markets.json data/news.json data/ticker.json
  823. fd30fc67 2026-07-25 auto-save: 2026-07-25T07:04:29 (3 files) — data/markets.json data/news.json data/ticker.json
  824. 0da8c759 2026-07-25 auto-save: 2026-07-25T06:34:19 (3 files) — data/markets.json data/news.json data/ticker.json
  825. 30b61be4 2026-07-25 auto-save: 2026-07-25T06:04:08 (3 files) — data/markets.json data/news.json data/ticker.json
  826. 1584c151 2026-07-25 auto-save: 2026-07-25T05:33:58 (3 files) — data/markets.json data/news.json data/ticker.json
  827. b5ad310c 2026-07-25 auto-save: 2026-07-25T05:03:47 (3 files) — data/markets.json data/news.json data/ticker.json
  828. cba466c1 2026-07-25 auto-save: 2026-07-25T04:33:37 (3 files) — data/markets.json data/news.json data/ticker.json
  829. 7dce4673 2026-07-25 auto-save: 2026-07-25T04:03:25 (3 files) — data/markets.json data/news.json data/ticker.json
  830. fdfc3f87 2026-07-25 auto-save: 2026-07-25T03:33:15 (3 files) — data/markets.json data/news.json data/ticker.json
  831. 1004cd3f 2026-07-25 auto-save: 2026-07-25T03:03:06 (3 files) — data/markets.json data/news.json data/ticker.json
  832. 2fd37100 2026-07-25 auto-save: 2026-07-25T02:32:56 (3 files) — data/markets.json data/news.json data/ticker.json
  833. 96b28d53 2026-07-25 auto-save: 2026-07-25T02:02:37 (3 files) — data/markets.json data/news.json data/ticker.json
  834. 36d1dcb5 2026-07-25 auto-save: 2026-07-25T01:32:27 (3 files) — data/markets.json data/news.json data/ticker.json
  835. 384ed81f 2026-07-25 auto-save: 2026-07-25T01:02:17 (3 files) — data/markets.json data/news.json data/ticker.json
  836. af6e6181 2026-07-25 chore: v0.8.0 (session close — CRE Market Pulse page + front-page embed)
  837. 1fa0ad9d 2026-07-25 auto-save: 2026-07-25T00:32:03 (3 files) — data/markets.json data/news.json data/ticker.json
  838. 2a251feb 2026-07-25 market-pulse: consolidate all nav into the single hamburger; left rail is Market Data only
  839. 83c2c24c 2026-07-25 market-pulse: pin full site nav into the persistent left rail (always shown) above the collapsed data categories
  840. ce438f64 2026-07-25 auto-save: 2026-07-25T00:01:48 (4 files) — data/markets.json data/news.json data/ticker.json public/market-pulse.html
  841. 78d7b01d 2026-07-24 Add CRE Market Pulse (rates terminal) page + front-page ticker link, nav, and live embed
  842. 220feb94 2026-07-24 auto-save: 2026-07-24T23:30:18 (3 files) — data/markets.json data/news.json data/ticker.json
  843. 07a11ce3 2026-07-24 auto-save: 2026-07-24T23:00:12 (3 files) — data/markets.json data/news.json data/ticker.json
  844. e7a0caf1 2026-07-24 auto-save: 2026-07-24T22:30:05 (3 files) — data/markets.json data/news.json data/ticker.json
  845. 05045859 2026-07-24 auto-save: 2026-07-24T21:59:59 (3 files) — data/markets.json data/news.json data/ticker.json
  846. 526f8dc5 2026-07-24 auto-save: 2026-07-24T21:29:51 (3 files) — data/markets.json data/news.json data/ticker.json
  847. 3d86c217 2026-07-24 auto-save: 2026-07-24T20:59:44 (3 files) — data/markets.json data/news.json data/ticker.json
  848. 2137373d 2026-07-24 auto-save: 2026-07-24T20:29:36 (3 files) — data/markets.json data/news.json data/ticker.json
  849. dfbb5f89 2026-07-24 auto-save: 2026-07-24T19:59:29 (3 files) — data/markets.json data/news.json data/ticker.json
  850. 94c94a2f 2026-07-24 auto-save: 2026-07-24T19:29:21 (3 files) — data/markets.json data/news.json data/ticker.json
  851. 7b3dc4c8 2026-07-24 auto-save: 2026-07-24T18:59:11 (3 files) — data/markets.json data/news.json data/ticker.json
  852. 451778dd 2026-07-24 auto-save: 2026-07-24T18:29:03 (3 files) — data/markets.json data/news.json data/ticker.json
  853. 867bf39c 2026-07-24 auto-save: 2026-07-24T17:58:56 (3 files) — data/markets.json data/news.json data/ticker.json
  854. eedc9240 2026-07-24 auto-save: 2026-07-24T17:28:49 (3 files) — data/markets.json data/news.json data/ticker.json
  855. 540c7d37 2026-07-24 auto-save: 2026-07-24T16:58:41 (3 files) — data/markets.json data/news.json data/ticker.json
  856. b74f23f9 2026-07-24 auto-save: 2026-07-24T16:28:36 (3 files) — data/markets.json data/news.json data/ticker.json
  857. d204b62c 2026-07-24 auto-save: 2026-07-24T15:58:29 (3 files) — data/markets.json data/news.json data/ticker.json
  858. 05184bda 2026-07-24 auto-save: 2026-07-24T15:28:23 (3 files) — data/markets.json data/news.json data/ticker.json
  859. 6bd546b4 2026-07-24 auto-save: 2026-07-24T14:58:16 (3 files) — data/markets.json data/news.json data/ticker.json
  860. f909bba2 2026-07-24 auto-save: 2026-07-24T14:28:09 (3 files) — data/markets.json data/news.json data/ticker.json
  861. 8792614d 2026-07-24 auto-save: 2026-07-24T13:58:01 (3 files) — data/markets.json data/news.json data/ticker.json
  862. 119284ff 2026-07-24 auto-save: 2026-07-24T13:27:55 (3 files) — data/markets.json data/pull.err data/ticker.json
  863. 80c37385 2026-07-24 auto-save: 2026-07-24T12:57:48 (3 files) — data/markets.json data/pull.err data/ticker.json
  864. a617b8f2 2026-07-24 auto-save: 2026-07-24T12:27:43 (3 files) — data/markets.json data/pull.err data/ticker.json
  865. 022e579e 2026-07-24 auto-save: 2026-07-24T11:57:36 (3 files) — data/markets.json data/pull.err data/ticker.json
  866. 745140c7 2026-07-24 auto-save: 2026-07-24T11:27:29 (3 files) — data/markets.json data/pull.err data/ticker.json
  867. 1129ea31 2026-07-24 auto-save: 2026-07-24T10:57:22 (3 files) — data/markets.json data/pull.err data/ticker.json
  868. 81717f50 2026-07-24 auto-save: 2026-07-24T10:27:15 (4 files) — data/markets.json data/news.json data/pull.err data/ticker.json
  869. 752b276e 2026-07-24 auto-save: 2026-07-24T09:57:07 (3 files) — data/markets.json data/news.json data/ticker.json
  870. 2c35404d 2026-07-24 auto-save: 2026-07-24T09:27:00 (3 files) — data/markets.json data/news.json data/ticker.json
  871. d54a5291 2026-07-24 auto-save: 2026-07-24T08:56:52 (3 files) — data/markets.json data/news.json data/ticker.json
  872. fcf02505 2026-07-24 fix(rentv-v1): stop review.html linking out to rentvreview.com
  873. 7a8f7559 2026-07-24 fix(rentv-v1): guard non-array feed data in /api/search + /api/pulse + feeds (live crash)
  874. 9ebf0cf9 2026-07-24 auto-save: 2026-07-24T08:26:42 (3 files) — data/markets.json data/news.json data/ticker.json
  875. 95fdcd34 2026-07-24 fix(rentv-v1): repair search/feed article+post links, kill rentv.com deal hotlink, admin/desk bugs
  876. 73b58020 2026-07-24 auto-save: 2026-07-24T07:56:29 (3 files) — data/markets.json data/news.json data/ticker.json
  877. 3c14210a 2026-07-24 syndicate: RSS 2.0 + JSON Feed for news (/feed.xml, /feed.json) + deals RSS (/deals.xml), internal links only; /syndicate page documents feeds with copy buttons + live preview; wired into Hub + nav
  878. 52ea90e7 2026-07-24 tools: full 10-scene walkthrough spec (Hub + all 9 tools guided tour)
  879. 1ada5998 2026-07-24 hub: RENTV Intelligence Hub (/hub) — single landing for the whole tool suite, grouped cards (Market Intelligence / Deal Tools / Directory & Search / Read & Share) + live stat strip (firms/brokers/markets/volume); home nav now leads with the hub
  880. bdc976b1 2026-07-24 auto-save: 2026-07-24T06:55:55 (3 files) — data/markets.json data/news.json data/ticker.json
  881. 53d44891 2026-07-24 auto-save: 2026-07-24T06:25:47 (3 files) — data/markets.json data/news.json data/ticker.json
  882. 64cf6d34 2026-07-24 auto-save: 2026-07-24T05:55:40 (3 files) — data/markets.json data/news.json data/ticker.json
  883. 05a1e416 2026-07-24 auto-save: 2026-07-24T05:25:33 (3 files) — data/markets.json data/news.json data/ticker.json
  884. fd427d22 2026-07-24 auto-save: 2026-07-24T04:55:26 (3 files) — data/markets.json data/news.json data/ticker.json
  885. 3f3b4601 2026-07-24 auto-save: 2026-07-24T04:25:19 (3 files) — data/markets.json data/news.json data/ticker.json
  886. 0707d822 2026-07-24 auto-save: 2026-07-24T03:55:12 (3 files) — data/markets.json data/news.json data/ticker.json
  887. 3698e15c 2026-07-24 auto-save: 2026-07-24T03:25:06 (3 files) — data/markets.json data/news.json data/ticker.json
  888. f89c9572 2026-07-24 auto-save: 2026-07-24T02:54:59 (3 files) — data/markets.json data/news.json data/ticker.json
  889. 294bd78e 2026-07-24 auto-save: 2026-07-24T02:24:51 (3 files) — data/markets.json data/news.json data/ticker.json
  890. 15656b88 2026-07-24 auto-save: 2026-07-24T01:54:44 (3 files) — data/markets.json data/news.json data/ticker.json
  891. a6cc5c8d 2026-07-24 auto-save: 2026-07-24T01:24:37 (3 files) — data/markets.json data/news.json data/ticker.json
  892. 407f6b81 2026-07-24 auto-save: 2026-07-24T00:54:30 (3 files) — data/markets.json data/news.json data/ticker.json
  893. d33dccf9 2026-07-24 auto-save: 2026-07-24T00:24:22 (3 files) — data/markets.json data/news.json data/ticker.json
  894. 3c00c1ba 2026-07-23 auto-save: 2026-07-23T23:54:14 (3 files) — data/markets.json data/news.json data/ticker.json
  895. 735964d7 2026-07-23 auto-save: 2026-07-23T23:24:08 (3 files) — data/markets.json data/news.json data/ticker.json
  896. 4a876724 2026-07-23 auto-save: 2026-07-23T22:54:00 (3 files) — data/markets.json data/news.json data/ticker.json
  897. 6efbe5c7 2026-07-23 auto-save: 2026-07-23T22:23:53 (3 files) — data/markets.json data/news.json data/ticker.json
  898. 0f83c942 2026-07-23 auto-save: 2026-07-23T21:53:45 (3 files) — data/markets.json data/news.json data/ticker.json
  899. bb87d61c 2026-07-23 auto-save: 2026-07-23T21:23:39 (3 files) — data/markets.json data/news.json data/ticker.json
  900. 8d63dd88 2026-07-23 auto-save: 2026-07-23T20:53:32 (3 files) — data/markets.json data/news.json data/ticker.json
  901. 905ee1e8 2026-07-23 auto-save: 2026-07-23T20:23:25 (3 files) — data/markets.json data/news.json data/ticker.json
  902. be01700f 2026-07-23 auto-save: 2026-07-23T19:53:19 (3 files) — data/markets.json data/news.json data/ticker.json
  903. 2618c970 2026-07-23 auto-save: 2026-07-23T19:23:13 (3 files) — data/markets.json data/news.json data/ticker.json
  904. 35ee65ed 2026-07-23 auto-save: 2026-07-23T18:53:06 (3 files) — data/markets.json data/news.json data/ticker.json
  905. a0ad97ec 2026-07-23 sector: Sector Deep-Dives (/sector) — per-property-type page (Multifamily/Office/Industrial/Retail) with sector KPIs, % market share, top deals, keyword-matched news, and cross-links to Watchlist/Compare/Search; deep-linkable ?type=
  906. cbaea83a 2026-07-23 fix(deals): correct city mis-assignment — shared parse-location.mjs prefers in-text asset cues over firm-HQ names (killed false 'Phoenix'), infers state for known cities; re-derived deals.json (23 fixed); repairs /pulse geography (Other $853M->$49M), /metros, /deals; future pulls use the fixed parser
  907. d3cb47ff 2026-07-23 metros: Deal Flow by Metro (/metros) — metros ranked by volume/count with bars + sector-led tags, click-to-expand deals, deep-linkable (?open/?sort); city trusted only if it appears in the deal text, else 'Location unconfirmed' bucket (surfaces upstream pull-deals city mis-tag bug)
  908. 592d2d9e 2026-07-23 brief: The RENTV Brief (/brief) — shareable, print-ready CRE digest composing news+deals+pulse; masthead+date, snapshot strip, top story, headlines, biggest deals, print/share/subscribe; internal links only
  909. f73bbee3 2026-07-23 auto-save: 2026-07-23T16:52:38 (3 files) — data/markets.json data/news.json data/ticker.json
  910. 7c7b8412 2026-07-23 compare: Deal Comparison (/compare) — side-by-side price/$per-unit/$per-SF/occupancy/vintage for up to 4 tracked deals, best-in-row highlight, shareable ?ids= link, compact scrollable picker
  911. 5a556954 2026-07-23 directory: searchable CRE Directory (/directory) over live firms (34.7k) + brokers (382k) — tabbed, debounced search, load-more pagination, deep-linkable, info-cards (no outbound links)
  912. 82f30a9a 2026-07-23 auto-save: 2026-07-23T16:22:30 (3 files) — data/markets.json data/news.json data/ticker.json
  913. 04e9cb85 2026-07-23 watchlist: personalized Deal Watchlist (/watchlist) — pin property/txn/market, private localStorage + shareable URL params, matching deals, internal-only links
  914. b236f487 2026-07-23 tools: CRE Toolkit (/tools) — cap rate, price per unit/SF, loan sizing (LTV vs DSCR) calculators, client-side + private
  915. 24a3fedc 2026-07-23 pulse: CRE Market Pulse dashboard (/pulse + /api/pulse) — KPIs, sector/txn/state bar charts, largest deals; hardened feature-video tool (free-port + verified health)
  916. f8414c0d 2026-07-23 auto-save: 2026-07-23T15:52:21 (4 files) — public/index.html server.js public/pulse.html tools/specs/pulse.json
  917. 80231abd 2026-07-23 tools: reusable $0 local feature-video generator (Chrome shots + say TTS + ffmpeg) + search explainer spec
  918. 4a4b2d18 2026-07-23 search: global site search across news, deals, videos, REview & LA firms (/search + /api/search, internal-only result links)
  919. 2035105c 2026-07-23 auto-save: 2026-07-23T15:22:12 (3 files) — data/markets.json data/news.json data/ticker.json
  920. bd476656 2026-07-23 gitignore the access-users ledger
  921. 89aa3b5b 2026-07-23 auth: add Scott viewer login
  922. 9e4b651a 2026-07-23 auth: set Boomer password to rentfree911
  923. 987e4e2a 2026-07-23 chore: v0.7.0 — section-filter feature (session close)
  924. b41691e2 2026-07-23 auth: add Daniel viewer login
  925. f934418a 2026-07-23 Localize all rentv.com photos + drop link-outs (serve everything locally)
  926. 21491536 2026-07-23 index: honor ?cat= so each hamburger section shows its own filtered feed
  927. 65b2eece 2026-07-23 auto-save: 2026-07-23T13:51:43 (3 files) — data/markets.json data/news.json data/ticker.json
  928. 40316ce5 2026-07-23 audience/CRM: unify newsletter + sublease-broker contacts into /audience with auto-derived segments, contact profiles, and segment performance
  929. 29ad9294 2026-07-23 auto-save: 2026-07-23T13:21:35 (3 files) — data/markets.json data/news.json data/ticker.json
  930. 93db0744 2026-07-23 auto-save: 2026-07-23T12:51:13 (3 files) — data/markets.json data/news.json data/ticker.json
  931. a055ad6a 2026-07-23 auto-save: 2026-07-23T12:20:57 (3 files) — data/markets.json data/news.json data/ticker.json
  932. 6b8d34e6 2026-07-23 auto-save: 2026-07-23T11:50:46 (3 files) — data/markets.json data/news.json data/ticker.json
  933. 10eec56a 2026-07-23 auto-save: 2026-07-23T11:20:37 (3 files) — data/markets.json data/news.json data/ticker.json
  934. ca3e4d7f 2026-07-23 auto-save: 2026-07-23T10:50:25 (3 files) — data/markets.json data/news.json data/ticker.json
  935. 8568c2c0 2026-07-23 auto-save: 2026-07-23T10:20:16 (3 files) — data/markets.json data/news.json data/ticker.json
  936. 30f1e52d 2026-07-23 auto-save: 2026-07-23T09:50:03 (3 files) — data/markets.json data/news.json data/ticker.json
  937. 2abd70a7 2026-07-23 auto-save: 2026-07-23T09:19:52 (3 files) — data/markets.json data/news.json data/ticker.json
  938. 2d8bd5f2 2026-07-23 auto-save: 2026-07-23T08:49:44 (3 files) — data/markets.json data/news.json data/ticker.json
  939. 73cbb0a0 2026-07-23 auto-save: 2026-07-23T08:19:35 (3 files) — data/markets.json data/news.json data/ticker.json
  940. a5236b65 2026-07-23 auto-save: 2026-07-23T07:49:27 (3 files) — data/markets.json data/news.json data/ticker.json
  941. 00f5f848 2026-07-23 auto-save: 2026-07-23T07:19:17 (3 files) — data/markets.json data/news.json data/ticker.json
  942. 250f3ba0 2026-07-23 auto-save: 2026-07-23T06:49:07 (3 files) — data/markets.json data/news.json data/ticker.json
  943. b06862e4 2026-07-23 auto-save: 2026-07-23T06:19:01 (3 files) — data/markets.json data/news.json data/ticker.json
  944. 7cf08754 2026-07-23 auto-save: 2026-07-23T05:48:54 (3 files) — data/markets.json data/news.json data/ticker.json
  945. 48f59904 2026-07-23 auto-save: 2026-07-23T05:18:46 (3 files) — data/markets.json data/news.json data/ticker.json
  946. aab2ffb4 2026-07-23 auto-save: 2026-07-23T04:48:39 (3 files) — data/markets.json data/news.json data/ticker.json
  947. 5067ca72 2026-07-23 auto-save: 2026-07-23T04:18:33 (3 files) — data/markets.json data/news.json data/ticker.json
  948. ee1e120f 2026-07-23 auto-save: 2026-07-23T03:48:26 (3 files) — data/markets.json data/news.json data/ticker.json
  949. e9f6151b 2026-07-23 auto-save: 2026-07-23T03:18:19 (3 files) — data/markets.json data/news.json data/ticker.json
  950. f29026d6 2026-07-23 auto-save: 2026-07-23T02:48:12 (3 files) — data/markets.json data/news.json data/ticker.json
  951. 27551af7 2026-07-23 auto-save: 2026-07-23T02:18:05 (3 files) — data/markets.json data/news.json data/ticker.json
  952. 35998414 2026-07-23 auto-save: 2026-07-23T01:47:57 (3 files) — data/markets.json data/news.json data/ticker.json
  953. 0023b816 2026-07-23 auto-save: 2026-07-23T01:17:50 (3 files) — data/markets.json data/news.json data/ticker.json
  954. 0f318ef3 2026-07-23 auto-save: 2026-07-23T00:47:42 (3 files) — data/markets.json data/news.json data/ticker.json
  955. 2ed26049 2026-07-23 auto-save: 2026-07-23T00:17:34 (3 files) — data/markets.json data/news.json data/ticker.json
  956. efd51ee1 2026-07-22 auto-save: 2026-07-22T23:47:26 (3 files) — data/markets.json data/news.json data/ticker.json
  957. a3a9a7bb 2026-07-22 auto-save: 2026-07-22T23:17:18 (3 files) — data/markets.json data/news.json data/ticker.json
  958. 67651c95 2026-07-22 auto-save: 2026-07-22T22:47:10 (3 files) — data/markets.json data/news.json data/ticker.json
  959. 84a2cfe5 2026-07-22 auto-save: 2026-07-22T22:17:02 (3 files) — data/markets.json data/news.json data/ticker.json
  960. 65d7eb77 2026-07-22 auto-save: 2026-07-22T21:46:55 (4 files) — data/markets.json data/news.json data/ticker.json package-lock.json
  961. 16ef70d0 2026-07-22 chore: refactor (drop dead decode branch) + v0.6.0 (deals-listings feature, session close)
  962. 49078ccf 2026-07-22 Add real CRE deal listings: parse rentv.com transaction stories into structured deal cards (/deals page + /api/deals + pull-deals.mjs)
  963. 4a206b7a 2026-07-22 auto-save: 2026-07-22T20:46:37 (3 files) — data/markets.json data/news.json data/ticker.json
  964. 6e2fe131 2026-07-22 chore: harden sublease (listing_url XSS guard, DELETE id validation), refactor, v0.5.0 (session close)
  965. 85dbfc62 2026-07-22 auto-save: 2026-07-22T20:16:30 (3 files) — data/markets.json data/news.json data/ticker.json
  966. e17a5f0d 2026-07-22 desk UX streamline: scope-contextual views (kill dead Map/Command combos), remove redundant Command + fake-geo Map, add live result count
  967. 9e29c2bb 2026-07-22 auto-save: 2026-07-22T19:46:22 (3 files) — data/markets.json data/news.json data/ticker.json
  968. bed96bd7 2026-07-22 desk: Sublease scope (empty-honest, CRCP actions) + admin-gated entry form + /api/sublease proxy
  969. 50c72c9a 2026-07-22 auto-save: 2026-07-22T19:16:13 (4 files) — data/markets.json data/news.json data/ticker.json package-lock.json
  970. 9ece2c0d 2026-07-22 chore: v0.4.0 (session close) — homepage, intelligence desk, broker proxy, live search
  971. 4bed4258 2026-07-22 auto-save: 2026-07-22T18:46:04 (3 files) — data/markets.json data/news.json data/ticker.json
  972. e6efe834 2026-07-22 Link the Broker & Owner Intelligence Desk from the homepage hamburger nav
  973. eb6fd3d5 2026-07-22 Desk search now queries the full CA registry live (debounced /api/brokers?q= + /api/firms?q=) instead of filtering the loaded 500
  974. a832ec34 2026-07-22 auto-save: 2026-07-22T18:15:55 (3 files) — data/markets.json data/news.json data/ticker.json
  975. aaeca199 2026-07-22 auto-save: 2026-07-22T17:45:47 (3 files) — data/markets.json data/news.json data/ticker.json
  976. 6f8a7062 2026-07-22 Wire /desk to the live CA broker registry via /api/brokers + /api/firms proxy (full 382,944 brokers)
  977. 4645759d 2026-07-22 Ship RENTV Intelligence Desk live at /desk — left-rail switcher (no tabs), Directory/Map/Analytics/Command over real CA broker data with LinkedIn/DRE/Maps click-outs
  978. 35e4b442 2026-07-22 Ship flagship homepage live — no tabs, bottom breaking bar, CRE data strip; robust loader fixes empty-data blanking
  979. 365ef78b 2026-07-22 auto-save: 2026-07-22T17:15:39 (3 files) — data/markets.json data/news.json data/ticker.json
  980. 189f602a 2026-07-22 auto-save: 2026-07-22T16:45:31 (3 files) — data/markets.json data/news.json data/ticker.json
  981. f5b9b400 2026-07-22 auto-save: 2026-07-22T16:15:24 (3 files) — data/markets.json data/news.json data/ticker.json
  982. b990c03b 2026-07-22 auto-save: 2026-07-22T15:45:17 (3 files) — data/markets.json data/news.json data/ticker.json
  983. 4f8af59d 2026-07-22 auto-save: 2026-07-22T15:15:08 (3 files) — data/markets.json data/news.json data/ticker.json
  984. edd2ccb2 2026-07-22 auto-save: 2026-07-22T14:44:58 (3 files) — data/markets.json data/news.json data/ticker.json
  985. 87435437 2026-07-22 Add 10 unique back-office admin layouts (A01-A10) + refined flagship front page (bottom breaking bar, CRE data strip)
  986. 819d5e04 2026-07-22 auto-save: 2026-07-22T14:14:43 (7 files) — data/markets.json data/news.json data/ticker.json mockups/assets/base.css mockups/admin/
  987. 5a1f12a0 2026-07-22 auto-save: 2026-07-22T13:44:34 (3 files) — data/markets.json data/news.json data/ticker.json
  988. 70f6d4b0 2026-07-22 Add 10 numbered front-end layout concepts (mockups/) — shared hamburger-left/user-right chrome, live data, pick-tray
  989. f7a39cc6 2026-07-22 auto-save: 2026-07-22T13:14:23 (3 files) — data/markets.json data/news.json data/ticker.json
  990. 5b318fbb 2026-07-22 auto-save: 2026-07-22T12:44:11 (3 files) — data/markets.json data/news.json data/ticker.json
  991. 73af2abf 2026-07-22 auto-save: 2026-07-22T12:13:58 (3 files) — data/markets.json data/news.json data/ticker.json
  992. 0af54705 2026-07-22 Fix RENTV Originals playback on rentv-v1 (contrarian catch): port review.html mp4 <video> branch + closeVideo box-clear + copy 4 mp4 + 4 jpg media. Verified end-to-end: video plays (readyState=4), 0 console errors. Prior 'superset' was data-only — player+media were missing.
  993. 4355473d 2026-07-22 Fork consolidation prep: port RENTV Originals feature into rentv-v1 (loss-free superset for gated cutover to canonical)
  994. 84c41d43 2026-07-22 auto-save: 2026-07-22T11:13:33 (3 files) — data/markets.json data/news.json data/ticker.json
  995. 308ed654 2026-07-22 LA Commercial: syndicate usrealestate commercial intel into RENTV
  996. 5767fb31 2026-07-22 auto-save: 2026-07-22T10:43:19 (3 files) — data/markets.json data/news.json data/ticker.json
  997. d7c428a9 2026-07-22 auto-save: 2026-07-22T10:13:11 (3 files) — data/markets.json data/news.json data/ticker.json
  998. 0d1cfef3 2026-07-22 auto-save: 2026-07-22T09:43:01 (3 files) — data/markets.json data/news.json data/ticker.json
  999. bf388a64 2026-07-22 auto-save: 2026-07-22T09:12:53 (3 files) — data/markets.json data/news.json data/ticker.json
  1000. 190ef29b 2026-07-22 auto-save: 2026-07-22T08:12:31 (3 files) — data/markets.json data/news.json data/ticker.json
  1001. fcb2c494 2026-07-22 auto-save: 2026-07-22T07:42:20 (3 files) — data/markets.json data/news.json data/ticker.json
  1002. 9d1d88c0 2026-07-22 auto-save: 2026-07-22T07:12:00 (3 files) — data/markets.json data/news.json data/ticker.json
  1003. c66bd705 2026-07-22 auto-save: 2026-07-22T06:41:50 (3 files) — data/markets.json data/news.json data/ticker.json
  1004. de035562 2026-07-22 auto-save: 2026-07-22T06:11:42 (3 files) — data/markets.json data/news.json data/ticker.json
  1005. 9e96c9d4 2026-07-22 auto-save: 2026-07-22T05:41:36 (3 files) — data/markets.json data/news.json data/ticker.json
  1006. 50316fa1 2026-07-22 auto-save: 2026-07-22T05:11:29 (3 files) — data/markets.json data/news.json data/ticker.json
  1007. 422d2a6e 2026-07-22 auto-save: 2026-07-22T04:41:22 (3 files) — data/markets.json data/news.json data/ticker.json
  1008. 75b53b95 2026-07-22 auto-save: 2026-07-22T04:11:16 (3 files) — data/markets.json data/news.json data/ticker.json
  1009. c6c5de9d 2026-07-22 auto-save: 2026-07-22T03:41:10 (3 files) — data/markets.json data/news.json data/ticker.json
  1010. 7c29ec8a 2026-07-22 auto-save: 2026-07-22T03:11:03 (3 files) — data/markets.json data/news.json data/ticker.json
  1011. 6df1b1be 2026-07-22 auto-save: 2026-07-22T02:40:56 (3 files) — data/markets.json data/news.json data/ticker.json
  1012. 35dbff70 2026-07-22 auto-save: 2026-07-22T02:10:50 (3 files) — data/markets.json data/news.json data/ticker.json
  1013. 6d3d9165 2026-07-22 auto-save: 2026-07-22T01:40:44 (3 files) — data/markets.json data/news.json data/ticker.json
  1014. aaa23328 2026-07-22 auto-save: 2026-07-22T01:10:37 (3 files) — data/markets.json data/news.json data/ticker.json
  1015. 687b2562 2026-07-22 auto-save: 2026-07-22T00:40:31 (3 files) — data/markets.json data/news.json data/ticker.json
  1016. 3edce097 2026-07-22 auto-save: 2026-07-22T00:10:24 (3 files) — data/markets.json data/news.json data/ticker.json
  1017. f6db0021 2026-07-21 auto-save: 2026-07-21T23:40:18 (3 files) — data/markets.json data/news.json data/ticker.json
  1018. 00afa855 2026-07-21 auto-save: 2026-07-21T23:10:10 (3 files) — data/markets.json data/news.json data/ticker.json
  1019. 31afa40a 2026-07-21 auto-save: 2026-07-21T22:40:04 (3 files) — data/markets.json data/news.json data/ticker.json
  1020. 962ad54e 2026-07-21 auto-save: 2026-07-21T22:09:58 (3 files) — data/markets.json data/news.json data/ticker.json
  1021. 091a5d76 2026-07-21 auto-save: 2026-07-21T21:39:52 (3 files) — data/markets.json data/news.json data/ticker.json
  1022. d716bb3f 2026-07-21 auto-save: 2026-07-21T21:09:46 (3 files) — data/markets.json data/news.json data/ticker.json
  1023. 336ace2b 2026-07-21 auto-save: 2026-07-21T20:39:40 (3 files) — data/markets.json data/news.json data/ticker.json
  1024. 008ddda8 2026-07-21 auto-save: 2026-07-21T20:09:34 (3 files) — data/markets.json data/news.json data/ticker.json
  1025. c0ac4362 2026-07-21 auto-save: 2026-07-21T19:39:27 (3 files) — data/markets.json data/news.json data/ticker.json
  1026. b033fd41 2026-07-21 auto-save: 2026-07-21T19:09:20 (3 files) — data/markets.json data/news.json data/ticker.json
  1027. a5f4e316 2026-07-21 auto-save: 2026-07-21T18:39:12 (3 files) — data/markets.json data/news.json data/ticker.json
  1028. 082bfe37 2026-07-21 auto-save: 2026-07-21T18:09:04 (3 files) — data/markets.json data/news.json data/ticker.json
  1029. 7e3d45ef 2026-07-21 auto-save: 2026-07-21T17:38:50 (3 files) — data/markets.json data/news.json data/ticker.json
  1030. 6bd50ca7 2026-07-21 auto-save: 2026-07-21T17:08:42 (3 files) — data/markets.json data/news.json data/ticker.json
  1031. adc26a37 2026-07-21 chore: v0.3.0 (session close — blog CMS, 10 versions/themes/admin, originals merge, nav)
  1032. ff9b76e0 2026-07-21 rentv-v1 admin: add clean nav (Dashboards/Publish/Blog/Main site) + mobile hamburger to all 10 admin versions
  1033. b28c3f18 2026-07-21 rentv-v1 versions: add clean nav + mobile hamburger to all 10 version previews (palette-aware, sticky; sections→/?cat=, franchises→routes)
  1034. c5fcc479 2026-07-21 rentv-v1: merge RENTV Originals into the homepage feed — published posts lead the wire, badged 'Original', link to /post/:id (category filter + most-read included)
  1035. 026bc4ee 2026-07-21 rentv-v1: BLOG BACKEND — file-backed original articles (posts API create/edit/delete/publish), admin editor /admin/publish, public reader /post/:id, /blog index; Blog wired into nav; posts.json rsync-excluded so deploys never clobber published articles
  1036. c7117dee 2026-07-21 rentv-v1: 10 ADMIN dashboard versions (distinct layouts over real subscriber/feed/video/market data) + /admin picker
  1037. 3683dd11 2026-07-21 rentv-v1: add Versions to index nav (first-occurrence, nav not footer)
  1038. 176ceb9a 2026-07-21 rentv-v1: wire /versions picker into the main nav (all pages + generator)
  1039. 6acf74cd 2026-07-21 rentv-v1 versions picker: reset anchor styling (titles white, no underline)
  1040. 6b7158a3 2026-07-21 rentv-v1: 10 full site VERSIONS (distinct homepage layouts on live data) + /versions picker — Wire/Broadsheet/Terminal/Magazine/Digest/Grid/Split/Dashboard/Minimal/Feed for Boomer to pick a direction
  1041. 88ae7aa2 2026-07-21 rentv-v1: 10-theme live switcher (dropdown in util bar, localStorage-persisted) — 10 professional CRE-news themes from graphic-designer incl 3 dark, dark-surface overrides, Google Fonts loaded; Boomer toggles to pick
  1042. 6ca6f36c 2026-07-21 rentv-v1 polish batch: wordmark 34→42px, mobile hamburger → upper-right, footer Sections → all 8 (from review)
  1043. 7444bb1f 2026-07-21 rentv-v1 DTD-C: section routes 301→/?cat= filtered home (one consistent 'section=filtered feed' model, no thin pages); home honors ?cat= + activates nav; tighten nav padding to fix Conferences clip
  1044. d11197b5 2026-07-21 rentv-v1: fix article breadcrumb dead link — only link cat when it's a real section (guards /rentv 404 when feed lookup misses); flagged by ui-ux review
  1045. 4587e548 2026-07-21 auto-save: 2026-07-21T14:07:54 (3 files) — data/markets.json data/news.json data/ticker.json
  1046. c037f630 2026-07-21 refine all: unify chrome site-wide (DTD-A) — canonical util-bar (kill dead Log In + external leaks), 3-col footer, 12-link nav + hamburger on every page, add Markets to nav; fix review video-grid regression (guard dangling #src that nuked the rendered grid)
  1047. e58b9691 2026-07-21 rentv-v1 deploy: exclude data/subscribers.jsonl from rsync so deploys never clobber prod's accumulated real signups
  1048. 255f3538 2026-07-21 rentv-v1: harden newsletter capture per contrarian — idempotent dedup (hot email Set), MAX_SUBS 50k ceiling, rightmost-XFF ip; honest CRE Talk grid framing (broader REview catalog, not implied interviews-only)
  1049. 59bb51bc 2026-07-21 rentv-v1: add /cre-talk interview-series page (live REview video grid, guest+sponsor CTAs) wired into nav+footer; real newsletter capture (POST /api/subscribe → append-only JSONL, gated /api/subscribers admin read); wire homepage+subscribe forms; gitignore subscribers.jsonl
  1050. 6abac16f 2026-07-21 auto-save: 2026-07-21T13:07:37 (3 files) — data/markets.json data/news.json data/ticker.json
  1051. 5e58ee5c 2026-07-21 rentv.com full-site rebuild: article reader-proxy (live story+photo+body in our shell), /api/markets route, company pages (conferences/advertise/subscribe/about) via build.mjs, wired all dead nav/footer links, OPEN local-preview bypass
  1052. 71dae0e3 2026-07-21 auto-save: 2026-07-21T12:37:29 (3 files) — data/markets.json data/news.json data/ticker.json
  1053. 0643da5c 2026-07-21 auto-save: 2026-07-21T12:07:22 (3 files) — data/markets.json data/news.json data/ticker.json
  1054. 20a689fc 2026-07-21 auto-save: 2026-07-21T11:37:17 (3 files) — data/markets.json data/news.json data/ticker.json
  1055. 5d302c73 2026-07-21 auto-save: 2026-07-21T11:07:10 (3 files) — data/markets.json data/news.json data/ticker.json
  1056. b6b3e9da 2026-07-21 auto-save: 2026-07-21T10:37:02 (3 files) — data/markets.json data/news.json data/ticker.json
  1057. 830859a3 2026-07-21 auto-save: 2026-07-21T10:06:55 (3 files) — data/markets.json data/news.json data/ticker.json
  1058. cbf1165b 2026-07-21 auto-save: 2026-07-21T09:36:49 (3 files) — data/markets.json data/news.json data/ticker.json
  1059. 721c6035 2026-07-21 auto-save: 2026-07-21T09:06:42 (3 files) — data/markets.json data/news.json data/ticker.json
  1060. b3b988ad 2026-07-21 auto-save: 2026-07-21T08:36:34 (3 files) — data/markets.json data/news.json data/ticker.json
  1061. 30f21607 2026-07-21 auto-save: 2026-07-21T08:06:27 (3 files) — data/markets.json data/news.json data/ticker.json
  1062. 92d29568 2026-07-21 auto-save: 2026-07-21T07:36:20 (3 files) — data/markets.json data/news.json data/ticker.json
  1063. 9cbf6a8f 2026-07-21 auto-save: 2026-07-21T07:06:14 (3 files) — data/markets.json data/news.json data/ticker.json
  1064. 3338c28e 2026-07-21 auto-save: 2026-07-21T06:36:08 (3 files) — data/markets.json data/news.json data/ticker.json
  1065. 5d53dc86 2026-07-21 auto-save: 2026-07-21T06:06:01 (3 files) — data/markets.json data/news.json data/ticker.json
  1066. 3d73ee6d 2026-07-21 auto-save: 2026-07-21T05:35:54 (3 files) — data/markets.json data/news.json data/ticker.json
  1067. ad44786e 2026-07-21 auto-save: 2026-07-21T05:05:47 (3 files) — data/markets.json data/news.json data/ticker.json
  1068. cb6c7ae3 2026-07-21 auto-save: 2026-07-21T04:35:41 (3 files) — data/markets.json data/news.json data/ticker.json
  1069. bfca5014 2026-07-21 auto-save: 2026-07-21T04:05:35 (3 files) — data/markets.json data/news.json data/ticker.json
  1070. f337b667 2026-07-21 auto-save: 2026-07-21T03:35:30 (3 files) — data/markets.json data/news.json data/ticker.json
  1071. 8bb1aa81 2026-07-21 auto-save: 2026-07-21T03:05:24 (3 files) — data/markets.json data/news.json data/ticker.json
  1072. 5aff48c3 2026-07-21 auto-save: 2026-07-21T02:35:18 (3 files) — data/markets.json data/news.json data/ticker.json
  1073. fb1f7d1f 2026-07-21 auto-save: 2026-07-21T02:05:11 (3 files) — data/markets.json data/news.json data/ticker.json
  1074. f45884ae 2026-07-21 auto-save: 2026-07-21T01:35:05 (3 files) — data/markets.json data/news.json data/ticker.json
  1075. 8cc972e1 2026-07-21 auto-save: 2026-07-21T01:04:59 (3 files) — data/markets.json data/news.json data/ticker.json
  1076. 4ff7a8e8 2026-07-21 auto-save: 2026-07-21T00:34:53 (3 files) — data/markets.json data/news.json data/ticker.json
  1077. 0b666e03 2026-07-21 auto-save: 2026-07-21T00:04:47 (3 files) — data/markets.json data/news.json data/ticker.json
  1078. 3e150cc4 2026-07-20 auto-save: 2026-07-20T23:34:42 (3 files) — data/markets.json data/news.json data/ticker.json
  1079. f034fdf7 2026-07-20 auto-save: 2026-07-20T23:04:35 (3 files) — data/markets.json data/news.json data/ticker.json
  1080. abed43d1 2026-07-20 auto-save: 2026-07-20T22:34:29 (3 files) — data/markets.json data/news.json data/ticker.json
  1081. 53abeed8 2026-07-20 auto-save: 2026-07-20T22:04:23 (3 files) — data/markets.json data/news.json data/ticker.json
  1082. b76f94fc 2026-07-20 auto-save: 2026-07-20T21:34:15 (3 files) — data/markets.json data/news.json data/ticker.json
  1083. 90c931b3 2026-07-20 auto-save: 2026-07-20T21:04:08 (3 files) — data/markets.json data/news.json data/ticker.json
  1084. 2be70546 2026-07-20 auto-save: 2026-07-20T20:34:02 (3 files) — data/markets.json data/news.json data/ticker.json
  1085. fea1f5d6 2026-07-20 auto-save: 2026-07-20T20:03:55 (3 files) — data/markets.json data/news.json data/ticker.json
  1086. 1323429b 2026-07-20 auto-save: 2026-07-20T19:33:48 (3 files) — data/markets.json data/news.json data/ticker.json
  1087. 9e65980f 2026-07-20 auto-save: 2026-07-20T19:03:42 (3 files) — data/markets.json data/news.json data/ticker.json
  1088. 37c8d909 2026-07-20 auto-save: 2026-07-20T18:33:36 (3 files) — data/markets.json data/news.json data/ticker.json
  1089. 695aa1d4 2026-07-20 auto-save: 2026-07-20T18:03:31 (3 files) — data/markets.json data/news.json data/ticker.json
  1090. bc3625fd 2026-07-20 auto-save: 2026-07-20T17:33:24 (3 files) — data/markets.json data/news.json data/ticker.json
  1091. 9ff4609d 2026-07-20 auto-save: 2026-07-20T17:03:17 (3 files) — data/markets.json data/news.json data/ticker.json
  1092. a0db9620 2026-07-20 auto-save: 2026-07-20T16:33:10 (3 files) — data/markets.json data/news.json data/ticker.json
  1093. cf0c1b0d 2026-07-20 auto-save: 2026-07-20T16:03:03 (3 files) — data/markets.json data/news.json data/ticker.json
  1094. 53e0efd7 2026-07-20 auto-save: 2026-07-20T15:32:55 (3 files) — data/markets.json data/news.json data/ticker.json
  1095. 2cc0f9ed 2026-07-20 auto-save: 2026-07-20T15:02:48 (3 files) — data/markets.json data/news.json data/ticker.json
  1096. e431d2ff 2026-07-20 Markets: durable additive components (markets.html + pull-markets.mjs) + parity patch doc
  1097. bda42248 2026-07-20 parity with rentv-website: real rentv images + full article-body scraping + mobile hamburger nav + centered masthead
  1098. 71395b46 2026-07-20 auto-save: 2026-07-20T14:32:39 (2 files) — data/news.json data/ticker.json
  1099. e8f63f03 2026-07-20 Live Rates & Markets page (/markets.html): Treasury curve + REIT benchmarks + spreads via Yahoo; /api/markets
  1100. d9ec1da5 2026-07-20 add in-shell article.html + section.html reader templates; wire homepage to /news/:id; robust title fallback via /api/news
  1101. daf98cbe 2026-07-20 rentv-website.agentabrams.com live: app-login-gated, latest news shell deployed
  1102. a2941af4 2026-07-20 snapshot before rentv-website.agentabrams.com go-live
  1103. 97824672 2026-07-20 auto-save: 2026-07-20T14:02:31 (1 files) — data/news.json
  1104. 8a1ce708 2026-07-20 auto-save: 2026-07-20T13:32:24 (1 files) — data/news.json
  1105. 1b5dff84 2026-07-20 auto-save: 2026-07-20T13:02:15 (1 files) — data/news.json
  1106. 683810fd 2026-07-20 auto-save: 2026-07-20T12:32:08 (1 files) — data/news.json
  1107. f94ea170 2026-07-20 chore: lint (esc() XSS-guard on homepage feed), v0.1.0 → v0.2.0 (session close)
  1108. f3c51020 2026-07-20 Fold The REview (rentvreview.com) into rentv-v1 as native video section
  1109. bfda803a 2026-07-20 auto-save: 2026-07-20T11:31:52 (1 files) — data/news.json
  1110. a010c382 2026-07-20 auto-save: 2026-07-20T11:01:36 (1 files) — data/news.json
  1111. 4ac9306b 2026-07-20 auto-save: 2026-07-20T10:31:23 (1 files) — data/news.json
  1112. 020a53fd 2026-07-20 auto-save: 2026-07-20T10:01:15 (1 files) — data/news.json
  1113. 8ab03512 2026-07-20 auto-save: 2026-07-20T09:31:09 (1 files) — data/news.json
  1114. b8b07222 2026-07-20 auto-save: 2026-07-20T09:00:59 (1 files) — data/news.json
  1115. 7eccd83b 2026-07-20 auto-save: 2026-07-20T08:30:53 (1 files) — data/news.json
  1116. 8e4b4562 2026-07-20 auto-save: 2026-07-20T08:00:46 (1 files) — data/news.json
  1117. 0d980949 2026-07-20 auto-save: 2026-07-20T07:30:40 (1 files) — data/news.json
  1118. 87a1a4d3 2026-07-20 auto-save: 2026-07-20T07:00:33 (1 files) — data/news.json
  1119. 5606c80a 2026-07-20 auto-save: 2026-07-20T06:30:25 (1 files) — data/news.json
  1120. 47a7464d 2026-07-20 auto-save: 2026-07-20T06:00:16 (1 files) — data/news.json
  1121. 0d509388 2026-07-20 auto-save: 2026-07-20T05:30:09 (1 files) — data/news.json
  1122. 53cee1ca 2026-07-20 auto-save: 2026-07-20T04:59:59 (1 files) — data/news.json
  1123. 10bc93de 2026-07-20 auto-save: 2026-07-20T04:29:52 (1 files) — data/news.json
  1124. a64206c2 2026-07-20 auto-save: 2026-07-20T03:59:45 (1 files) — data/news.json
  1125. 133812ba 2026-07-20 auto-save: 2026-07-20T03:29:38 (1 files) — data/news.json
  1126. d18116ae 2026-07-20 auto-save: 2026-07-20T02:59:32 (1 files) — data/news.json
  1127. 52b0861c 2026-07-20 auto-save: 2026-07-20T02:29:25 (1 files) — data/news.json
  1128. 91bd400a 2026-07-20 auto-save: 2026-07-20T01:59:19 (1 files) — data/news.json
  1129. 932251de 2026-07-20 auto-save: 2026-07-20T01:29:12 (1 files) — data/news.json
  1130. 1d85b04e 2026-07-20 auto-save: 2026-07-20T00:59:05 (1 files) — data/news.json
  1131. 3e5dd20f 2026-07-20 auto-save: 2026-07-20T00:28:58 (1 files) — data/news.json
  1132. a00062bf 2026-07-19 auto-save: 2026-07-19T23:58:51 (1 files) — data/news.json
  1133. aab03b3a 2026-07-19 auto-save: 2026-07-19T23:28:44 (1 files) — data/news.json
  1134. 79f86bf8 2026-07-19 auto-save: 2026-07-19T22:58:36 (1 files) — data/news.json
  1135. 35199739 2026-07-19 auto-save: 2026-07-19T22:28:29 (1 files) — data/news.json
  1136. 0ff2fec5 2026-07-19 auto-save: 2026-07-19T21:58:21 (1 files) — data/news.json
  1137. 87cd0954 2026-07-19 auto-save: 2026-07-19T21:28:14 (1 files) — data/news.json
  1138. 6402a6a4 2026-07-19 auto-save: 2026-07-19T20:58:07 (1 files) — data/news.json
  1139. 3101f807 2026-07-19 auto-save: 2026-07-19T20:27:58 (1 files) — data/news.json
  1140. 2cd83e6a 2026-07-19 auto-save: 2026-07-19T19:57:51 (1 files) — data/news.json
  1141. 6f4baa76 2026-07-19 auto-save: 2026-07-19T19:27:44 (1 files) — data/news.json
  1142. 618bf43a 2026-07-19 auto-save: 2026-07-19T18:57:38 (1 files) — data/news.json
  1143. 54a55d40 2026-07-19 auto-save: 2026-07-19T18:27:32 (1 files) — data/news.json
  1144. 84c39647 2026-07-19 auto-save: 2026-07-19T17:57:26 (1 files) — data/news.json
  1145. 8b662cf2 2026-07-19 auto-save: 2026-07-19T17:27:20 (1 files) — data/news.json
  1146. 7e2f5bac 2026-07-19 auto-save: 2026-07-19T16:57:14 (1 files) — data/news.json
  1147. a3bda33e 2026-07-19 auto-save: 2026-07-19T16:27:08 (1 files) — data/news.json
  1148. fbd40d84 2026-07-19 auto-save: 2026-07-19T15:57:02 (1 files) — data/news.json
  1149. a0c55d81 2026-07-19 auto-save: 2026-07-19T15:26:55 (1 files) — data/news.json
  1150. 3db1c038 2026-07-19 auto-save: 2026-07-19T14:56:49 (2 files) — data/news.json server.js
  1151. 846bfda3 2026-07-19 auto-save: 2026-07-19T14:26:43 (1 files) — data/news.json
  1152. 714ba6ad 2026-07-19 auto-save: 2026-07-19T13:56:37 (1 files) — data/news.json
  1153. a7276db0 2026-07-19 auto-save: 2026-07-19T13:26:30 (1 files) — data/news.json
  1154. d1321d60 2026-07-19 auto-save: 2026-07-19T12:56:25 (1 files) — data/news.json
  1155. 7d6155b0 2026-07-19 auto-save: 2026-07-19T12:26:19 (1 files) — data/news.json
  1156. 9524c19b 2026-07-19 auto-save: 2026-07-19T11:56:13 (1 files) — data/news.json
  1157. 2023bbaf 2026-07-19 auto-save: 2026-07-19T11:26:07 (1 files) — data/news.json
  1158. 559f2e20 2026-07-19 auto-save: 2026-07-19T10:56:01 (1 files) — data/news.json
  1159. 78de4e81 2026-07-19 auto-save: 2026-07-19T10:25:55 (1 files) — data/news.json
  1160. 540dd799 2026-07-19 auto-save: 2026-07-19T09:55:50 (1 files) — data/news.json
  1161. c7cb7de4 2026-07-19 auto-save: 2026-07-19T09:25:44 (1 files) — data/news.json
  1162. f0bfec11 2026-07-19 auto-save: 2026-07-19T08:55:38 (1 files) — data/news.json
  1163. 1e494a03 2026-07-19 auto-save: 2026-07-19T08:25:31 (1 files) — data/news.json
  1164. 78771111 2026-07-19 auto-save: 2026-07-19T07:55:24 (1 files) — data/news.json
  1165. 9a60ab81 2026-07-19 auto-save: 2026-07-19T07:25:16 (1 files) — data/news.json
  1166. 40626e85 2026-07-19 auto-save: 2026-07-19T06:55:10 (1 files) — data/news.json
  1167. 4f8aa134 2026-07-19 auto-save: 2026-07-19T06:25:04 (1 files) — data/news.json
  1168. 8f369d24 2026-07-19 auto-save: 2026-07-19T05:54:59 (1 files) — data/news.json
  1169. 1709a7c9 2026-07-19 auto-save: 2026-07-19T05:24:52 (1 files) — data/news.json
  1170. 295c27b1 2026-07-19 auto-save: 2026-07-19T04:54:45 (1 files) — data/news.json
  1171. eb480321 2026-07-19 auto-save: 2026-07-19T04:24:38 (1 files) — data/news.json
  1172. 0de63615 2026-07-19 auto-save: 2026-07-19T03:54:31 (1 files) — data/news.json
  1173. 0a29a356 2026-07-19 auto-save: 2026-07-19T03:24:25 (1 files) — data/news.json
  1174. 06a030a8 2026-07-19 auto-save: 2026-07-19T02:54:18 (1 files) — data/news.json
  1175. 097350bc 2026-07-19 auto-save: 2026-07-19T02:24:11 (1 files) — data/news.json
  1176. 8ba90355 2026-07-19 auto-save: 2026-07-19T01:54:05 (1 files) — data/news.json
  1177. ac7790a6 2026-07-19 auto-save: 2026-07-19T01:23:59 (1 files) — data/news.json
  1178. 4e6364be 2026-07-19 auto-save: 2026-07-19T00:53:53 (1 files) — data/news.json
  1179. 92ebe3bf 2026-07-19 auto-save: 2026-07-19T00:23:46 (1 files) — data/news.json
  1180. 13c254a5 2026-07-18 auto-save: 2026-07-18T23:53:39 (1 files) — data/news.json
  1181. cb55da5a 2026-07-18 auto-save: 2026-07-18T23:23:33 (1 files) — data/news.json
  1182. 57641b82 2026-07-18 auto-save: 2026-07-18T22:53:23 (1 files) — data/news.json
  1183. 5e5a3252 2026-07-18 auto-save: 2026-07-18T22:23:17 (1 files) — data/news.json
  1184. b2d7c112 2026-07-18 auto-save: 2026-07-18T21:53:10 (1 files) — data/news.json
  1185. ad07ac15 2026-07-18 auto-save: 2026-07-18T21:23:03 (1 files) — data/news.json
  1186. 70d07262 2026-07-18 auto-save: 2026-07-18T20:52:57 (1 files) — data/news.json
  1187. 6aaf46d3 2026-07-18 auto-save: 2026-07-18T20:22:51 (1 files) — data/news.json
  1188. 0e626f39 2026-07-18 auto-save: 2026-07-18T19:52:44 (1 files) — data/news.json
  1189. 001a7570 2026-07-18 auto-save: 2026-07-18T19:22:39 (1 files) — data/news.json
  1190. d8f13b7c 2026-07-18 auto-save: 2026-07-18T18:52:32 (1 files) — data/news.json
  1191. 38778897 2026-07-18 auto-save: 2026-07-18T18:22:25 (1 files) — data/news.json
  1192. a9a95808 2026-07-18 auto-save: 2026-07-18T17:52:20 (1 files) — data/news.json
  1193. dc87e2f4 2026-07-18 auto-save: 2026-07-18T17:22:14 (1 files) — data/news.json
  1194. 324fb3db 2026-07-18 auto-save: 2026-07-18T16:52:08 (1 files) — data/news.json
  1195. 4891e2d2 2026-07-18 auto-save: 2026-07-18T16:22:02 (1 files) — data/news.json
  1196. b26947bf 2026-07-18 auto-save: 2026-07-18T15:51:56 (1 files) — data/news.json
  1197. 27b9fb3b 2026-07-18 auto-save: 2026-07-18T15:21:51 (1 files) — data/news.json
  1198. 7a200cc9 2026-07-18 auto-save: 2026-07-18T14:51:45 (1 files) — data/news.json
  1199. e8510711 2026-07-18 auto-save: 2026-07-18T14:21:38 (1 files) — data/news.json
  1200. 5b2a176c 2026-07-18 auto-save: 2026-07-18T13:51:32 (1 files) — data/news.json
  1201. c8fda234 2026-07-18 auto-save: 2026-07-18T13:21:27 (1 files) — data/news.json
  1202. dbebee80 2026-07-18 auto-save: 2026-07-18T12:51:21 (1 files) — data/news.json
  1203. 3f8deaff 2026-07-18 auto-save: 2026-07-18T12:21:15 (1 files) — data/news.json
  1204. e13eda22 2026-07-18 auto-save: 2026-07-18T11:51:10 (1 files) — data/news.json
  1205. bf23cb96 2026-07-18 auto-save: 2026-07-18T11:21:04 (1 files) — data/news.json
  1206. abfdfa36 2026-07-18 snapshot: news.json
  1207. 10e999ac 2026-07-18 auto-save: 2026-07-18T10:50:58 (1 files) — data/news.json
  1208. 1d782e20 2026-07-18 auto-save: 2026-07-18T10:20:51 (1 files) — data/news.json
  1209. 92205fae 2026-07-18 auto-save: 2026-07-18T09:50:45 (1 files) — data/news.json
  1210. 73f108dc 2026-07-18 auto-save: 2026-07-18T09:20:39 (1 files) — data/news.json
  1211. f3fe00d6 2026-07-18 auto-save: 2026-07-18T08:50:32 (1 files) — data/news.json
  1212. 908a6d23 2026-07-18 auto-save: 2026-07-18T08:20:26 (1 files) — data/news.json
  1213. ba82f476 2026-07-18 auto-save: 2026-07-18T07:50:19 (1 files) — data/news.json
  1214. 61591887 2026-07-18 auto-save: 2026-07-18T07:20:11 (1 files) — data/news.json
  1215. 19789422 2026-07-18 auto-save: 2026-07-18T06:50:05 (1 files) — data/news.json
  1216. bde1e2cc 2026-07-18 auto-save: 2026-07-18T06:19:57 (1 files) — data/news.json
  1217. ceaa6a70 2026-07-18 auto-save: 2026-07-18T05:49:50 (1 files) — data/news.json
  1218. 91916f1f 2026-07-18 auto-save: 2026-07-18T05:19:43 (1 files) — data/news.json
  1219. 26c479ab 2026-07-18 auto-save: 2026-07-18T04:49:36 (1 files) — data/news.json
  1220. f830bad5 2026-07-18 auto-save: 2026-07-18T04:19:30 (1 files) — data/news.json
  1221. a28df3e6 2026-07-18 auto-save: 2026-07-18T03:49:23 (1 files) — data/news.json
  1222. 81d7e40a 2026-07-18 auto-save: 2026-07-18T03:19:16 (1 files) — data/news.json
  1223. ed303226 2026-07-18 auto-save: 2026-07-18T02:49:10 (1 files) — data/news.json
  1224. 26112585 2026-07-18 auto-save: 2026-07-18T02:19:03 (1 files) — data/news.json
  1225. f490beb5 2026-07-18 auto-save: 2026-07-18T01:48:57 (1 files) — data/news.json
  1226. c0020094 2026-07-18 auto-save: 2026-07-18T01:18:50 (1 files) — data/news.json
  1227. 3f210bf5 2026-07-18 auto-save: 2026-07-18T00:48:43 (1 files) — data/news.json
  1228. 930d2171 2026-07-18 auto-save: 2026-07-18T00:18:37 (1 files) — data/news.json
  1229. 2d791eff 2026-07-17 auto-save: 2026-07-17T23:48:30 (1 files) — data/news.json
  1230. 235cc63a 2026-07-17 auto-save: 2026-07-17T23:18:22 (1 files) — data/news.json
  1231. b1b2363d 2026-07-17 auto-save: 2026-07-17T22:48:14 (1 files) — data/news.json
  1232. 2c7efe43 2026-07-17 auto-save: 2026-07-17T22:18:08 (1 files) — data/news.json
  1233. f7d7b238 2026-07-17 auto-save: 2026-07-17T21:48:00 (1 files) — data/news.json
  1234. c9fa183b 2026-07-17 auto-save: 2026-07-17T21:17:52 (1 files) — data/news.json
  1235. e8064f68 2026-07-17 auto-save: 2026-07-17T20:47:45 (1 files) — data/news.json
  1236. 6b7891a3 2026-07-17 auto-save: 2026-07-17T20:17:38 (1 files) — data/news.json
  1237. 32e7cd15 2026-07-17 auto-save: 2026-07-17T19:47:29 (1 files) — data/news.json
  1238. 7a069d50 2026-07-17 auto-save: 2026-07-17T19:17:25 (1 files) — data/news.json
  1239. f52016b9 2026-07-17 auto-save: 2026-07-17T18:47:21 (1 files) — data/news.json
  1240. ccc8ffc9 2026-07-17 auto-save: 2026-07-17T18:17:17 (1 files) — data/news.json
  1241. 954cc26a 2026-07-17 auto-save: 2026-07-17T17:47:14 (1 files) — data/news.json
  1242. b4f866f3 2026-07-17 auto-save: 2026-07-17T17:17:09 (1 files) — data/news.json
  1243. 8f2fd541 2026-07-17 auto-save: 2026-07-17T16:47:06 (1 files) — data/news.json
  1244. 2abd6762 2026-07-17 auto-save: 2026-07-17T16:17:02 (1 files) — data/news.json
  1245. c50c8306 2026-07-17 auto-save: 2026-07-17T15:46:58 (1 files) — data/news.json
  1246. dc01ea95 2026-07-17 auto-save: 2026-07-17T15:16:54 (1 files) — data/news.json
  1247. bb13a345 2026-07-17 auto-save: 2026-07-17T14:46:50 (1 files) — data/news.json
  1248. 801932e5 2026-07-17 auto-save: 2026-07-17T14:16:47 (1 files) — data/news.json
  1249. 28e2d15b 2026-07-17 auto-save: 2026-07-17T13:46:43 (1 files) — data/news.json
  1250. 53de9783 2026-07-17 auto-save: 2026-07-17T13:16:39 (1 files) — data/news.json
  1251. 25843222 2026-07-17 auto-save: 2026-07-17T12:46:34 (1 files) — data/news.json
  1252. 374fcffe 2026-07-17 auto-save: 2026-07-17T12:16:30 (1 files) — data/news.json
  1253. a23b73f1 2026-07-17 rentv-v1: gate behind Basic Auth (admin + Boomer)
  1254. b143d490 2026-07-17 rentv-v1: public live-data CRE-news site + 20-min news engine

Authors

Agents used

  • secrets-manager2

Skills used

  • /news775
  • /markets629
  • /ticker537
  • /deals111
  • /deals-registry87
  • /search-index-meta78
  • /services18
  • /social14
  • /search13
  • /consulting13
  • /login10
  • /broker10
  • /map10
  • /pr-intelligence10
  • /review9
  • /closings9
  • /seller9
  • /type8
  • /topic8
  • /people8
  • /advertise7
  • /subscribe7
  • /pulse7
  • /jobs7
  • /videos7
  • /pull7
  • /user6
  • /index6
  • /firm6
  • /feed6

Creative ideas + design notes

Commits with substantial prose (≥120 chars) — the rationale behind each move.

437aa93c · 2026-08-15 · TK-10569: port /api/advertise + /api/advertise-inquiries from rentv to rentv-2026
Lead-capture endpoint was missing from feature/2026-overhaul-adslots branch.
Mirrors original rentv implementation; uses rentv-2026's existing writeThrottle
(10/hr per IP) instead of the manual counter pattern.
5a59077e · 2026-08-15 · rentv: per-IP write-form rate limits on /api/subscribe + /api/ad/reserve (TK-10559)
TK-10559 approved 2026-08-14 by rentv-approver triage session.

/api/subscribe: writeThrottle(10 req/hr per IP) — prevents JSONL list flooding;
existing subSet.size cap still applies for dedup.

/api/ad/reserve: adReserveThrottle(5 req/hr per IP) — prioritized (not idempotent;
each inquiry appends to ad-reservations.jsonl and marks slot reserved).

Both throttle with Retry-After header. No external dep (plain Map + Date.now).

Co-Authored-By: 4am-fix-loop <noreply@anthropic.com>
f2bf7551 · 2026-08-15 · rentv: P1+P2+P3 public-launch hardening (TK-10564/10575, Steve-approved 2026-08-14)
P1 (critical): fix INTERNAL_STATIC %2f bypass — test decodeURIComponent(req.path) so
/admin%2f correctly 302→/login like /admin does. Closes live UI-shell info-disclosure.

P2: trust proxy (req.protocol=https, req.ip=real-client behind nginx TLS terminator);
brute-force throttle on POST /api/login (10 bad attempts/15 min → 429 Retry-After);
robots.txt Disallow: /api/ to block bulk API/CSV scraping.

P3: app.disable('x-powered-by'); baseline headers middleware (X-Content-Type-Options,
X-Frame-Options, Referrer-Policy, HSTS on secure connections).

Co-Authored-By: 4am-fix-loop <noreply@anthropic.com>
d5a4141e · 2026-08-15 · pr-intelligence: add CAN-SPAM List-Unsubscribe header + address footer to buildMime (TK-10578)
Before: buildMime emitted only From/To/Subject/MIME headers — no List-Unsubscribe
header, no physical address footer injection. Sufficient for 1:1 outreach but
non-compliant for bulk/programmatic sends.

After: buildMime injects List-Unsubscribe + List-Unsubscribe-Post (RFC 8058 one-click)
headers and physical address + opt-out footer into text/HTML bodies when
PR_MAILING_ADDRESS / PR_UNSUBSCRIBE_URL env vars are set. Also adds PR_FROM_NAME for
"Display Name <addr>" From header formatting. Backwards-compatible: env vars default
to '' so 1:1 outreach path is unchanged if not configured.

Co-Authored-By: 4am-fix-loop <noreply@anthropic.com>
fc7ec801 · 2026-08-10 · fix(adslots): 5 ad-system.cjs correctness fixes + regression guards (TK-10364)
Graph-engineering hardening of the marquee ad-slots module, each defect
reproduced against real data and contrarian-gated before fixing:

- summarize() now counts 'reserved' AND an 'other' catch-all, so
  sold+available+reserved+other === total for ANY status in ad-state.json
  (an admin board reconciling the header was silently short by soft-held
  and any legacy/hand-edited status).
- originals uid strips the pre-existing 'orig-' prefix (data ids are already
  orig-brand/orig-deals/…) — was emitting 'orig-orig-brand', so admin
  overrides keyed by the logical id silently missed. Contained to the ad
  module; originals.json (read by the main site) is left untouched.
- vimeo inventory concat is Array.isArray-guarded — vimeo-library.json ships
  episodes/clips as numeric COUNTS, not arrays; hardened + forward-compatible.
- admin POST /api/ad/admin/video rejects a non-numeric price_monthly instead
  of persisting NaN (NaN passed the != null overlay test and served a
  misleading price:null over the heuristic).

test/adslots/bugfixes.test.mjs adds regression guards for each. adslots
suite 154 pass, full suite 224 pass, 0 fail. No deploy, no prod push.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
f709ec78 · 2026-08-10 · test(adslots): +124 coverage (buildInventory sources/dedup, reserve soft-hold lifecycle, exact price ladder, admin gating) + replace a pricing tautology with live-value asserts
Graph-engineering pass under TK-10364: 6 new zero-dep test files raise the ad-system.cjs adslots suite 23->147 (0 fail). No production code changed. Contrarian(Cody)-gated: fixed a false-confidence tautology in pricing (assert.ok(200<250) -> live suggested_price asserts), pinned the intentional admin-can-unsell vs public-reserve-cannot asymmetry, and clarified the quoted_monthly=0 known-bug guard.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
423cfa3d · 2026-08-08 · test(adslots): cover ad-system admin write paths (video/placement/site-template)
Completes src/ad-system.cjs coverage — admin state mutations (uid/id 400 guards,
status-enum validation, Number coercion, persistence to ad-state.json), reservations
read (reversed + empty-safe), and the site-template pick (enum guard + persistence +
read-back + the 'going live is separately gated' note). No production code changed.
Suite 84->93 green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
adcaafca · 2026-08-08 · test(adslots): rate-card data contract + rate-card/slot endpoint coverage
Covers the half of src/ad-system.cjs cycle-1 left untested. Real-data contract on
data/ad-slots.json (unique ids, required id/name/type, numeric price, valid status
enum, created_at present) so a malformed hand-edit is caught in CI, not by an
advertiser. Plus fake-Express coverage of /api/ad/rate-card creative merge and
/api/ad/slot/:id known-id merge + unknown-id 404. No production code changed.
Suite 77->84 green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
e15f5398 · 2026-08-08 · test(adslots): cover ad-system + fix filtered inventory summary mismatch
/api/ad/inventory summarized a fresh unfiltered buildInventory() instead of the
filtered list it returns, so summary.total/by_source/sold/available disagreed with
count/items on any ?source= / ?status= request. Summarize the returned list
instead (also removes a redundant second inventory scan).

Adds test/adslots/inventory.test.mjs: 7 tests via a zero-dep fake-Express harness
over temp fixtures — suggestPrice per-source asks + plays bumps + $50 rounding,
summarize source/status counts, reserve 400/200 validation, and a regression guard
that fails against the old summarize(buildInventory()) call. Suite 70->77 green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d71f0c89 · 2026-08-07 · fix(login): resolve /api/login against location.origin so Basic-Auth creds-in-URL access can't taint the fetch base
Page reached via https://user:pass@host/login inherits creds into the document
base URL; relative fetch('/api/login') then resolves to a credentialed URL and
the Fetch spec throws 'Request cannot be constructed from a URL that includes
credentials'. location.origin never carries userinfo. Matches the surgical
single-file hotfix already deployed to prod (/root/public-projects/rentv).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cfd849be · 2026-08-07 · selector: add Classic (original) as 6th option + rank all 6 + why-it-wins + CRE competitor landscape
- Classic = the current live site, now a first-class selectable card (iframe→/, chosen accepts 'classic').
- All 6 ranked (#1 Cinematic … #6 Classic) with a 'Why it wins' pitch + the CRE competitor each out-designs (Bisnow/The REview/The Real Deal/CoStar/Commercial Observer/current).
- New 'The field' section: 6 real CRE news-wire/conference rivals (The Real Deal, Bisnow, Commercial Observer, GlobeSt, CoStar, Connect CRE) with links.
- Cards sorted by rank; #1 gets a ★ Recommended tag.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
93172711 · 2026-08-07 · TK-10350: verify 5 distinct template variants + wire template D video cards into ad inventory (all 123 videos sponsorable)
- Verified /2026/{a,b,c,d,e}.html all render (HTTP 200, no JS errors — only
  cosmetic favicon + prod-only news-thumbnail 404s) and are genuinely distinct
  UI/UX directions: A Video Wall (dark, video-forward), B Editorial (serif
  news river), C Cinematic (pure-black, red accent), D Magazine (navy serif
  front page), E Dashboard (monospace CRE terminal).
- Confirmed all 123 vimeo-library videos are wired as sponsorable ad inventory
  via src/ad-system.cjs (/api/ad/inventory: total 154, vimeo 123, 0 missing,
  every item drillable via view_url/embed).
- FIX: template D had sponsoredFlag() helper + CSS defined but never called —
  its /api/videos-driven cards showed no per-video sponsorship layer that
  A/B/C/E have. Added loadSponsorMap() + sponsorForVideo() to merge
  /api/ad/inventory sponsorship state onto D's review cards + Video-of-Week
  hero. Verified headless: D now renders SPONSORED flags (Kidder Mathews, JLL)
  + Sponsor-this offers.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cf5c27a7 · 2026-08-07 · TK-10105: fix heygen 'Not logged in' auth wiring in buildloop
The heygen CLI authenticates from EITHER ~/.heygen/credentials OR $HEYGEN_API_KEY.
Under launchd/sandbox the credentials file can be unreachable and the env var is
empty, so any heygen call in a cycle dies with 'Not logged in' / 'no API key found'.
Export the valid key (routed by secrets-manager into the heygen skill .env) before
invoking claude so auth/list/whoami checks work. Renders stay gated (no spend tool;
prompt forces HeyGen renders to a pending-approval memo).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
e6e748c4 · 2026-08-07 · rentv 2026: admin front-end template toggle
Floating switcher (public/template-toggle.js) lets a logged-in admin/user flip the
live front end between the original site + the 5 concepts (A-E) from the front end.
Gating: live front page shows it only for an authed admin/user session (/api/whoami);
concept pages (/2026/*, /advertise) always show it (demoable); ?tt=1 forces it on.
Marks the chosen site with a ★ (reads site-template.json). Injected into index +
all 5 templates + advertise.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
23094df1 · 2026-08-07 · rentv: re-gate site behind un/pw (reverse 2026-08-06 public launch)
Steve 2026-08-07: rentv.agentabrams.com should not be publicly live; ask for
un/pw to enter. Reverses the TK-10284 public tier: anonymous visitors are now
challenged at the app layer — browser navigations 302 to /login (login.html),
assets/APIs get 401 + WWW-Authenticate (browser un/pw popup). Reuses the existing
ROLE_CREDS (admin + user tiers) — no new secrets. PUBLIC=1 env restores open mode
without a code edit. Verified locally: anon 302/401, valid creds 200, session +
bad-creds paths correct.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
089da29b · 2026-08-07 · RENTV 2026: element-numbering overlay (all templates) + demo sold-sponsorship creatives
- public/2026/elements.js: shared drop-in that numbers every significant element
  (stable DOM-order N + badge + searchable index panel), toggled by button / 'e' key / ?num=1.
  Injected into all 5 templates + selector + advertise + ad-admin so any element is
  referenceable as 'Template C · el N' in future feedback.
- public/ad-creatives/{jll-leaderboard,cbre-masthead,mm-rectangle}.svg: demo banner
  creatives so the sold-slot creative-serving state is visible on the live templates
  (data/ad-state.json seeds 3 sold banners + 3 sold video sponsorships; runtime, gitignored).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
827eb166 · 2026-08-07 · RENTV 2026: 5-template selector + ad-slots-for-sale system (all videos as sponsorable inventory)
- 5 distinct video-forward homepage templates (public/2026/{a..e}.html): Video Wall,
  Editorial Lead, Cinematic, Magazine, Dashboard — each self-contained, live data,
  sort+density on every grid, ad slots served in-context.
- Selector modal (public/2026/index.html): live iframe previews, full-screen switcher
  with device toggle, 'Make this the site' -> data/site-template.json (admin-gated, local pick only).
- Ad-slots system (src/ad-system.cjs, one-line mount in server.js): banner/newsletter/video-surface
  rate card (data/ad-slots.json) + ALL 154 RENTV videos pulled into sponsorable inventory live
  (youtube+vimeo+originals+news-wire), monthly pricing, availability, reserve-inquiry flow (NO charge),
  admin state, reservations queue.
- Rebuilt /advertise into a slots-for-sale marketplace; /ad-admin management surface
  (created date+time chips, toggleable columns); /ad-slot.js on-page banner serving.

Local build in isolated worktree; prod deploy stays claude-rentv/Steve gated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0a9bf943 · 2026-08-07 · allstar: 5 firm-inspired themes with distinct UI per theme (toggle + persist)
Each theme is a different layout system, not a recolor — routed the remaining
hardcoded colors/gradients/fonts through CSS vars, then per-theme structural
overrides (hero arrangement, nav treatment, card shape, radius, light/dark):
 - Editorial (RENTV/Real Deal, red serif, ruled), Institutional (CBRE/M&M navy
   full-bleed band, boxed nav), Capital (Blackstone dark luxe, centered serif,
   gold hairlines), Brokerage (Cushman/JLL emerald, pill nav, soft cards),
   Summit (modern expo indigo→violet gradient, pill nav).
Masthead theme switcher, localStorage-persisted, pre-paint FOUC guard.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
da2aa3f6 · 2026-08-07 · Add All Star Group section to RENTV backend — RENTV-style rebuild, 2026
Rebuilds allstargroup.com the way RENTV works: a self-contained backend page
(public/allstar.html) served behind adminOnly at /allstar, with the site's
real nav rebuilt as tabs (Home / Events / Income Property Lending), refreshed
for 2026 (flagship CRELC — April 29 2026, Westin Long Beach).

- Brings in real video: two YouTube embeds of Arnie Garfinkel on the events
  (oEmbed-verified embeddable).
- Highlights Arnie Garfinkel + his full experience (IPL since 1995, Pacific
  Thrift & Loan, UCCI, Foothill Capital, CAMB/NAMB/CMBA speaker).
- Wired all three RENTV touchpoints: adminOnly route, INTERNAL_PAGE (footer),
  and INTERNAL_STATIC (security gate so /allstar.html can't leak publicly).
- Added an All Star Group card to the RENTV Backend hub.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4cf0c4ad · 2026-08-07 · consulting portal: sync refreshed CRCP growth page + daynight readability fix from consulting-rentv-com@55f002c (TK-10299/TK-10319)
Landed by claude-mac2 with Steve's explicit in-session authorization ("HELP DO IT", 2026-08-07).
Single-file scoped commit; triggers the auto-deploy hook to make prod durable (was on an interim rsync).
47c3761d · 2026-08-06 · polish(services): trade chips — specialty trades lead, General buckets trail muted
Cody #3: General Building (~91% of contractors) was swamping the trade-filter row and
defeating its purpose. Now the specialty trades (Electrical/Plumbing/HVAC/Roofing/etc.)
lead; General Building + General Engineering trail with a muted dashed style. Client-only, $0.
47cb4fdb · 2026-08-06 · feat(services): contractor trade filter (CSLB class) for Construction
Deal teams can filter 25.7k LA contractors by trade — General Building, Electrical (C-10),
HVAC (C-20), Plumbing (C-36), Roofing, Concrete, Structural Steel, Fire Protection, Elevator,
etc. — via a regex match on the CSLB class inside license_type. New /api/services/trades facet
(counts DISTINCT firms so the chip count matches the deduped result), trade param on
/api/services + CSV export, client trade-filter chips on Construction (deep-linkable).

Cody gate (FIX FIRST) resolved: (1) general-building regex proven to NOT leak B-2 Residential
Remodeling — 0 matches against 184 real B-2 rows, documented; (2) facet/filter count gap fixed
by counting distinct firms (chip 1955 == result 1955). $0, existing data.
6574a4ff · 2026-08-06 · feat(services): Property Management now registry-backed (162 DRE-licensed PM firms)
SERVICE_CATS.property → role 'Property Manager' (was featured-only); serviceSpecialty surfaces
the local-model descriptor; ca_dre_pm → 'CA DRE' source label. Real firms + featured majors, with
verified DRE 'Licensed' status + official DRE public-record links.
8e0541c9 · 2026-08-06 · feat(services): CSV export + per-view SEO/JSON-LD + provider detail pages
Three sales/discoverability features:

1. CSV export — /api/services/export.csv streams the current category/metro/filter as a
   deduped one-row-per-firm prospect list (biggest-first, featured included), admin
   '⤓ Export CSV' button; Content-Disposition attachment. ~1,088 lender rows/click.
2. SEO — /services now server-injects per-metro/category <title>, meta description,
   canonical, OG tags, and JSON-LD (CollectionPage + BreadcrumbList + ItemList of
   featured firms) via a sendPage(transform) hook; /services + 6 category URLs added
   to sitemap.xml. Crawlable for 'LA commercial title companies' etc.
3. Provider detail pages — /services/:id + /api/services/provider/:id: full profile
   with the firm's complete branch-license roster (the value-add over the card),
   humanized specialties, official public-record links, 'Pairs well with' deal-team
   cross-links, and admin Solicit+note. Card firm names now link to the detail page
   (honors the all-data-points-href rule). Handles both registry (numeric) and
   featured (f-*) ids.

Verified: export headers+attachment, per-cat <title>/JSON-LD types, detail page renders
37-branch roster + pairs, card names deep-link.
e393d66a · 2026-08-06 · feat(services): DTD-verdict guardrails on the Featured layer (keep-with-guardrails)
Panel voted 8/8 to KEEP the curated Featured layer, conditional on hardening the
pay-to-play firewall. Implements the four attached conditions:

1. Disclosure banner above Featured cards: '★ Featured = unpaid editorial selection —
   no firm has paid for placement …' (public-facing, on every category with featured).
2. Published selection methodology in the banner (prominence + verifiable standing +
   metro coverage), sourced from services-featured.json selection_criteria.
3. Pay-to-play tripwire: seed 'policy' field + code — a paid slot MUST set paid:true,
   which renders 'Sponsored' (not '★ Featured'), visually distinct, with rel=sponsored
   on its link; editorial Featured stays rel=nofollow. Never silently mixed.
4. last_verified date (shown in banner) + verify_cadence_days:90 in the seed for a
   re-check cadence so a defunct firm is never shown as Featured.

Verified: facets returns featured_meta; Title view renders the banner with the date +
'no firm has paid' line; featured rows carry paid:false / source_label 'Featured'.
e8a2e401 · 2026-08-06 · chore(services): localhost-only ?reset=outreach to clear the outreach basket
Dev/preview convenience — clears the rentv.growthLI.v1 localStorage bucket, but only
when hostname is 127.0.0.1/localhost, so a shared or bookmarked link can never wipe a
real outreach list on the live site. No-op on the production domain.
4c3bc491 · 2026-08-06 · feat(services): per-firm pitch note rides into the /social letter
Admin card gets a dashed 'Note for the pitch' field. On Solicit (single or bulk) the
note is stored on the outreach item and — in social.html's letterFor — opens the
generated sponsorship letter (capitalized, auto-punctuated) so each pitch is
personalized (e.g. 'Met at ICSC Las Vegas — keen on industrial.'). Note is editable:
re-soliciting a firm updates its stored note; the note also shows in the outreach
rail sub-line. Verified E2E via Playwright: /services note → localStorage → /social
letterFor output contains the note.
0250fee3 · 2026-08-06 · feat(services): 'Solicit all visible' bulk action (admin)
Adds a one-click 'Solicit all visible' button (admin-only, in the control bar) that
queues every firm currently loaded on screen into the outreach basket at once —
deduped, respecting the current category/metro/search/city filter and any Load-More
pages already expanded. Refactored the single-Solicit path into a shared
addToOutreach() helper; BYID is cleared on each reset so 'visible' means exactly the
current view; button shows an 'Added N (M visible)' confirmation.
d3fe7c22 · 2026-08-06 · feat(services): admin-only 'Solicit' → pipes firm into /social outreach generator
Turns the ranked directory into a working lead-gen funnel for RENTV's sales.

- services.html: each card gets a ✉ Solicit button (ADMIN-ONLY — /services is public,
  /social is admin, so the action only renders for logged-in staff via /api/whoami).
  Solicit appends the firm to the SAME localStorage bucket social.html reads,
  mapping our category → social's role vocabulary (Contractor→Construction/GCs,
  Lender→Lenders & Capital Sources, etc.), deduped. A floating ✉ Outreach basket
  shows the count + opens /social where the sponsorship-pitch letter generator loads.
- server.js: /api/whoami honors OPEN=1 local-preview bypass so the admin UI is testable
  locally (prod has no OPEN → stays session-gated; public sees nothing).
427a4cf2 · 2026-08-06 · feat(services): rank big multi-location firms first (solicitation view) + add Arizona
Reframes /services as a ranked PROSPECT list — the large, multi-branch operators
(the firms with ad budgets to solicit) surface first.

- server.js: default sort 'Most locations' — normalized-name window count over branch
  licenses (regexp_replace(lower(name),'[^a-z0-9]+','')) → loc_count + city_count;
  the locations sort dedupes to one representative card per firm, biggest first;
  featured majors stay pinned above. Fixed count(DISTINCT) OVER (not allowed in PG)
  via a GROUP BY stats CTE joined back.
- Added ARIZONA market (27,436 contractors + 9,467 developers — RENTV covers AZ).
  Honest coverage: featured firms now carry 'national' vs 'socal' tokens so
  nationally-present Title/Property majors (First American, CBRE) appear in AZ but
  SoCal-only law firms never falsely claim Arizona; AZ correctly shows only
  Construction/Developers/Title/Property (lenders/escrow/legal hidden — no AZ registry).
- services.html: 'Most locations' default sort option, 📍 N-locations badge, Arizona
  in the metro switcher.
8d4a638e · 2026-08-06 · feat(services): guarantee >=1 vendor per category — curated Featured layer
Every service category now shows at least one vendor in every metro. The public
license registries don't cover Title or Property Management and barely cover Legal
(3 attorney rows statewide), so those are filled by a curated seed of REAL, verifiable
major CRE firms (First American Title, CBRE, Allen Matkins, etc.), clearly badged
★ Featured and pinned above the registry rows — never fabricated data.

- data/services-featured.json: curated real firms (Title/Property/Legal + a flagship
  for each registry category), markets:'all' = serves all SoCal metros.
- server.js: Title + Property Management categories (role:null, featured-only);
  featuredFor() helper; /api/services pins featured on page 1 (skipped when a city
  filter is active); facets fold featured into per-cat counts so none render empty.
- services.html: gold ★ Featured pill + card treatment, featured pinned above rows,
  meta shows 'N featured', note explains the curation.
- build-services-content.mjs + services-content.json: blurbs for Title + Property (local Ollama, $0).
71ec8d49 · 2026-08-06 · fix(auth): bridge server-admin session into /api/pr so deals.html deal-notes work
deals.html is a server-realm page (session/Basic auth), but /api/pr only resolved
Basic/service creds — a server-session admin got 401 on deal notes (deals.html deal
drawer). Bridge ADMIN server sessions into the PR layer (prAuthCtx then treats them
as tenant-1 admin); gate to role==='admin' so front-page user-tier logins still can't
reach the internal CRM. authVia='session' keeps the CSRF gate active for mutations;
deals.html now loads /csrf.js so its POSTs carry the double-submit token.

Verified: server-admin session GET/POST notes 200 (POST 403 without CSRF); user-tier
session /api/pr 401 (no leak); pr_session workspace unaffected.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0960554d · 2026-08-06 · consulting portal: remove dead theme-aware CSS (superseded by forced-black bg)
The theme-aware --gold/accent scheme + its html.rentv-night/body.theme-dark override
never took effect once the page pinned a permanent black background (daynight doesn't
touch the accent vars at all — only the bg needed pinning). Collapse the base :root to
the bright values that actually render and drop the dead night-override rule + comment.
Visually neutral: final computed accent values unchanged.
55129020 · 2026-08-06 · nav(services): add CRE Services to shared masthead drawer (rentv-nav.js) + homepage nav row
- rentv-nav.js: 'CRE Directory' + 'CRE Services' now in the injected masthead-chrome
  Explore drawer (benefits any header.mast page without its own drawer).
- index.html: the fleet fan-out missed the homepage (emoji byte-mismatch on the
  🏢 anchor); added 🛠️ CRE Services beside CRE Directory in the homepage nav row.
  Fleet coverage now 11/11 drawer-nav pages + shared masthead drawer.
bc6ded37 · 2026-08-06 · feat(services): metro switcher (LA/OC/SD/IE/Ventura) + fleet nav link
- services.html: Metro market <select> (Greater LA · Orange County · San Diego ·
  Inland Empire · Ventura), persisted + deep-linkable (?market=). Hero headline/
  kicker/dek/title + category counts + city chips all re-template per market.
  Zero-count categories (e.g. Legal outside LA) are hidden; empty selected cat
  falls back to the biggest non-empty one. City drill-links carry the market.
- 10 masthead pages (brief/compare/hub/metros/syndicate/sector/topic/topics/
  index/region): added 'CRE Services' link beside 'CRE Directory' in the drawer nav.
d72a1293 · 2026-08-06 · consulting portal: make gold + semantic accents theme-aware so text is readable in day mode
daynight.js flips --bg to white by default but never managed --gold, so all gold
text (and the red/green/blue SWOT + teardown accents) washed out on white. Pinned
--gold/--pos/--neg/--info to deep readable tones at :root (day) with bright tones
under html.rentv-night/body.theme-dark (night).
f57a571a · 2026-08-06 · Move Regions + Market Snapshot into the right hamburger (Sections) drawer
Homepage: Market Snapshot markup relocated from left #drawer to right
#drawerR; Regions now injected into the right drawer via a data-regions
marker + data-regions-anchor (buildDrawerGroup targets [data-regions]).
Masthead pages (buildMastNav): Regions clone moved from left to right
drawer for parity. aria-labels updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d7e04f05 · 2026-08-06 · feat(services): /services — Greater LA CRE services directory from real license registries
New public page + API listing licensed LA CRE service providers by category
(Construction/GCs 25.7k · Lenders 1.3k · Escrow 499 · Developers 152 · Legal),
sourced from the realestate DB (CSLB / DFPI / CA DRE / State Bar public records).

- server.js: public /api/services (server-side sort/search/city filter, paginated)
  + /api/services/facets (counts + top cities + LLM copy) + /services route;
  CSLB license-code humanizer; empty-string coalescing; source-registry labels.
- public/services.html: category chips w/ live counts + blurbs, real server-side
  Sort (Name/City) + density slider (persisted), city-filter chips, graceful
  cards (drill: role->tab, city->filter, license->public record, phone->tel:),
  Brokerage cross-links to /directory (no fabricated data).
- scripts/build-services-content.mjs: LOCAL Ollama (qwen2.5, $0) category copy.
- directory.html: cross-link to /services.
a8efed7c · 2026-08-06 · PR-intel: soft-delete (Discard) for outreach drafts
The outreach layer was append-only — POST /outreach/draft always inserts a
new row and there was no delete/void path, so regenerating a draft for the
same person left un-removable duplicates (Tim Jemal #3/#6/#7) that inflated
drafts_awaiting_review.

- migration 010: add 'discarded' to pr_outreach_status + a discarded_at
  column (soft-delete, nothing sent is ever hard-deleted).
- outreach.discard(): status='discarded' + discarded_at; HARD rule — a row
  with sent_at IS NOT NULL can never be discarded (audit trail); only
  non-sent drafts (draft_generated/needs_review/provider_draft_created/
  approved) are discardable; idempotent.
- outreach.list(): hide discarded rows unless ?status=discarded or
  ?include_discarded=1. drafts_awaiting_review already excludes them (it
  only counts draft_generated/needs_review).
- DELETE /api/pr/outreach/:id (adminOnly) wired to outreach.discard.
- review.html Reply-history panel: a Discard button on each non-sent draft,
  wired via PR.api('/outreach/'+id, {method:'DELETE'}); sent messages get no
  button.

TK-10297. Migration + discard rules verified against throwaway
rentv_pr_test; full test suite 58/58. Live deploy + prod migration
Steve-gated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
46664637 · 2026-08-06 · PR-intel CA gate: count a verified general_press_email as a contact
The contact_coverage gate only counted an org as "covered" if it had a
pr_people row in a comms/leadership role, so orgs reachable via a verified
org-level press channel (e.g. Lockton's media@lockton.com) scored as
"no PR contact" and held the CA gate under 70%.

Extend the with_contact FILTER in settings.stateGate with an OR arm that
also counts an org whose general_press_email is present AND backed by a
pr_field_evidence row for field_name='general_press_email' — so only
verified, evidence-backed press channels count, never an inferred or
hand-typed address (mirrors the org_completeness has_evidence gate and the
no_mislabeled_inferred rule). The stricter comms_only sub-metric is left
untouched and still reported.

Mirror the same definition in organizations.list's no_pr_contact filter and
the dashboard's orgs_without_pr_contact count so all three agree.

TK-10297. Verified against throwaway rentv_pr_test: an evidence-backed
press-email org counts; an inferred one and a bare org do not. Live deploy
Steve-gated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
30df559d · 2026-08-06 · PR CRM notes: attach to deals too (string entity_id) + deals.html wiring
- migration 009: widen pr_notes.entity_id bigint→text so notes attach to
  string-keyed entities (deal ids like 'md<ts>'/feed slugs), not just numeric
  org/person ids — keeps the widget truly generic
- notes.js: entity_id treated as text; activity-timeline row only recorded for
  numeric ids (pr_activities.entity_id is bigint)
- routes: pass entity_id through as text (no Number() coercion)
- deals.html: load pr-shared.js, add a Notes section to the edit modal shown
  when editing a persisted deal; mount PR.notes(el,'deal',id)
- verified: deal string-id add/list 200 + org numeric-id regression 200

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ce079996 · 2026-08-06 · nav: surface /market-pulse (charts) in map hamburger + site-wide Explore drawer
Post public-launch (TK-10284) the charts dashboard had no visible nav link.
/market-pulse + /markets are public (200); /deals + /pulse stay admin-gated.
TK-10296
6b792cc9 · 2026-08-06 · PR CRM: user-authored notes on any entity (org/broker/person/property/deal)
- migration 008: pr_notes table (tenant_id, entity_type, entity_id, body, author,
  pinned, created/updated) + RLS tenant policy + pr_app grants
- notes service: list/add/update/pin/remove, author-stamped, records a
  note_added activity into the entity timeline; RLS scopes reads, insert sets
  tenant_id to satisfy WITH CHECK
- 5 routes under /api/pr/notes (read for GET, write for mutations), mounted
  AFTER the router gate so db.tenantMiddleware binds them (RLS auto-scoped)
- reusable PR.notes() widget in pr-shared.js (compose+list, pin/edit/delete,
  RBAC-aware via memoized /auth/me) wired into the person + org drawers
- verified: RLS isolation (tenant 2 sees 0 of tenant 1's notes) + RBAC
  (read-only user 403) end-to-end over HTTP

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2837beed · 2026-08-06 · Split nav into TWO hamburgers: upper-left (Explore+Regions) + upper-right (Sections+Tools)
Steve: 'Split hamburger between upper right and left.' Both the map's own build AND the
sitewide masthead build now render two hamburgers flanking a centered logo:
 • LEFT drawer (slides from left): Explore pages + Regions
 • RIGHT drawer (slides from right): Sections (+ the map's filters/legend/Near me/Reset on /map)
Region/Section links split from the hidden strip (.rt-geo → left, .rt-cat → right).
Verified markets/blog/map: 2 hamburgers, logo centered, correct split, 0 errors.

TK-10284

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ba9f632d · 2026-08-06 · logo: make it genuinely LIQUID — animated specular sweep + flowing tint + frosted glass
Steve feedback: shipped logo read as a static glossy pill, 'no liquid'. Added real motion:
- rentv-flow: slow flowing gradient tint (9s loop)
- rentv-sweep: a specular light band glides across the capsule (5.5s loop) — the liquid signal
- backdrop-filter frost + glass meniscus highlight; respects prefers-reduced-motion
Centering preserved (a.brand.rentv-logo re-asserted; transform not animated). Verified via 3-frame + 12-frame GIF render.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
9d3b82a9 · 2026-08-06 · Sitewide nav: collapse all tab strips into a hamburger + center the logo
Steve: 'all tabs on every page need hamburger for a cleaner look. Center logo on topline.'
- rentv-nav.js: retire the horizontal region/section strip everywhere (kept hidden as the
  drawer data source). Masthead pages (blog/markets/article/review/about) now get an injected
  left hamburger + drawer (Explore + Regions/Sections) and their OWN horizontal nav bar is
  hidden; header.top pages keep their native burger+drawer. Wordmark centered on the top line
  across masthead pages (secondary edition/date text dropped so it truly centers).
- map.html: center the wordmark on its top line too; mark its drawer data-own-nav so the
  sitewide nav doesn't double up.
Verified across mast + top pages: one hamburger each, no horizontal nav, logo centered, 0 errors.

TK-10284

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ea0ef6cd · 2026-08-06 · PR intel (b2 complete): tenant isolation via Postgres RLS
- migration 007: ENABLE + FORCE RLS + tenant policy on all 17 entity tables
  (NULLIF-guarded so an unset GUC = full system access, never a cast error).
  Auth tables excluded (login is pre-tenant).
- db.js: AsyncLocalStorage — tenantMiddleware checks out one connection per web
  request, SET app.tenant_id, and every query auto-scopes to the caller's tenant.
  Worker/CLI run unscoped = full cross-tenant.
- index.js: PR router mounts db.tenantMiddleware after the capability gate.
- app connects as non-superuser pr_app (superusers bypass RLS); PR_DATABASE_URL.
- retired the PR_MULTI_TENANT_READY guard — isolation is DB-enforced.
- PROVEN end-to-end: a tenant-2 user sees ONLY tenant-2 data via HTTP; tenant-1
  sees 0 tenant-2 rows; unset (worker) sees all.
0044e5f8 · 2026-08-06 · News map: collapse ALL controls into one LEFT hamburger; strip the busy top bar
Steve: 'do not show tabs across screen.. busy.. horrible. put into its own collapsed
hamburger on left.' Removed the wide filter/tab row entirely; the top is now just a slim
wordmark + story count. One hamburger (upper-LEFT) opens a left drawer holding the legend,
all map filters (Show/Type/Years/Near me/Reset), and all nav (Explore + Regions/Sections).
Map now starts at ~64px (was 310). Near me / Reset auto-close the drawer.

TK-10284

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5c689bb6 · 2026-08-06 · News map: collapse nav into a hamburger + log all articles in sitemap
- Map chrome was eating 310px (393 on mobile) before the map. Hide the injected
  region/section tab strip and move ALL nav into a hamburger drawer (upper-right);
  collapse the filter controls to one compact scrollable row; hide util bar + legend
  on mobile. Map now starts at ~150px desktop / ~138px mobile.
- sitemap.xml: log EVERY RENTV article (full corpus, ~4,466) individually, not just
  the 30 recent — deduped corpus + live-feed.

TK-10284

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
108b7392 · 2026-08-06 · PR intel (b2 partial): scope outreach reads by tenant + completion checklist
Scoped outreach.list + route by tenant_id (joins the org/people lists already
scoped). Added MULTITENANT_TODO.md: the exact remaining reads to scope
(campaigns/tasks/sources/relationships/suppression/runs/letters/dashboard/
export) + an RLS alternative + the verification gate. The PR_MULTI_TENANT_READY
guard stays until that pass is complete + verified, so no false isolation ships.

File tree

703 files tracked. Click any to browse the source at HEAD.

Other build journals

← Rentv  ·  all 4 projects  ·  Rentv 826 Tracker →

Export

commits.csv · feed.atom · project.json · commits.json

rendered in 15ms