{
 "page": "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": "The active pill is 'Chat' (aria-current=page, the only navy pill, no 'All tools' menu) but the header has 9 pills and not 8, and the label is not 'Community'. The nav belongs to the shell.",
   "needs": "owner decision on the name and the pill count in assets/os-boot.js"
  },
  {
   "i": 2,
   "result": "pass",
   "evidence": "No breadcrumb on the page (0 fm-crumbs)."
  },
  {
   "i": 3,
   "result": "pass",
   "evidence": "Clicking General: H1 becomes 'General', the address becomes #/community?space=general (added), the row has the cream row token and weight 700; a reload restores the Space."
  },
  {
   "i": 4,
   "result": "pass",
   "evidence": "'N new' appears only when the count is real; rooms without new posts show no number."
  },
  {
   "i": 5,
   "result": "na",
   "evidence": "Rooms are a fixed catalogue plus your NAICS codes and followed conversations; there is no spaces table.",
   "needs": "spaces table, create_space RPC with name and description, and RLS"
  },
  {
   "i": 6,
   "result": "pass",
   "evidence": "Hot, New and Top (Hot added: score lifted by freshness on loaded posts) with exactly one aria-pressed=true; the choice goes into the address."
  },
  {
   "i": 7,
   "result": "pass",
   "evidence": "Post is amber and disabled while the box is empty (changed: it used to be enabled), enabled with text; it is the only primary button in the column."
  },
  {
   "i": 8,
   "result": "na",
   "evidence": "The composer posts text to a room or contract room; a post cannot carry a contract embed.",
   "needs": "talk_posts.attachment jsonb {kind:'notice', id} and post_talk_thread argument"
  },
  {
   "i": 9,
   "result": "na",
   "evidence": "No polls: there are no poll tables or RPCs, so the UI is left out (R9).",
   "needs": "poll tables (poll, option, vote), create_poll and vote_poll RPCs"
  },
  {
   "i": 10,
   "result": "pass",
   "evidence": "Upvote adds 1 and sets aria-pressed; the same tap again returns the score; asserted."
  },
  {
   "i": 11,
   "result": "pass",
   "evidence": "With vote_talk_thread failing the score reverts and a toast ('The vote did not save.') shows; asserted."
  },
  {
   "i": 12,
   "result": "pass",
   "evidence": "The best-contract embed's due chip is neutral at 12 days, fm-badge--warn at 5 days, fm-badge--urgent at 24h (R5), checked by moving the clock."
  },
  {
   "i": 13,
   "result": "pass",
   "evidence": "The embed title now links to #/opportunities?notice=<id> (added) beside Open; it is an fm-embed card, not a list row."
  },
  {
   "i": 14,
   "result": "na",
   "evidence": "No Win posts: 'Wins and milestones' is a read-only list from home_win_feed, with no Congrats action.",
   "needs": "a congrats table and RPC on win events"
  },
  {
   "i": 15,
   "result": "fail",
   "evidence": "A question with an accepted answer is not marked in the feed. talk_thread_marks only returns which questions are answered.",
   "needs": "include the accepted answer body, answerer and certification status in the list payload"
  },
  {
   "i": 16,
   "result": "na",
   "evidence": "No grant embeds appear in the feed.",
   "needs": "grant embeds on posts (talk_posts.attachment)"
  },
  {
   "i": 17,
   "result": "na",
   "evidence": "No polls (see 9).",
   "needs": "see 9"
  },
  {
   "i": 18,
   "result": "na",
   "evidence": "No Save or bookmark for posts; talk_follows is Follow, not Saved. A Share link alone would not meet the criterion.",
   "needs": "saved_posts table, toggle_saved RPC, a Saved view"
  },
  {
   "i": 19,
   "result": "fail",
   "evidence": "The 'Who's around' card shows '2 members here now' and a list of up to 5 named members; it is not an avatar stack with +N and the card is hidden at 0.",
   "needs": "avatar stack from member_presence (names only today), empty text at 0"
  },
  {
   "i": 20,
   "result": "na",
   "evidence": "No Trending card; there is no trending ranking.",
   "needs": "talk_trending(p_limit) RPC returning ranked threads"
  },
  {
   "i": 21,
   "result": "pass",
   "evidence": "Rules card has 3 rules (be useful and kind; keep prices and bids out; no phone numbers or emails) and no disclosure toggle."
  },
  {
   "i": 22,
   "result": "pass",
   "evidence": "Loading shows 3 skeleton cards (added). A failed read shows an alert with 'Try again', the title and sort stay (added), and Retry reloads; asserted."
  },
  {
   "i": 23,
   "result": "pass",
   "evidence": "axe color-contrast is clean on .fm-community in the default and dark themes and at 390; no text under 13px outside avatar initials (the 12px room counts and the 12.5px Helpful, hint and small buttons were raised to --fm-text-sm)."
  },
  {
   "i": 24,
   "result": "pass",
   "evidence": "Typing a phone number and an email shows the heads-up 'This has an email address or phone number...'; the server's talk_body_check refuses the post."
  }
 ]
}