{
 "page": "mobile-community",
 "audited": "2026-11-05",
 "stamp": "20261105as1",
 "method": "Served the worktree and drove it in Chromium against the stubbed-Supabase harness (qc/d3-accept-social.spec.cjs asserts every automatable pass). 'na' = needs a table, RPC or data FedM8 does not have; the UI is left out (R9) and the entry names what it would need.",
 "criteria": [
  {
   "i": 1,
   "result": "fail",
   "evidence": "No breadcrumb or back arrow, but the first H1 is the feed title 'New in your rooms'; the page is named Chat.",
   "needs": "owner decision on the page name; rename the H1 in assets/chat-home.js"
  },
  {
   "i": 2,
   "result": "fail",
   "evidence": "The chip row is the real room catalogue (Everything first and selected, 10 rooms, NAICS codes, conversations), 44px high and scrolls; not Contracts, Grants, Certs, Teaming, Wins.",
   "needs": "owner decision on the Spaces set"
  },
  {
   "i": 3,
   "result": "fail",
   "evidence": "Chips mark the selection with aria-current and the cream token (not navy); there is no Teaming room and the spec asks for aria-pressed.",
   "needs": "spaces set (see 2)"
  },
  {
   "i": 4,
   "result": "fail",
   "evidence": "Hot, New and Top show at 44px, but New is the default, not Hot.",
   "needs": "owner decision on the default sort"
  },
  {
   "i": 5,
   "result": "pass",
   "evidence": "Top then New re-orders the loaded posts newest first with no reload; asserted."
  },
  {
   "i": 6,
   "result": "fail",
   "evidence": "Card has vote rail with score, 'in <room>' tag, avatar, author, relative time, title and a reply-count link (both now open the thread). There is no Save button.",
   "needs": "saved_posts table and RPC (see community 18)"
  },
  {
   "i": 7,
   "result": "pass",
   "evidence": "Upvote sets aria-pressed and adds 1; a second tap removes it."
  },
  {
   "i": 8,
   "result": "pass",
   "evidence": "Up then Down: Down is pressed and the score is baseline minus 1 (3 to 2 in the stub)."
  },
  {
   "i": 9,
   "result": "pass",
   "evidence": "A failing vote reverts the score and shows a toast."
  },
  {
   "i": 10,
   "result": "pass",
   "evidence": "The post title and the 'N replies' count are links to the thread (added), as is Open."
  },
  {
   "i": 11,
   "result": "na",
   "evidence": "No Save for posts (see 6).",
   "needs": "saved_posts table and toggle RPC"
  },
  {
   "i": 12,
   "result": "pass",
   "evidence": "An empty room shows 'Nobody has posted here yet. Ask the first question above.' with a New post button that opens the sheet (button added; wording is the existing copy, not 'No posts in <space> yet')."
  },
  {
   "i": 13,
   "result": "pass",
   "evidence": "Three skeleton cards show while posts load."
  },
  {
   "i": 14,
   "result": "pass",
   "evidence": "A failed read shows an alert with Try again; the rooms row and sort stay usable (fixed: they used to vanish)."
  },
  {
   "i": 15,
   "result": "fail",
   "evidence": "The list is capped (30 per room) and there is no next page; clearance above the FAB and tab bar is met by the 104px bottom padding.",
   "needs": "a cursor or offset argument on list_talk_threads and an infinite-scroll loader"
  },
  {
   "i": 16,
   "result": "pass",
   "evidence": "FAB is 56px, amber, named 'New post' and the only amber element at rest (Post is in the closed sheet)."
  },
  {
   "i": 17,
   "result": "fail",
   "evidence": "The sheet opens with the room preselected, the body box and a Post that is off while empty. There is no separate title field: a room post's title is the first line.",
   "needs": "a title field and post_talk_thread p_title from it"
  },
  {
   "i": 18,
   "result": "pass",
   "evidence": "With the failing RPC the draft stays and the failure is said; on success the sheet closes and the post appears first under New. Fixed: the sheet sat under the tab bar (z-index 30 under 90), so Post could not be tapped."
  },
  {
   "i": 19,
   "result": "pass",
   "evidence": "No 'Sample members' text in the code or the page."
  },
  {
   "i": 20,
   "result": "pass",
   "evidence": "The Chat tab has aria-current=page, 56px; the content's bottom padding is at least the 73px bar."
  },
  {
   "i": 21,
   "result": "fail",
   "evidence": "No pull-to-refresh gesture.",
   "needs": "a touch pull handler that reloads the feed and scrolls to top"
  },
  {
   "i": 22,
   "result": "pass",
   "evidence": "At text scale 1.3: no horizontal scroll and the vote rail stays 44px; titles wrap."
  },
  {
   "i": 23,
   "result": "pass",
   "evidence": "axe color-contrast is clean at 390 including the 'in <room>' meta text."
  }
 ]
}