{"data":{"source_url":"https://news.ycombinator.com/","healed":true,"decidedBy":"llm","deterministic":false,"llmCalls":1,"llmFields":["title","link","points"],"repairs":[],"data":[{"title":"AI is forcing us to pay off 40 years of technical debt","link":"https://spectrum.ieee.org/ai-in-cybersecurity-php2shell-vulnerability","points":883},{"title":"A new Go API for JSON","link":"https://go.dev/blog/jsonv2","points":110},{"title":"Ripple-65B Preview: U.S. Open-Weight SOTA on Agentic Coding","link":"https://www.ricursive.com/ripple","points":51},{"title":"Insects Don't Swarm at LED Lights","link":"https://www.birdsoutsidemywindow.org/2026/11/03/insects-dont-swarm-at-led-lights/","points":19},{"title":"Progress on provable inference for large language models","link":"https://www.anthropic.com/research/provable-inference","points":125},{"title":"Nvidia RTX Spark encrypted firmware slows inference speed to 35% on Linux","link":"https://www.mindstudio.ai/blog/linux-nvidia-rtx-spark-laptop","points":527},{"title":"Have I Befriended a Murderer?","link":"https://longreads.com/2026/11/03/murder-friendship-doubt/","points":43},{"title":"Launch HN: Kino AI (YC S23) – AI media manager and video editor","link":"item?id=50368804","points":35},{"title":"AMD expects to outsell Intel in Q4 for the first time in history","link":"https://www.tomshardware.com/pc-components/cpus/amd-expects-to-outsell-intel-in-q4-for-the-first-time-in-history-usd17b-guidance-would-exceed-intels-projections","points":329},{"title":"Tencent Hy4","link":"https://hy.tencent.ai/research/hy4","points":114},{"title":"OpenAI to acquire Pierre Computer Company","link":"https://openai.com/index/openai-to-acquire-pierre/","points":81},{"title":"Guerrilla bike lanes: San Francisco makes illicit infrastructure permanent (2016)","link":"https://99percentinvisible.org/article/guerrilla-bike-lanes-san-francisco-makes-illicit-infrastructure-permanent/","points":197},{"title":"North Korean fake job interview led to $6.3B Binance heist","link":"https://www.theregister.com/security/2026/11/03/north-korean-fake-job-interview-led-to-63b-binance-heist/5307398","points":466},{"title":"Verification Is Not Knowledge: Science needs more than answers","link":"https://blog.cosmos-institute.org/p/verification-is-not-knowledge","points":197},{"title":"Incident with Pull Requests, Git Operations and Issues","link":"https://www.githubstatus.com/incidents/smtdswd1h2w4","points":229},{"title":"Qualcomm Cloud AI 100 Ultra – 150W AI Accelerator Card with 128GB at 548GB/s","link":"https://www.qualcomm.com/data-center/products/cloud-ai-100-ultra","points":4},{"title":"Kimi K3.1 Pro model weights are out","link":"https://huggingface.co/moonshotai/Kimi-K3.1-Pro","points":238},{"title":"Show HN: I built a tool that prices a prebuilt PC part by part","link":"https://pcdealcheck.com/","points":68},{"title":"Tell HN: Gemini trains on chat history, even for subscribers (personal accounts)","link":"item?id=50363461","points":546},{"title":"Evergreen: A Provably Safe Systems Language","link":"https://evergreenlang.net","points":74},{"title":"Basically no one is using AI agents for their DoorDash orders","link":"https://arstechnica.com/ai/2026/10/doordash-says-outside-ai-agents-have-only-led-to-hundreds-of-orders-so-far/","points":6},{"title":"Jelly Sheet","link":"https://mrdoob.github.io/codevember-2026/01/","points":432},{"title":"Conductor Is Joining Meta","link":"https://www.conductor.build/announcement","points":18},{"title":"Letting users trust their own MCP clients, without opening a phishing hole","link":"https://streamvessel.com/blog/mcp-trusted-redirect-uris","points":27},{"title":"Stringman, an $800 open-source room scale gripper robot","link":"https://neufangled.com/","points":785},{"title":"Adding Window Functions to a Spreadsheet","link":"https://www.getgrist.com/blog/running-totals-you-dont-have-to-chase/","points":37},{"title":"Kitty 0.50","link":"https://sw.kovidgoyal.net/kitty/changelog/#","points":334},{"title":"Benchfmt.rs: Bringing Go's benchmarking and benchstat workflow to Rust","link":"https://www.bwplotka.dev/2026/rust-microbenchmarks-benchstat/","points":17},{"title":"This Month in Ladybird – October 2026","link":"https://ladybird.org/newsletter/2026-10-31/","points":67},{"title":"Show HN: Codemap – one-page interactive map of any Go repository","link":"https://github.com/peterretief/codemap","points":36}],"selectorMap":{"title":".titleline > a","link":".titleline > a","points":"+ tr .score"},"spec":{"itemSelector":"tr.athing.submission","fields":[{"name":"title","selector":".titleline > a","extract":"text","attribute":"","all":false,"type":"string"},{"name":"link","selector":".titleline > a","extract":"attr","attribute":"href","all":false,"type":"string"},{"name":"points","selector":"+ tr .score","extract":"text","attribute":"","all":false,"type":"integer"}]},"validation":{"valid":true,"errors":[],"itemCount":30,"fields":[{"name":"title","selector":".titleline > a","matches":30,"filled":30,"fillRate":1},{"name":"link","selector":".titleline > a","matches":30,"filled":30,"fillRate":1},{"name":"points","selector":"+ tr .score","matches":30,"filled":30,"fillRate":1}]},"extractorCode":"// Generated by x402-agents /api/v1/heal-scraper. Requires: npm install cheerio\nimport * as cheerio from \"cheerio\";\n\ntype FieldSpec = { name: string; selector: string; extract: \"text\" | \"attr\" | \"html\"; attribute: string; all: boolean; type: \"string\" | \"number\" | \"integer\" | \"boolean\" };\ntype Value = string | number | boolean | null;\n\nexport const SPEC: { itemSelector: string; fields: FieldSpec[] } = {\n  \"itemSelector\": \"tr.athing.submission\",\n  \"fields\": [\n    {\n      \"name\": \"title\",\n      \"selector\": \".titleline > a\",\n      \"extract\": \"text\",\n      \"attribute\": \"\",\n      \"all\": false,\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"link\",\n      \"selector\": \".titleline > a\",\n      \"extract\": \"attr\",\n      \"attribute\": \"href\",\n      \"all\": false,\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"points\",\n      \"selector\": \"+ tr .score\",\n      \"extract\": \"text\",\n      \"attribute\": \"\",\n      \"all\": false,\n      \"type\": \"integer\"\n    }\n  ]\n};\n\nconst squash = (s: string) => s.replace(/\\s+/g, \" \").trim();\n\nconst DATE_OR_TIME_RE = /\\d{4}-\\d{1,2}-\\d{1,2}|\\d{1,2}[/.]\\d{1,2}[/.]\\d{2,4}|\\d{1,2}:\\d{2}/;\nconst NUMBER_RE = /\\d{1,3}(?:[,. \\u202f']\\d{3})+(?:[.,]\\d+)?|\\d+(?:[.,]\\d+)?/;\nconst SUFFIX_RE = /^(?:(k|K|M|B|bn)|\\s(thousand|million|billion))(?![A-Za-z])/;\nconst SCALE: Record<string, number> = { k: 3, K: 3, M: 6, B: 9, bn: 9, thousand: 3, million: 6, billion: 9 };\n\nfunction parseNumber(raw: string): number | null {\n  const s = raw.replace(/\\u00a0/g, \" \");\n  if (DATE_OR_TIME_RE.test(s)) return null;\n  const m = NUMBER_RE.exec(s);\n  if (!m) return null;\n  const rest = s.slice(m.index + m[0].length);\n  if (/^\\s?[-\\u2013]\\s?\\d/.test(rest)) return null;\n  const token = m[0].replace(/[ \\u202f']/g, \"\");\n  const lastDot = token.lastIndexOf(\".\");\n  const lastComma = token.lastIndexOf(\",\");\n  const dots = token.split(\".\").length - 1;\n  const commas = token.split(\",\").length - 1;\n  let decimalAt = -1;\n  if (lastDot >= 0 && lastComma >= 0) decimalAt = Math.max(lastDot, lastComma);\n  else if (lastDot >= 0 && dots === 1) decimalAt = lastDot;\n  else if (lastComma >= 0 && commas === 1 && token.length - lastComma - 1 !== 3) decimalAt = lastComma;\n  const intPart = (decimalAt >= 0 ? token.slice(0, decimalAt) : token).replace(/[.,]/g, \"\");\n  const frac = decimalAt >= 0 ? token.slice(decimalAt + 1) : \"\";\n  const suffix = SUFFIX_RE.exec(rest);\n  const exp = suffix ? SCALE[suffix[1] ?? suffix[2]!]! : 0;\n  const n = Number(`${intPart}${frac ? `.${frac}` : \"\"}e${exp}`);\n  if (!Number.isFinite(n)) return null;\n  const before = s.slice(0, m.index);\n  return /(?:^|[^\\p{L}\\p{N}])[-\\u2212]$/u.test(before) ? -n : n;\n}\n\nfunction coerce(raw: string | null, type: FieldSpec[\"type\"]): Value {\n  if (raw === null) return null;\n  if (type === \"string\") return raw === \"\" ? null : raw;\n  if (type === \"boolean\") return !/^(false|no|0|off|)$/i.test(raw.trim());\n  const n = parseNumber(raw);\n  if (n === null) return null;\n  return type === \"integer\" ? (Number.isInteger(n) ? n : null) : n;\n}\n\nfunction read(el: cheerio.Cheerio<any>, f: FieldSpec): string | null {\n  if (f.extract === \"attr\") return f.attribute ? (el.attr(f.attribute)?.trim() ?? null) : null;\n  if (f.extract === \"html\") return el.html()?.trim() ?? null;\n  return squash(el.text());\n}\n\nfunction extractRecord($: cheerio.CheerioAPI, scope: cheerio.Cheerio<any> | null): Record<string, Value | Value[]> {\n  const record: Record<string, Value | Value[]> = {};\n  for (const f of SPEC.fields) {\n    const matched = f.selector === \"\" && scope ? scope : scope ? scope.find(f.selector) : $(f.selector);\n    if (f.type === \"boolean\" && !f.all) {\n      record[f.name] = matched.length > 0 && coerce(read(matched.first(), f) ?? \"\", \"boolean\") === true;\n      continue;\n    }\n    if (f.all) {\n      const values = matched.toArray().map((node) => coerce(read($(node), f), f.type)).filter((v) => v !== null);\n      if (values.length > 0) record[f.name] = values;\n    } else if (matched.length > 0) {\n      const v = coerce(read(matched.first(), f), f.type);\n      if (v !== null) record[f.name] = v;\n    }\n  }\n  return record;\n}\n\nexport function extract(html: string) {\n  const $ = cheerio.load(html);\n  if (SPEC.itemSelector) return $(SPEC.itemSelector).toArray().map((node) => extractRecord($, $(node)));\n  return extractRecord($, null);\n}\n","page_structure_notes":"Hacker News front page. Each story is split across two sibling rows: tr.athing.submission holds the rank, title and link in span.titleline > a, and the next sibling tr holds span.score. The old .storylink class no longer exists. Points are read with a leading-combinator selector (+ tr .score) relative to the story row, which depends on the selector engine supporting relative selectors in find. The score text is like '883 points'."},"_provenance":{"version":"writerslogic-provenance/1","issuer":"did:web:agents.writerslogic.com","verify":{"endpoint":"POST /api/v1/verify-provenance","did":"did:web:agents.writerslogic.com"},"manifest":{"format":"application/json","instance_id":"xmp:iid:1811730b-1bac-4a47-9dc6-5a67f8f99872","claim_generator_info":[{"name":"WritersLogic x402 Agent Hub","version":"2.0.0"}],"title":"Self-Healing Scraper & DOM-to-JSON Compiler","assertions":[{"label":"c2pa.actions.v2","data":{"actions":[{"action":"c2pa.created","when":"2026-11-04T20:24:57.199Z","softwareAgent":{"name":"writerslogic-agent-hub/heal-scraper","version":"2.0.0"},"digitalSourceType":"http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia","parameters":{"endpoint":"POST /api/v1/heal-scraper","inputDigest":{"alg":"sha256","hash":"9b21a4e8eaab13e84dc1f656abf94f7338efd519ff33f6709a304eb1f36f6f4c","canonicalization":"JCS"}}}]}},{"label":"c2pa.hash.data","data":{"alg":"sha256","hash":"c86f7dc21ec08535df7a1a531d29d42375ae6f7998c006200f9417c0c3b6ff64","name":"jcs-canonical-json(data)"}},{"label":"c2pa.ingredient.v3","data":{"title":"https://news.ycombinator.com/","format":"text/html","relationship":"inputTo","dc":{"source":"https://news.ycombinator.com/","date":"2026-11-04T20:24:45.645Z"},"hash":{"alg":"sha256","hash":"4c52087646a3dd1d2080b710f40669be2aa142847bc3d8d57484b643e0576fd7","basis":"body"}}}]},"credential":{"@context":["https://www.w3.org/ns/credentials/v2"],"id":"urn:uuid:cec2e524-61e0-4242-8e28-f1a8e47eb190","type":["VerifiableCredential","AgentOutputCredential"],"issuer":"did:web:agents.writerslogic.com","validFrom":"2026-11-04T20:24:57.199Z","credentialSubject":{"id":"urn:sha256:c86f7dc21ec08535df7a1a531d29d42375ae6f7998c006200f9417c0c3b6ff64","agent":"heal-scraper","endpoint":"POST /api/v1/heal-scraper","outputDigest":{"alg":"sha256","value":"c86f7dc21ec08535df7a1a531d29d42375ae6f7998c006200f9417c0c3b6ff64","canonicalization":"JCS"},"inputDigest":{"alg":"sha256","value":"9b21a4e8eaab13e84dc1f656abf94f7338efd519ff33f6709a304eb1f36f6f4c","canonicalization":"JCS"},"manifestDigest":{"alg":"sha256","value":"e3f332915c8669ba8e3ee5dcd6ef071a3cdc329fc0e92070df27f0372292db6d","canonicalization":"JCS"},"ingredients":[{"url":"https://news.ycombinator.com/","sha256":"4c52087646a3dd1d2080b710f40669be2aa142847bc3d8d57484b643e0576fd7"}],"payment":{"scheme":"api-key","network":"eip155:8453","payer":"sample"}},"proof":{"type":"DataIntegrityProof","cryptosuite":"eddsa-jcs-2022","created":"2026-11-04T20:24:57.199Z","verificationMethod":"did:web:agents.writerslogic.com#key-1","proofPurpose":"assertionMethod","proofValue":"z53mxyy58rBsXbjaikG6YHAjuw9xTCgsDoBM5cG3r2WTiWc5XbYpr8aF1cmvTGgYTSX1hMpPi35E6rtZdiEb8d89o"}},"ethSignature":{"type":"EIP-191","signer":"did:pkh:eip155:8453:0x3DBd42560cA7a7E448A2c7DfC9E785526189411f","address":"0x3DBd42560cA7a7E448A2c7DfC9E785526189411f","message":"writerslogic-provenance:e697bc1d40337cf1148759c2424b3285716bfc9522612dd007fcd34b4d324e62","signature":"0xf00998a2a3662a534ccdf4bb255ea9d0901dd481099c6663637d80d81611fb5655859bee5ac42c5486315b4292d53229ac7c9949649902240ecf26a526f2b06f1c"}}}