ledger: fresh arXiv cs.AI top-10 extraction (2026-10-23)
This commit is contained in:
1 parent
df3327384d
commit
c729afef3a
5 files changed
+396
No files matched your search
@@ -0,0 +1,11 @@
|
||||
id,submitted,title,authors,categories,summary
|
||||
http://arxiv.org/abs/2610.31667v1,2026-10-22T17:59:48Z,Direct Pass@$k$ Optimization for Thought Pruning: Balancing Quality and Diversity in Test-Time Reasoning,Mahdi Salmani; Adel Javanmard; Devansh Gupta,"cs.AI, cs.CL","Test-time scaling has emerged as a key inference strategy for reasoning models, where a model generates a large number of candidate solutions in the hope of finding at least one correct solution. Running all candidate solutions to completion can be computationally demanding, so recent work prunes th"
|
||||
http://arxiv.org/abs/2610.31657v1,2026-10-22T17:58:52Z,Cost-Aware Abstention for LLM-Based IT Ticket Classification,Sachin Gupta,"cs.LG, cs.AI, cs.CL","Wrong automatic routing of an IT support ticket can cost more than human triage. We evaluate cost-aware abstention as an offline, cost-conditional readiness assessment: select a routing policy on calibration data under explicit costs, then evaluate that frozen policy once on held-out test data. On a"
|
||||
http://arxiv.org/abs/2610.31656v1,2026-10-22T17:58:27Z,METTA: Memory-Enhanced Test-Time Adaptation for Meta-Reinforcement Learning,Ali Najar; Hosein Hasani; Amir Kooshan Fattah,"cs.LG, cs.AI","Meta-reinforcement learning aims to train agents that adapt quickly to unseen tasks from limited interaction, but this requires representing task evidence over long interaction histories. Classical recurrent agents compress experience into hidden states, while transformer-based agents retrieve from "
|
||||
http://arxiv.org/abs/2610.31650v1,2026-10-22T17:57:04Z,EpiSEM-Bench: Evaluating Safety and Evidence Recovery in LLM Agents under Missing Evidence,Qijin Zhang; Hanzhen Wang; Yuehan Zhao,"cs.AI, cs.LG","Tool-using language model agents rely on environmental facts to decide whether an action is permitted. When a tool response omits a safety-relevant fact, an agent may carry out a prohibited action even though the user request is benign and every returned statement is true. We introduce \bench{}, an "
|
||||
http://arxiv.org/abs/2610.31646v1,2026-10-22T17:56:13Z,Low-Bit N-Gram Embeddings for Language Models,Stephen Chung; Wenyu Du,"cs.CL, cs.AI","Many recent open-weight language models use n-gram embedding tables to improve performance. These tables store learned representations of short token sequences, such as pairs or triples of consecutive tokens, which the model retrieves during processing. However, they can require substantial memory: "
|
||||
http://arxiv.org/abs/2610.31639v1,2026-10-22T17:52:56Z,Causal Chain of Thought: Mitigating Attention Leakage via Context Isolation,Gabriele Dominici; Teague McMillan; Fazl Barez,"cs.LG, cs.AI","Chain-of-thought (CoT) prompting elicits step-by-step rationales that appear to explain model predictions, but there is no guarantee these steps causally drive the final answer. In standard autoregressive generation, dense attention allows each reasoning step to attend to the full context, enabling "
|
||||
http://arxiv.org/abs/2610.31624v1,2026-10-22T17:44:41Z,Questioning Instrumental Convergence in RLVR: Checkpoint Evidence from OLMo-3,Barış Alparslan; Sandy Tanwisuth; Caleb Petterson,"cs.LG, cs.AI","Instrumental convergence is often invoked as a general reason to expect capable agents to acquire or express power-seeking subgoals: self-preservation, resource acquisition, deception, or resistance to oversight which poses an important threat to the society. For LLMs, reinforcement learning is the "
|
||||
http://arxiv.org/abs/2610.31606v1,2026-10-22T17:36:14Z,How Ground Truth Shapes Retrieval Scores: Evidence-Aware Evaluation of a Retrieval-Augmented Generation System for Breast Lesions,Miguel Mochizuki Silva; Samuel Ismael; Mateus C. Dias,"cs.CL, cs.AI","Purpose: To describe an evidence-aware retrieval evaluation protocol for a clinical retrieval-augmented generation (RAG) system over breast lesion management literature, addressing the dependence of retrieval scores on annotation coverage. Methods: An 18-document corpus and an 18-query development b"
|
||||
http://arxiv.org/abs/2610.31593v1,2026-10-22T17:26:42Z,Simulated Control Evals,Jeffrey Olmo; David Zhang; Tyler Tracy,cs.AI,"Control evaluations measure whether safeguards can prevent an AI model from causing undesired outcomes even when it is intentionally trying to do so. These evaluations typically use purpose-built control settings and extrapolate their results to a model's deployment. However, the effectiveness of sa"
|
||||
http://arxiv.org/abs/2610.31588v1,2026-10-22T17:23:39Z,VERA: A Responsible AI Dashboard for Assessing LLM Deployments in Light of the EU AI Act,Robin Quériaux; Solveig Bachellery; Léa Déléris,"cs.SE, cs.AI, cs.CY",Institutions that deploy large language models in regulated settings often need technical evidence of responsible AI practices before approving a deployment. COMPL-AI provides a technical interpretation of the EU AI Act that organises this evidence under six principle groups and eighteen technical r
|
||||
|
@@ -0,0 +1,89 @@
|
||||
{
|
||||
"query": "https://export.arxiv.org/api/query?search_query=cat:cs.AI&max_results=10&sortBy=submittedDate&sortOrder=descending",
|
||||
"stamp": "2026-10-23T03:48:28ZZ",
|
||||
"source": "export.arxiv.org",
|
||||
"max_results": 10,
|
||||
"totalResults": 10,
|
||||
"rows": [
|
||||
{
|
||||
"id": "http://arxiv.org/abs/2610.31667v1",
|
||||
"submitted": "2026-10-22T17:59:48Z",
|
||||
"title": "Direct Pass@$k$ Optimization for Thought Pruning: Balancing Quality and Diversity in Test-Time Reasoning",
|
||||
"authors": "Mahdi Salmani; Adel Javanmard; Devansh Gupta",
|
||||
"categories": "cs.AI, cs.CL",
|
||||
"summary": "Test-time scaling has emerged as a key inference strategy for reasoning models, where a model generates a large number of candidate solutions in the hope of finding at least one correct solution. Running all candidate solutions to completion can be computationally demanding, so recent work prunes th"
|
||||
},
|
||||
{
|
||||
"id": "http://arxiv.org/abs/2610.31657v1",
|
||||
"submitted": "2026-10-22T17:58:52Z",
|
||||
"title": "Cost-Aware Abstention for LLM-Based IT Ticket Classification",
|
||||
"authors": "Sachin Gupta",
|
||||
"categories": "cs.LG, cs.AI, cs.CL",
|
||||
"summary": "Wrong automatic routing of an IT support ticket can cost more than human triage. We evaluate cost-aware abstention as an offline, cost-conditional readiness assessment: select a routing policy on calibration data under explicit costs, then evaluate that frozen policy once on held-out test data. On a"
|
||||
},
|
||||
{
|
||||
"id": "http://arxiv.org/abs/2610.31656v1",
|
||||
"submitted": "2026-10-22T17:58:27Z",
|
||||
"title": "METTA: Memory-Enhanced Test-Time Adaptation for Meta-Reinforcement Learning",
|
||||
"authors": "Ali Najar; Hosein Hasani; Amir Kooshan Fattah",
|
||||
"categories": "cs.LG, cs.AI",
|
||||
"summary": "Meta-reinforcement learning aims to train agents that adapt quickly to unseen tasks from limited interaction, but this requires representing task evidence over long interaction histories. Classical recurrent agents compress experience into hidden states, while transformer-based agents retrieve from "
|
||||
},
|
||||
{
|
||||
"id": "http://arxiv.org/abs/2610.31650v1",
|
||||
"submitted": "2026-10-22T17:57:04Z",
|
||||
"title": "EpiSEM-Bench: Evaluating Safety and Evidence Recovery in LLM Agents under Missing Evidence",
|
||||
"authors": "Qijin Zhang; Hanzhen Wang; Yuehan Zhao",
|
||||
"categories": "cs.AI, cs.LG",
|
||||
"summary": "Tool-using language model agents rely on environmental facts to decide whether an action is permitted. When a tool response omits a safety-relevant fact, an agent may carry out a prohibited action even though the user request is benign and every returned statement is true. We introduce \\bench{}, an "
|
||||
},
|
||||
{
|
||||
"id": "http://arxiv.org/abs/2610.31646v1",
|
||||
"submitted": "2026-10-22T17:56:13Z",
|
||||
"title": "Low-Bit N-Gram Embeddings for Language Models",
|
||||
"authors": "Stephen Chung; Wenyu Du",
|
||||
"categories": "cs.CL, cs.AI",
|
||||
"summary": "Many recent open-weight language models use n-gram embedding tables to improve performance. These tables store learned representations of short token sequences, such as pairs or triples of consecutive tokens, which the model retrieves during processing. However, they can require substantial memory: "
|
||||
},
|
||||
{
|
||||
"id": "http://arxiv.org/abs/2610.31639v1",
|
||||
"submitted": "2026-10-22T17:52:56Z",
|
||||
"title": "Causal Chain of Thought: Mitigating Attention Leakage via Context Isolation",
|
||||
"authors": "Gabriele Dominici; Teague McMillan; Fazl Barez",
|
||||
"categories": "cs.LG, cs.AI",
|
||||
"summary": "Chain-of-thought (CoT) prompting elicits step-by-step rationales that appear to explain model predictions, but there is no guarantee these steps causally drive the final answer. In standard autoregressive generation, dense attention allows each reasoning step to attend to the full context, enabling "
|
||||
},
|
||||
{
|
||||
"id": "http://arxiv.org/abs/2610.31624v1",
|
||||
"submitted": "2026-10-22T17:44:41Z",
|
||||
"title": "Questioning Instrumental Convergence in RLVR: Checkpoint Evidence from OLMo-3",
|
||||
"authors": "Barış Alparslan; Sandy Tanwisuth; Caleb Petterson",
|
||||
"categories": "cs.LG, cs.AI",
|
||||
"summary": "Instrumental convergence is often invoked as a general reason to expect capable agents to acquire or express power-seeking subgoals: self-preservation, resource acquisition, deception, or resistance to oversight which poses an important threat to the society. For LLMs, reinforcement learning is the "
|
||||
},
|
||||
{
|
||||
"id": "http://arxiv.org/abs/2610.31606v1",
|
||||
"submitted": "2026-10-22T17:36:14Z",
|
||||
"title": "How Ground Truth Shapes Retrieval Scores: Evidence-Aware Evaluation of a Retrieval-Augmented Generation System for Breast Lesions",
|
||||
"authors": "Miguel Mochizuki Silva; Samuel Ismael; Mateus C. Dias",
|
||||
"categories": "cs.CL, cs.AI",
|
||||
"summary": "Purpose: To describe an evidence-aware retrieval evaluation protocol for a clinical retrieval-augmented generation (RAG) system over breast lesion management literature, addressing the dependence of retrieval scores on annotation coverage. Methods: An 18-document corpus and an 18-query development b"
|
||||
},
|
||||
{
|
||||
"id": "http://arxiv.org/abs/2610.31593v1",
|
||||
"submitted": "2026-10-22T17:26:42Z",
|
||||
"title": "Simulated Control Evals",
|
||||
"authors": "Jeffrey Olmo; David Zhang; Tyler Tracy",
|
||||
"categories": "cs.AI",
|
||||
"summary": "Control evaluations measure whether safeguards can prevent an AI model from causing undesired outcomes even when it is intentionally trying to do so. These evaluations typically use purpose-built control settings and extrapolate their results to a model's deployment. However, the effectiveness of sa"
|
||||
},
|
||||
{
|
||||
"id": "http://arxiv.org/abs/2610.31588v1",
|
||||
"submitted": "2026-10-22T17:23:39Z",
|
||||
"title": "VERA: A Responsible AI Dashboard for Assessing LLM Deployments in Light of the EU AI Act",
|
||||
"authors": "Robin Quériaux; Solveig Bachellery; Léa Déléris",
|
||||
"categories": "cs.SE, cs.AI, cs.CY",
|
||||
"summary": "Institutions that deploy large language models in regulated settings often need technical evidence of responsible AI practices before approving a deployment. COMPL-AI provides a technical interpretation of the EU AI Act that organises this evidence under six principle groups and eighteen technical r"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
# arXiv cs.AI - top 10 papers by submission date (fresh extraction)
|
||||
|
||||
Source: https://export.arxiv.org/api/query?search_query=cat:cs.AI&max_results=10&sortBy=submittedDate&sortOrder=descending
|
||||
Retrieved: 2026-10-23T03:48:28ZZ (UTC)
|
||||
Rows: 10 of max_results=10. Sorted most-recent submission first.
|
||||
|
||||
## Table
|
||||
|
||||
| # | id | submitted | title | authors | categories |
|
||||
|---|----|-----------|-------|---------|------------|
|
||||
| 1 | [http://arxiv.org/abs/2610.31667v1](http://arxiv.org/abs/2610.31667v1) | 2026-10-22T17:59:48Z | Direct Pass@$k$ Optimization for Thought Pruning: Balancing Quality and Diversity in Test-Time Reasoning | Mahdi Salmani; Adel Javanmard; Devansh Gupta | cs.AI, cs.CL |
|
||||
| 2 | [http://arxiv.org/abs/2610.31657v1](http://arxiv.org/abs/2610.31657v1) | 2026-10-22T17:58:52Z | Cost-Aware Abstention for LLM-Based IT Ticket Classification | Sachin Gupta | cs.LG, cs.AI, cs.CL |
|
||||
| 3 | [http://arxiv.org/abs/2610.31656v1](http://arxiv.org/abs/2610.31656v1) | 2026-10-22T17:58:27Z | METTA: Memory-Enhanced Test-Time Adaptation for Meta-Reinforcement Learning | Ali Najar; Hosein Hasani; Amir Kooshan Fattah | cs.LG, cs.AI |
|
||||
| 4 | [http://arxiv.org/abs/2610.31650v1](http://arxiv.org/abs/2610.31650v1) | 2026-10-22T17:57:04Z | EpiSEM-Bench: Evaluating Safety and Evidence Recovery in LLM Agents under Missing Evidence | Qijin Zhang; Hanzhen Wang; Yuehan Zhao | cs.AI, cs.LG |
|
||||
| 5 | [http://arxiv.org/abs/2610.31646v1](http://arxiv.org/abs/2610.31646v1) | 2026-10-22T17:56:13Z | Low-Bit N-Gram Embeddings for Language Models | Stephen Chung; Wenyu Du | cs.CL, cs.AI |
|
||||
| 6 | [http://arxiv.org/abs/2610.31639v1](http://arxiv.org/abs/2610.31639v1) | 2026-10-22T17:52:56Z | Causal Chain of Thought: Mitigating Attention Leakage via Context Isolation | Gabriele Dominici; Teague McMillan; Fazl Barez | cs.LG, cs.AI |
|
||||
| 7 | [http://arxiv.org/abs/2610.31624v1](http://arxiv.org/abs/2610.31624v1) | 2026-10-22T17:44:41Z | Questioning Instrumental Convergence in RLVR: Checkpoint Evidence from OLMo-3 | Barış Alparslan; Sandy Tanwisuth; Caleb Petterson | cs.LG, cs.AI |
|
||||
| 8 | [http://arxiv.org/abs/2610.31606v1](http://arxiv.org/abs/2610.31606v1) | 2026-10-22T17:36:14Z | How Ground Truth Shapes Retrieval Scores: Evidence-Aware Evaluation of a Retrieval-Augmented Generation System for Breast Lesions | Miguel Mochizuki Silva; Samuel Ismael; Mateus C. Dias | cs.CL, cs.AI |
|
||||
| 9 | [http://arxiv.org/abs/2610.31593v1](http://arxiv.org/abs/2610.31593v1) | 2026-10-22T17:26:42Z | Simulated Control Evals | Jeffrey Olmo; David Zhang; Tyler Tracy | cs.AI |
|
||||
| 10 | [http://arxiv.org/abs/2610.31588v1](http://arxiv.org/abs/2610.31588v1) | 2026-10-22T17:23:39Z | VERA: A Responsible AI Dashboard for Assessing LLM Deployments in Light of the EU AI Act | Robin Quériaux; Solveig Bachellery; Léa Déléris | cs.SE, cs.AI, cs.CY |
|
||||
|
||||
## Schema
|
||||
|
||||
| column | type | note |
|
||||
|--------|------|------|
|
||||
| id | string | canonical arxiv abs URL |
|
||||
| submitted | string | ISO-8601 datetime |
|
||||
| title | string | verbatim title |
|
||||
| authors | string | first three authors, ;-joined |
|
||||
| categories | string | arXiv subject terms, ,-joined |
|
||||
| summary | string | first ~300 chars of abstract |
|
||||
|
||||
## Evidence
|
||||
|
||||
Every field is a verbatim field of the live Atom payload at 2026-10-23T03:48:28ZZ. No value was edited or invented.
|
||||
@@ -0,0 +1,146 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Build a FRESH arXiv cs.AI top-10 extraction (ledger / Extract lane).
|
||||
|
||||
Source: https://export.arxiv.org/api/query?search_query=cat:cs.AI&max_results=10&sortBy=submittedDate&sortOrder=descending
|
||||
Retrieved (UTC): stamp recorded on each artifact.
|
||||
|
||||
Outputs (same directory):
|
||||
arxiv-csai-fresh-<STAMP>.csv | .json | .md
|
||||
|
||||
Conventions (ledger lane):
|
||||
- CSV: one row per paper; description-free columns; newlines stripped from summary.
|
||||
- JSON: ordered list of rows + feed metadata (query, stamp, totalResults).
|
||||
- MD: human-readable Markdown table with links.
|
||||
- Verdict: sibling verify_arxiv_csai_fresh.py re-fetches the same query and diffs
|
||||
the artifact against a fresh extraction; exit 0 == artifact matches fresh fetch.
|
||||
|
||||
Field definitions (each value read verbatim from the Atom payload; no field invented):
|
||||
id canonical arxiv abs URL of the paper entry.
|
||||
submitted ISO-8601 submission timestamp ("published" element).
|
||||
title verbatim article title.
|
||||
authors first three author names, "; "-joined (empty list -> "").
|
||||
categories comma-joined arXiv subject terms (empty -> "").
|
||||
summary first ~300 chars of the abstract, newlines stripped.
|
||||
"""
|
||||
|
||||
import csv
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
import urllib.request
|
||||
import xml.etree.ElementTree as ET
|
||||
from datetime import datetime, timezone
|
||||
|
||||
QUERY = ("https://export.arxiv.org/api/query"
|
||||
"?search_query=cat:cs.AI&max_results=10"
|
||||
"&sortBy=submittedDate&sortOrder=descending")
|
||||
MAX_RESULTS = 10
|
||||
NS = {"atom": "http://www.w3.org/2005/Atom", "arxiv": "http://arxiv.org/schemas/atom"}
|
||||
OUT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
|
||||
def local(tag):
|
||||
return tag.split("}", 1)[-1]
|
||||
|
||||
|
||||
def fetch_atom(url):
|
||||
req = urllib.request.Request(url, headers={"User-Agent": "ledger/1.0"})
|
||||
with urllib.request.urlopen(req, timeout=40) as r:
|
||||
raw = r.read()
|
||||
if r.status != 200:
|
||||
sys.exit("arXiv API returned HTTP %s" % r.status)
|
||||
return raw
|
||||
|
||||
|
||||
def parse_atom(xml_bytes):
|
||||
root = ET.fromstring(xml_bytes)
|
||||
entries = []
|
||||
for e in root.iter():
|
||||
if local(e.tag) != "entry":
|
||||
continue
|
||||
id_ = next((c.text for c in e.iter() if local(c.tag) == "id"), "").strip()
|
||||
title = next((c.text for c in e.iter() if local(c.tag) == "title"), "").strip()
|
||||
submitted = next((c.text for c in e.iter() if local(c.tag) == "published"), "").strip()
|
||||
authors = [a.text.strip() for a in e.iter() if local(a.tag) == "name"]
|
||||
terms = [c.get("term") for c in e.iter() if local(c.tag) == "category" and c.get("term")]
|
||||
summary = next((c.text for c in e.iter() if local(c.tag) == "summary"), "").strip()
|
||||
summary = " ".join(summary.split())[:300]
|
||||
entries.append({
|
||||
"id": id_, "submitted": submitted, "title": title,
|
||||
"authors": "; ".join(authors[:3]), "categories": ", ".join(terms), "summary": summary,
|
||||
})
|
||||
return entries
|
||||
|
||||
|
||||
def build_outputs(rows):
|
||||
st = datetime.now(timezone.utc).strftime("%Y-%m-%d")
|
||||
now = datetime.now(timezone.utc).strftime("%H:%M:%SZ")
|
||||
csv_path = os.path.join(OUT_DIR, "arxiv-csai-fresh-%s.csv" % st)
|
||||
json_path = os.path.join(OUT_DIR, "arxiv-csai-fresh-%s.json" % st)
|
||||
md_path = os.path.join(OUT_DIR, "arxiv-csai-fresh-%s.md" % st)
|
||||
|
||||
with open(csv_path, "w", newline="", encoding="utf-8") as f:
|
||||
w = csv.DictWriter(f, fieldnames=["id", "submitted", "title", "authors", "categories", "summary"], lineterminator="\n")
|
||||
w.writeheader()
|
||||
for r in rows:
|
||||
w.writerow(r)
|
||||
|
||||
with open(json_path, "w", encoding="utf-8") as f:
|
||||
json.dump({"query": QUERY, "stamp": "%sT%sZ" % (st, now), "source": "export.arxiv.org",
|
||||
"max_results": MAX_RESULTS, "totalResults": len(rows), "rows": rows}, f, ensure_ascii=False, indent=2)
|
||||
|
||||
lines = [
|
||||
"# arXiv cs.AI - top 10 papers by submission date (fresh extraction)",
|
||||
"",
|
||||
"Source: https://export.arxiv.org/api/query?search_query=cat:cs.AI&max_results=10&sortBy=submittedDate&sortOrder=descending",
|
||||
"Retrieved: %sT%sZ (UTC)" % (st, now),
|
||||
"Rows: %d of max_results=%d. Sorted most-recent submission first." % (len(rows), MAX_RESULTS),
|
||||
"",
|
||||
"## Table",
|
||||
"",
|
||||
"| # | id | submitted | title | authors | categories |",
|
||||
"|---|----|-----------|-------|---------|------------|",
|
||||
]
|
||||
for i, r in enumerate(rows, 1):
|
||||
lines.append("| {n} | [{id}]({id}) | {sub} | {title} | {auth} | {cats} |".format(
|
||||
n=i, id=r["id"], sub=r["submitted"], title=r["title"],
|
||||
auth=r["authors"], cats=r["categories"]))
|
||||
lines += [
|
||||
"",
|
||||
"## Schema",
|
||||
"",
|
||||
"| column | type | note |",
|
||||
"|--------|------|------|",
|
||||
"| id | string | canonical arxiv abs URL |",
|
||||
"| submitted | string | ISO-8601 datetime |",
|
||||
"| title | string | verbatim title |",
|
||||
"| authors | string | first three authors, ;-joined |",
|
||||
"| categories | string | arXiv subject terms, ,-joined |",
|
||||
"| summary | string | first ~300 chars of abstract |",
|
||||
"",
|
||||
"## Evidence",
|
||||
"",
|
||||
"Every field is a verbatim field of the live Atom payload at %sT%sZ. No value was edited or invented." % (st, now),
|
||||
"",
|
||||
]
|
||||
with open(md_path, "w", encoding="utf-8") as f:
|
||||
f.write("\n".join(lines))
|
||||
|
||||
print("fetched %d papers (stamp=%sT%sZ)" % (len(rows), st, now))
|
||||
print(" csv: %s" % csv_path)
|
||||
print(" json: %s" % json_path)
|
||||
print(" md: %s" % md_path)
|
||||
return csv_path, json_path, md_path
|
||||
|
||||
|
||||
def main():
|
||||
xml_bytes = fetch_atom(QUERY)
|
||||
rows = parse_atom(xml_bytes)
|
||||
if len(rows) != MAX_RESULTS:
|
||||
print("WARNING: expected %d rows, got %d" % (MAX_RESULTS, len(rows)), file=sys.stderr)
|
||||
build_outputs(rows)
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
@@ -0,0 +1,115 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Verification for the fresh arXiv cs.AI extraction (ledger / Extract lane).
|
||||
|
||||
Re-fetches the same arXiv API query the artifact was built from and checks that
|
||||
the on-disk data matches a fresh extraction (re-extract + exact diff), validates
|
||||
the schema, and checks the row count.
|
||||
|
||||
House exit contract: 0 = artifact matches a fresh fetch (correct); nonzero = mismatch.
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
import urllib.request
|
||||
from datetime import datetime, timezone
|
||||
|
||||
OUT_DIR = "/root/troupe-standup/wizard-work/ledger"
|
||||
ARTIFACT_FILES = ["arxiv-csai-fresh-2026-10-23.csv",
|
||||
"arxiv-csai-fresh-2026-10-23.json",
|
||||
"arxiv-csai-fresh-2026-10-23.md"]
|
||||
QUERY = ("https://export.arxiv.org/api/query"
|
||||
"?search_query=cat:cs.AI&max_results=10"
|
||||
"&sortBy=submittedDate&sortOrder=descending")
|
||||
MAX_RESULTS = 10
|
||||
|
||||
fails = []
|
||||
|
||||
|
||||
def check(name, cond, detail=""):
|
||||
print("[%s] %s %s" % ("PASS" if cond else "FAIL", name, detail))
|
||||
if not cond:
|
||||
fails.append(name)
|
||||
|
||||
|
||||
def local(tag):
|
||||
return tag.split("}", 1)[-1]
|
||||
|
||||
|
||||
def fetch_atom(url):
|
||||
req = urllib.request.Request(url, headers={"User-Agent": "ledger/1.0"})
|
||||
with urllib.request.urlopen(req, timeout=40) as r:
|
||||
raw = r.read()
|
||||
if r.status != 200:
|
||||
sys.exit("arXiv API returned HTTP %s" % r.status)
|
||||
return raw
|
||||
|
||||
|
||||
def parse_atom(xml_bytes):
|
||||
import xml.etree.ElementTree as ET
|
||||
root = ET.fromstring(xml_bytes)
|
||||
entries = []
|
||||
for e in root.iter():
|
||||
if local(e.tag) != "entry":
|
||||
continue
|
||||
id_ = next((c.text for c in e.iter() if local(c.tag) == "id"), "").strip()
|
||||
title = next((c.text for c in e.iter() if local(c.tag) == "title"), "").strip()
|
||||
submitted = next((c.text for c in e.iter() if local(c.tag) == "published"), "").strip()
|
||||
authors = [a.text.strip() for a in e.iter() if local(a.tag) == "name"]
|
||||
terms = [c.get("term") for c in e.iter() if local(c.tag) == "category" and c.get("term")]
|
||||
summary = next((c.text for c in e.iter() if local(c.tag) == "summary"), "").strip()
|
||||
summary = " ".join(summary.split())[:300]
|
||||
entries.append({"id": id_, "submitted": submitted, "title": title,
|
||||
"authors": "; ".join(authors[:3]),
|
||||
"categories": ", ".join(terms), "summary": summary})
|
||||
return entries
|
||||
|
||||
|
||||
def main():
|
||||
# 1) fresh fetch + re-extract
|
||||
fresh_xml = fetch_atom(QUERY)
|
||||
fresh = parse_atom(fresh_xml)
|
||||
check("fresh row count == max_results", len(fresh) == MAX_RESULTS, "got %d" % len(fresh))
|
||||
|
||||
# 2) artifact present and readable
|
||||
for fn in ARTIFACT_FILES:
|
||||
try:
|
||||
open(OUT_DIR + "/" + fn, encoding="utf-8").read()
|
||||
except OSError as exc:
|
||||
check("artifact present " + fn, False, str(exc))
|
||||
return 1
|
||||
with open(OUT_DIR + "/arxiv-csai-fresh-2026-10-23.json", encoding="utf-8") as f:
|
||||
artifact = json.load(f)
|
||||
check("artifact row count == max_results", len(artifact["rows"]) == MAX_RESULTS,
|
||||
"got %d" % len(artifact["rows"]))
|
||||
|
||||
# 3) exact diff against a fresh extraction
|
||||
fresh.sort(key=lambda r: r["submitted"], reverse=True)
|
||||
artifact_sorted = sorted(artifact["rows"], key=lambda r: r["submitted"], reverse=True)
|
||||
check("id set matches a fresh fetch",
|
||||
[r["id"] for r in artifact_sorted] == [r["id"] for r in fresh],
|
||||
"artifact %d rows vs fresh %d rows" % (len(artifact_sorted), len(fresh)))
|
||||
|
||||
# 4) per-row exact content equality
|
||||
exact_match = all(
|
||||
a["id"] == f["id"] and a["submitted"] == f["submitted"] and a["title"] == f["title"]
|
||||
and a["authors"] == f["authors"] and a["categories"] == f["categories"]
|
||||
and a["summary"] == f["summary"]
|
||||
for a, f in zip(artifact_sorted, fresh))
|
||||
check("every field identical to a fresh fetch", exact_match)
|
||||
|
||||
# 5) schema + integrity
|
||||
schema_ok = all(set(r.keys()) == {"id", "submitted", "title", "authors", "categories", "summary"}
|
||||
for r in artifact["rows"])
|
||||
check("schema keys exact", schema_ok)
|
||||
iso_ok = all(isinstance(r["submitted"], str) and "T" in r["submitted"] for r in artifact["rows"])
|
||||
check("submitted is ISO-8601 datetime", iso_ok)
|
||||
nonblank = all(r["id"] and r["title"] and r["submitted"] and r["categories"] for r in artifact["rows"])
|
||||
check("no blank id/title/submitted/categories", nonblank)
|
||||
check("totalResults recorded", artifact.get("totalResults") == MAX_RESULTS)
|
||||
|
||||
print("verdict: %s" % ("PASS" if not fails else "FAIL"))
|
||||
sys.exit(1 if fails else 0)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in new issue
Block a user