Compare commits

..

49 Commits

Author SHA1 Message Date
codex-bot a49714786b Record accepted WWW event migration and verified server source cache
Metadata integrity checks / metadata (push) Successful in 1m10s
2026-11-08 21:29:25 +08:00
codex-bot ce5ace0c21 Inventory early WWW proceedings and preserve source scope discrepancies
Metadata integrity checks / metadata (push) Successful in 1m45s
2026-11-08 21:18:40 +08:00
codex-bot 838731025c Record CoNLL direct submission revision and scoped SIGIR IROS policy evidence
Metadata integrity checks / metadata (push) Successful in 1m10s
2026-11-08 20:24:23 +08:00
codex-bot a30cfa5f64 Scope same-year identity work to verified WWW gap after PostgreSQL preflight
Metadata integrity checks / metadata (push) Successful in 1m9s
2026-11-08 20:16:06 +08:00
codex-bot 422c731cf3 Complete first-pass conference year census with evidence and remaining data gaps
Metadata integrity checks / metadata (push) Successful in 1m10s
2026-11-08 20:11:30 +08:00
codex-bot 1cc5e9b88c Census retrieval and mining conferences with same-year event boundaries
Metadata integrity checks / metadata (push) Successful in 1m7s
2026-11-08 20:00:19 +08:00
codex-bot 95fab931a8 Census robotics and speech conference histories with transfer and publication boundaries
Metadata integrity checks / metadata (push) Successful in 1m8s
2026-11-08 19:50:44 +08:00
codex-bot 0570dd8a15 Document FAccT ISMIR and MICCAI edition censuses and policy limits
Metadata integrity checks / metadata (push) Successful in 1m12s
2026-11-08 19:40:23 +08:00
codex-bot a95815605f Census vision and reasoning conference histories with source-specific evidence
Metadata integrity checks / metadata (push) Successful in 1m10s
2026-11-08 18:53:08 +08:00
codex-bot 1022ec7d22 Census NLP conference editions and preserve bounded review policy evidence
Metadata integrity checks / metadata (push) Successful in 1m7s
2026-11-08 18:27:24 +08:00
codex-bot 3bdcc562fe Record bounded Multimedia public metadata access evidence
Metadata integrity checks / metadata (push) Successful in 1m9s
2026-11-08 18:16:42 +08:00
codex-bot 05800ab67a Census RSS ICAPS AAMAS and Multimedia with historical scope boundaries
Metadata integrity checks / metadata (push) Successful in 2m23s
2026-11-08 18:06:20 +08:00
codex-bot ff60fa4cdb Verify CLeaR and CoRL editions and organize conference census evidence
Metadata integrity checks / metadata (push) Successful in 1m48s
2026-11-08 17:03:25 +08:00
codex-bot 18c8feaaa0 Verify IJCAI conference editions and bound resubmission policy evidence
Metadata integrity checks / metadata (push) Successful in 2m4s
2026-11-08 16:41:35 +08:00
codex-bot d50ca2f0ad Census ICLR and NeurIPS years and retain ICML archive gaps
Metadata integrity checks / metadata (push) Successful in 2m17s
2026-11-08 15:30:35 +08:00
codex-bot c8314c0bae Census UAI COLT AISTATS and EMNLP official historical editions
Metadata integrity checks / metadata (push) Successful in 1m13s
2026-11-08 15:04:26 +08:00
codex-bot 91505844be Census official MLSys and COLM editions with nonarchival boundaries
Metadata integrity checks / metadata (push) Successful in 1m8s
2026-11-08 14:55:37 +08:00
codex-bot 040712b9c1 Census official RecSys editions and document KR WSDM policy limits
Metadata integrity checks / metadata (push) Successful in 2m16s
2026-11-08 14:18:06 +08:00
codex-bot bb861badcd Record ICLR release boundaries and FAccT AAAI decision evidence limits
Metadata integrity checks / metadata (push) Successful in 2m24s
2026-11-08 04:37:26 +08:00
codex-bot 5544a7838c Document ICAPS poster outcomes and AAMAS resubmission evidence gaps
Metadata integrity checks / metadata (push) Successful in 2m44s
2026-11-08 04:11:29 +08:00
codex-bot 9d32f47fac Clarify public decision policies and venue-specific paper attributes
Metadata integrity checks / metadata (push) Successful in 2m56s
2026-11-08 04:01:19 +08:00
codex-bot a1744d4f4c Document observed venue coverage and public decision source gaps
Metadata integrity checks / metadata (push) Successful in 1m9s
2026-11-08 03:14:51 +08:00
Zayden-Jung 067a67f3f7 Merge pull request '在 PostgreSQL 预检公开决定并复核导入事务' (#16) from codex/postgres-preflight into main
Metadata integrity checks / metadata (push) Successful in 2m27s
Reviewed-on: #16
2026-11-07 08:10:37 +00:00
codex-bot 6fa59c4d26 Audit public decisions against PostgreSQL and recheck imports
Metadata integrity checks / metadata (push) Successful in 1m9s
2026-11-07 16:01:27 +08:00
Zayden-Jung dc41dfa350 Merge pull request '为 PostgreSQL 主库接入元数据导入与投稿证据写入' (#15) from codex/postgres-ingestion into main
Metadata integrity checks / metadata (push) Successful in 1m25s
Reviewed-on: #15
2026-11-07 07:53:18 +00:00
codex-bot 6ea150690d Support native PostgreSQL metadata ingestion and provenance writes
Metadata integrity checks / metadata (push) Successful in 1m7s
2026-11-07 15:38:42 +08:00
Zayden-Jung 426aa042a5 Merge pull request '无损迁移含 NUL 的来源文本并恢复 PostgreSQL 断点' (#14) from codex/postgres-nul into main
Metadata integrity checks / metadata (push) Successful in 1m24s
Reviewed-on: #14
2026-11-06 19:37:00 +00:00
codex-bot 4e62710bba Preserve NUL text through PostgreSQL migration and resume
Metadata integrity checks / metadata (push) Successful in 1m7s
2026-11-07 03:27:57 +08:00
Zayden-Jung 3f040b968f Merge pull request '迁移 PostgreSQL 并保留完整研究数据与投稿历史' (#13) from codex/postgresql-migration into main
Metadata integrity checks / metadata (push) Successful in 1m18s
Reviewed-on: #13
2026-11-06 18:56:51 +00:00
codex-bot a3b677bdf2 Add verified PostgreSQL migration and shared research queries
Metadata integrity checks / metadata (push) Successful in 46s
2026-11-07 02:09:19 +08:00
Zayden-Jung 029e73cafe Merge pull request '补齐 ACM MM、MLSys 范围并接入官方摘要与发表身份' (#12) from codex/multimedia-mlsys into main
Metadata integrity checks / metadata (push) Successful in 27s
Reviewed-on: #12
2026-11-06 16:15:16 +00:00
Zayden-Jung 2e95e91f5e Merge pull request '逐条审计 arXiv 类别完整性及来源证据' (#10) from codex/arxiv-tag-audit into main
Metadata integrity checks / metadata (push) Successful in 28s
Reviewed-on: #10
2026-11-06 16:15:09 +00:00
Zayden-Jung a58b96341a Merge pull request '修正 ICML 多轨道分类并保留既有投稿与决定历史' (#11) from codex/pmlr-track-scope into main
Metadata integrity checks / metadata (push) Successful in 28s
Reviewed-on: #11
2026-11-06 16:15:04 +00:00
codex-bot 9a279f2eae Handle MLSys year-labelled proceedings and bridge retained publisher evidence
Metadata integrity checks / metadata (push) Successful in 53s
2026-11-06 22:58:50 +08:00
codex-bot 25cc5b865b Preserve unspecified MM tracks and validate MLSys identities at the shared boundary
Metadata integrity checks / metadata (push) Successful in 41s
2026-11-06 22:49:41 +08:00
codex-bot c9b0cfa857 Bound arXiv tag audit batches by primary key instead of sorting the source
Metadata integrity checks / metadata (push) Successful in 43s
2026-11-06 22:41:43 +08:00
codex-bot a65edc6b9d Add ACM Multimedia scope and MLSys metadata with shared publication identities
Metadata integrity checks / metadata (push) Successful in 33s
2026-11-06 22:39:55 +08:00
codex-bot 4e0e3f0ce8 Migrate existing PMLR submission tracks with atomic provenance checks
Metadata integrity checks / metadata (push) Successful in 44s
2026-11-06 22:15:56 +08:00
codex-bot 17bdaa77fb Resolve mixed ICML PMLR tracks from verified official programs
Metadata integrity checks / metadata (push) Successful in 40s
2026-11-06 22:12:08 +08:00
codex-bot bfa7fe2e94 Merge remote-tracking branch 'origin/main' into codex/arxiv-tag-audit
Metadata integrity checks / metadata (push) Successful in 32s
# Conflicts:
#	paper_atlas/cli.py
2026-11-06 21:51:29 +08:00
codex-bot d712a4fbed Audit every arXiv record category and evidence owner after repair
Metadata integrity checks / metadata (push) Successful in 32s
2026-11-06 21:43:50 +08:00
Zayden-Jung 0fbcaf4ec7 Merge pull request '核验 ICLR 2020 真实投稿身份并修复旧版论文链接' (#9) from codex/iclr-legacy-identities into main
Metadata integrity checks / metadata (push) Successful in 41s
Reviewed-on: #9
2026-11-06 13:29:08 +00:00
Zayden-Jung c199ed3c1d Merge pull request '补齐其他会议公开拒稿采集及投稿历史核验' (#8) from codex/public-rejections into main
Metadata integrity checks / metadata (push) Successful in 35s
Reviewed-on: #8
2026-11-06 13:28:59 +00:00
codex-bot 4d17231f1f Verify ICLR 2020 legacy forum identities before importing submission history
Metadata integrity checks / metadata (push) Successful in 42s
2026-11-06 21:19:10 +08:00
codex-bot ac08edf572 Add ICML 2026 public rejected-submission archive with platform evidence
Metadata integrity checks / metadata (push) Successful in 35s
2026-11-06 20:55:49 +08:00
codex-bot 249713a342 Collect and audit explicit public rejection metadata across conferences
Metadata integrity checks / metadata (push) Successful in 35s
2026-11-06 20:52:42 +08:00
Zayden-Jung 3f35c7e42f Merge pull request '核验 arXiv 原始编号并恢复逐来源类别证据' (#7) from codex/arxiv-integrity into main
Metadata integrity checks / metadata (push) Successful in 29s
Reviewed-on: #7
2026-11-06 11:15:33 +00:00
Zayden-Jung 22d8f78870 Merge pull request '排除 DBLP 论文目录中的会务与前后页材料' (#6) from codex/dblp-frontmatter into main
Metadata integrity checks / metadata (push) Successful in 27s
Reviewed-on: #6
2026-11-06 11:12:47 +00:00
codex-bot 503908198e Audit raw arXiv IDs and preserve per-record category evidence
Metadata integrity checks / metadata (push) Successful in 26s
2026-11-06 19:11:02 +08:00
108 changed files with 26260 additions and 157 deletions
+13 -2
View File
@@ -30,11 +30,16 @@ jobs:
if len(candidates)!=1:
raise SystemExit('Unexpected repository archive layout')
src = candidates[0].parent
subprocess.run(['python3','-B','-m','unittest','discover','-s','tests','-t','.','-v'],cwd=src,check=True)
# Build and installation checks run only on the approved remote runner.
venv = root / 'venv'
subprocess.run(['python3','-B','-m','venv','--system-site-packages',str(venv)],check=True)
python = str(venv / 'bin/python')
subprocess.run([python,'-B','-m','pip','install','--only-binary=:all:','--no-compile','psycopg[binary]==3.3.8'],check=True)
testenv = os.environ.copy()
service_file = pathlib.Path('/etc/paper-atlas/pg_service.conf')
if service_file.is_file():
testenv.update(PGSERVICEFILE=str(service_file),PAPER_ATLAS_TEST_PG_SERVICE='foundry-research')
subprocess.run([python,'-B','-m','unittest','discover','-s','tests','-t','.','-v'],cwd=src,env=testenv,check=True)
wheels = root / 'wheels'
subprocess.run([python,'-B','-m','pip','wheel','--no-deps','--wheel-dir',str(wheels),str(src)],check=True)
wheel, = wheels.glob('paper_atlas-*.whl')
@@ -43,7 +48,13 @@ jobs:
outside.mkdir()
subprocess.run([str(venv/'bin/paper-atlas'),'--help'],cwd=outside,check=True)
subprocess.run([python,'-I','-B','-m','paper_atlas','collect','cvf','--help'],cwd=outside,check=True)
smoke = "from paper_atlas.db.store import Store; from paper_atlas.config import DEFAULT_REGISTRY; import json; assert len(json.loads(DEFAULT_REGISTRY.read_text())['venues'])==41; s=Store('installed.sqlite'); s.conn.close()"
subprocess.run([python,'-I','-B','-m','paper_atlas','maintain','postgres','--help'],cwd=outside,check=True)
subprocess.run([python,'-I','-B','-m','paper_atlas','import','records','--help'],cwd=outside,check=True)
subprocess.run([python,'-I','-B','-m','paper_atlas','import','arxiv','--help'],cwd=outside,check=True)
subprocess.run([python,'-I','-B','-m','paper_atlas','maintain','backfill','--help'],cwd=outside,check=True)
subprocess.run([python,'-I','-B','-m','paper_atlas','audit','public-openreview','--help'],cwd=outside,check=True)
subprocess.run([python,'-I','-B','-c','from paper_atlas.postgres.writer import PostgresStore, WriteConnection'],cwd=outside,check=True)
smoke = "from paper_atlas.db.store import Store; from paper_atlas.config import DEFAULT_REGISTRY; import json; assert {'COLM','MM','MLSys'} <= {v['acronym'] for v in json.loads(DEFAULT_REGISTRY.read_text())['venues']}; s=Store('installed.sqlite'); s.conn.close()"
subprocess.run([python,'-I','-B','-c',smoke],cwd=outside,check=True)
subprocess.run([python,'-I','-B','-m','paper_atlas','query','--db','installed.sqlite','--stats'],cwd=outside,check=True)
PY
+9 -6
View File
@@ -2,9 +2,9 @@
**长期维护、按需运行的论文元数据与公开投稿历史工具。**
Paper Atlas 将 arXiv、AI 会议论文集及公开投稿决定整理到可追溯的 SQLite 数据库中,用于查询和后续研究分析。它按批次运行,不需要常驻 Web 服务;采集标题、摘要、标识、标签及决定证据,不下载论文全文。
Paper Atlas 将 arXiv、AI 会议论文集及公开投稿决定整理到可追溯的数据库中,用于查询和后续研究分析。生产数据使用 PostgreSQL,支持从既有 SQLite 索引完整迁移;SQLite 保留离线核验和小型样本用途。它按批次运行,不需要常驻 Web 服务;采集标题、摘要、标识、标签及决定证据,不下载论文全文。
项目仍在建设中。候选范围包含 41 个会议,尚未完成全部历史数据和最终去重复核。实际进度以数据库、来源清单和覆盖报告为准,而不是仓库文件数量。
项目仍在建设中。候选范围包含 43 个会议(含 ACM MM、MLSys),尚未完成全部历史数据和最终去重复核。实际进度以数据库、来源清单和覆盖报告为准,而不是仓库文件数量。
## 项目结构
@@ -14,6 +14,7 @@ paper_atlas/
collectors/ 各来源采集与目录盘点
ingestion/ 导入、身份回填与单写入协调
db/ 数据模型、身份解析与 SQL schema
postgres/ PostgreSQL 迁移、原生全文索引和只读连接
audits/ 来源核验和覆盖报告
io/ 网络、快照下载、HTML 与 Git 元数据读取
resources/ 候选会议目录
@@ -30,7 +31,7 @@ pyproject.toml 包元数据、依赖和命令注册
```sh
python3 -m venv .venv
.venv/bin/python -m pip install .
.venv/bin/python -m pip install '.[postgres]'
source .venv/bin/activate
paper-atlas --help
```
@@ -41,13 +42,13 @@ paper-atlas --help
```sh
# 查看当前入库量;不同平台记录数不等于独立论文数
paper-atlas query --db /data/paper-index/papers.sqlite --stats
PGSERVICEFILE=/etc/paper-atlas/pg_service.conf paper-atlas query --pg-service foundry-research --stats
# 查询标题与摘要
paper-atlas query --db /data/paper-index/papers.sqlite --query '"language model"'
PGSERVICEFILE=/etc/paper-atlas/pg_service.conf paper-atlas query --pg-service foundry-research --query '"language model"'
# 查看一篇论文的来源、标签和所有已知投稿历史
paper-atlas query --db /data/paper-index/papers.sqlite --paper 123
PGSERVICEFILE=/etc/paper-atlas/pg_service.conf paper-atlas query --pg-service foundry-research --paper 123
# 列出全部目标会议,包括尚未入库的项目
paper-atlas coverage --db /data/paper-index/papers.sqlite \
@@ -60,6 +61,8 @@ paper-atlas collect colm --cache /data/paper-index/raw/http-cache \
`paper-atlas collect --help` 查看来源;`paper-atlas import --help` 查看导入方式。完整批次步骤见[使用指南](docs/usage.md)。
共享实例名为 `foundry-postgres`,数据位于 `foundry_data` 库的 `research` schema;其他项目可按权限复用同一组表。库名通过 libpq service 配置、schema 通过 search_path 或 `--pg-schema` 指定,不写死在查询中。PostgreSQL 凭据放在服务器权限为 `0600` 的 libpq service 文件中;命令行只使用服务名称。`paper-atlas maintain postgres --help` 提供迁移入口:先完整核验 21 张业务表,再发布目标 schema。SQLite FTS5 内部表由 PostgreSQL GIN 索引替代。切换后 SQLite 为只读备份;`import records`、`import arxiv` 和 `maintain backfill` 使用 `--pg-service foundry-research` 写入主库,整个写入会话只允许一个协调写入者,会议文件失败时整体回滚并保留失败批次记录。
## 数据如何组织
- **论文和投稿分开。** 一篇论文可以多次投稿;某次被拒、后来在其他会议录用,两段历史都保留。
+190
View File
@@ -0,0 +1,190 @@
# 会议覆盖与公开决定核查
这是 2026-11-08 的首份核查基线,**完整逐年政策普查和最终去重仍未完成**。收录 43 个目标,不能把“有记录”当作“完整覆盖”。结构化清单见 [inventory-2026-11-08.json](inventory-2026-11-08.json)。清单中的 `policy_checks` 均限定所列年份和轨道;空数组表示尚未核实,绝不表示没有公开拒稿。
## 快照与复核
生产只读快照时间 `2026-11-07T19:06:00.862Z`,数据库 `foundry_data/research`。报告固定代码 `fd3fdb6cf7e70404d7c35051c36442a4e3771d36`,服务器产物 `/data/paper-index/collected/venue-coverage-postgresql-fd3fdb6.json`,SHA256 `2f090827ae741c9d663c428942fec40182231c5479346f3107678ee5c5fb5435`。完整 JSON 保留逐届、逐 track 和来源清单证据;仓库里的清单记录摘要及后续核查任务。
PostgreSQL 报告支持由 [PR #19](https://gitea.entroia.com/Zayden-Jung/paper-atlas/pulls/19) 提供,须使用包含其提交的安装版本。它与本清单的文档分支相互独立。刷新时生成新的日期快照,保留旧快照;不要把旧报告当实时统计。
```sh
PGSERVICEFILE=/etc/paper-atlas/pg_service.conf paper-atlas coverage \
--pg-service foundry-research --pg-schema research \
--out /data/paper-index/collected/venue-coverage-current.json
```
报告包含 1328 个不同届次/track、503,964 次不同投稿。逐会议相加为 505,718,差额 1,754 来自 7 个联合届次同时匹配两个注册目标,见 JSON 的 `joint_editions`。这是栏目重叠,不是新增投稿。论文可以跨年、跨会复投,来源也可以重叠,所以论文数与来源数都不能直接逐行相加。
## 43 个目标的已观察记录
年份范围只表示已观察最早与最晚年,中间是否缺年须看 JSON 的 `observed_years`;它不证明应举办年份齐全。拒稿列按每次投稿的最新已观察决定计数,完整决定历史另见 JSON。
| 会议 | 已观察年份范围 | 投稿 | 最新拒稿 | 状态未知 | 来源 |
| --- | --- | ---: | ---: | ---: | --- |
| NeurIPS | 1987–2025 | 32,057 | 1,216 | 0 | neurips, papercopilot_openreview |
| ICML | 2013–2026 | 21,232 | 399 | 0 | pmlr, papercopilot_openreview, openreview_public_archive |
| ICLR | 2017–2026 | 50,536 | 24,612 | 10,208 | peerread, iclr_program, openreview_snapshot |
| COLM | 2024–2026 | 1,573 | 0 | 0 | colm |
| COLT | 2011–2026 | 1,795 | 0 | 0 | pmlr |
| AISTATS | 2007–2026 | 5,371 | 0 | 0 | pmlr |
| UAI | 2019–2026 | 1,698 | 0 | 0 | pmlr |
| CLeaR | 2022–2026 | 243 | 0 | 0 | pmlr |
| ACL | 1979–2026 | 22,214 | 0 | 0 | acl_anthology |
| EMNLP | 1996–2026 | 21,785 | 9 | 0 | acl_anthology, papercopilot_openreview |
| NAACL | 2000–2025 | 6,251 | 0 | 0 | acl_anthology |
| EACL | 1983–2026 | 3,712 | 0 | 0 | acl_anthology |
| COLING | 1965–2025 | 8,560 | 0 | 0 | acl_anthology |
| CoNLL | 1997–2026 | 1,566 | 0 | 0 | acl_anthology |
| CVPR | 2013–2026 | 23,435 | 0 | 0 | cvf |
| ICCV | 2013–2025 | 9,145 | 0 | 0 | cvf |
| ECCV | 2018–2024 | 6,165 | 0 | 0 | ecva |
| AAAI | 1980–2026 | 29,827 | 0 | 5 | dblp |
| IJCAI | 1969–2026 | 16,288 | 0 | 1 | dblp |
| ECAI | 1976–2026 | 6,280 | 0 | 0 | dblp |
| KDD | 1995–2026 | 8,707 | 0 | 0 | dblp |
| SIGIR | 1971–2026 | 7,869 | 0 | 1 | dblp |
| WWW | 1995–2026 | 11,422 | 0 | 2 | dblp |
| WSDM | 2008–2026 | 2,184 | 0 | 0 | dblp |
| RecSys | 2007–2025 | 2,360 | 0 | 0 | dblp |
| CIKM | 1992–2025 | 9,330 | 0 | 0 | dblp |
| ICDM | 2001–2025 | 3,824 | 0 | 0 | dblp |
| SDM | 2001–2025 | 2,048 | 0 | 0 | dblp |
| ECML-PKDD | 1993–2026 | 4,836 | 0 | 1 | dblp |
| ICRA | 1984–2026 | 32,504 | 0 | 8 | dblp |
| IROS | 1991–2025 | 25,074 | 0 | 0 | dblp |
| RSS | 2005–2024 | 1,305 | 0 | 0 | dblp |
| CoRL | 2017–2025 | 1,488 | 0 | 0 | pmlr |
| ICAPS | 1994–2025 | 1,576 | 0 | 0 | dblp |
| KR | 1989–2026 | 1,694 | 0 | 0 | dblp |
| AAMAS | 2002–2024 | 7,325 | 0 | 0 | dblp |
| ICASSP | 1976–2025 | 56,226 | 0 | 4 | dblp |
| INTERSPEECH | 1987–2026 | 29,784 | 0 | 1 | dblp |
| ISMIR | 2000–2025 | 2,593 | 0 | 0 | dblp |
| MICCAI | 1998–2026 | 10,930 | 0 | 0 | dblp |
| FAccT | 2018–2026 | 1,258 | 0 | 0 | dblp |
| MLSys | 2019–2026 | 448 | 0 | 0 | dblp, mlsys |
| MM | 1993–2025 | 11,200 | 0 | 1 | dblp |
## 优先缺口
- **UAI 2024–2026**:官方均允许作者选择公开拒稿,当前主库拒稿仍为零。原 notes 接口要求 Challenge 验证,公开镜像尚无已核验来源,必须保留这个真实缺口;不能根据 PMLR 录用名单推断拒稿。参见 [2025 投稿指南](https://www.auai.org/uai2025/submission_instructions)、JSON 内其他年份官方证据。
- **EMNLP 2023**:官方允许公开 opt-in 拒稿,目前只导入 9 条。需继续核验实际公开全集。ARR 评审、conference commitment 与最终会议决定分开;[ARR 作者说明](https://aclrollingreview.org/authors) 明确其自愿捐赠数据与 EMNLP 2023 直接投稿发布的范围不同。
- **ICLR**:固定快照已观察 2017 与 2020–2026;快照之后,2013/2018/2019 的 1,654 条来源记录已完成独立 PostgreSQL 验收(报告时间 `2026-11-07T19:52:28.378Z`),不回写旧快照计数,也不据此宣称逐届全集已齐。快照中的 10,208 次 unknown 不等于 rejected,近期补采与冲突核对仍在进行;评审推荐不能当最终决定。
- **MM / MLSys**:MM 11,200 条书目记录保留 `proceedings_unspecified`;MLSys 的 448 次官方投稿与 313 条 DBLP 记录重叠。2026 MLSys 的研究/工业轨道在 [官方 CFP](https://mlsys.org/Conferences/2026/CallForResearchPapers) 中分开,仍须核对逐篇轨道证据,不能仅凭会议名全部归 main。
- **摘要与历史目录**:DBLP 原始来源不含摘要,论文实体可能从其他来源补得,须分开核验。最近导入批次仍有 6 条 CVF 原始摘要缺失。COLT 可选择一页 extended abstract,摘要非空不能证明完整。RSS 等部分近期届次尚无当前来源记录,需与真实出版目录核对。
## 官方历届目录核对
已完成 **43/43** 个目标的首轮独立年份目录核查;逐篇采集、逐轨道/逐年公开决定普查和最终审计仍未完成。每份证据保存官方目录实际条目、URL、可读取表示(HTML、静态JS或网页提取文本)的哈希和检查时间;不能用数据库已观察年份或首尾年份插值替代官方目录。下表差集仅对应前述固定旧快照,不是当前主库查询,也不代表逐篇、track、摘要或公开拒稿已完整。
| 目标 | 官方截至2026年届次 | 固定旧快照缺年 | 证据与边界 |
| --- | --- | --- | --- |
| NeurIPS | 1987–2025已列论文集,另公告2026,共40届 | 2026 | [证据](neurips-editions-2026-11-08.json);2026未列论文集,不能称为漏了已出版论文。 |
| ICLR | 2013–2026,14届 | 2013–2016、2018、2019 | [证据](iclr-editions-2026-11-08.json);2013/2018/2019后续来源已验收,不能因旧快照缺年而重放。 |
| COLM | 2024–2026,3届 | 无 | [证据](colm-editions-2026-11-08.json);无年份差集不证明逐篇或轨道完整。 |
| COLT | 1988–2026,39届 | 1988–2010,23届 | [证据](colt-editions-2026-11-08.json);EuroCOLT四届另列,混合论文集保留范围限制。 |
| AISTATS | 官方目录实际29届,早期不连续 | 1985、1989–2005奇数年,共10届 | [证据](aistats-editions-2026-11-08.json);不补造1987或2008。 |
| UAI | 1985–2026,42届 | 1985–2018,34届 | [证据](uai-editions-2026-11-08.json);早期编辑图书出版年与会议年分开。 |
| CLeaR | 2022–2026,5届 | 无 | [证据](clear-editions-2026-11-08.json);由官方出版社首届说明、实际各卷及会议日期核对。 |
| EMNLP | 1996–2026,31个不同年份 | 无 | [证据](emnlp-editions-2026-11-08.json);WVLC另列,2020重复只计一次,保留年份/日期/地点文字冲突。 |
| IJCAI | 1969–2026,35届,早期隔年 | 无 | [证据](ijcai-editions-2026-11-08.json);保留IJCAI-ECAI / IJCAI-PRICAI联合名称,多卷不增加届数。 |
| RecSys | 2007–2026,20届 | 2026 | [证据](recsys-editions-2026-11-08.json);未来2027排除。 |
| CoRL | 2017–2025已列论文集,另公告2026,共10个年份 | 2026 | [证据](corl-editions-2026-11-08.json);截至11月8日,11月9–12日活动即将举办,PMLR未列该届,不能称为漏了已出版论文。 |
| MLSys | 2018–2026,9届 | 2018 | [证据](mlsys-editions-2026-11-08.json);首届SysML为非存档oral/poster,正式论文集从2019开始。 |
| RSS | 2005–2026,22届 | 2025、2026 | [证据](rss-editions-2026-11-08.json);使用论文集中的会议日期,印刷出版年和期刊特刊分开。 |
| ICAPS及具名共同前身 | ICAPS2003–2026共24届,另13个具名前身届次 | 1990–1993、1995、1997、1999、2001、2026 | [证据](icaps-editions-2026-11-08.json);保留AIPS/ECP/EWSP/EPS原名,ECP系仍有采集范围缺口,不把前身论文改名ICAPS。 |
| AAMAS | 2002–2026,25届 | 2012、2025、2026 | [证据](aamas-editions-2026-11-08.json);2002–2006出版入口与2007后基金会档案分开,保留2020–2022实际线上举办情况。 |
| MM | 1993–2026,34个实际年份标签 | 2026 | [证据](mm-editions-2026-11-08.json);SIGMM早期档案、官网历届及统计年份交叉核对,2026截至11月8日尚未举办,不据此断定出版情况。 |
| ACL | 1963–2026,64个真实会议年 | 1963–1978 | [证据](acl-editions-2026-11-08.json);历史表补16个早年,1962成立年不算会议;1965由首届COLING替代,不能生成额外录用。 |
| NAACL | 2000–2025实际18个系列会议年 | 无 | [证据](naacl-editions-2026-11-08.json);章节网站承办的ACL年份单列,不能改名NAACL;保留2024组织更名与历史标题。 |
| EACL | 1983–2026,19届 | 无 | [证据](eacl-editions-2026-11-08.json);承办ACL2019/2022不算新增EACL届次,1997明确联合;未来2027排除。 |
| COLING | 1965–2025,31届 | 1971、1976、1978 | [证据](coling-editions-2026-11-08.json);1988前言补早期缺年,2024联合LREC、2025改奇数年;不补造2026。 |
| CoNLL | 1997–2026,30届 | 无 | [证据](conll-editions-2026-11-08.json);shared tasks与另一个1997前身workshop分开,保留早期workshop名称。 |
| CVPR | 官方实际39个会议年,1983–2026不连续 | 2013年前25个实际年份,详见JSON | [证据](cvpr-editions-2026-11-08.json);逐行保留实际年份,不按年插值,未来2027–2031排除。 |
| ICCV | 1987–2025实际20届 | 1987–2011实际13届,详见JSON | [证据](iccv-editions-2026-11-08.json);早期1988/1990/1998确有条目,不强制奇数年。 |
| ECCV | 1990–2026,19届 | 1990–2016偶数年及2026 | [证据](eccv-editions-2026-11-08.json);ECVA概览只列2004–2024,以CVF完整目录补核,2020地点文字冲突保留。 |
| AAAI | 1980–2026实际40届 | 无 | [证据](aaai-editions-2026-11-08.json);官网会议/论文集两组年份一致;web工具官方文本提取哈希另存,直连403如实记录。 |
| ECAI及具名前身 | 1974–2026实际29届 | 1974、1980、2018、2022 | [证据](ecai-editions-2026-11-08.json);1974–1980为AISB前身,1982开始ECAI名称;2018/2022/2026与IJCAI联合。 |
| KR | 1989–2026实际23届 | 无 | [证据](kr-editions-2026-11-08.json);只解析官网静态会议数组,不执行脚本,排除其他数组和未来2027/2028。 |
| FAccT | 9个实际会议年 | 无 | [证据](facct-editions-2026-11-08.json);2018–2026;2018–2020保留FAT*原名,2027排除。 |
| ISMIR | 27个实际会议年 | 2026 | [证据](ismir-editions-2026-11-08.json);2000–2026;2026于核查当天开幕,出版完整性未确认。 |
| MICCAI | 29个实际会议年 | 无 | [证据](miccai-editions-2026-11-08.json);1998–2026;另列8个具名前身事件,不改名为MICCAI;保留2026地点/日期来源冲突。 |
| ICRA | 43个目录年份 | 无 | [证据](icra-editions-2026-11-08.json);1984–2026;按届次标题取年,保留2002日期行误写2022的源内冲突。 |
| IROS | 39个目录年份 | 1988、1989、1990、2026 | [证据](iros-editions-2026-11-08.json);1988–2026;1988–1990和2026在固定旧快照缺失,未来2027排除。 |
| ICASSP | 51个目录年份 | 1977、2026 | [证据](icassp-editions-2026-11-08.json);1976–2026列明51个届次年份;2003现场标记取消但仍有IEEE论文集DOI,不能等同没有录用稿件。 |
| INTERSPEECH | 39个目录年份 | 无 | [证据](interspeech-editions-2026-11-08.json);1987–2026具名家族;保留ECST/Eurospeech/ICSLP原名,不补1988。 |
| KDD | 32个具名届次/事件 | 无 | [证据](kdd-editions-2026-11-08.json);1995–2026主会;另列1989/1991/1993/1994四个具名workshop。 |
| SIGIR | 50个具名届次/事件 | 无 | [证据](sigir-editions-2026-11-08.json);含1971独立历史事件与1978–2026的49个年度会,不补1972–1977。 |
| WSDM | 19个具名届次/事件 | 无 | [证据](wsdm-editions-2026-11-08.json);2008–2026;2008文字误连2009域名另记,未来2027排除。 |
| WWW | 35个具名届次/事件 | 1994、1996、1997、1998、1999、2000 | [证据](www-editions-2026-11-08.json);1994–2026共33年份、35事件;1994/1995各两届,需先补事件身份模型再导入。 |
| ICML | 43个具名届次/事件 | 1980、1983、1985、1987、1988、1989、1990、1991、1992、1993、1994、1995、1996、1997、1998、1999、2000、2001、2002、2003、2004、2005、2006、2007、2008、2009、2010、2011、2012 | [证据](icml-editions-2026-11-08.json);1980–2026家族实际年份;早期workshop原名保留,不补1981/1982/1984/1986。 |
| CIKM | 35个具名届次/事件 | 2026 | [证据](cikm-editions-2026-11-08.json);1992–2026;1992会议与1993精选论文集出版年分开,2026正在举行。 |
| ICDM | 26个具名届次/事件 | 2026 | [证据](icdm-editions-2026-11-08.json);2001–2026;重复目录行去重,2026于11月12–15日尚待举行,不代表论文集齐全。 |
| SDM | 26个具名届次/事件 | 2026 | [证据](sdm-editions-2026-11-08.json);2001–2025出版社实际论文集标题加2026官方公告,2026于11月19–20日尚待举行。 |
| ECML-PKDD | 41个具名届次/事件 | 1986、1987、1988、1989、1991 | [证据](ecml-pkdd-editions-2026-11-08.json);1986–2026共38年份、41事件;5个EWSL前身、1997/1998/2000两系列独立事件均保留,生产中已属不同venue/edition。 |
CLeaR与CoRL的出版届次由 [PMLR官方目录](https://proceedings.mlr.press/) 和每卷会议日期核对;[CoRL2026官网](https://www.corl.org/) 的已公告活动另记,不把公告当作已出版论文集。main、workshop、demo与late-breaking展示还需分别核对。MLSys2018允许已有发表研究及后续原样再投,展示或PDF链接不能自动作正式出版证据。
NeurIPS2021 Datasets & Benchmarks使用独立目录,2022起混入主卷,2025 Main Conference与Creative AI分索引,仍须保留逐篇轨道证据。EMNLP目录文字冲突保留在证据中,不据此修改事件元数据。
ICML的[早先部分证据](icml-partial-editions-2026-11-08.json)保留原始坏导航记录;后来找到[2008官方历届表等独立证据](icml-editions-2026-11-08.json),已补齐43个实际家族年份。没有使用错位导航补年,也没有把尚未下载/导入的历史论文集说成已完成。
[UAI2023投稿说明](https://www.auai.org/uai2023/submission_instructions) 与2024–2026核查均包含作者可选公开拒稿;逐篇公开来源仍未验收。[EMNLP2023审稿流程说明](https://2023.emnlp.org/blog/EMNLP-2023-openreview/) 确认opt-in范围,但不提供可见记录全集,目前9条不能称为全量。年份普查不替代逐年、逐轨道的公开决定核查。
ICAPS官方共同历史明确列出两个前身系列,现有DBLP映射只覆盖AIPS/ICAPS,ECP/EWSP/EPS缺口须独立补齐并保留原名。MM官网的完整历届链接当前404;使用SIGMM档案与官网逐年实际标签交叉核对,不从首尾年推算。[MM官方汇总统计](https://www.acmmm.org/) 不是逐篇拒稿记录;SC政策PDF仍有proposal/alternative表述,不能据此代替具体会议最终决定。
## 政策证据的边界
- [COLM 2026 固定版 CFP](https://raw.githubusercontent.com/COLM-org/colm-org.github.io/f1718e86fd16ed9b10b4e010c9098c1b6223c2a8/cfp.md) 明确不发布拒稿、撤稿及其元数据,哈希与提交号保存在 JSON;不再依赖含 2024 旧链接的 2026 AuthorGuide。2025 有独立政策证据。
- [RSS 2026 CFP](https://roboticsconference.org/2026/information/cfp/) 明确仅录用论文公开、评审不公开。无年份根路径已指向 2027,必须使用有年份的链接。
- [CVPR 2026 指南](https://cvpr.thecvf.com/Conferences/2026/AuthorGuidelines) 说评审与回复不公开;这不自动证明所有拒稿元数据都永久私密。[MICCAI 2026 主会流程](https://miccai2026.org/en/THE-MICCAI-REVIEW-PROCESS.html) 的录用评审公开政策,也不能用 workshop 的通用 OpenReview 配置手册替代。
- AISTATS 的撤稿统计口径、CoRL/CLeaR 审稿期隐私、是否使用 OpenReview,均不能单独证明决定后的拒稿发布范围。
## 新增政策核查与建模边界
本次仅补充政策证据,前面的已观察记录表仍对应固定生产快照,不滚动改写旧计数。43 个目标中,目前 43 个都有至少一条限定年份的政策核查,共 54 条;“有核查”包含仍然 unknown 的结果,不代表这些会议的全部历史年份已查清。额外的 TMLR 期刊政策单列在 JSON 的 `additional_nonconference_policy_checks`,不增加会议目标数。
- [ICAPS 2024 主会 CFP / FAQ](https://icaps24.icaps-conference.org/calls/main_track/) 仅明确录用论文的评审和最终 rebuttal 公开,不能据此推断所有拒稿元数据私密。该年把此前主题轨道统一为主轨道内的可选 primary keywords;technical/position、long/short 仍是论文属性,不能互相混用。
- [ICCV 2025 作者指南](https://iccv.thecvf.com/Conferences/2025/AuthorGuidelines) 明确评审和作者回复不公开;拒稿元数据的会后发布范围仍未独立确认,不将审稿期保密外推为永久不公开。
- [KDD 2026 研究轨道 CFP](https://kdd2026.kdd.org/research-track-call-for-papers/) 的 Resubmit 与 Reject、Withdrawn 分开,且保留 cycle。录用评审公开政策不证明拒稿全集可得;研究轨道证据不外推其他轨道。
- [ICAPS 2025 主会 CFP](https://icaps25.icaps-conference.org/calls/main_track/) 另设海报录用及非存档扩展摘要;缺席存档论文集不能作为拒稿证据。论文类型与 long/short 分开,会后拒稿公开政策仍未确认。
- [AAMAS 2026 AAAI track 专页](https://cyprusconferences.org/aamas2026/call-for-papers-aaai-track/) 接收先在 AAAI 被拒的修订稿,但与 [calls 总览](https://cyprusconferences.org/aamas2026/calls/) 的原会议年份分别写 AAAI-26、AAAI-25,存在冲突。[该 track 录用目录](https://cyprusconferences.org/aamas2026/aaai-accepted/) 可作为后续跨会历史候选,须补原投稿标识和逐篇决定证据后关联,不能仅凭 track 资格规则生成原拒稿记录;评审推荐也不替代会议最终决定。
- [ICLR 2026 作者指南](https://iclr.cc/Conferences/2026/AuthorGuide) 明确录用、拒稿和截稿后撤稿的公开范围,截稿前撤稿可删除;该段未单独确认所有 desk rejection。撤稿权止于决定公布,不能把镜像提交时间当成决定后的撤稿时间。指南与 [CFP](https://iclr.cc/Conferences/2026/CallForPapers) 的通知日期也存在差异,逐篇日期须另有证据。
- [FAccT 2026 作者指南](https://facctconference.org/2026/authorguide.html) 保密投稿材料、录用后公开标题/作者/摘要;未据此确认会后拒稿元数据的完整发布范围。[该年 CFP](https://facctconference.org/2026/cfp.html) 的 Revise 再审不是最终 Reject,non-archival 论文只刊摘要仍可为录用。
- [AAAI 2026 投稿说明](https://aaai.org/conference/aaai/aaai-26/submission-instructions/) 的两阶段决定和 OpenReview 用法不能证明拒稿公开。[AI Review Pilot 原论文](https://arxiv.org/html/2604.13940v1) 的 AI 评审及 SPECS 合成错误样本也不是真实会议 Reject 证据;未核验到逐篇拒稿来源时继续标为 unknown。
- [RecSys 2026 CFP](https://recsys.acm.org/recsys26/call/) 使用 EasyChair;开放出版不等于拒稿公开。Research & Practice Notes 明确不接受主轨道拒稿转投,论文类型和长度不自动改成新的会议投稿结果。
- [KR 2026 主会 CFP](https://kr.org/KR2026/call_main_track.html) 的保密承诺截至出版日期,不能外推会后是否公开拒稿。regular/short 长度、会议录用、期刊邀请分别保留。
- [WSDM 2026 CFP](https://wsdm-conference.org/2026/index.php/call-for-papers/) 区分不同评审角色对作者元数据的可见性;EasyChair 投稿和 ACM 开放出版均不能建立公开拒稿全集。
- [TMLR 当前 FAQ](https://www.jmlr.org/tmlr/faq.html) 明确公开录用、拒稿、撤稿及撤回发表的投稿,desk-rejected 不公开。未录用作者仍保持匿名,不能借其他来源推断身份。期刊论文后续获得会议展示认证,也不能自动当成一次新的会议投稿录用。
- [IJCAI 2025 主会 CFP](https://2025.ijcai.org/call-for-papers-main-track/) 要求近期拒稿复投提供原评审与修改说明;这不能据此生成某篇论文的前次拒稿。[Reviewer FAQ](https://2025.ijcai.org/reviewers-faq/) 的内部讨论可见性也不能证明会后拒稿是否公开。该年主会仍标 unknown;Journal / Best Papers from Sister Conferences 展示轨道与新的主会投稿录用分开。
- [本批四项政策证据](nlp-aamas-policy-checks-2026-11-08.json):NAACL2025的ARR匿名投稿可选公开不等于会议最终拒稿公开;preferred venue不是正式commitment,ARR desk rejection不改记成NAACL决定。EACL2026未入main会自动考虑Findings,Findings录用不能当最终会议Reject;TACL/CL展示与主会录用分开。
- COLING2025仅main直投通道明确不公开投稿与评审,ARR稿件另经commitment,不外推其他年份/轨道。AAMAS2026主会明确公开录用论文及评审,但尚未确认会后拒稿元数据发布范围;允许拒稿重投的规则不能生成逐篇历史决定。CoNLL的逐年公开拒稿政策仍待核查。
- [本批视觉与推理政策证据](vision-reasoning-policy-checks-2026-11-08.json):ECCV2026评审及回复永不公开,不等于已确认全部拒稿元数据的会后发布范围;五个作者贡献类型与轨道、主题、决定分开,无逐篇字段时不能补默认类型。ECAI2025内部跨会共享材料不等于公开,允许带原评审复投不能生成某篇论文的原拒稿。
- [ISMIR2026政策核查](music-medical-fairness-policy-checks-2026-11-08.json):双盲、CMT和desk rejection规则未确认会后公开拒稿范围。MICCAI、FAccT已有检查保持原定年份与范围;不把只公开录用稿件或审稿材料理解为公开全部拒稿。
- [机器人与语音政策证据](robotics-speech-policy-checks-2026-11-08.json):ICRA2026允许IROS2025未录用稿件转投,但政策不是逐篇原拒稿证据;期刊展示不额外生成主会录用。ICASSP no-show不进Xplore也可能已分发论文集,不能据索引缺失判拒。INTERSPEECH响应内静态政策说明审稿保密,重定向页面渲染异常另记;IROS政策访问受限未算完成核查。
- [WWW2026分轨道政策](ir-mining-policy-checks-2026-11-08.json):Research为EasyChair、会后拒稿范围unknown;Industry为OpenReview,仅公开录用稿件审稿材料。Research原HTML中隐藏的2025政策注释未作为2026证据。
- WWW1994/1995各两届;当前`UNIQUE(venue_id,year,track)`不能表达两个同年main事件。补导前须提供独立事件身份、迁移和PG验证,保留原track与IDs,不用伪造track绕过约束。
- [最后四会限定政策](final-four-policy-checks-2026-11-08.json):CIKM Full Research、ICDM Research、SDM main、ECML-PKDD ADS分别记录,均未确认会后负面元数据全集。SDM2026公开group可读、三个public标志为false,根venueid匿名notes查询403,不当作零条;没有绕过权限。
- 生产只读预检确认ECML/PKDD1997/1998/2000已经保存在独立venue/edition中,保持现有身份即可,不需要为这些记录迁移。WWW1995已有59条Fall卷来源;Spring及1994两届仍需先解决同一venue/year/track的事件身份,再补导。SIAM出版社与CIKM官方历史的索引文本提取使用独立哈希,直连403/TLS错误保留,不冒充原HTML。
- [CoNLL、SIGIR、IROS限定政策](remaining-policy-checks-2026-11-08.json):CoNLL2025第二次CFP改为只接直接投稿;其OpenReview路径中的Workshop不决定论文track,非存档展示也不增加存档录用。SIGIR2026仅Full Papers,公开group三个标志false、一次匿名拒稿查询403,不算零条。IROS2025为单盲,不把期刊展示视为常规新录用;2026与全部历史公开拒稿范围仍待查。43个目标都有至少一项限定核查,并不代表全部历史年份/轨道已经完整核查。
## 更新与验收
补充每个年份的官方 CFP/FAQ、固定版本或内容哈希、实际可读取来源、轨道和缺口原因。政策描述与记录证据分开:导入只依赖明确最终决定或明确公开分类,不从标题匹配、未录用清单、评分或评审推荐制造拒稿。同一论文后续在别会录用要保留原拒稿历史。
这份基线不关闭长期目标:还需完成 43 个会议逐年公开决定核查、跨来源身份/标签规范化、全部导入后的全库去重与冲突/摘要/约束/查询审计,以及运维文档最终整理。
MM 2026 的[官方 CFP](https://2026.acmmm.org/site/cfp-guidelines.html)说明会后公开最终评审及适用的作者回复,但未明确包含全部被拒投稿。2026-11-08 对官方组的匿名 API 查询返回200,对该组 `venueid` 的投稿查询返回403;[证据](mm-editions-2026-11-08.json)保存查询、时间和响应哈希。公开拒稿可用性仍为 unknown,403不能作为零记录或不存在公开拒稿的证据。
WWW早期逐来源核查见 `www-early-proceedings-2026-11-08.json`:1995春季论文三目录均为38个相同条目ID,海报摘要53个条目与作者链接47个条目不齐;1994春季50个Title字段与主页49场报告说法待逐项核对。上述为源目录观察,不是已导入或全部录用数量;主会、海报、教程等继续独立核验。
WWW事件标识生产迁移已独立验收(报告SHA `f5dbb8a8`):保留1399个原届次字段及IDs、59个Fall投稿和完整全库历史哈希。服务器已缓存46个官方HTML来源(约223KB),只作为后续维护式采集器的输入;尚未补导早期WWW论文,也未启用可选注解表。
+222
View File
@@ -0,0 +1,222 @@
{
"source_url": "https://aaai.org/conference/aaai/",
"checked_at": "2026-11-08T10:52:18.532452+00:00",
"source_representation": "first_party_page_text_returned_by_web_tool",
"source_extract_sha256": "a615dd93457489752e7780c1352882547b44f67c2faf64b28b6f76ee9207e227",
"source_html_sha256": null,
"direct_fetch": {
"source_url": "https://aaai.org/conference/aaai/",
"error": "HTTP Error 403: Forbidden",
"checked_at": "2026-11-08T10:47:21.547698+00:00"
},
"retrieval_note": "Primarypagewebextractioncontainsboth40pastAAAI-XXlabelsand40proceedingsyearlabelswithmatchingorderedyears,plusfuture41st2027. Rawdirectfetch403retainedaslimitation;nobypassorrawHTMLhashclaim. ArchivedwebtextreceiptisdistinctfromrawHTTPresponse.",
"cutoff_year": 2026,
"expected_years": [
1980,
1982,
1983,
1984,
1986,
1987,
1988,
1990,
1991,
1992,
1993,
1994,
1996,
1997,
1998,
1999,
2000,
2002,
2004,
2005,
2006,
2007,
2008,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027
],
"editions": [
{
"year": 2026,
"label": "AAAI-26"
},
{
"year": 2025,
"label": "AAAI-25"
},
{
"year": 2024,
"label": "AAAI-24"
},
{
"year": 2023,
"label": "AAAI-23"
},
{
"year": 2022,
"label": "AAAI-22"
},
{
"year": 2021,
"label": "AAAI-21"
},
{
"year": 2020,
"label": "AAAI-20"
},
{
"year": 2019,
"label": "AAAI-19"
},
{
"year": 2018,
"label": "AAAI-18"
},
{
"year": 2017,
"label": "AAAI-17"
},
{
"year": 2016,
"label": "AAAI-16"
},
{
"year": 2015,
"label": "AAAI-15"
},
{
"year": 2014,
"label": "AAAI-14"
},
{
"year": 2013,
"label": "AAAI-13"
},
{
"year": 2012,
"label": "AAAI-12"
},
{
"year": 2011,
"label": "AAAI-11"
},
{
"year": 2010,
"label": "AAAI-10"
},
{
"year": 2008,
"label": "AAAI-08"
},
{
"year": 2007,
"label": "AAAI-07"
},
{
"year": 2006,
"label": "AAAI-06"
},
{
"year": 2005,
"label": "AAAI-05"
},
{
"year": 2004,
"label": "AAAI-04"
},
{
"year": 2002,
"label": "AAAI-02"
},
{
"year": 2000,
"label": "AAAI-00"
},
{
"year": 1999,
"label": "AAAI-99"
},
{
"year": 1998,
"label": "AAAI-98"
},
{
"year": 1997,
"label": "AAAI-97"
},
{
"year": 1996,
"label": "AAAI-96"
},
{
"year": 1994,
"label": "AAAI-94"
},
{
"year": 1993,
"label": "AAAI-93"
},
{
"year": 1992,
"label": "AAAI-92"
},
{
"year": 1991,
"label": "AAAI-91"
},
{
"year": 1990,
"label": "AAAI-90"
},
{
"year": 1988,
"label": "AAAI-88"
},
{
"year": 1987,
"label": "AAAI-87"
},
{
"year": 1986,
"label": "AAAI-86"
},
{
"year": 1984,
"label": "AAAI-84"
},
{
"year": 1983,
"label": "AAAI-83"
},
{
"year": 1982,
"label": "AAAI-82"
},
{
"year": 1980,
"label": "AAAI-80"
}
],
"scope": "40actualAAAIeditionlabels1980–2026independentlycrosscheckedagainstproceedingslabelsonthesameprimaryhistorypage. Noannualinterpolationandnoinvented2009orotherunlistedyears. Conferencepapers,IAAI/EAAI,demonstrationsandothertracksstillrequireseparatescopechecks;OpenReviewandpublicationare notproofpublicRejectmetadata."
}
@@ -0,0 +1,187 @@
{
"source_url": "https://www.ifaamas.org/previousaamas.html",
"resolved_url": "https://www.ifaamas.org/previousaamas.html",
"checked_at": "2026-11-08T10:03:00.826680+00:00",
"source_sha256": "bf9d3ed74d85c801804918397fff3d1794c4d0486b712ea174a7427c91be56e1",
"expected_years": [
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"editions": [
{
"year": 2026,
"label": "AAMAS 2026",
"conference_url": "https://cyprusconferences.org/aamas2026/"
},
{
"year": 2022,
"label": "Bids to Host AAMAS 2022",
"conference_url": "https://www.ifaamas.org/hosting-2022.html"
},
{
"year": 2022,
"label": "bids to host AAMAS 2022",
"conference_url": "https://www.ifaamas.org/hosting-2022.html"
},
{
"year": 2025,
"label": "Detroit, USA (AAMAS 2025)",
"conference_url": "https://aamas2025.org/"
},
{
"year": 2024,
"label": "Auckland, New Zealand (AAMAS 2024)",
"conference_url": "https://www.aamas2024-conference.auckland.ac.nz/"
},
{
"year": 2023,
"label": "London, UK (AAMAS 2023)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas2023/"
},
{
"year": 2022,
"label": "Auckland, New Zealand (AAMAS 2022) - held online",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas2022/"
},
{
"year": 2022,
"label": "Auckland, New Zealand (AAMAS 2022)",
"conference_url": "https://aamas2022-conference.auckland.ac.nz/"
},
{
"year": 2021,
"label": "London, UK (AAMAS 2021)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas2021/"
},
{
"year": 2020,
"label": "Auckland, New Zealand (AAMAS 2020)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas2020/"
},
{
"year": 2019,
"label": "Montreal, Canada (AAMAS 2019)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas2019/"
},
{
"year": 2018,
"label": "Stockholm, Sweden (AAMAS 2018)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas2018/"
},
{
"year": 2017,
"label": "São Paulo, Brazil (AAMAS 2017)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas2017/"
},
{
"year": 2016,
"label": "Singapore (AAMAS 2016)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas2016/"
},
{
"year": 2015,
"label": "Istanbul, Turkey (AAMAS 2015)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas2015/"
},
{
"year": 2014,
"label": "Paris, France (AAMAS 2014)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas2014/"
},
{
"year": 2013,
"label": "Saint Paul, USA (AAMAS 2013)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas2013/"
},
{
"year": 2012,
"label": "Valencia, Spain (AAMAS 2012)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas2012/"
},
{
"year": 2011,
"label": "Taipei, Taiwan (AAMAS 2011)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas2011/"
},
{
"year": 2010,
"label": "Toronto, Canada (AAMAS 2010)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas2010/"
},
{
"year": 2009,
"label": "Budapest, Hungary (AAMAS 2009)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas2009/"
},
{
"year": 2008,
"label": "Estoril, Portugal (AAMAS'08)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas08/"
},
{
"year": 2007,
"label": "Honolulu, USA (AAMAS'07)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas07/"
},
{
"year": 2006,
"label": "Hakodate, Japan (AAMAS'06)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas06/"
},
{
"year": 2005,
"label": "Utrecht, The Netherlands (AAMAS'05)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas05/"
},
{
"year": 2004,
"label": "New York, USA (AAMAS'04)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas04/"
},
{
"year": 2003,
"label": "Melbourne, Australia (AAMAS'03)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas03/"
},
{
"year": 2002,
"label": "Bologna, Italy (AAMAS'02)",
"conference_url": "https://www.ifaamas.org/AAMAS/aamas02/"
}
],
"additional_primary_sources": [
{
"source_url": "https://www.ifaamas.org/proceedings.html",
"resolved_url": "https://www.ifaamas.org/proceedings.html",
"checked_at": "2026-11-08T10:03:01.535471+00:00",
"source_sha256": "b0ad40e5042861bb5004ab902486306c048c50aa5972b962c803d63757b6c7bb"
}
],
"scope": "IFAAMAS actual annualconferenceentries2002–2026. Publisherarchive separates ACM Digital Library2002–2006 from foundation archive2007onward. Keep planned locations and actual online2020–2022 events distinct. No per-paper/track or public rejection census; sister-conference/journal presentation tracks do not manufacture prior rejection or new main acceptance.",
"cutoff_year": 2026,
"excluded_future_years": [],
"source_html_sha256": "bf9d3ed74d85c801804918397fff3d1794c4d0486b712ea174a7427c91be56e1"
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,332 @@
{
"source_url": "https://aistats.org/other.html",
"checked_at": "2026-11-08T07:00:27.535493+00:00",
"source_html_sha256": "cc1d6e200d841f53a215e9b3d58fcc1311e8c65166afd37c5350a2f3949a966d",
"cutoff_year": 2026,
"expected_years": [
1985,
1989,
1991,
1993,
1995,
1997,
1999,
2001,
2003,
2005,
2007,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [],
"edition_entries": [
{
"year": 2026,
"official_entry": "AISTATS 2026 May 2-5, Tangier, Morocco",
"links": [
{
"text": "AISTATS 2026",
"url": "https://aistats.org/aistats2026/"
}
]
},
{
"year": 2025,
"official_entry": "AISTATS 2025 May 3 - May 5, Mai Khao, Thailand",
"links": [
{
"text": "AISTATS 2025",
"url": "https://aistats.org/aistats2025/"
}
]
},
{
"year": 2024,
"official_entry": "AISTATS 2024 May 2 - May 4, Valencia, Spain",
"links": [
{
"text": "AISTATS 2024",
"url": "https://aistats.org/aistats2024/"
}
]
},
{
"year": 2023,
"official_entry": "AISTATS 2023 April 25-27, Valencia, Spain",
"links": [
{
"text": "AISTATS 2023",
"url": "https://aistats.org/aistats2023/"
}
]
},
{
"year": 2022,
"official_entry": "AISTATS 2022 March 28-30, Virtual Conference",
"links": [
{
"text": "AISTATS 2022",
"url": "https://aistats.org/aistats2022/"
}
]
},
{
"year": 2021,
"official_entry": "AISTATS 2021 April 13-15, Virtual Conference",
"links": [
{
"text": "AISTATS 2021",
"url": "https://aistats.org/aistats2021/"
}
]
},
{
"year": 2020,
"official_entry": "AISTATS 2020 August 26-28, Virtual Meeting",
"links": [
{
"text": "AISTATS 2020",
"url": "https://aistats.org/aistats2020/"
}
]
},
{
"year": 2019,
"official_entry": "AISTATS 2019 April 16-18, Naha, Okinawa, Japan",
"links": [
{
"text": "AISTATS 2019",
"url": "https://aistats.org/aistats2019/"
}
]
},
{
"year": 2018,
"official_entry": "AISTATS 2018 April 9-11 Playa Blanca, Lanzarote, Canary Islands",
"links": [
{
"text": "AISTATS 2018",
"url": "https://aistats.org/aistats2018/"
}
]
},
{
"year": 2017,
"official_entry": "AISTATS 2017 April 20-22, Fort Lauderdale, Florida, USA",
"links": [
{
"text": "AISTATS 2017",
"url": "https://aistats.org/aistats2017/"
}
]
},
{
"year": 2016,
"official_entry": "AISTATS 2016 May 9-11, Cadiz, Spain",
"links": [
{
"text": "AISTATS 2016",
"url": "https://aistats.org/aistats2016/"
}
]
},
{
"year": 2015,
"official_entry": "AISTATS 2015 May 9-12, San Diego, California, USA",
"links": [
{
"text": "AISTATS 2015",
"url": "https://aistats.org/aistats2015/"
}
]
},
{
"year": 2014,
"official_entry": "AISTATS 2014 April 22-25, Reykjavik, Iceland",
"links": [
{
"text": "AISTATS 2014",
"url": "https://aistats.org/aistats2014/"
}
]
},
{
"year": 2013,
"official_entry": "AISTATS 2013 April 29-May 1, Scottsdale, Arizona, USA",
"links": [
{
"text": "AISTATS 2013",
"url": "https://aistats.org/aistats2013/"
}
]
},
{
"year": 2012,
"official_entry": "AISTATS 2012 April 21-23, La Palma, Canary Islands",
"links": [
{
"text": "AISTATS 2012",
"url": "https://aistats.org/aistats2012/"
}
]
},
{
"year": 2011,
"official_entry": "AISTATS 2011 April 11-13, Fort Lauderdale, Florida, USA",
"links": [
{
"text": "AISTATS 2011",
"url": "https://aistats.org/aistats2011/"
}
]
},
{
"year": 2010,
"official_entry": "AISTATS 2010 May 13-15, Chia Laguna Resort, Sardinia, Italy",
"links": [
{
"text": "AISTATS 2010",
"url": "https://aistats.org/aistats2010/"
}
]
},
{
"year": 2009,
"official_entry": "AISTATS 2009 April 16-18, Hilton Clearwater Beach Resort, Clearwater Beach, Florida USA",
"links": [
{
"text": "AISTATS 2009",
"url": "https://aistats.org/aistats2009/"
}
]
},
{
"year": 2007,
"official_entry": "AISTATS 2007 March 21-24, Caribe Hilton Hotel, San Juan, Puerto Rico",
"links": [
{
"text": "AISTATS 2007",
"url": "https://aistats.org/aistats2007/"
}
]
},
{
"year": 2005,
"official_entry": "AISTATS 2005 January 6-8, The Savanah Hotel, Bridgetown, Barbados",
"links": [
{
"text": "AISTATS 2005",
"url": "https://aistats.org/aistats2005/"
}
]
},
{
"year": 2003,
"official_entry": "AISTATS 2003 January 1-3, The Hyatt Hotel, Key West, Florida, USA",
"links": [
{
"text": "AISTATS 2003",
"url": "https://aistats.org/aistats2003/"
}
]
},
{
"year": 2001,
"official_entry": "AISTATS 2001 January 3-6, The Hyatt Hotel, Key West, Florida, USA",
"links": [
{
"text": "AISTATS 2001",
"url": "https://aistats.org/aistats2001/"
}
]
},
{
"year": 1999,
"official_entry": "AISTATS 1999 January 3-6, Radisson Bahia Mar Beach Resort, Fort Lauderdale, Florida, USA",
"links": [
{
"text": "AISTATS 1999",
"url": "https://aistats.org/aistats1999/"
}
]
},
{
"year": 1997,
"official_entry": "AISTATS 1997 January 4-7, Radisson Bahia Mar Beach Resort, Fort Lauderdale, Florida, USA",
"links": [
{
"text": "AISTATS 1997",
"url": "https://aistats.org/aistats1997/"
}
]
},
{
"year": 1995,
"official_entry": "AISTATS 1995 January 4-7, Hyatt Regency Pier 66, Fort Lauderdale, Florida, USA",
"links": [
{
"text": "AISTATS 1995",
"url": "https://aistats.org/aistats1995/"
}
]
},
{
"year": 1993,
"official_entry": "AISTATS 1993 January, Hyatt Regency Pier 66, Fort Lauderdale, Florida, USA",
"links": [
{
"text": "AISTATS 1993",
"url": "https://aistats.org/aistats1993/"
}
]
},
{
"year": 1991,
"official_entry": "AISTATS 1991 January, Hyatt Regency Pier 66, Fort Lauderdale, Florida, USA",
"links": [
{
"text": "AISTATS 1991",
"url": "https://aistats.org/aistats1991/"
}
]
},
{
"year": 1989,
"official_entry": "AISTATS 1989 January 4-7, Hyatt Regency Pier 66, Fort Lauderdale, Florida, USA",
"links": [
{
"text": "AISTATS 1989",
"url": "https://aistats.org/aistats1989/"
}
]
},
{
"year": 1985,
"official_entry": "AISTATS 1985 April",
"links": [
{
"text": "AISTATS 1985",
"url": "https://aistats.org/aistats1985/"
}
]
}
],
"scope": "Official conference-year enumeration only. Entry links are recorded as published, not proof that every linked target was fetched or every track/paper/negative decision is covered.",
"enumeration_boundary": "Use the 29 actual official meeting entries. Do not fill calendar gaps (including 1987 and 2008) by interpolating the earliest/latest year."
}
+269
View File
@@ -0,0 +1,269 @@
{
"source_url": "https://www.cikmconference.org/",
"checked_at": "2026-11-08T12:10:20.249437+00:00",
"source_representation": "indexed_first_party_history_page_text_returned_by_search_tool",
"source_html_sha256": null,
"source_extract_sha256": "7fd7e59c30ca60ca01c266352438c5e4fda27be33f3a1ac92b349ea3c7bd730a",
"direct_fetch": {
"source_url": "https://cikmconference.org/",
"error": "<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'cikmconference.org'. (_ssl.c:1081)>"
},
"additional_primary_sources": [
{
"source_url": "https://link.springer.com/book/10.1007/3-540-57419-0",
"resolved_url": "https://link.springer.com/book/10.1007/3-540-57419-0?error=cookies_not_supported&code=882fa90f-f443-4ff5-b4bb-0a031701e8f9",
"http_status": 200,
"checked_at": "2026-11-08T12:03:58.690527+00:00",
"source_sha256": "e596ea97fc0c1c8297ba549e8972897b8b1027af3554078c1a086f3d214924dc",
"source_html_sha256": "e596ea97fc0c1c8297ba549e8972897b8b1027af3554078c1a086f3d214924dc"
},
{
"source_url": "https://cikm2025.org/",
"resolved_url": "https://cikm2025.org/",
"http_status": 200,
"checked_at": "2026-11-08T12:06:35.191168+00:00",
"source_sha256": "978ad9fa2455841e295b8d67155e5ab7d80558b25be3d76ed3891ebc4fb43a15",
"source_html_sha256": "978ad9fa2455841e295b8d67155e5ab7d80558b25be3d76ed3891ebc4fb43a15"
},
{
"source_url": "https://cikm2026.diag.uniroma1.it/",
"resolved_url": "https://cikm2026.diag.uniroma1.it/",
"http_status": 200,
"checked_at": "2026-11-08T12:06:33.175163+00:00",
"source_sha256": "687e250043c7c18f120df4ff2b56257a5885391cb637ea1ab382ea74b327cf64",
"source_html_sha256": "687e250043c7c18f120df4ff2b56257a5885391cb637ea1ab382ea74b327cf64"
},
{
"source_url": "https://api.crossref.org/works/10.1145/170088",
"resolved_url": "https://api.crossref.org/works/10.1145/170088",
"http_status": 200,
"checked_at": "2026-11-08T12:07:40.960053+00:00",
"source_sha256": "660ebc5e235bf6fcbd0cb0f13e983a605fee1cf09f38533f3469f1848e39ae6f"
}
],
"cutoff_year": 2026,
"expected_years": [
1992,
1993,
1994,
1995,
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027
],
"editions": [
{
"year": 1992,
"source_label": "CIKM '92",
"dates_label": "November8–11,1992",
"publication_year_of_selected_volume": 1993,
"publication_scope": "SpringerLNCS752selectedpapers;notalloriginalproceedings"
},
{
"year": 1993,
"source_label": "CIKM '93",
"dates_label": "November1–5,1993",
"doi": "10.1145/170088",
"evidence_scope": "ACM-depositedCrossrefproceedingsrecord"
},
{
"year": 1994,
"source_label": "CIKM 1994",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 1995,
"source_label": "CIKM 1995",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 1996,
"source_label": "CIKM 1996",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 1997,
"source_label": "CIKM 1997",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 1998,
"source_label": "CIKM 1998",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 1999,
"source_label": "CIKM 1999",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2000,
"source_label": "CIKM 2000",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2001,
"source_label": "CIKM 2001",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2002,
"source_label": "CIKM 2002",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2003,
"source_label": "CIKM 2003",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2004,
"source_label": "CIKM 2004",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2005,
"source_label": "CIKM 2005",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2006,
"source_label": "CIKM 2006",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2007,
"source_label": "CIKM 2007",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2008,
"source_label": "CIKM 2008",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2009,
"source_label": "CIKM 2009",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2010,
"source_label": "CIKM 2010",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2011,
"source_label": "CIKM 2011",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2012,
"source_label": "CIKM 2012",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2013,
"source_label": "CIKM 2013",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2014,
"source_label": "CIKM 2014",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2015,
"source_label": "CIKM 2015",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2016,
"source_label": "CIKM 2016",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2017,
"source_label": "CIKM 2017",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2018,
"source_label": "CIKM 2018",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2019,
"source_label": "CIKM 2019",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2020,
"source_label": "CIKM 2020",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2021,
"source_label": "CIKM 2021",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2022,
"source_label": "CIKM 2022",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2023,
"source_label": "CIKM 2023",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2024,
"source_label": "CIKM 2024",
"evidence_scope": "officialhistorydirectorylabel"
},
{
"year": 2025,
"source_label": "CIKM 2025",
"evidence_scope": "officialconferencewebsite"
},
{
"year": 2026,
"source_label": "CIKM 2026",
"dates_label": "November7–11,2026",
"event_status_at_cutoff": "ongoing"
}
],
"retrieval_note": "OfficialhistoryTLS hostname mismatch and webtimeout retained; indexed firstpartyhistory31explicitlabels archived separately. NoTLS verification disabled. Publisher1992booktitle andACM-deposited1993eventrecord independentlysupplytwoearlyyears. Historyfuture2027excluded.",
"scope": "35expliciteditionyears1992–2026.1992conferenceand1993selected-paperbookpublicationyearkeptseparate;selectedvolumeisnotthecomplete1992proceedings. CIKM2026isongoingNov7–11asofcutoff;availability/individualtrackcompletenessnotinferredfromeventsite. Full/short/applied/resource/demo/PhD/industry/workshoprequireindividualscope;ciKm.orgdomainisnotused."
}
@@ -0,0 +1,66 @@
{
"source_url": "https://proceedings.mlr.press/",
"checked_at": "2026-11-08T09:00:14.927398+00:00",
"source_html_sha256": "6b0c53798d285af02e4425adfd01b51db9d0945e2dc7c92772daa517e8847843",
"cutoff_year": 2026,
"expected_years": [
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [],
"publisher_index_years": [
2022,
2023,
2024,
2025,
2026
],
"editions": [
{
"year": 2026,
"url": "https://proceedings.mlr.press/v323/",
"publisher_index_label": "Volume 323 Proceedings of CLeaR 2026",
"checked_at": "2026-11-08T09:01:38.679644+00:00",
"source_html_sha256": "57f28747aa48a7d7c22d951ec7ea63ca725e0d39d7135a309f62e2ad09ffbe44",
"event_heading": "Volume 323: Causal Learning and Reasoning, 6-8 April 2026, Broad Institute of MIT and Harvard, Cambridge, USA"
},
{
"year": 2025,
"url": "https://proceedings.mlr.press/v275/",
"publisher_index_label": "Volume 275 Proceedings of CLeaR 2025",
"checked_at": "2026-11-08T09:01:38.558502+00:00",
"source_html_sha256": "c5aafeebab81c47def2ca3f62bed9140c890cc8a2bfc5dca80ad44bf6f2db86d",
"event_heading": "Volume 275: Causal Learning and Reasoning, 7-9 May 2025, Lausanne, Switzerland"
},
{
"year": 2024,
"url": "https://proceedings.mlr.press/v236/",
"publisher_index_label": "Volume 236 Proceedings of CLeaR 2024",
"checked_at": "2026-11-08T09:01:38.730670+00:00",
"source_html_sha256": "3f71ca96a2c87880b8cfcb040356d5fb17ba54535d0c9421d6d4622cfce10bb7",
"event_heading": "Volume 236: Causal Learning and Reasoning, 1-3 April 2024, Los Angeles, California, USA"
},
{
"year": 2023,
"url": "https://proceedings.mlr.press/v213/",
"publisher_index_label": "Volume 213 Proceedings of CLeaR 2023",
"checked_at": "2026-11-08T09:01:40.519783+00:00",
"source_html_sha256": "7b70177fb388db0f60bdbe0b83fa2505ebed7b24eeb8eb0fc65b008e12c68c95",
"event_heading": "Volume 213: Conference on Causal Learning and Reasoning, 11-14 April 2023, Amazon Development Center, Tübingen, Germany"
},
{
"year": 2022,
"url": "https://proceedings.mlr.press/v177/",
"publisher_index_label": "Volume 177 Proceedings of CLeaR 2022",
"checked_at": "2026-11-08T09:01:39.465244+00:00",
"source_html_sha256": "b55542996032f89a89d1edb4a2f5daa1f68c624181721466d4a8dbba2b0e769e",
"event_heading": "Volume 177: Conference on Causal Learning and Reasoning, 11-13 April 2022, Sequoia Conference Center, Eureka, CA, USA"
}
],
"first_edition_explicitly_named_by_publisher": true,
"announced_not_in_publisher_proceedings_index": [],
"scope": "Independent first-edition and all actual publisher-index conference/event-year labels, checked against each volume event heading. No annual interpolation, per-paper/track/abstract completeness or public rejection census. CoRL2026 is separately announced/upcoming and not listed in PMLR index; missing snapshot year does not prove missing published papers."
}
@@ -0,0 +1,899 @@
{
"source_url": "https://aclanthology.org/venues/coling/",
"resolved_url": "https://aclanthology.org/venues/coling/",
"checked_at": "2026-11-08T10:20:25.283166+00:00",
"http_status": 200,
"source_sha256": "8e7ec0a2915bfbccaa26b7a7558a9cf977c4aadc119794516ecebb826f61623f",
"cutoff_year": 2026,
"expected_years": [
1965,
1967,
1969,
1971,
1973,
1976,
1978,
1980,
1982,
1984,
1986,
1988,
1990,
1992,
1994,
1996,
1998,
2000,
2002,
2004,
2006,
2008,
2010,
2012,
2014,
2016,
2018,
2020,
2022,
2024,
2025
],
"excluded_future_years": [],
"publisher_years": [
1965,
1967,
1969,
1973,
1980,
1982,
1984,
1986,
1988,
1990,
1992,
1994,
1996,
1998,
2000,
2002,
2004,
2006,
2008,
2010,
2012,
2014,
2016,
2018,
2020,
2022,
2024,
2025
],
"editions": [
{
"year": 2025,
"event_url": "https://aclanthology.org/events/coling-2025/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2025.coling-main/",
"title": "Proceedings of the 31st International Conference on Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/2025.coling-demos/",
"title": "Proceedings of the 31st International Conference on Computational Linguistics: System Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/2025.coling-industry/",
"title": "Proceedings of the 31st International Conference on Computational Linguistics: Industry Track"
}
]
},
{
"year": 2024,
"event_url": "https://aclanthology.org/events/coling-2024/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2024.lrec-main/",
"title": "Proceedings of the 2024 Joint International Conference on Computational Linguistics, Language Resources and Evaluation (LREC-COLING 2024)"
},
{
"url": "https://aclanthology.org/volumes/2024.lrec-tutorials/",
"title": "Proceedings of the 2024 Joint International Conference on Computational Linguistics, Language Resources and Evaluation (LREC-COLING 2024): Tutorial Summaries"
}
]
},
{
"year": 2022,
"event_url": "https://aclanthology.org/events/coling-2022/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2022.coling-1/",
"title": "Proceedings of the 29th International Conference on Computational Linguistics"
}
]
},
{
"year": 2020,
"event_url": "https://aclanthology.org/events/coling-2020/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2020.coling-main/",
"title": "Proceedings of the 28th International Conference on Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/2020.coling-demos/",
"title": "Proceedings of the 28th International Conference on Computational Linguistics: System Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/2020.coling-tutorials/",
"title": "Proceedings of the 28th International Conference on Computational Linguistics: Tutorial Abstracts"
},
{
"url": "https://aclanthology.org/volumes/2020.coling-industry/",
"title": "Proceedings of the 28th International Conference on Computational Linguistics: Industry Track"
}
]
},
{
"year": 2018,
"event_url": "https://aclanthology.org/events/coling-2018/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C18-1/",
"title": "Proceedings of the 27th International Conference on Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/C18-2/",
"title": "Proceedings of the 27th International Conference on Computational Linguistics: System Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/C18-3/",
"title": "Proceedings of the 27th International Conference on Computational Linguistics: Tutorial Abstracts"
}
]
},
{
"year": 2016,
"event_url": "https://aclanthology.org/events/coling-2016/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C16-1/",
"title": "Proceedings of COLING 2016, the 26th International Conference on Computational Linguistics: Technical Papers"
},
{
"url": "https://aclanthology.org/volumes/C16-2/",
"title": "Proceedings of COLING 2016, the 26th International Conference on Computational Linguistics: System Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/C16-3/",
"title": "Proceedings of COLING 2016, the 26th International Conference on Computational Linguistics: Tutorial Abstracts"
}
]
},
{
"year": 2014,
"event_url": "https://aclanthology.org/events/coling-2014/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C14-1/",
"title": "Proceedings of COLING 2014, the 25th International Conference on Computational Linguistics: Technical Papers"
},
{
"url": "https://aclanthology.org/volumes/C14-2/",
"title": "Proceedings of COLING 2014, the 25th International Conference on Computational Linguistics: System Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/C14-3/",
"title": "Proceedings of COLING 2014, the 25th International Conference on Computational Linguistics: Tutorial Abstracts"
}
]
},
{
"year": 2012,
"event_url": "https://aclanthology.org/events/coling-2012/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C12-1/",
"title": "Proceedings of COLING 2012"
},
{
"url": "https://aclanthology.org/volumes/C12-2/",
"title": "Proceedings of COLING 2012: Posters"
},
{
"url": "https://aclanthology.org/volumes/C12-3/",
"title": "Proceedings of COLING 2012: Demonstration Papers"
}
]
},
{
"year": 2010,
"event_url": "https://aclanthology.org/events/coling-2010/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C10-1/",
"title": "Proceedings of the 23rd International Conference on Computational Linguistics (Coling 2010)"
},
{
"url": "https://aclanthology.org/volumes/C10-2/",
"title": "Coling 2010: Posters"
},
{
"url": "https://aclanthology.org/volumes/C10-3/",
"title": "Coling 2010: Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/C10-4/",
"title": "Coling 2010: Paraphrases and Applications–Tutorial notes"
},
{
"url": "https://aclanthology.org/volumes/C10-5/",
"title": "Coling 2010: Kernel Engineering for Fast and Easy Design of Natural Language Applications–Tutorial notes"
}
]
},
{
"year": 2008,
"event_url": "https://aclanthology.org/events/coling-2008/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C08-1/",
"title": "Proceedings of the 22nd International Conference on Computational Linguistics (Coling 2008)"
},
{
"url": "https://aclanthology.org/volumes/C08-2/",
"title": "Coling 2008: Companion volume: Posters"
},
{
"url": "https://aclanthology.org/volumes/C08-3/",
"title": "Coling 2008: Companion volume: Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/C08-4/",
"title": "Coling 2008: Educational Natural Language Processing - Tutorial notes"
},
{
"url": "https://aclanthology.org/volumes/C08-5/",
"title": "Coling 2008: Advanced Dynamic Programming in Computational Linguistics: Theory, Algorithms and Applications - Tutorial notes"
}
]
},
{
"year": 2006,
"event_url": "https://aclanthology.org/events/coling-2006/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/P06-1/",
"title": "Proceedings of the 21st International Conference on Computational Linguistics and 44th Annual Meeting of the Association for Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/P06-2/",
"title": "Proceedings of the COLING/ACL 2006 Main Conference Poster Sessions"
},
{
"url": "https://aclanthology.org/volumes/P06-3/",
"title": "Proceedings of the COLING/ACL 2006 Student Research Workshop"
},
{
"url": "https://aclanthology.org/volumes/P06-4/",
"title": "Proceedings of the COLING/ACL 2006 Interactive Presentation Sessions"
}
]
},
{
"year": 2004,
"event_url": "https://aclanthology.org/events/coling-2004/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C04-1/",
"title": "COLING 2004: Proceedings of the 20th International Conference on Computational Linguistics"
}
]
},
{
"year": 2002,
"event_url": "https://aclanthology.org/events/coling-2002/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C02-1/",
"title": "COLING 2002: The 19th International Conference on Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/C02-2/",
"title": "COLING 2002: The 17th International Conference on Computational Linguistics: Project Notes"
}
]
},
{
"year": 2000,
"event_url": "https://aclanthology.org/events/coling-2000/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C00-1/",
"title": "COLING 2000 Volume 1: The 18th International Conference on Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/C00-2/",
"title": "COLING 2000 Volume 2: The 18th International Conference on Computational Linguistics"
}
]
},
{
"year": 1998,
"event_url": "https://aclanthology.org/events/coling-1998/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C98-1/",
"title": "COLING 1998 Volume 1: The 17th International Conference on Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/C98-2/",
"title": "COLING 1998 Volume 2: The 17th International Conference on Computational Linguistics"
}
]
},
{
"year": 1996,
"event_url": "https://aclanthology.org/events/coling-1996/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C96-1/",
"title": "COLING 1996 Volume 1: The 16th International Conference on Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/C96-2/",
"title": "COLING 1996 Volume 2: The 16th International Conference on Computational Linguistics"
}
]
},
{
"year": 1994,
"event_url": "https://aclanthology.org/events/coling-1994/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C94-1/",
"title": "COLING 1994 Volume 1: The 15th International Conference on Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/C94-2/",
"title": "COLING 1994 Volume 2: The 15th International Conference on Computational Linguistics"
}
]
},
{
"year": 1992,
"event_url": "https://aclanthology.org/events/coling-1992/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C92-1/",
"title": "COLING 1992 Volume 1: The 14th International Conference on Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/C92-2/",
"title": "COLING 1992 Volume 2: The 14th International Conference on Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/C92-3/",
"title": "COLING 1992 Volume 3: The 14th International Conference on Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/C92-4/",
"title": "COLING 1992 Volume 4: The 14th International Conference on Computational Linguistics"
}
]
},
{
"year": 1990,
"event_url": "https://aclanthology.org/events/coling-1990/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C90-1/",
"title": "COLING 1990 Volume 1: Papers presented to the 13th International Conference on Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/C90-2/",
"title": "COLING 1990 Volume 2: Papers presented to the 13th International Conference on Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/C90-3/",
"title": "COLING 1990 Volume 3: Papers presented to the 13th International Conference on Computational Linguistics"
}
]
},
{
"year": 1988,
"event_url": "https://aclanthology.org/events/coling-1988/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C88-1/",
"title": "Coling Budapest 1988 Volume 1: International Conference on Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/C88-2/",
"title": "Coling Budapest 1988 Volume 2: International Conference on Computational Linguistics"
}
]
},
{
"year": 1986,
"event_url": "https://aclanthology.org/events/coling-1986/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C86-1/",
"title": "Coling 1986 Volume 1: The 11th International Conference on Computational Linguistics"
}
]
},
{
"year": 1984,
"event_url": "https://aclanthology.org/events/coling-1984/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/P84-1/",
"title": "10th International Conference on Computational Linguistics and 22nd Annual Meeting of the Association for Computational Linguistics"
}
]
},
{
"year": 1982,
"event_url": "https://aclanthology.org/events/coling-1982/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C82-1/",
"title": "Coling 1982: Proceedings of the Ninth International Conference on Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/C82-2/",
"title": "Coling 1982 Abstracts: Proceedings of the Ninth International Conference on Computational Linguistics Abstracts"
}
]
},
{
"year": 1980,
"event_url": "https://aclanthology.org/events/coling-1980/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C80-1/",
"title": "COLING 1980 Volume 1: The 8th International Conference on Computational Linguistics"
}
]
},
{
"year": 1973,
"event_url": "https://aclanthology.org/events/coling-1973/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C73-1/",
"title": "COLING 1973 Volume 1: Computational And Mathematical Linguistics: Proceedings of the International Conference on Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/C73-2/",
"title": "COLING 1973 Volume 2: Computational And Mathematical Linguistics: Proceedings of the International Conference on Computational Linguistics"
}
]
},
{
"year": 1969,
"event_url": "https://aclanthology.org/events/coling-1969/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C69-01/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 1"
},
{
"url": "https://aclanthology.org/volumes/C69-02/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 2"
},
{
"url": "https://aclanthology.org/volumes/C69-03/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 3"
},
{
"url": "https://aclanthology.org/volumes/C69-04/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 4"
},
{
"url": "https://aclanthology.org/volumes/C69-05/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 5"
},
{
"url": "https://aclanthology.org/volumes/C69-06/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 6"
},
{
"url": "https://aclanthology.org/volumes/C69-07/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 7"
},
{
"url": "https://aclanthology.org/volumes/C69-08/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 8"
},
{
"url": "https://aclanthology.org/volumes/C69-09/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 9"
},
{
"url": "https://aclanthology.org/volumes/C69-10/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 10"
},
{
"url": "https://aclanthology.org/volumes/C69-11/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 11"
},
{
"url": "https://aclanthology.org/volumes/C69-12/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 12"
},
{
"url": "https://aclanthology.org/volumes/C69-13/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 13"
},
{
"url": "https://aclanthology.org/volumes/C69-14/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 14"
},
{
"url": "https://aclanthology.org/volumes/C69-15/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 15"
},
{
"url": "https://aclanthology.org/volumes/C69-16/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 16"
},
{
"url": "https://aclanthology.org/volumes/C69-17/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 17"
},
{
"url": "https://aclanthology.org/volumes/C69-18/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 18"
},
{
"url": "https://aclanthology.org/volumes/C69-19/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 19"
},
{
"url": "https://aclanthology.org/volumes/C69-20/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 20"
},
{
"url": "https://aclanthology.org/volumes/C69-21/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 21"
},
{
"url": "https://aclanthology.org/volumes/C69-22/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 22"
},
{
"url": "https://aclanthology.org/volumes/C69-23/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 23"
},
{
"url": "https://aclanthology.org/volumes/C69-24/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 24"
},
{
"url": "https://aclanthology.org/volumes/C69-25/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 25"
},
{
"url": "https://aclanthology.org/volumes/C69-26/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 26"
},
{
"url": "https://aclanthology.org/volumes/C69-27/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 27"
},
{
"url": "https://aclanthology.org/volumes/C69-28/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 28"
},
{
"url": "https://aclanthology.org/volumes/C69-29/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 29"
},
{
"url": "https://aclanthology.org/volumes/C69-30/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 30"
},
{
"url": "https://aclanthology.org/volumes/C69-31/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 31"
},
{
"url": "https://aclanthology.org/volumes/C69-32/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 32"
},
{
"url": "https://aclanthology.org/volumes/C69-33/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 33"
},
{
"url": "https://aclanthology.org/volumes/C69-34/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 34"
},
{
"url": "https://aclanthology.org/volumes/C69-35/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 35"
},
{
"url": "https://aclanthology.org/volumes/C69-36/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 36"
},
{
"url": "https://aclanthology.org/volumes/C69-37/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 37"
},
{
"url": "https://aclanthology.org/volumes/C69-38/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 38"
},
{
"url": "https://aclanthology.org/volumes/C69-39/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 39"
},
{
"url": "https://aclanthology.org/volumes/C69-40/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 40"
},
{
"url": "https://aclanthology.org/volumes/C69-41/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 41"
},
{
"url": "https://aclanthology.org/volumes/C69-42/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 42"
},
{
"url": "https://aclanthology.org/volumes/C69-43/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 43"
},
{
"url": "https://aclanthology.org/volumes/C69-44/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 44"
},
{
"url": "https://aclanthology.org/volumes/C69-45/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 45"
},
{
"url": "https://aclanthology.org/volumes/C69-46/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 46"
},
{
"url": "https://aclanthology.org/volumes/C69-47/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 47"
},
{
"url": "https://aclanthology.org/volumes/C69-48/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 48"
},
{
"url": "https://aclanthology.org/volumes/C69-49/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 49"
},
{
"url": "https://aclanthology.org/volumes/C69-50/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 50"
},
{
"url": "https://aclanthology.org/volumes/C69-51/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 51"
},
{
"url": "https://aclanthology.org/volumes/C69-52/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 52"
},
{
"url": "https://aclanthology.org/volumes/C69-53/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 53"
},
{
"url": "https://aclanthology.org/volumes/C69-54/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 54"
},
{
"url": "https://aclanthology.org/volumes/C69-55/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 55"
},
{
"url": "https://aclanthology.org/volumes/C69-56/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 56"
},
{
"url": "https://aclanthology.org/volumes/C69-57/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 57"
},
{
"url": "https://aclanthology.org/volumes/C69-58/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 58"
},
{
"url": "https://aclanthology.org/volumes/C69-59/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 59"
},
{
"url": "https://aclanthology.org/volumes/C69-60/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 60"
},
{
"url": "https://aclanthology.org/volumes/C69-61/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 61"
},
{
"url": "https://aclanthology.org/volumes/C69-62/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 62: Collection of Abstracts of Papers"
},
{
"url": "https://aclanthology.org/volumes/C69-63/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 63"
},
{
"url": "https://aclanthology.org/volumes/C69-64/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 64"
},
{
"url": "https://aclanthology.org/volumes/C69-65/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 65"
},
{
"url": "https://aclanthology.org/volumes/C69-66/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 66"
},
{
"url": "https://aclanthology.org/volumes/C69-67/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 67"
},
{
"url": "https://aclanthology.org/volumes/C69-68/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 68"
},
{
"url": "https://aclanthology.org/volumes/C69-69/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 69: Collection of Abstracts of Papers"
},
{
"url": "https://aclanthology.org/volumes/C69-70/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 70"
},
{
"url": "https://aclanthology.org/volumes/C69-71/",
"title": "International Conference on Computational Linguistics COLING 1969: Preprint No. 71"
},
{
"url": "https://aclanthology.org/volumes/C69-72/",
"title": "International Conference on Computational Linguistics COLING 1969"
},
{
"url": "https://aclanthology.org/volumes/C69-73/",
"title": "International Conference on Computational Linguistics COLING 1969"
},
{
"url": "https://aclanthology.org/volumes/C69-74/",
"title": "International Conference on Computational Linguistics COLING 1969"
},
{
"url": "https://aclanthology.org/volumes/C69-75/",
"title": "International Conference on Computational Linguistics COLING 1969"
},
{
"url": "https://aclanthology.org/volumes/C69-76/",
"title": "International Conference on Computational Linguistics COLING 1969: Post-Print I"
},
{
"url": "https://aclanthology.org/volumes/C69-77/",
"title": "International Conference on Computational Linguistics COLING 1969: Index to Preprints"
},
{
"url": "https://aclanthology.org/volumes/C69-78/",
"title": "International Conference on Computational Linguistics COLING 1969: Bulletin Monday, September 1, 1969"
},
{
"url": "https://aclanthology.org/volumes/C69-79/",
"title": "International Conference on Computational Linguistics COLING 1969: Bulletin Wednesday, September 3, 1969"
}
]
},
{
"year": 1967,
"event_url": "https://aclanthology.org/events/coling-1967/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C67-1/",
"title": "COLING 1967 Volume 1: Conference Internationale Sur Le Traitement Automatique Des Langues"
}
]
},
{
"year": 1965,
"event_url": "https://aclanthology.org/events/coling-1965/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/C65-1/",
"title": "COLING 1965"
}
]
}
],
"scope": "Actual first-party publisher entries; multiple volumes/tracks do not create extra event years. Year census does not establish per-paper/track/abstract or public rejected-submission completeness. 31actualeventyears1965–2025 from28publisherheadings plus1971/1976/1978 named in contemporary1988frontmatter.2024isLREC-COLINGjoint,2025returnsstandalone/odd-yearschedule. No fabricated2026meeting. JointACL1984/1998/2006 are not additional distinctpaper acceptances; different1998catalogueIDs still require identity review.",
"additional_primary_sources": [
{
"source_url": "https://aclanthology.org/C88-2000.pdf",
"resolved_url": "https://aclanthology.org/C88-2000.pdf",
"checked_at": "2026-11-08T10:22:01.141425+00:00",
"http_status": 200,
"source_sha256": "cd878f821b013f142856272b1bb2e993e2a70f45ec57f62c173416db9f5e7e7e",
"pdf_page_one_based": 4,
"review": "Visually read the complete Previous COLING Conferences list of11 actualevents; PDFpage1 states12thconference1988."
},
{
"source_url": "https://coling2025.org/faqs/",
"resolved_url": "https://coling2025.org/faqs/",
"checked_at": "2026-11-08T10:22:00.644326+00:00",
"http_status": 200,
"source_sha256": "21ce11fb7f2deee77315c7e546ae97f0982c5cf4e16950c830005db60a49af1a"
}
],
"early_history_entries": [
{
"year": 1965,
"location": "New York"
},
{
"year": 1967,
"location": "Grenoble"
},
{
"year": 1969,
"location": "Sånga Säby"
},
{
"year": 1971,
"location": "Debrecen"
},
{
"year": 1973,
"location": "Pisa"
},
{
"year": 1976,
"location": "Ottawa"
},
{
"year": 1978,
"location": "Bergen"
},
{
"year": 1980,
"location": "Tokyo"
},
{
"year": 1982,
"location": "Prague"
},
{
"year": 1984,
"location": "Stanford"
},
{
"year": 1986,
"location": "Bonn"
}
],
"publisher_directory_missing_historical_years": [
1971,
1976,
1978
],
"source_disagreements": [
{
"source_url": "https://coling2025.org/faqs/",
"issue": "2025FAQ associates Bergen with1976; contemporary1988officialfrontmatter instead lists Ottawa1976 andBergen1978. Prefer contemporary explicitlist for these locations; no originalpaper metadata rewritten."
},
{
"year": 2002,
"issue": "Publisherproject-notes title says17th while mainvolume says19th. Sameyear remains oneedition; originalvolume title preserved."
}
],
"source_html_sha256": "8e7ec0a2915bfbccaa26b7a7558a9cf977c4aadc119794516ecebb826f61623f"
}
@@ -0,0 +1,36 @@
{
"source_url": "https://colm.cc/",
"checked_at": "2026-11-08T06:51:08.576901+00:00",
"source_html_sha256": "2fcea9d2a73cf3d88c09a731fbc4f16314fbb04e81b3506d3c355d14e7a8ae0d",
"cutoff_year": 2026,
"expected_years": [
2024,
2025,
2026
],
"excluded_future_years": [],
"year_links": {
"2026": [
"https://colm.cc/Conferences/2026/index.html"
],
"2025": [
"https://colmweb.org/2025/"
],
"2024": [
"https://colmweb.org/2024/"
]
},
"edition_pages": [
{
"source_url": "https://colmweb.org/2024/",
"checked_at": "2026-11-08T06:51:09.525917+00:00",
"source_html_sha256": "d757f26ff2876cac240bc07e0b1dd78638307b9d4fcea3d3c2f848f799e85cf9"
},
{
"source_url": "https://colmweb.org/2025/",
"checked_at": "2026-11-08T06:51:11.606331+00:00",
"source_html_sha256": "cd82ab43a570aad227dffdb9ea2302b2ab28f73d88e53d6955d49710cd514f62"
}
],
"scope": "Official first-through-third conference enumeration only; no claim of per-track/paper completeness or public rejection coverage."
}
+830
View File
@@ -0,0 +1,830 @@
{
"source_url": "https://www.learningtheory.org/",
"checked_at": "2026-11-08T07:00:26.440614+00:00",
"source_html_sha256": "133586432353e07b6364cd38aea5769936460f58ad31fee654b75116840d500c",
"cutoff_year": 2026,
"expected_years": [
1988,
1989,
1990,
1991,
1992,
1993,
1994,
1995,
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027
],
"edition_entries": [
{
"year": 2027,
"official_entry": "COLT 2027",
"links": [
{
"text": "COLT 2027",
"url": "http://learningtheory.org/colt2027/"
}
]
},
{
"year": 1988,
"official_entry": "COLT 1988 dblp",
"links": [
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt1988.html"
}
]
},
{
"year": 1989,
"official_entry": "COLT 1989 dblp",
"links": [
{
"text": "COLT 1989",
"url": "https://www.sciencedirect.com/book/9780080948294/colt-89"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt1989.html"
}
]
},
{
"year": 1990,
"official_entry": "COLT 1990 dblp",
"links": [
{
"text": "COLT 1990",
"url": "https://www.sciencedirect.com/book/9781558601468/colt-proceedings-1990"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt1990.html"
}
]
},
{
"year": 1991,
"official_entry": "COLT 1991 dblp",
"links": [
{
"text": "COLT 1991",
"url": "https://www.sciencedirect.com/book/9781558602137/colt"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt1991.html"
}
]
},
{
"year": 1992,
"official_entry": "COLT 1992 dblp",
"links": [
{
"text": "COLT 1992",
"url": "http://dl.acm.org/citation.cfm?id=130385"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt1992.html"
}
]
},
{
"year": 1993,
"official_entry": "COLT 1993 dblp",
"links": [
{
"text": "COLT 1993",
"url": "http://dl.acm.org/citation.cfm?id=168304"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt1993.html"
}
]
},
{
"year": 1994,
"official_entry": "COLT 1994 dblp",
"links": [
{
"text": "COLT 1994",
"url": "http://dl.acm.org/citation.cfm?id=180139"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt1994.html"
}
]
},
{
"year": 1995,
"official_entry": "COLT 1995 dblp",
"links": [
{
"text": "COLT 1995",
"url": "http://dl.acm.org/citation.cfm?id=225298"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt1995.html"
}
]
},
{
"year": 1996,
"official_entry": "COLT 1996 dblp",
"links": [
{
"text": "COLT 1996",
"url": "http://dl.acm.org/citation.cfm?id=238061"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt1996.html"
}
]
},
{
"year": 1997,
"official_entry": "COLT 1997 dblp",
"links": [
{
"text": "COLT 1997",
"url": "http://dl.acm.org/citation.cfm?id=267460"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt1997.html"
}
]
},
{
"year": 1998,
"official_entry": "COLT 1998 dblp",
"links": [
{
"text": "COLT 1998",
"url": "http://dl.acm.org/citation.cfm?id=279943"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt1998.html"
}
]
},
{
"year": 1999,
"official_entry": "COLT 1999 dblp",
"links": [
{
"text": "COLT 1999",
"url": "http://dl.acm.org/citation.cfm?id=307400"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt1999.html"
}
]
},
{
"year": 2000,
"official_entry": "COLT 2000 dblp www",
"links": [
{
"text": "COLT 2000",
"url": "https://www.learningtheory.org/colt2000/"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2000.html"
},
{
"text": "www",
"url": "https://web.archive.org/web/20060202000723/http://www.learningtheory.org/colt2000/"
}
]
},
{
"year": 2001,
"official_entry": "COLT 2001 dblp www",
"links": [
{
"text": "COLT 2001",
"url": "https://link.springer.com/book/10.1007/3-540-44581-1"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2001.html"
},
{
"text": "www",
"url": "https://web.archive.org/web/20061205041150/http://learningtheory.org/colt2001/"
}
]
},
{
"year": 2002,
"official_entry": "COLT 2002 dblp www",
"links": [
{
"text": "COLT 2002",
"url": "https://link.springer.com/book/10.1007/3-540-45435-7"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2002.html"
},
{
"text": "www",
"url": "https://web.archive.org/web/20030208022421/http://www.cse.unsw.edu.au/~colt2002/colt2002.html"
}
]
},
{
"year": 2003,
"official_entry": "COLT 2003 dblp www",
"links": [
{
"text": "COLT 2003",
"url": "https://link.springer.com/book/10.1007/b12006"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2003.html"
},
{
"text": "www",
"url": "https://web.archive.org/web/20070519034402/http://learningtheory.org/colt2003/"
}
]
},
{
"year": 2004,
"official_entry": "COLT 2004 dblp www",
"links": [
{
"text": "COLT 2004",
"url": "https://link.springer.com/book/10.1007/b98522"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2004.html"
},
{
"text": "www",
"url": "https://web.archive.org/web/20070703083129/http://www.learningtheory.org/colt2004/"
}
]
},
{
"year": 2005,
"official_entry": "COLT 2005 dblp www",
"links": [
{
"text": "COLT 2005",
"url": "https://link.springer.com/book/10.1007/b137542"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2005.html"
},
{
"text": "www",
"url": "https://web.archive.org/web/20070703134356/http://learningtheory.org/colt2005/"
}
]
},
{
"year": 2006,
"official_entry": "COLT 2006 dblp www",
"links": [
{
"text": "COLT 2006",
"url": "https://link.springer.com/book/10.1007/11776420"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2006.html"
},
{
"text": "www",
"url": "https://web.archive.org/web/20070706001445/http://learningtheory.org/colt2006/"
}
]
},
{
"year": 2007,
"official_entry": "COLT 2007 dblp www",
"links": [
{
"text": "COLT 2007",
"url": "https://link.springer.com/book/10.1007/978-3-540-72927-3"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2007.html"
},
{
"text": "www",
"url": "https://web.archive.org/web/20070807141052/http://www.learningtheory.org/colt2007/"
}
]
},
{
"year": 2008,
"official_entry": "COLT 2008 dblp www",
"links": [
{
"text": "COLT 2008",
"url": "https://www.learningtheory.org/colt2008/"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2008.html"
},
{
"text": "www",
"url": "http://colt2008.cs.helsinki.fi/"
}
]
},
{
"year": 2009,
"official_entry": "COLT 2009 dblp www",
"links": [
{
"text": "COLT 2009",
"url": "https://www.learningtheory.org/colt2009/"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2009.html"
},
{
"text": "www",
"url": "https://www.cs.mcgill.ca/~colt2009/"
}
]
},
{
"year": 2010,
"official_entry": "COLT 2010 dblp www",
"links": [
{
"text": "COLT 2010",
"url": "https://www.learningtheory.org/colt2010/"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2010.html"
},
{
"text": "www",
"url": "https://www.learningtheory.org/colt2010/conference-website/"
}
]
},
{
"year": 2011,
"official_entry": "COLT 2011 dblp videos www",
"links": [
{
"text": "COLT 2011",
"url": "https://proceedings.mlr.press/v19/"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2011.html"
},
{
"text": "videos",
"url": "https://videolectures.net/colt2011_budapest/"
},
{
"text": "www",
"url": "http://www.conferences.hu/colt2011"
}
]
},
{
"year": 2012,
"official_entry": "COLT 2012 dblp www",
"links": [
{
"text": "COLT 2012",
"url": "https://proceedings.mlr.press/v23/"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2012.html"
},
{
"text": "www",
"url": "http://www.ttic.edu/colt2012"
}
]
},
{
"year": 2013,
"official_entry": "COLT 2013 dblp videos www",
"links": [
{
"text": "COLT 2013",
"url": "https://proceedings.mlr.press/v30/"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2013.html"
},
{
"text": "videos",
"url": "https://videolectures.net/colt2013_princeton/"
},
{
"text": "www",
"url": "https://web.archive.org/web/20131109133822/https://orfe.princeton.edu/conferences/colt2013"
}
]
},
{
"year": 2014,
"official_entry": "COLT 2014 dblp videos www",
"links": [
{
"text": "COLT 2014",
"url": "https://proceedings.mlr.press/v35"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2014.html"
},
{
"text": "videos",
"url": "https://videolectures.net/colt2014_barcelona/"
},
{
"text": "www",
"url": "https://web.archive.org/web/20141122072429/http://orfe.princeton.edu/conferences/colt2014/"
}
]
},
{
"year": 2015,
"official_entry": "COLT 2015 dblp videos www",
"links": [
{
"text": "COLT 2015",
"url": "https://proceedings.mlr.press/v40"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2015.html"
},
{
"text": "videos",
"url": "https://videolectures.net/colt2015_paris/"
},
{
"text": "www",
"url": "https://web.archive.org/web/20240813033833/http://www.learningtheory.org/colt2015/"
}
]
},
{
"year": 2016,
"official_entry": "COLT 2016 dblp videos www",
"links": [
{
"text": "COLT 2016",
"url": "https://proceedings.mlr.press/v49"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2016.html"
},
{
"text": "videos",
"url": "https://www.youtube.com/playlist?list=PLCHBdlWR7RYxyz4k3OlafPd9G68v7zDWB"
},
{
"text": "www",
"url": "https://web.archive.org/web/20170702175829/http://www.learningtheory.org/colt2016/"
}
]
},
{
"year": 2017,
"official_entry": "COLT 2017 dblp videos www",
"links": [
{
"text": "COLT 2017",
"url": "https://proceedings.mlr.press/v65"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2017.html"
},
{
"text": "videos",
"url": "https://www.youtube.com/playlist?list=PLCHBdlWR7RYw7U8mH0gCaWNbi3xDejrAH"
},
{
"text": "www",
"url": "https://web.archive.org/web/20241008042653/http://www.learningtheory.org/colt2017/"
}
]
},
{
"year": 2018,
"official_entry": "COLT 2018 dblp videos www",
"links": [
{
"text": "COLT 2018",
"url": "https://proceedings.mlr.press/v75"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2018.html"
},
{
"text": "videos",
"url": "https://www.youtube.com/playlist?list=PLCHBdlWR7RYzMjoGTatLItEhisi5sBNFh"
},
{
"text": "www",
"url": "http://learningtheory.org/colt2018"
}
]
},
{
"year": 2019,
"official_entry": "COLT 2019 dblp videos www",
"links": [
{
"text": "COLT 2019",
"url": "https://proceedings.mlr.press/v99"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2019.html"
},
{
"text": "videos",
"url": "https://www.youtube.com/playlist?list=PLCHBdlWR7RYz4jx6NPdnI_1rP3kj0E3G8"
},
{
"text": "www",
"url": "http://learningtheory.org/colt2019"
}
]
},
{
"year": 2020,
"official_entry": "COLT 2020 dblp videos www",
"links": [
{
"text": "COLT 2020",
"url": "https://proceedings.mlr.press/v125"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2020.html"
},
{
"text": "videos",
"url": "https://www.youtube.com/playlist?list=PLCHBdlWR7RYw4LAGsUrCLamYRnBf9pTTT"
},
{
"text": "www",
"url": "http://learningtheory.org/colt2020"
}
]
},
{
"year": 2021,
"official_entry": "COLT 2021 dblp videos www",
"links": [
{
"text": "COLT 2021",
"url": "https://proceedings.mlr.press/v134"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2021.html"
},
{
"text": "videos",
"url": "https://www.youtube.com/playlist?list=PLCHBdlWR7RYwAnL8ZSYN3c1tprFa9-Qdx"
},
{
"text": "www",
"url": "http://learningtheory.org/colt2021"
}
]
},
{
"year": 2022,
"official_entry": "COLT 2022 dblp videos www",
"links": [
{
"text": "COLT 2022",
"url": "https://proceedings.mlr.press/v178"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2022.html"
},
{
"text": "videos",
"url": "https://www.youtube.com/playlist?list=PLCHBdlWR7RYxoGuHe6kYSSo8ETlzDqrJN"
},
{
"text": "www",
"url": "http://learningtheory.org/colt2022"
}
]
},
{
"year": 2023,
"official_entry": "COLT 2023 dblp www",
"links": [
{
"text": "COLT 2023",
"url": "https://proceedings.mlr.press/v195"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2023.html"
},
{
"text": "www",
"url": "http://learningtheory.org/colt2023"
}
]
},
{
"year": 2024,
"official_entry": "COLT 2024 dblp www",
"links": [
{
"text": "COLT 2024",
"url": "https://proceedings.mlr.press/v247"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2024.html"
},
{
"text": "www",
"url": "http://learningtheory.org/colt2024"
}
]
},
{
"year": 2025,
"official_entry": "COLT 2025 dblp videos www",
"links": [
{
"text": "COLT 2025",
"url": "https://proceedings.mlr.press/v291"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2025.html"
},
{
"text": "videos",
"url": "https://www.youtube.com/playlist?list=PLCHBdlWR7RYx9VNiWhgSboOAFfiYubw8u"
},
{
"text": "www",
"url": "http://learningtheory.org/colt2025"
}
]
},
{
"year": 2026,
"official_entry": "COLT 2026 dblp www",
"links": [
{
"text": "COLT 2026",
"url": "https://proceedings.mlr.press/v336"
},
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/colt/colt2026.html"
},
{
"text": "www",
"url": "http://learningtheory.org/colt2026"
}
]
},
{
"year": 2027,
"official_entry": "COLT 2027 www",
"links": [
{
"text": "www",
"url": "http://learningtheory.org/colt2027"
}
]
}
],
"scope": "Official conference-year enumeration only. Entry links are recorded as published, not proof that every linked target was fetched or every track/paper/negative decision is covered.",
"related_series_entries": [
{
"year": 1993,
"official_entry": "EuroCOLT 1993 dblp",
"links": [
{
"text": "dblp",
"url": "https://dblp.uni-trier.de/db/conf/eurocolt/eurocolt1993.html"
}
]
},
{
"year": 1995,
"official_entry": "EuroCOLT 1995 dblp",
"links": [
{
"text": "EuroCOLT 1995",
"url": "https://link.springer.com/book/10.1007/3-540-59119-2"
},
{
"text": "dblp",
"url": "https://dblp.org/db/conf/eurocolt/eurocolt1995.html"
}
]
},
{
"year": 1997,
"official_entry": "EuroCOLT 1997 dblp www",
"links": [
{
"text": "EuroCOLT 1997",
"url": "https://link.springer.com/book/10.1007/3-540-62685-9"
},
{
"text": "dblp",
"url": "https://dblp.org/db/conf/eurocolt/eurocolt1997.html"
},
{
"text": "www",
"url": "https://web.archive.org/web/20000901081649/http://ls2-www.cs.uni-dortmund.de/eurocolt/1997/index.html"
}
]
},
{
"year": 1999,
"official_entry": "EuroCOLT 1999 dblp",
"links": [
{
"text": "EuroCOLT 1999",
"url": "https://link.springer.com/book/10.1007/3-540-49097-3"
},
{
"text": "dblp",
"url": "https://dblp.org/db/conf/eurocolt/eurocolt1999.html"
}
]
}
],
"related_series_scope": "EuroCOLT entries retained separately for later source/identity checks; do not count them as another COLT edition in the same year or infer final decisions from titles."
}
@@ -0,0 +1,480 @@
{
"source_url": "https://aclanthology.org/venues/conll/",
"resolved_url": "https://aclanthology.org/venues/conll/",
"checked_at": "2026-11-08T10:20:25.545279+00:00",
"http_status": 200,
"source_sha256": "a342c627a8a97330fc064a5b3b7d612f917b9d81e07e050ffeb4a2b05d3bf061",
"cutoff_year": 2026,
"expected_years": [
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [],
"publisher_years": [
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"editions": [
{
"year": 2026,
"event_url": "https://aclanthology.org/events/conll-2026/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2026.conll-main/",
"title": "Proceedings of the 30th Conference on Computational Natural Language Learning"
}
]
},
{
"year": 2025,
"event_url": "https://aclanthology.org/events/conll-2025/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2025.conll-1/",
"title": "Proceedings of the 29th Conference on Computational Natural Language Learning"
}
]
},
{
"year": 2024,
"event_url": "https://aclanthology.org/events/conll-2024/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2024.conll-1/",
"title": "Proceedings of the 28th Conference on Computational Natural Language Learning"
}
]
},
{
"year": 2023,
"event_url": "https://aclanthology.org/events/conll-2023/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2023.conll-1/",
"title": "Proceedings of the 27th Conference on Computational Natural Language Learning (CoNLL)"
}
]
},
{
"year": 2022,
"event_url": "https://aclanthology.org/events/conll-2022/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2022.conll-1/",
"title": "Proceedings of the 26th Conference on Computational Natural Language Learning (CoNLL)"
}
]
},
{
"year": 2021,
"event_url": "https://aclanthology.org/events/conll-2021/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2021.conll-1/",
"title": "Proceedings of the 25th Conference on Computational Natural Language Learning"
}
]
},
{
"year": 2020,
"event_url": "https://aclanthology.org/events/conll-2020/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2020.conll-1/",
"title": "Proceedings of the 24th Conference on Computational Natural Language Learning"
},
{
"url": "https://aclanthology.org/volumes/2020.conll-shared/",
"title": "Proceedings of the CoNLL 2020 Shared Task: Cross-Framework Meaning Representation Parsing"
}
]
},
{
"year": 2019,
"event_url": "https://aclanthology.org/events/conll-2019/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/K19-1/",
"title": "Proceedings of the 23rd Conference on Computational Natural Language Learning (CoNLL)"
},
{
"url": "https://aclanthology.org/volumes/K19-2/",
"title": "Proceedings of the Shared Task on Cross-Framework Meaning Representation Parsing at the 2019 Conference on Natural Language Learning"
}
]
},
{
"year": 2018,
"event_url": "https://aclanthology.org/events/conll-2018/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/K18-1/",
"title": "Proceedings of the 22nd Conference on Computational Natural Language Learning"
},
{
"url": "https://aclanthology.org/volumes/K18-2/",
"title": "Proceedings of the CoNLL 2018 Shared Task: Multilingual Parsing from Raw Text to Universal Dependencies"
},
{
"url": "https://aclanthology.org/volumes/K18-3/",
"title": "Proceedings of the CoNLL–SIGMORPHON 2018 Shared Task: Universal Morphological Reinflection"
}
]
},
{
"year": 2017,
"event_url": "https://aclanthology.org/events/conll-2017/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/K17-1/",
"title": "Proceedings of the 21st Conference on Computational Natural Language Learning (CoNLL 2017)"
},
{
"url": "https://aclanthology.org/volumes/K17-2/",
"title": "Proceedings of the CoNLL SIGMORPHON 2017 Shared Task: Universal Morphological Reinflection"
},
{
"url": "https://aclanthology.org/volumes/K17-3/",
"title": "Proceedings of the CoNLL 2017 Shared Task: Multilingual Parsing from Raw Text to Universal Dependencies"
}
]
},
{
"year": 2016,
"event_url": "https://aclanthology.org/events/conll-2016/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/K16-1/",
"title": "Proceedings of the 20th SIGNLL Conference on Computational Natural Language Learning"
},
{
"url": "https://aclanthology.org/volumes/K16-2/",
"title": "Proceedings of the CoNLL-16 shared task"
}
]
},
{
"year": 2015,
"event_url": "https://aclanthology.org/events/conll-2015/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/K15-1/",
"title": "Proceedings of the Nineteenth Conference on Computational Natural Language Learning"
},
{
"url": "https://aclanthology.org/volumes/K15-2/",
"title": "Proceedings of the Nineteenth Conference on Computational Natural Language Learning - Shared Task"
}
]
},
{
"year": 2014,
"event_url": "https://aclanthology.org/events/conll-2014/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/W14-16/",
"title": "Proceedings of the Eighteenth Conference on Computational Natural Language Learning"
},
{
"url": "https://aclanthology.org/volumes/W14-17/",
"title": "Proceedings of the Eighteenth Conference on Computational Natural Language Learning: Shared Task"
}
]
},
{
"year": 2013,
"event_url": "https://aclanthology.org/events/conll-2013/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/W13-35/",
"title": "Proceedings of the Seventeenth Conference on Computational Natural Language Learning"
},
{
"url": "https://aclanthology.org/volumes/W13-36/",
"title": "Proceedings of the Seventeenth Conference on Computational Natural Language Learning: Shared Task"
}
]
},
{
"year": 2012,
"event_url": "https://aclanthology.org/events/conll-2012/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/D12-1/",
"title": "Proceedings of the 2012 Joint Conference on Empirical Methods in Natural Language Processing and Computational Natural Language Learning"
},
{
"url": "https://aclanthology.org/volumes/W12-45/",
"title": "Joint Conference on EMNLP and CoNLL - Shared Task"
}
]
},
{
"year": 2011,
"event_url": "https://aclanthology.org/events/conll-2011/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/W11-03/",
"title": "Proceedings of the Fifteenth Conference on Computational Natural Language Learning"
},
{
"url": "https://aclanthology.org/volumes/W11-19/",
"title": "Proceedings of the Fifteenth Conference on Computational Natural Language Learning: Shared Task"
}
]
},
{
"year": 2010,
"event_url": "https://aclanthology.org/events/conll-2010/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/W10-29/",
"title": "Proceedings of the Fourteenth Conference on Computational Natural Language Learning"
},
{
"url": "https://aclanthology.org/volumes/W10-30/",
"title": "Proceedings of the Fourteenth Conference on Computational Natural Language Learning – Shared Task"
}
]
},
{
"year": 2009,
"event_url": "https://aclanthology.org/events/conll-2009/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/W09-11/",
"title": "Proceedings of the Thirteenth Conference on Computational Natural Language Learning (CoNLL-2009)"
},
{
"url": "https://aclanthology.org/volumes/W09-12/",
"title": "Proceedings of the Thirteenth Conference on Computational Natural Language Learning (CoNLL 2009): Shared Task"
}
]
},
{
"year": 2008,
"event_url": "https://aclanthology.org/events/conll-2008/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/W08-21/",
"title": "CoNLL 2008: Proceedings of the Twelfth Conference on Computational Natural Language Learning"
}
]
},
{
"year": 2007,
"event_url": "https://aclanthology.org/events/conll-2007/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/D07-1/",
"title": "Proceedings of the 2007 Joint Conference on Empirical Methods in Natural Language Processing and Computational Natural Language Learning (EMNLP-CoNLL)"
}
]
},
{
"year": 2006,
"event_url": "https://aclanthology.org/events/conll-2006/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/W06-29/",
"title": "Proceedings of the Tenth Conference on Computational Natural Language Learning (CoNLL-X)"
}
]
},
{
"year": 2005,
"event_url": "https://aclanthology.org/events/conll-2005/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/W05-06/",
"title": "Proceedings of the Ninth Conference on Computational Natural Language Learning (CoNLL-2005)"
}
]
},
{
"year": 2004,
"event_url": "https://aclanthology.org/events/conll-2004/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/W04-24/",
"title": "Proceedings of the Eighth Conference on Computational Natural Language Learning (CoNLL-2004) at HLT-NAACL 2004"
}
]
},
{
"year": 2003,
"event_url": "https://aclanthology.org/events/conll-2003/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/W03-04/",
"title": "Proceedings of the Seventh Conference on Natural Language Learning at HLT-NAACL 2003"
}
]
},
{
"year": 2002,
"event_url": "https://aclanthology.org/events/conll-2002/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/W02-20/",
"title": "COLING-02: The 6th Conference on Natural Language Learning 2002 (CoNLL-2002)"
}
]
},
{
"year": 2001,
"event_url": "https://aclanthology.org/events/conll-2001/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/W01-07/",
"title": "Proceedings of the ACL 2001 Workshop on Computational Natural Language Learning (CoNLL)"
}
]
},
{
"year": 2000,
"event_url": "https://aclanthology.org/events/conll-2000/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/W00-07/",
"title": "Fourth Conference on Computational Natural Language Learning and the Second Learning Language in Logic Workshop"
}
]
},
{
"year": 1999,
"event_url": "https://aclanthology.org/events/conll-1999/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/W99-07/",
"title": "EACL 1999: CoNLL-99 Computational Natural Language Learning"
}
]
},
{
"year": 1998,
"event_url": "https://aclanthology.org/events/conll-1998/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/W98-12/",
"title": "Proceedings of the Joint Conference on New Methods in Language Processing and Computational Natural Language Learning"
}
]
},
{
"year": 1997,
"event_url": "https://aclanthology.org/events/conll-1997/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/W97-10/",
"title": "CoNLL97: Computational Natural Language Learning"
}
]
}
],
"scope": "Actual first-party publisher entries; multiple volumes/tracks do not create extra event years. Year census does not establish per-paper/track/abstract or public rejected-submission completeness. 30 actualeditions1997–2026:officialpreviouslist1997–2025 pluscurrent2026 andpublisherentries; separate shared-taskseries excluded from extraeditioncounts. Named ECML97/MLNet fore-runner is not the1997MadridCoNLLedition. Preserve earlyworkshop titles andtrack evidence rather than blindly relabel allrecords main.",
"additional_primary_sources": [
{
"source_url": "https://www.conll.org/previous-editions",
"resolved_url": "https://www.conll.org/previous-editions",
"checked_at": "2026-11-08T10:24:23.579938+00:00",
"http_status": 200,
"source_sha256": "79e9e4342727acd13891103d140b40bc35ab4f3f5beef8b38868dab13c5129f4"
},
{
"source_url": "https://www.conll.org/2026",
"resolved_url": "https://www.conll.org/2026",
"checked_at": "2026-11-08T10:23:34.920174+00:00",
"http_status": 200,
"source_sha256": "b4925b839e61d2a9e69b88bad06cca191c2e4bb40d66ea07a5890770ca4e8e02"
}
],
"official_previous_edition_years": [
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025
],
"source_html_sha256": "a342c627a8a97330fc064a5b3b7d612f917b9d81e07e050ffeb4a2b05d3bf061"
}
+117
View File
@@ -0,0 +1,117 @@
{
"source_url": "https://proceedings.mlr.press/",
"checked_at": "2026-11-08T09:00:14.927398+00:00",
"source_html_sha256": "6b0c53798d285af02e4425adfd01b51db9d0945e2dc7c92772daa517e8847843",
"cutoff_year": 2026,
"expected_years": [
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [],
"publisher_index_years": [
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025
],
"editions": [
{
"year": 2025,
"url": "https://proceedings.mlr.press/v305/",
"publisher_index_label": "Volume 305 Proceedings of CoRL 2025",
"checked_at": "2026-11-08T09:01:41.131259+00:00",
"source_html_sha256": "6d006392265f4eec3a40cb44a89cf1c9b75d9b2cb393acdf711e91bda0d60e80",
"event_heading": "Volume 305: Conference on Robot Learning, 27-30 September 2025, Seoul, Korea"
},
{
"year": 2024,
"url": "https://proceedings.mlr.press/v270/",
"publisher_index_label": "Volume 270 Proceedings of CoRL 2024",
"checked_at": "2026-11-08T09:01:46.083656+00:00",
"source_html_sha256": "9bf9b3c63c131f8779ee3af7e9ffb3950be4e8eed0dd88d5dd75c7e956764bae",
"event_heading": "Volume 270: Conference on Robot Learning, 6-9 November 2024, Munich, Germany"
},
{
"year": 2023,
"url": "https://proceedings.mlr.press/v229/",
"publisher_index_label": "Volume 229 Proceedings of CoRL 2023",
"checked_at": "2026-11-08T09:01:41.859103+00:00",
"source_html_sha256": "7411f1baa35bc2034af476079fc14dc7198aea1943979f832c0415e34eb91421",
"event_heading": "Volume 229: Conference on Robot Learning, 6-9 November 2023, Atlanta, USA"
},
{
"year": 2022,
"url": "https://proceedings.mlr.press/v205/",
"publisher_index_label": "Volume 205 Proceedings of CoRL 2022",
"checked_at": "2026-11-08T09:01:42.212859+00:00",
"source_html_sha256": "ea69a217883f22500ce1153fc23c6dfa140ffbebb60081945b57baebee5e8db4",
"event_heading": "Volume 205: Conference on Robot Learning, 14-18 December 2022, Auckland, New Zealand"
},
{
"year": 2021,
"url": "https://proceedings.mlr.press/v164/",
"publisher_index_label": "Volume 164 Proceedings of CoRL 2021",
"checked_at": "2026-11-08T09:01:43.424032+00:00",
"source_html_sha256": "5dbbb03b4b021f50898b66ce2f9896ef809a2813210e17c1a97809ac36e0bf71",
"event_heading": "Volume 164: Conference on Robot Learning, 8-11 November 2021, London, UK"
},
{
"year": 2020,
"url": "https://proceedings.mlr.press/v155/",
"publisher_index_label": "Volume 155 Proceedings of CoRL 2020",
"checked_at": "2026-11-08T09:01:43.030373+00:00",
"source_html_sha256": "80350d6dac2b430312639d7a7c8973e5f5c91e1430c45a50fa7b10b7668b6905",
"event_heading": "Volume 155: Conference on Robot Learning, 16-18 November 2020, virtual"
},
{
"year": 2019,
"url": "https://proceedings.mlr.press/v100/",
"publisher_index_label": "Volume 100 CoRL 2019",
"checked_at": "2026-11-08T09:01:45.269656+00:00",
"source_html_sha256": "13c5f8504612969fc76a0547437d5e1ed00f6bc9e5961950dce9bd074e02962c",
"event_heading": "Volume 100: Conference on Robot Learning, 30 October to 1 November 2019,"
},
{
"year": 2018,
"url": "https://proceedings.mlr.press/v87/",
"publisher_index_label": "Volume 87 CoRL 2018",
"checked_at": "2026-11-08T09:01:47.815772+00:00",
"source_html_sha256": "9820e3ef1d900d1479a1dd2e90bdbf36d88bd1841cac3c1c23cf1aa4cd548396",
"event_heading": "Volume 87: Conference on Robot Learning, 29-31 October 2018,"
},
{
"year": 2017,
"url": "https://proceedings.mlr.press/v78/",
"publisher_index_label": "Volume 78 CoRL 2017 Proceedings",
"checked_at": "2026-11-08T09:01:47.618892+00:00",
"source_html_sha256": "9cf96de10cea85ea94e841861d6a17deccf9d89a0058c991fab7c69ac9a300e9",
"event_heading": "Volume 78: Conference on Robot Learning, 13-15 November 2017,"
}
],
"first_edition_explicitly_named_by_publisher": true,
"announced_not_in_publisher_proceedings_index": [
{
"source_url": "https://www.corl.org/",
"checked_at": "2026-11-08T09:01:51.370877+00:00",
"source_html_sha256": "346f02407c7247f3de4e8124d65c391f8786afe5bdf6c2261de91b34a8ab25d2",
"year": 2026,
"event_dates": "2026-11-09/2026-11-12",
"as_of": "2026-11-08",
"state": "announced_upcoming_event_not_in_publisher_proceedings_index"
}
],
"scope": "Independent first-edition and all actual publisher-index conference/event-year labels, checked against each volume event heading. No annual interpolation, per-paper/track/abstract completeness or public rejection census. CoRL2026 is separately announced/upcoming and not listed in PMLR index; missing snapshot year does not prove missing published papers."
}
+283
View File
@@ -0,0 +1,283 @@
{
"source_url": "https://www.thecvf.com/?page_id=100",
"resolved_url": "https://www.thecvf.com/?page_id=100",
"http_status": 200,
"checked_at": "2026-11-08T10:47:26.989521+00:00",
"source_sha256": "59b10db1ad99b8e47871bea22c5739310ce02294d6b34e5a0665bd7b32d1ed64",
"source_html_sha256": "59b10db1ad99b8e47871bea22c5739310ce02294d6b34e5a0665bd7b32d1ed64",
"cutoff_year": 2026,
"expected_years": [
1983,
1985,
1986,
1988,
1989,
1991,
1992,
1993,
1994,
1996,
1997,
1998,
1999,
2000,
2001,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027,
2028,
2029,
2030,
2031
],
"editions": [
{
"year": 2026,
"location_label": "Denver",
"links": [
"http://openaccess.thecvf.com/CVPR2026"
]
},
{
"year": 2025,
"location_label": "Nashville",
"links": [
"http://openaccess.thecvf.com/CVPR2025"
]
},
{
"year": 2024,
"location_label": "Seattle",
"links": [
"http://openaccess.thecvf.com/CVPR2024"
]
},
{
"year": 2023,
"location_label": "Vancouver",
"links": [
"http://openaccess.thecvf.com/CVPR2023"
]
},
{
"year": 2022,
"location_label": "New Orleans",
"links": [
"http://openaccess.thecvf.com/CVPR2022"
]
},
{
"year": 2021,
"location_label": "Virtual",
"links": [
"http://openaccess.thecvf.com/CVPR2021"
]
},
{
"year": 2020,
"location_label": "Virtual",
"links": [
"http://openaccess.thecvf.com/CVPR2020.py"
]
},
{
"year": 2019,
"location_label": "Long Beach",
"links": [
"http://openaccess.thecvf.com/CVPR2019.py"
]
},
{
"year": 2018,
"location_label": "Salt Lake City",
"links": [
"http://openaccess.thecvf.com/CVPR2018.py"
]
},
{
"year": 2017,
"location_label": "Honolulu",
"links": [
"http://openaccess.thecvf.com/CVPR2017.py"
]
},
{
"year": 2016,
"location_label": "Las Vegas",
"links": [
"http://openaccess.thecvf.com/CVPR2016.py"
]
},
{
"year": 2015,
"location_label": "Boston",
"links": [
"http://openaccess.thecvf.com/CVPR2015.py"
]
},
{
"year": 2014,
"location_label": "Columbus",
"links": [
"http://openaccess.thecvf.com/CVPR2014.py"
]
},
{
"year": 2013,
"location_label": "Portland",
"links": [
"http://openaccess.thecvf.com/CVPR2013.py"
]
},
{
"year": 2012,
"location_label": "Providence",
"links": []
},
{
"year": 2011,
"location_label": "Colorado Springs",
"links": []
},
{
"year": 2010,
"location_label": "San Francisco",
"links": []
},
{
"year": 2009,
"location_label": "Miami",
"links": []
},
{
"year": 2008,
"location_label": "Anchorage",
"links": []
},
{
"year": 2007,
"location_label": "Minneapolis",
"links": []
},
{
"year": 2006,
"location_label": "New York",
"links": []
},
{
"year": 2005,
"location_label": "San Diego",
"links": []
},
{
"year": 2004,
"location_label": "Washington D.C.",
"links": []
},
{
"year": 2003,
"location_label": "Madison",
"links": []
},
{
"year": 2001,
"location_label": "Kauai",
"links": []
},
{
"year": 2000,
"location_label": "Hilton Head",
"links": []
},
{
"year": 1999,
"location_label": "Fort Collins",
"links": []
},
{
"year": 1998,
"location_label": "Santa Barbara",
"links": []
},
{
"year": 1997,
"location_label": "San Juan",
"links": []
},
{
"year": 1996,
"location_label": "San Francisco",
"links": []
},
{
"year": 1994,
"location_label": "Seattle",
"links": []
},
{
"year": 1993,
"location_label": "New York",
"links": []
},
{
"year": 1992,
"location_label": "Champaign",
"links": []
},
{
"year": 1991,
"location_label": "Lahaina",
"links": []
},
{
"year": 1989,
"location_label": "San Francisco",
"links": []
},
{
"year": 1988,
"location_label": "Ann Arbor",
"links": []
},
{
"year": 1986,
"location_label": "Miami",
"links": []
},
{
"year": 1985,
"location_label": "San Francisco",
"links": []
},
{
"year": 1983,
"location_label": "Arlington",
"links": []
}
],
"scope": "Explicit rows from CVFcomprehensivepast/futureconference table, filteredat2026; notfirst/lastyear interpolation. Multiple proceedingsvolumes,tracksandfuturebidsdonotcreateextraeventyears. Doesnotproveperpaper/track/abstract/publicnegativecompleteness. Preserve irregular earlyyearlist; do not invent1984/1987/1990/1995/2002 because they fallbetweenfirstandlast. CVFofficialopenaccesslinksbegin2013, sohistoricalpublisheravailabilityisaseparatequestion.2026Findings retainsitsowntrack,notallworkshopproceedingsareFindings."
}
+492
View File
@@ -0,0 +1,492 @@
{
"source_url": "https://aclanthology.org/venues/eacl/",
"resolved_url": "https://aclanthology.org/venues/eacl/",
"checked_at": "2026-11-08T10:20:24.488318+00:00",
"http_status": 200,
"source_sha256": "d117c304299c40a1c569ebff91056cdb8fdfdb448d3e90a62bc962b31eb01f7d",
"cutoff_year": 2026,
"expected_years": [
1983,
1985,
1987,
1989,
1991,
1993,
1995,
1997,
1999,
2003,
2006,
2009,
2012,
2014,
2017,
2021,
2023,
2024,
2026
],
"excluded_future_years": [
2027
],
"publisher_years": [
1983,
1985,
1987,
1989,
1991,
1993,
1995,
1997,
1999,
2003,
2006,
2009,
2012,
2014,
2017,
2021,
2023,
2024,
2026
],
"editions": [
{
"year": 2026,
"event_url": "https://aclanthology.org/events/eacl-2026/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2026.eacl-long/",
"title": "Proceedings of the 19th Conference of the European Chapter of the Association for Computational Linguistics (Volume 1: Long Papers)"
},
{
"url": "https://aclanthology.org/volumes/2026.eacl-short/",
"title": "Proceedings of the 19th Conference of the European Chapter of the Association for Computational Linguistics (Volume 2: Short Papers)"
},
{
"url": "https://aclanthology.org/volumes/2026.eacl-demo/",
"title": "Proceedings of the 19th Conference of the European Chapter of the Association for Computational Linguistics (Volume 3: System Demonstrations)"
},
{
"url": "https://aclanthology.org/volumes/2026.eacl-srw/",
"title": "Proceedings of the 19th Conference of the European Chapter of the Association for Computational Linguistics (Volume 4: Student Research Workshop)"
},
{
"url": "https://aclanthology.org/volumes/2026.eacl-industry/",
"title": "Proceedings of the 19th Conference of the European Chapter of the Association for Computational Linguistics (Volume 5: Industry Track)"
},
{
"url": "https://aclanthology.org/volumes/2026.eacl-tutorials/",
"title": "Proceedings of the 19th Conference of the European Chapter of the Association for Computational Linguistics (Volume 6: Tutorial Abstracts)"
}
]
},
{
"year": 2024,
"event_url": "https://aclanthology.org/events/eacl-2024/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2024.eacl-long/",
"title": "Proceedings of the 18th Conference of the European Chapter of the Association for Computational Linguistics (Volume 1: Long Papers)"
},
{
"url": "https://aclanthology.org/volumes/2024.eacl-short/",
"title": "Proceedings of the 18th Conference of the European Chapter of the Association for Computational Linguistics (Volume 2: Short Papers)"
},
{
"url": "https://aclanthology.org/volumes/2024.eacl-demo/",
"title": "Proceedings of the 18th Conference of the European Chapter of the Association for Computational Linguistics: System Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/2024.eacl-srw/",
"title": "Proceedings of the 18th Conference of the European Chapter of the Association for Computational Linguistics: Student Research Workshop"
},
{
"url": "https://aclanthology.org/volumes/2024.eacl-tutorials/",
"title": "Proceedings of the 18th Conference of the European Chapter of the Association for Computational Linguistics: Tutorial Abstracts"
}
]
},
{
"year": 2023,
"event_url": "https://aclanthology.org/events/eacl-2023/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2023.eacl-main/",
"title": "Proceedings of the 17th Conference of the European Chapter of the Association for Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/2023.eacl-demo/",
"title": "Proceedings of the 17th Conference of the European Chapter of the Association for Computational Linguistics: System Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/2023.eacl-srw/",
"title": "Proceedings of the 17th Conference of the European Chapter of the Association for Computational Linguistics: Student Research Workshop"
},
{
"url": "https://aclanthology.org/volumes/2023.eacl-tutorials/",
"title": "Proceedings of the 17th Conference of the European Chapter of the Association for Computational Linguistics: Tutorial Abstracts"
}
]
},
{
"year": 2021,
"event_url": "https://aclanthology.org/events/eacl-2021/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2021.eacl-main/",
"title": "Proceedings of the 16th Conference of the European Chapter of the Association for Computational Linguistics: Main Volume"
},
{
"url": "https://aclanthology.org/volumes/2021.eacl-demos/",
"title": "Proceedings of the 16th Conference of the European Chapter of the Association for Computational Linguistics: System Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/2021.eacl-srw/",
"title": "Proceedings of the 16th Conference of the European Chapter of the Association for Computational Linguistics: Student Research Workshop"
},
{
"url": "https://aclanthology.org/volumes/2021.eacl-tutorials/",
"title": "Proceedings of the 16th Conference of the European Chapter of the Association for Computational Linguistics: Tutorial Abstracts"
}
]
},
{
"year": 2017,
"event_url": "https://aclanthology.org/events/eacl-2017/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/E17-1/",
"title": "Proceedings of the 15th Conference of the European Chapter of the Association for Computational Linguistics: Volume 1, Long Papers"
},
{
"url": "https://aclanthology.org/volumes/E17-2/",
"title": "Proceedings of the 15th Conference of the European Chapter of the Association for Computational Linguistics: Volume 2, Short Papers"
},
{
"url": "https://aclanthology.org/volumes/E17-3/",
"title": "Proceedings of the Software Demonstrations of the 15th Conference of the European Chapter of the Association for Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/E17-4/",
"title": "Proceedings of the Student Research Workshop at the 15th Conference of the European Chapter of the Association for Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/E17-5/",
"title": "Proceedings of the 15th Conference of the European Chapter of the Association for Computational Linguistics: Tutorial Abstracts"
}
]
},
{
"year": 2014,
"event_url": "https://aclanthology.org/events/eacl-2014/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/E14-1/",
"title": "Proceedings of the 14th Conference of the European Chapter of the Association for Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/E14-2/",
"title": "Proceedings of the Demonstrations at the 14th Conference of the European Chapter of the Association for Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/E14-3/",
"title": "Proceedings of the Student Research Workshop at the 14th Conference of the European Chapter of the Association for Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/E14-4/",
"title": "Proceedings of the 14th Conference of the European Chapter of the Association for Computational Linguistics, volume 2: Short Papers"
}
]
},
{
"year": 2012,
"event_url": "https://aclanthology.org/events/eacl-2012/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/E12-1/",
"title": "Proceedings of the 13th Conference of the European Chapter of the Association for Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/E12-2/",
"title": "Proceedings of the Demonstrations at the 13th Conference of the European Chapter of the Association for Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/E12-3/",
"title": "Proceedings of the Student Research Workshop at the 13th Conference of the European Chapter of the Association for Computational Linguistics"
}
]
},
{
"year": 2009,
"event_url": "https://aclanthology.org/events/eacl-2009/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/E09-1/",
"title": "Proceedings of the 12th Conference of the European Chapter of the ACL (EACL 2009)"
},
{
"url": "https://aclanthology.org/volumes/E09-2/",
"title": "Proceedings of the Demonstrations Session at EACL 2009"
},
{
"url": "https://aclanthology.org/volumes/E09-3/",
"title": "Proceedings of the Student Research Workshop at EACL 2009"
}
]
},
{
"year": 2006,
"event_url": "https://aclanthology.org/events/eacl-2006/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/E06-1/",
"title": "11th Conference of the European Chapter of the Association for Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/E06-2/",
"title": "Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/E06-3/",
"title": "Student Research Workshop"
}
]
},
{
"year": 2003,
"event_url": "https://aclanthology.org/events/eacl-2003/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/E03-1/",
"title": "10th Conference of the European Chapter of the Association for Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/E03-2/",
"title": "Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/E03-3/",
"title": "Student Research Workshop"
}
]
},
{
"year": 1999,
"event_url": "https://aclanthology.org/events/eacl-1999/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/E99-1/",
"title": "Ninth Conference of the European Chapter of the Association for Computational Linguistics"
}
]
},
{
"year": 1997,
"event_url": "https://aclanthology.org/events/eacl-1997/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/P97-1/",
"title": "35th Annual Meeting of the Association for Computational Linguistics and 8th Conference of the European Chapter of the Association for Computational Linguistics"
}
]
},
{
"year": 1995,
"event_url": "https://aclanthology.org/events/eacl-1995/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/E95-1/",
"title": "Seventh Conference of the European Chapter of the Association for Computational Linguistics"
}
]
},
{
"year": 1993,
"event_url": "https://aclanthology.org/events/eacl-1993/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/E93-1/",
"title": "Sixth Conference of the European Chapter of the Association for Computational Linguistics"
}
]
},
{
"year": 1991,
"event_url": "https://aclanthology.org/events/eacl-1991/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/E91-1/",
"title": "Fifth Conference of the European Chapter of the Association for Computational Linguistics"
}
]
},
{
"year": 1989,
"event_url": "https://aclanthology.org/events/eacl-1989/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/E89-1/",
"title": "Fourth Conference of the European Chapter of the Association for Computational Linguistics"
}
]
},
{
"year": 1987,
"event_url": "https://aclanthology.org/events/eacl-1987/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/E87-1/",
"title": "Third Conference of the European Chapter of the Association for Computational Linguistics"
}
]
},
{
"year": 1985,
"event_url": "https://aclanthology.org/events/eacl-1985/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/E85-1/",
"title": "Second Conference of the European Chapter of the Association for Computational Linguistics"
}
]
},
{
"year": 1983,
"event_url": "https://aclanthology.org/events/eacl-1983/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/E83-1/",
"title": "First Conference of the European Chapter of the Association for Computational Linguistics"
}
]
}
],
"scope": "Actual first-party publisher entries; multiple volumes/tracks do not create extra event years. Year census does not establish per-paper/track/abstract or public rejected-submission completeness. All19namededitions1983–2026 crosschecked against chapterdirectory; hostedACL2019/2022 are separate from EACLseries.1997explicitjointACL/EACL sharesP97-1.2027excluded; no interpolation across irregular intervals.2021plannedKyiv/heldonline are kept distinct.",
"additional_primary_sources": [
{
"source_url": "https://eacl.org/conferences/",
"resolved_url": "https://eacl.org/conferences/",
"checked_at": "2026-11-08T10:20:25.447335+00:00",
"http_status": 200,
"source_sha256": "0ee08d024d3356336de9a2c02c7e214e6d48d97acb9060bfbc360ff510cd34c7"
}
],
"chapter_directory_entries": [
{
"year": 2027,
"label": "EACL 2027",
"location_note": "Athens, Greece"
},
{
"year": 2026,
"label": "EACL 2026",
"location_note": "Rabat, Morocco"
},
{
"year": 2024,
"label": "EACL 2024",
"location_note": "St. Julians, Malta"
},
{
"year": 2023,
"label": "EACL 2023",
"location_note": "Dubrovnik, Croatia (hybrid)"
},
{
"year": 2022,
"label": "ACL 2022",
"location_note": "Dublin, Ireland"
},
{
"year": 2021,
"label": "EACL 2021",
"location_note": "Kyiv, Ukraine (held online)"
},
{
"year": 2019,
"label": "ACL 2019",
"location_note": "Florence, Italy"
},
{
"year": 2017,
"label": "EACL 2017",
"location_note": "Valencia, Spain"
},
{
"year": 2014,
"label": "EACL 2014",
"location_note": "Gothenburg, Sweden"
},
{
"year": 2012,
"label": "EACL 2012",
"location_note": "Avignon, France"
},
{
"year": 2009,
"label": "EACL 2009",
"location_note": "Athens, Greece"
},
{
"year": 2006,
"label": "EACL 2006",
"location_note": "Trento, Italy"
},
{
"year": 2003,
"label": "EACL 2003",
"location_note": "Budapest, Hungary"
},
{
"year": 1999,
"label": "EACL 1999",
"location_note": "Bergen, Norway"
},
{
"year": 1997,
"label": "EACL-ACL 1997",
"location_note": "Madrid, Spain"
},
{
"year": 1995,
"label": "EACL 1995",
"location_note": "Dublin, Ireland"
},
{
"year": 1993,
"label": "EACL 1993",
"location_note": "Utrecht, The Netherlands"
},
{
"year": 1991,
"label": "EACL 1991",
"location_note": "Berlin, Germany"
},
{
"year": 1989,
"label": "EACL 1989",
"location_note": "Manchester, England"
},
{
"year": 1987,
"label": "EACL 1987",
"location_note": "Copenhagen, Denmark"
},
{
"year": 1985,
"label": "EACL 1985",
"location_note": "Geneva, Switzerland"
},
{
"year": 1983,
"label": "EACL 1983",
"location_note": "Pisa, Italy"
}
],
"chapter_hosted_acl_years_not_eacl_series_editions": [
2022,
2019
],
"source_html_sha256": "d117c304299c40a1c569ebff91056cdb8fdfdb448d3e90a62bc962b31eb01f7d"
}
+269
View File
@@ -0,0 +1,269 @@
{
"source_url": "https://www.eurai.org/ecai/history",
"resolved_url": "https://www.eurai.org/ecai/history",
"http_status": 200,
"checked_at": "2026-11-08T10:48:38.667782+00:00",
"source_sha256": "9d7b1d7a1b9cc22abf8ae981bc421560ae028e484b759bbdc36e32e5f3cb2cff",
"source_html_sha256": "9d7b1d7a1b9cc22abf8ae981bc421560ae028e484b759bbdc36e32e5f3cb2cff",
"additional_primary_sources": [
{
"source_url": "https://ecai2025.org/",
"resolved_url": "https://ecai2025.org/",
"http_status": 200,
"checked_at": "2026-11-08T10:48:35.786591+00:00",
"source_sha256": "485208f9783d26a094832af9dd8f024642528561e29226f29ca3533d2de81bce"
},
{
"source_url": "https://www.eurai.org/ecai",
"resolved_url": "https://www.eurai.org/ecai",
"http_status": 200,
"checked_at": "2026-11-08T10:47:36.587944+00:00",
"source_sha256": "d9a23a3955947645ac19dbb80bb4aedf99ce19137ad3204acdaccbdc813824ad"
}
],
"cutoff_year": 2026,
"expected_years": [
1974,
1976,
1978,
1980,
1982,
1984,
1986,
1988,
1990,
1992,
1994,
1996,
1998,
2000,
2002,
2004,
2006,
2008,
2010,
2012,
2014,
2016,
2018,
2020,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [],
"editions": [
{
"ordinal": 1,
"year": 1974,
"location_label": "Brighton",
"series_label": "AISB predecessor",
"joint_with_ijcai": false
},
{
"ordinal": 2,
"year": 1976,
"location_label": "Edinburgh",
"series_label": "AISB predecessor",
"joint_with_ijcai": false
},
{
"ordinal": 3,
"year": 1978,
"location_label": "Hamburg",
"series_label": "AISB predecessor",
"joint_with_ijcai": false
},
{
"ordinal": 4,
"year": 1980,
"location_label": "Amsterdam",
"series_label": "AISB predecessor",
"joint_with_ijcai": false
},
{
"ordinal": 5,
"year": 1982,
"location_label": "Orsay",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 6,
"year": 1984,
"location_label": "Pisa",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 7,
"year": 1986,
"location_label": "Brighton",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 8,
"year": 1988,
"location_label": "Munich",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 9,
"year": 1990,
"location_label": "Stockholm",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 10,
"year": 1992,
"location_label": "Vienna",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 11,
"year": 1994,
"location_label": "Amsterdam",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 12,
"year": 1996,
"location_label": "Budapest",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 13,
"year": 1998,
"location_label": "Brighton",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 14,
"year": 2000,
"location_label": "Berlin",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 15,
"year": 2002,
"location_label": "Lyon",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 16,
"year": 2004,
"location_label": "Valencia",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 17,
"year": 2006,
"location_label": "Riva del Garda",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 18,
"year": 2008,
"location_label": "Patras",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 19,
"year": 2010,
"location_label": "Lisboa",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 20,
"year": 2012,
"location_label": "Montpellier",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 21,
"year": 2014,
"location_label": "Prague",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 22,
"year": 2016,
"location_label": "The Hague",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 23,
"year": 2018,
"location_label": "Stockholm",
"series_label": "ECAI",
"joint_with_ijcai": true
},
{
"ordinal": 24,
"year": 2020,
"location_label": "Santiago de Compostela (online)",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 25,
"year": 2022,
"location_label": "Vienna",
"series_label": "ECAI",
"joint_with_ijcai": true
},
{
"ordinal": 26,
"year": 2023,
"location_label": "Krakow",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 27,
"year": 2024,
"location_label": "Santiago de Compostela",
"series_label": "ECAI",
"joint_with_ijcai": false
},
{
"ordinal": 28,
"year": 2025,
"series_label": "ECAI",
"location_label": "Bologna",
"joint_with_ijcai": false
},
{
"ordinal": 29,
"year": 2026,
"series_label": "IJCAI-ECAI",
"location_label": "Bremen",
"joint_with_ijcai": true
}
],
"predecessor_years": [
1974,
1976,
1978,
1980
],
"scope": "Officialhistoryenumerates27actualeditions1974–2024;currentofficial28th2025and29thjoint2026sourcesextendto29. FirstfourwereAISBconferencesretrospectivelynumberedinthefamily;ECAInamefirstused1982. PreserveoriginalAISBsource names,notimplicitrenaming. JointIJCAI2018/2022/2026areoneeventperyear,notadditionalpapers;2023onannualonlyasactualentries. Earlypredecessors,perpapertracksandpublicnegativecoverage stillneedindependentcollection."
}
+161
View File
@@ -0,0 +1,161 @@
{
"source_url": "https://www.thecvf.com/?page_id=100",
"resolved_url": "https://www.thecvf.com/?page_id=100",
"http_status": 200,
"checked_at": "2026-11-08T10:47:26.989521+00:00",
"source_sha256": "59b10db1ad99b8e47871bea22c5739310ce02294d6b34e5a0665bd7b32d1ed64",
"source_html_sha256": "59b10db1ad99b8e47871bea22c5739310ce02294d6b34e5a0665bd7b32d1ed64",
"cutoff_year": 2026,
"expected_years": [
1990,
1992,
1994,
1996,
1998,
2000,
2002,
2004,
2006,
2008,
2010,
2012,
2014,
2016,
2018,
2020,
2022,
2024,
2026
],
"excluded_future_years": [],
"editions": [
{
"year": 2026,
"location_label": "Malmö",
"links": []
},
{
"year": 2024,
"location_label": "Milan",
"links": [
"https://www.ecva.net/papers.php"
]
},
{
"year": 2022,
"location_label": "Tel Aviv",
"links": [
"https://www.ecva.net/papers.php"
]
},
{
"year": 2020,
"location_label": "Edinburgh",
"links": [
"https://www.ecva.net/papers.php"
]
},
{
"year": 2018,
"location_label": "Munich",
"links": [
"http://openaccess.thecvf.com/ECCV2018.py"
]
},
{
"year": 2016,
"location_label": "Amsterdam",
"links": []
},
{
"year": 2014,
"location_label": "Zurich",
"links": []
},
{
"year": 2012,
"location_label": "Florence",
"links": []
},
{
"year": 2010,
"location_label": "Hersonissos",
"links": []
},
{
"year": 2008,
"location_label": "Marseille",
"links": []
},
{
"year": 2006,
"location_label": "Graz",
"links": []
},
{
"year": 2004,
"location_label": "Prague",
"links": []
},
{
"year": 2002,
"location_label": "Copenhagen",
"links": []
},
{
"year": 2000,
"location_label": "Dublin",
"links": []
},
{
"year": 1998,
"location_label": "Freiburg",
"links": []
},
{
"year": 1996,
"location_label": "Cambridge",
"links": []
},
{
"year": 1994,
"location_label": "Stockholm",
"links": []
},
{
"year": 1992,
"location_label": "Santa Margherita Ligure",
"links": []
},
{
"year": 1990,
"location_label": "Antibes",
"links": []
}
],
"scope": "Explicit rows from CVFcomprehensivepast/futureconference table, filteredat2026; notfirst/lastyear interpolation. Multiple proceedingsvolumes,tracksandfuturebidsdonotcreateextraeventyears. Doesnotproveperpaper/track/abstract/publicnegativecompleteness. CVFexplicitlylists1990–2026; ECVAoverviewlistsonly2004–2024 andlabelsitslistpartial.2026websiteconfirmscurrentedition; proceedingavailabilitynotinferredfromeventlisting. Workshop/demo/contributiontype remainindependent.",
"additional_primary_sources": [
{
"source_url": "https://www.ecva.net/",
"resolved_url": "https://www.ecva.net/",
"http_status": 200,
"checked_at": "2026-11-08T10:47:22.058487+00:00",
"source_sha256": "c1946548b87a08a6381bf8ab409f35bc18ede20d3e09b6152b8e147a629386da"
},
{
"source_url": "https://eccv.ecva.net/Conferences/2026",
"resolved_url": "https://eccv.ecva.net/Conferences/2026",
"http_status": 200,
"checked_at": "2026-11-08T10:48:37.796019+00:00",
"source_sha256": "4a8dfff82350066c696247f62baf8069af49368135827fca95cdfc1be8953967"
}
],
"source_disagreements": [
{
"year": 2020,
"cvf_location_label": "Edinburgh",
"ecva_location_label": "Glasgow, Scotland",
"interpretation": "Retain firstparty directory disagreement; no venue metadata rewritten or actualinpersonlocationinferred."
}
]
}
@@ -0,0 +1,432 @@
{
"source_url": "https://www.ecmlpkdd2011.org/pastConferences.php",
"resolved_url": "https://www.ecmlpkdd2011.org/pastConferences.php",
"http_status": 200,
"checked_at": "2026-11-08T12:03:53.988202+00:00",
"source_sha256": "c3ecdb032aeacf6a365aace5457773827d1405872ad9bc6be6fc05851d5e68d6",
"source_html_sha256": "c3ecdb032aeacf6a365aace5457773827d1405872ad9bc6be6fc05851d5e68d6",
"additional_primary_sources": [
{
"source_url": "https://ecmlpkdd.org/",
"resolved_url": "https://ecmlpkdd.org/",
"http_status": 200,
"checked_at": "2026-11-08T12:03:53.009253+00:00",
"source_sha256": "d390dbba8ae6142d828b10eee646dc0a70cf744dabdd200dd419ea281a23ff23",
"source_html_sha256": "d390dbba8ae6142d828b10eee646dc0a70cf744dabdd200dd419ea281a23ff23"
},
{
"source_url": "https://www.ecmlpkdd2011.org/",
"resolved_url": "https://www.ecmlpkdd2011.org/",
"http_status": 200,
"checked_at": "2026-11-08T12:06:35.511744+00:00",
"source_sha256": "ad5b311ec3e17173615e092b436f740a27114fcbd4272e6d659f78ebc2a7c809",
"source_html_sha256": "ad5b311ec3e17173615e092b436f740a27114fcbd4272e6d659f78ebc2a7c809"
},
{
"source_url": "https://ecmlpkdd.org/2026/",
"resolved_url": "https://ecmlpkdd.org/2026/",
"http_status": 200,
"checked_at": "2026-11-08T12:06:36.806556+00:00",
"source_sha256": "6c8d1ce8f13698f377304104f4ed887952776928ac5e2dcf07e859c5d0aa445c",
"source_html_sha256": "6c8d1ce8f13698f377304104f4ed887952776928ac5e2dcf07e859c5d0aa445c"
}
],
"cutoff_year": 2026,
"expected_years": [
1986,
1987,
1988,
1989,
1991,
1993,
1994,
1995,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [],
"editions": [
{
"year": 1986,
"source_series": "EWSL",
"source_label": "EWSL 1986, Orsay, France, February 3-4, 1986",
"census_event_key": "ewsl:1986"
},
{
"year": 1987,
"source_series": "EWSL",
"source_label": "EWSL 1987, Bled, Yugoslavia, May 13-15, 1987",
"census_event_key": "ewsl:1987"
},
{
"year": 1988,
"source_series": "EWSL",
"source_label": "EWSL 1988, Glasgow, Scotland, UK, October 3-5, 1988",
"census_event_key": "ewsl:1988"
},
{
"year": 1989,
"source_series": "EWSL",
"source_label": "EWSL 1989, Montpellier, France, December 4-6, 1989",
"census_event_key": "ewsl:1989"
},
{
"year": 1991,
"source_series": "EWSL",
"source_label": "EWSL 1991, Porto, Portugal, March 6-8, 1991",
"census_event_key": "ewsl:1991"
},
{
"year": 1993,
"source_series": "ECML",
"source_label": "ECML 1993, Vienna, Austria, April 5-7, 1993",
"census_event_key": "ecml:1993"
},
{
"year": 1994,
"source_series": "ECML",
"source_label": "ECML 1994, Catania, Italy, April 6-8, 1994",
"census_event_key": "ecml:1994"
},
{
"year": 1995,
"source_series": "ECML",
"source_label": "ECML 1995, Heraclion, Crete, Greece, April 25-27, 1995",
"census_event_key": "ecml:1995"
},
{
"year": 1997,
"source_series": "ECML",
"source_label": "ECML 1997, located in Prague, Czech Republic, April 23-26, 1997",
"census_event_key": "ecml:1997"
},
{
"year": 1997,
"source_series": "PKDD",
"source_label": "PKDD 1997, Trondheim, Norway, June 24-27, 1997",
"census_event_key": "pkdd:1997"
},
{
"year": 1998,
"source_series": "ECML",
"source_label": "ECML 1998, Chemnitz, Germany, April 21-24, 1998",
"census_event_key": "ecml:1998"
},
{
"year": 1998,
"source_series": "PKDD",
"source_label": "PKDD 1998, Nantes, France, September 23-26, 1998",
"census_event_key": "pkdd:1998"
},
{
"year": 1999,
"source_series": "PKDD",
"source_label": "PKDD 1999, Prague, Czech Republic, September 15-18, 1999",
"census_event_key": "pkdd:1999"
},
{
"year": 2000,
"source_series": "ECML",
"source_label": "ECML 2000, Barcelona, Spain, May 30-June 2, 2000",
"census_event_key": "ecml:2000"
},
{
"year": 2000,
"source_series": "PKDD",
"source_label": "PKDD 2000, Lyon, France, September 13-16, 2000",
"census_event_key": "pkdd:2000"
},
{
"year": 2001,
"source_series": "ECML-PKDD",
"source_label": "ECML-PKDD 2001, Freiburg, Germany, September 3-7, 2001",
"census_event_key": "ecml-pkdd:2001"
},
{
"year": 2002,
"source_series": "ECML-PKDD",
"source_label": "ECML-PKDD 2002, Helsinki, Finland, August 19-23, 2002",
"census_event_key": "ecml-pkdd:2002"
},
{
"year": 2003,
"source_series": "ECML-PKDD",
"source_label": "ECML-PKDD 2003, Cavtat/Dubrovnik, Croatia, September 22-26, 2003",
"census_event_key": "ecml-pkdd:2003"
},
{
"year": 2004,
"source_series": "ECML-PKDD",
"source_label": "ECML-PKDD 2004, Pisa, Italy, September 20-24, 2004",
"census_event_key": "ecml-pkdd:2004"
},
{
"year": 2005,
"source_series": "ECML-PKDD",
"source_label": "ECML-PKDD 2005, Porto, Portugal, October 3-7, 2005",
"census_event_key": "ecml-pkdd:2005"
},
{
"year": 2006,
"source_series": "ECML-PKDD",
"source_label": "ECML-PKDD 2006, Berlin, Germany, September 18-22, 2006",
"census_event_key": "ecml-pkdd:2006"
},
{
"year": 2007,
"source_series": "ECML-PKDD",
"source_label": "ECML-PKDD 2007, Warsaw, Poland, September 17-21, 2007",
"census_event_key": "ecml-pkdd:2007"
},
{
"year": 2008,
"source_series": "ECML-PKDD",
"source_label": "ECML-PKDD 2008, Antwerp, Belgium September 15-19, 2008",
"census_event_key": "ecml-pkdd:2008"
},
{
"year": 2009,
"source_series": "ECML-PKDD",
"source_label": "ECML-PKDD 2009, Bled, Slovenia, September 7-11, 2009",
"census_event_key": "ecml-pkdd:2009"
},
{
"year": 2010,
"source_series": "ECML-PKDD",
"source_label": "ECML-PKDD 2010, Barcelona, Catalonia, Spain, September 20-24, 2010",
"census_event_key": "ecml-pkdd:2010"
},
{
"year": 2011,
"source_series": "ECML-PKDD",
"source_label": "ECML PKDD 2011",
"census_event_key": "ecml-pkdd:2011",
"evidence_scope": "officialOldSite.datesJSONarray"
},
{
"year": 2012,
"source_series": "ECML-PKDD",
"source_label": "ECML PKDD 2012",
"census_event_key": "ecml-pkdd:2012",
"evidence_scope": "officialOldSite.datesJSONarray"
},
{
"year": 2013,
"source_series": "ECML-PKDD",
"source_label": "ECML PKDD 2013",
"census_event_key": "ecml-pkdd:2013",
"evidence_scope": "officialOldSite.datesJSONarray"
},
{
"year": 2014,
"source_series": "ECML-PKDD",
"source_label": "ECML PKDD 2014",
"census_event_key": "ecml-pkdd:2014",
"evidence_scope": "officialOldSite.datesJSONarray"
},
{
"year": 2015,
"source_series": "ECML-PKDD",
"source_label": "ECML PKDD 2015",
"census_event_key": "ecml-pkdd:2015",
"evidence_scope": "officialOldSite.datesJSONarray"
},
{
"year": 2016,
"source_series": "ECML-PKDD",
"source_label": "ECML PKDD 2016",
"census_event_key": "ecml-pkdd:2016",
"evidence_scope": "officialOldSite.datesJSONarray"
},
{
"year": 2017,
"source_series": "ECML-PKDD",
"source_label": "ECML PKDD 2017",
"census_event_key": "ecml-pkdd:2017",
"evidence_scope": "officialOldSite.datesJSONarray"
},
{
"year": 2018,
"source_series": "ECML-PKDD",
"source_label": "ECML PKDD 2018",
"census_event_key": "ecml-pkdd:2018",
"evidence_scope": "officialOldSite.datesJSONarray"
},
{
"year": 2019,
"source_series": "ECML-PKDD",
"source_label": "ECML PKDD 2019",
"census_event_key": "ecml-pkdd:2019",
"evidence_scope": "officialOldSite.datesJSONarray"
},
{
"year": 2020,
"source_series": "ECML-PKDD",
"source_label": "ECML PKDD 2020",
"census_event_key": "ecml-pkdd:2020",
"evidence_scope": "officialOldSite.datesJSONarray"
},
{
"year": 2021,
"source_series": "ECML-PKDD",
"source_label": "ECML PKDD 2021",
"census_event_key": "ecml-pkdd:2021",
"evidence_scope": "officialOldSite.datesJSONarray"
},
{
"year": 2022,
"source_series": "ECML-PKDD",
"source_label": "ECML PKDD 2022",
"census_event_key": "ecml-pkdd:2022",
"evidence_scope": "officialOldSite.datesJSONarray"
},
{
"year": 2023,
"source_series": "ECML-PKDD",
"source_label": "ECML PKDD 2023",
"census_event_key": "ecml-pkdd:2023",
"evidence_scope": "officialOldSite.datesJSONarray"
},
{
"year": 2024,
"source_series": "ECML-PKDD",
"source_label": "ECML PKDD 2024",
"census_event_key": "ecml-pkdd:2024",
"evidence_scope": "officialcurrenteventorrecentsitelist"
},
{
"year": 2025,
"source_series": "ECML-PKDD",
"source_label": "ECML PKDD 2025",
"census_event_key": "ecml-pkdd:2025",
"evidence_scope": "officialcurrenteventorrecentsitelist"
},
{
"year": 2026,
"source_series": "ECML-PKDD",
"source_label": "ECML PKDD 2026",
"census_event_key": "ecml-pkdd:2026",
"evidence_scope": "officialcurrenteventorrecentsitelist"
}
],
"event_count": 41,
"multiple_events_in_same_year": {
"1997": [
"ECML",
"PKDD"
],
"1998": [
"ECML",
"PKDD"
],
"2000": [
"ECML",
"PKDD"
]
},
"predecessor_years": [
1991,
1989,
1988,
1987,
1986
],
"scope": "41expliciteventsacross38years1986–2026. FiveEWSLpredecessors1986/1987/1988/1989/1991retainnames;ECMLnamefrom1993,PKDDfrom1997,andco-locationfrom2001. No1990/1992/1996interpolation. SeparateECML/PKDDeventsin1997/1998/2000arenotonehistoricalconference. OnlyOldSite.datesJSONparsedwithoutJSexecution;currentrecentyearsindependentlymatch. MultipleLNCSvolumes,journaltrackandADS/research/workshopsnotduplicateeventacceptances.",
"existing_event_identity_preflight": {
"snapshot_at": "2026-11-08 12:13:48.722149+00:00",
"report_path": "/data/paper-index/collected/same-year-event-preflight-v1.json",
"report_sha256": "50e213d5fdc194ae4fee8b74059252fa3f6f9a3bb2d2b593993ba1b95636e3b5",
"database_written": false,
"scope": "Read-onlyrepeatablereadmatchingvenues+fiveyears; notfinaldedupaudit.",
"status": "existing_separate_venue_identity_verified_preserve",
"venues": [
{
"id": 30,
"acronym": "ECML"
},
{
"id": 47,
"acronym": "PKDD"
}
],
"editions": [
{
"id": 641,
"venue_id": 30,
"acronym": "ECML",
"year": 1997,
"track": "main",
"submissions": 33
},
{
"id": 642,
"venue_id": 30,
"acronym": "ECML",
"year": 1998,
"track": "main",
"submissions": 48
},
{
"id": 643,
"venue_id": 30,
"acronym": "ECML",
"year": 2000,
"track": "main",
"submissions": 45
},
{
"id": 1053,
"venue_id": 47,
"acronym": "PKDD",
"year": 1997,
"track": "main",
"submissions": 43
},
{
"id": 1054,
"venue_id": 47,
"acronym": "PKDD",
"year": 1998,
"track": "main",
"submissions": 56
},
{
"id": 1056,
"venue_id": 47,
"acronym": "PKDD",
"year": 2000,
"track": "main",
"submissions": 86
}
],
"interpretation": "ExistingECMLandPKDDsameyeareventsaredistinctvenue/editionIDsandhaveindependentDBLPvolumeanchors. Noidentitymigrationneededfortheseexistingrecords. Keepseparatecanonicalvenues; familyquerymembershipdoesnotmeanoneevent. Earlierconstraint-onlyriskinferencewastoobroad."
}
}
@@ -0,0 +1,621 @@
{
"source_url": "https://sigdat.org/events",
"checked_at": "2026-11-08T07:00:27.310733+00:00",
"source_html_sha256": "5988b322cd329b9ff4eb10af701f40201fc6e2c394422e48b4f20357ace50769",
"cutoff_year": 2026,
"expected_years": [
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [],
"edition_entries": [
{
"year": 2026,
"official_heading": "2026 Conference on Empirical Methods in Natural Language Processing (EMNLP 2026)",
"year_basis": "leading heading year"
},
{
"year": 2025,
"official_heading": "2025 Conference on Empirical Methods in Natural Language Processing (EMNLP 2023)",
"year_basis": "leading heading year"
},
{
"year": 2024,
"official_heading": "2024 Conference on Empirical Methods in Natural Language Processing (EMNLP 2023)",
"year_basis": "leading heading year"
},
{
"year": 2023,
"official_heading": "2023 Conference on Empirical Methods in Natural Language Processing (EMNLP 2023)",
"year_basis": "leading heading year"
},
{
"year": 2022,
"official_heading": "2022 Conference on Empirical Methods in Natural Language Processing (EMNLP 2022)",
"year_basis": "leading heading year"
},
{
"year": 2021,
"official_heading": "2021 Conference on Empirical Methods in Natural Language Processing (EMNLP 2021)",
"year_basis": "leading heading year"
},
{
"year": 2020,
"official_heading": "2020 Conference on Empirical Methods in Natural Language Processing (EMNLP 2020)",
"year_basis": "leading heading year"
},
{
"year": 2020,
"official_heading": "2020 Conference on Empirical Methods in Natural Language Processing and 9th International Joint Conference on Natural Language Processing (EMNLP 2020)",
"year_basis": "leading heading year"
},
{
"year": 2019,
"official_heading": "2019 Conference on Empirical Methods in Natural Language Processing and 9th International Joint Conference on Natural Language Processing (EMNLP-IJCNLP 2019)",
"year_basis": "leading heading year"
},
{
"year": 2018,
"official_heading": "2018 Conference on Empirical Methods in Natural Language Processing (EMNLP 2018)",
"year_basis": "leading heading year"
},
{
"year": 2017,
"official_heading": "2017 Conference on Empirical Methods in Natural Language Processing (EMNLP 2015)",
"year_basis": "leading heading year"
},
{
"year": 2016,
"official_heading": "2016 Conference on Empirical Methods in Natural Language Processing (EMNLP 2015)",
"year_basis": "leading heading year"
},
{
"year": 2015,
"official_heading": "2015 Conference on Empirical Methods in Natural Language Processing (EMNLP 2015)",
"year_basis": "leading heading year"
},
{
"year": 2014,
"official_heading": "2014 Conference on Empirical Methods in Natural Language Processing (EMNLP 2014)",
"year_basis": "leading heading year"
},
{
"year": 2013,
"official_heading": "2013 Conference on Empirical Methods in Natural Language Processing (EMNLP 2013)",
"year_basis": "leading heading year"
},
{
"year": 2012,
"official_heading": "2012 Conference on Empirical Methods in Natural Language Processing and Computational Natural Language Learning (EMNLP-CoNLL 2012)",
"year_basis": "leading heading year"
},
{
"year": 2011,
"official_heading": "2011 Conference on Empirical Methods in Natural Language Processing (EMNLP 2011)",
"year_basis": "leading heading year"
},
{
"year": 2010,
"official_heading": "2010 Conference on Empirical Methods in Natural Language Processing (EMNLP 2010)",
"year_basis": "leading heading year"
},
{
"year": 2009,
"official_heading": "2009 Conference on Empirical Methods in Natural Language Processing (EMNLP 2009)",
"year_basis": "leading heading year"
},
{
"year": 2008,
"official_heading": "2008 Conference on Empirical Methods in Natural Language Processing (EMNLP 2008)",
"year_basis": "leading heading year"
},
{
"year": 2007,
"official_heading": "2007 Joint Conference on Empirical Methods in Natural Language Processing and Natural Langauge Learning (EMNLP-CoNLL 2007)",
"year_basis": "leading heading year"
},
{
"year": 2006,
"official_heading": "2006 Conference on Empirical Methods in Natural Language Processing (EMNLP 2006)",
"year_basis": "leading heading year"
},
{
"year": 2005,
"official_heading": "2005 Joint Conference on Human Language Technology and Empirical Methods in Natural Language Processing (HLT-EMNLP 2005)",
"year_basis": "leading heading year"
},
{
"year": 2004,
"official_heading": "2004 Conference on Empirical Methods in Natural Language Processing (EMNLP 2004)",
"year_basis": "leading heading year"
},
{
"year": 2003,
"official_heading": "2003 Conference on Empirical Methods in Natural Language Processing (EMNLP 2003)",
"year_basis": "leading heading year"
},
{
"year": 2002,
"official_heading": "2002 Conference on Empirical Methods in Natural Language Processing (EMNLP 2002)",
"year_basis": "leading heading year"
},
{
"year": 2001,
"official_heading": "2001 Conference on Empirical Methods in Natural Language Processing (EMNLP 2001)",
"year_basis": "leading heading year"
},
{
"year": 2000,
"official_heading": "2000 Joint SIGDAT Conference on Empirical Methods in NLP and Very Large Corpora (EMNLP/VLC 2000)",
"year_basis": "leading heading year"
},
{
"year": 1999,
"official_heading": "1999 Joint SIGDAT Conference on Empirical Methods in NLP and Very Large Corpora (EMNLP/VLC 1999)",
"year_basis": "leading heading year"
},
{
"year": 1998,
"official_heading": "3rd Conference on Empirical Methods in Natural Language Processing (EMNLP-3)",
"year_basis": "dated body following numbered/first EMNLP heading"
},
{
"year": 1997,
"official_heading": "2nd Conference on Empirical Methods in Natural Language Processing (EMNLP-2)",
"year_basis": "dated body following numbered/first EMNLP heading"
},
{
"year": 1996,
"official_heading": "First Conference on Empirical Methods in Natural Language Processing",
"year_basis": "dated body following numbered/first EMNLP heading"
}
],
"related_event_headings_excluded_from_emnlp_year_count": [
"Sixth Workshop on Very Large Corpora (WVLC-6)",
"Fifth Workshop on Very Large Corpora (WVLC-5) - August 18-20, 1997",
"Fourth Workshop on Very Large Corpora (WVLC-4) at COLING-96",
"Third Workshop on Very Large Corpora (WVLC-3) at ACL-95",
"EACL-95 SIGDAT Workshop: From Text to Tags",
"Second Workshop on Very Large Corpora (WVLC-2) at COLING-94 (Kyoto)",
"First Workshop on Very Large Corpora (WVLC-1) at ACL-93 (Columbus, Ohio)"
],
"archive_links": [
{
"text": "SIGDAT",
"url": "https://sigdat.org/"
},
{
"text": "About",
"url": "https://sigdat.org/about"
},
{
"text": "Organization",
"url": "https://sigdat.org/organization"
},
{
"text": "Constitution",
"url": "https://sigdat.org/constitution"
},
{
"text": "Information",
"url": "https://sigdat.org/information"
},
{
"text": "Calls",
"url": "https://sigdat.org/calls/bids2025"
},
{
"text": "Videos",
"url": "https://sigdat.org/videos"
},
{
"text": "Past Events",
"url": "https://sigdat.org/events"
},
{
"text": "Website",
"url": "https://2026.emnlp.org"
},
{
"text": "Website",
"url": "https://2025.emnlp.org"
},
{
"text": "Proceedings",
"url": "https://aclanthology.org/events/emnlp-2025/"
},
{
"text": "Website",
"url": "https://2024.emnlp.org"
},
{
"text": "Proceedings",
"url": "https://aclanthology.org/events/emnlp-2024/"
},
{
"text": "Website",
"url": "https://2023.emnlp.org/"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2023/"
},
{
"text": "Website",
"url": "https://2022.emnlp.org/"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2022/"
},
{
"text": "Website",
"url": "https://2021.emnlp.org/"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2021/"
},
{
"text": "Website",
"url": "https://2020.emnlp.org/"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2020/"
},
{
"text": "Website",
"url": "https://2020.emnlp.org/"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2020/"
},
{
"text": "Website",
"url": "https://www.emnlp-ijcnlp2019.org"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2019/"
},
{
"text": "Website",
"url": "https://2018.emnlp.org/"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2018/"
},
{
"text": "Website",
"url": "http://www.emnlp2017.net"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2017/"
},
{
"text": "Website",
"url": "https://www.aclweb.org/mirror/emnlp2016/"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2016/"
},
{
"text": "Culturgest",
"url": "http://www.culturgest.pt/"
},
{
"text": "Website",
"url": "http://www.emnlp2015.org"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2015/"
},
{
"text": "Website",
"url": "http://www.emnlp2014.org"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2014/"
},
{
"text": "Website",
"url": "http://hum.csse.unimelb.edu.au/emnlp2013/"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2013/"
},
{
"text": "Poster",
"url": "http://www.cs.jhu.edu/~yarowsky/EMNLP-CoNLL-2012.jpg"
},
{
"text": "Website",
"url": "http://emnlp-conll2012.unige.ch/"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2012/"
},
{
"text": "Poster",
"url": "http://www.cs.jhu.edu/~yarowsky/emnlp-2011.jpg"
},
{
"text": "Website",
"url": "http://conferences.inf.ed.ac.uk/emnlp2011/"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2011/"
},
{
"text": "Website",
"url": "http://www.lsi.upc.edu/events/emnlp2010/"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2010/"
},
{
"text": "Website",
"url": "http://conferences.inf.ed.ac.uk/emnlp09/"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2009/"
},
{
"text": "Website",
"url": "http://conferences.inf.ed.ac.uk/emnlp08/"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2008/"
},
{
"text": "Website",
"url": "http://cs.jhu.edu/EMNLP-CoNLL-2007/"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2007/"
},
{
"text": "Website",
"url": "http://nlp.stanford.edu/emnlp06"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2006/"
},
{
"text": "Website",
"url": "http://www.cs.utexas.edu/~ml/HLT-EMNLP05"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2005/"
},
{
"text": "Website",
"url": "https://web.archive.org/web/20041208220224/http://www.cs.ualberta.ca/~lindek/emnlp04"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2004/"
},
{
"text": "Website",
"url": "https://web.archive.org/web/20031203134359/http://www.ai.mit.edu/people/mcollins/emnlp03.html"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2003/"
},
{
"text": "Website",
"url": "https://web.archive.org/web/20021209092212/http://ufal.ms.mff.cuni.cz/~hajic/emnlp02/"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2002/"
},
{
"text": "Website",
"url": "https://web.archive.org/web/20011101075859/http://www.cs.cornell.edu/home/llee/emnlp.html"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2001/"
},
{
"text": "Program",
"url": "https://web.archive.org/web/20011128122922/http://www-csli.stanford.edu/~schuetze/finalprogram.html"
},
{
"text": "Call for papers",
"url": "https://web.archive.org/web/20011128105606/http://www-csli.stanford.edu/~schuetze/emnlp-vlc2000.html"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-2000/"
},
{
"text": "Program",
"url": "https://web.archive.org/web/20001208024200/http://www.ee.ust.hk:80/~pascale/emnlpwvlc99_program.html"
},
{
"text": "Call for papers",
"url": "https://web.archive.org/web/20001014101735/http://www.ee.ust.hk:80/~pascale/emnlpwvlc99-final.html"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-1999/"
},
{
"text": "Program",
"url": "https://web.archive.org/web/19990429022549/http://coling-acl98.iro.umontreal.ca/WVLC6_prog.en.html"
},
{
"text": "Registration",
"url": "https://web.archive.org/web/19991106060156/http://coling-acl98.iro.umontreal.ca/Fees.en.html"
},
{
"text": "Call for papers",
"url": "https://web.archive.org/web/19991103110053/http://www.cs.jhu.edu/~yarowsky/wvlc6.html"
},
{
"text": "Program",
"url": "https://web.archive.org/web/19990225093521/http://www.cs.vassar.edu/~ide/papers.html"
},
{
"text": "Registration",
"url": "https://web.archive.org/web/19990504092315/http://www.cs.vassar.edu/~ide/registration.html"
},
{
"text": "Call for papers",
"url": "https://web.archive.org/web/19990429050846/http://www.cs.vassar.edu/~ide/emnlp3.html"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-1998/"
},
{
"text": "Program",
"url": "https://web.archive.org/web/19970805000114/http://www.cs.cornell.edu/Info/People/cardie/emnlp2.html"
},
{
"text": "Registration",
"url": "https://web.archive.org/web/19970805000114/http://www.cs.cornell.edu/Info/People/cardie/emnlp2.html"
},
{
"text": "Call for papers",
"url": "https://web.archive.org/web/19970805000114/http://www.cs.cornell.edu/Info/People/cardie/emnlp2.html"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/events/emnlp-1997/"
},
{
"text": "Program",
"url": "https://web.archive.org/web/19991104192207/http://www.lexis-nexis.com:80/WVLC-5/final.html"
},
{
"text": "Registration",
"url": "https://web.archive.org/web/19991010145622/http://www.lexis-nexis.com:80/WVLC-5/regform.html"
},
{
"text": "Call for papers",
"url": "https://web.archive.org/web/19991010072858/http://www.lexis-nexis.com:80/WVLC-5/2ndpap.html"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/W/W97/#0100"
},
{
"text": "Program",
"url": "https://web.archive.org/web/19990218074412/http://www.ling.umu.se:80/WVLC-4/program.html"
},
{
"text": "Registration",
"url": "https://web.archive.org/web/19991014043712/http://www.ling.umu.se:80/WVLC-4/coling-reg.txt"
},
{
"text": "Call for papers",
"url": "https://web.archive.org/web/19991014033008/http://www.ling.umu.se:80/WVLC-4/2ndcfp.html"
},
{
"text": "Proceedings",
"url": "http://www.aclweb.org/anthology/W/W96/#0100/"
},
{
"text": "Program",
"url": "https://web.archive.org/web/20010609141717/http://www.cis.upenn.edu:80/~yarowsky/Conf_on_Emp_Meth.html"
},
{
"text": "Proceedings",
"url": "http://www.aclweb.org/anthology/W/W96/#0200/"
},
{
"text": "Program & Registration",
"url": "https://web.archive.org/web/20010606230356/http://www.cis.upenn.edu:80/~yarowsky/wvlc3.html"
},
{
"text": "Call for papers",
"url": "https://web.archive.org/web/20010609145326/http://www.cis.upenn.edu:80/~yarowsky/wvlc3_cfp.html"
},
{
"text": "Proceedings",
"url": "https://www.aclweb.org/anthology/W/W95/#0100"
},
{
"text": "Program",
"url": "https://web.archive.org/web/20010609143300/http://www.cis.upenn.edu:80/~yarowsky/eacl_sigdat_prog.html"
},
{
"text": "Registration",
"url": "https://web.archive.org/web/20010408030721/http://www.cis.upenn.edu:80/~yarowsky/eacl_sigdat_reg.html"
},
{
"text": "Call for papers",
"url": "https://web.archive.org/web/20010406122325/http://www.cis.upenn.edu:80/~yarowsky/eacl_sigdat_cfp.html"
},
{
"text": "Feed",
"url": "https://sigdat.org/feed.xml"
},
{
"text": "Jekyll",
"url": "https://jekyllrb.com"
},
{
"text": "Minimal Mistakes",
"url": "https://mademistakes.com/work/minimal-mistakes-jekyll-theme/"
}
],
"source_issues": [
"2024/2025 headings retain parenthetical EMNLP 2023; use leading year only for edition enumeration, not as repaired source text.",
"2026 heading lists a 2023 date; event dates remain untrusted here.",
"2016/2017 headings retain parenthetical EMNLP 2015.",
"2020 appears twice, one entry retaining 9th IJCNLP text; count one EMNLP year and do not create a new joint event from this typo.",
"2023 location disagrees with the actual EMNLP2023 official homepage (Singapore); do not import history-page locations."
],
"scope": "Year enumeration only, preserving joint edition headings and separate WVLC events. Dates/locations/parenthetical labels contain source conflicts and are not imported as metadata. No per-track/paper or negative completeness claim."
}
@@ -0,0 +1,70 @@
{
"source_url": "https://facctconference.org/",
"resolved_url": "https://facctconference.org/",
"http_status": 200,
"checked_at": "2026-11-08T11:37:54.104171+00:00",
"source_html_sha256": "dfe181a34da6ac39e456440e85014625c9a0d6295cf73a19fab5585abe34c81d",
"cutoff_year": 2026,
"expected_years": [
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027
],
"editions": [
{
"year": 2018,
"source_label": "FAT*2018 New York",
"source_url": "https://facctconference.org/2018/index.html"
},
{
"year": 2019,
"source_label": "FAT*2019 Atlanta",
"source_url": "https://facctconference.org/2019/index.html"
},
{
"year": 2020,
"source_label": "FAT*2020 Barcelona",
"source_url": "https://facctconference.org/2020/index.html"
},
{
"year": 2021,
"source_label": "FAccT 2021 Online",
"source_url": "https://facctconference.org/2021/index.html"
},
{
"year": 2022,
"source_label": "Home",
"source_url": "https://facctconference.org/2022/index.html"
},
{
"year": 2023,
"source_label": "Home",
"source_url": "https://facctconference.org/2023/index.html"
},
{
"year": 2024,
"source_label": "Home",
"source_url": "https://facctconference.org/2024/index.html"
},
{
"year": 2025,
"source_label": "Home",
"source_url": "https://facctconference.org/2025/index.html"
},
{
"year": 2026,
"source_label": "Home",
"source_url": "https://facctconference.org/2026/index.html"
}
],
"scope": "Nine actual linked conference years, not annual interpolation. Preserve FAT* labels for 2018–2020 and FAccT from 2021. Earlier FATML workshops are not extra FAccT main conferences. Archival and non-archival acceptances, CRAFTs, tutorials and doctoral events require separate scope; no per-paper completeness or public rejection export claimed."
}
@@ -0,0 +1,128 @@
{
"checked_on": "2026-11-08",
"scope": "Four bounded2026trackchecks, no individualnegativeexport orDBwrite. Unknowndoesnotmeanprivateforeverorzerorecords.",
"checks": [
{
"venue": "CIKM",
"year": 2026,
"track": "full_research",
"status": "unknown",
"primary_url": "https://cikm2026.diag.uniroma1.it/full-research-papers/",
"checked_on": "2026-11-08",
"note": "官方Full Research与通用政策使用EasyChair、双盲、作者审稿义务及desk rejection规则;未确认会后逐篇拒稿元数据公开范围。各short/applied/resource/demo/industry轨道不自动继承相同公开范围。",
"evidence": [
{
"source_url": "https://cikm2026.diag.uniroma1.it/full-research-papers/",
"resolved_url": "https://cikm2026.diag.uniroma1.it/full-research-papers/",
"http_status": 200,
"checked_at": "2026-11-08T12:07:43.733817+00:00",
"source_sha256": "c3b6ae0e7160ab0b3d972537aecb0997d2ba7b0577b3b8d09f74d8f7e30a2fcb",
"source_html_sha256": "c3b6ae0e7160ab0b3d972537aecb0997d2ba7b0577b3b8d09f74d8f7e30a2fcb"
},
{
"source_url": "https://cikm2026.diag.uniroma1.it/policies-and-information/",
"resolved_url": "https://cikm2026.diag.uniroma1.it/policies-and-information/",
"http_status": 200,
"checked_at": "2026-11-08T12:06:35.159771+00:00",
"source_sha256": "0a89aad73fb2b95558c251e61fcb7507d350d71f85b0d0f4f6d8297e30743118",
"source_html_sha256": "0a89aad73fb2b95558c251e61fcb7507d350d71f85b0d0f4f6d8297e30743118"
}
]
},
{
"venue": "ICDM",
"year": 2026,
"track": "research",
"status": "unknown",
"primary_url": "https://icdm2026.neu.edu.cn/CallforResearchTrack/",
"checked_on": "2026-11-08",
"note": "官方Research使用CyberChair及triple-blind,超长稿件不送审;三盲包含评审之间与AC的身份隐藏,不能概括为普通双盲。既有预印本可保留不代表公开最终拒稿,实际会后负面元数据发布范围仍未确认。",
"evidence": [
{
"source_url": "https://icdm2026.neu.edu.cn/CallforResearchTrack/",
"resolved_url": "https://icdm2026.neu.edu.cn/CallforResearchTrack/",
"http_status": 200,
"checked_at": "2026-11-08T12:07:39.969872+00:00",
"source_sha256": "12803953314a3f4165108cf3f95d6d3c678d6d3a3dd9a24cdc28dabd6abda446",
"source_html_sha256": "12803953314a3f4165108cf3f95d6d3c678d6d3a3dd9a24cdc28dabd6abda446"
}
]
},
{
"venue": "SDM",
"year": 2026,
"track": "main",
"status": "unknown",
"primary_url": "https://www.siam.org/conferences-events/siam-conferences/sdm26/submissions/",
"checked_on": "2026-11-08",
"note": "官方说明三盲、OpenReview及desk rejection规则;核查时会议尚未举行。公开group配置的public_submissions/public_withdrawn_submissions/public_desk_rejected_submissions均false;一次根venueid匿名notes查询403,未获得逐篇记录。查询不等于完整拒稿出口检查,不能把403说成零条,未来会后公开范围仍unknown。",
"evidence": [
{
"source_url": "https://www.siam.org/conferences-events/siam-conferences/sdm26/submissions/",
"checked_at": "2026-11-08T12:10:20.249437+00:00",
"source_representation": "first_party_page_text_returned_by_web_tool",
"source_html_sha256": null,
"source_extract_sha256": "34abd19290f2b0539b28be04867c9bc5540266fd6cd77b2ce04481c027b4ef87",
"direct_fetch": {
"source_url": "https://www.siam.org/conferences-events/siam-conferences/sdm26/submissions/",
"error": "HTTP Error 403: Forbidden",
"checked_at": "2026-11-08T12:07:40.123155+00:00"
}
},
{
"source_url": "https://api2.openreview.net/groups?id=SIAM.org%2F2026%2FConference_on_Data_Mining",
"resolved_url": "https://api2.openreview.net/groups?id=SIAM.org%2F2026%2FConference_on_Data_Mining",
"http_status": 200,
"checked_at": "2026-11-08T12:07:42.385042+00:00",
"source_sha256": "8aecd0bc5cf2ae980bab011e0454d4307f1426b2779018a619e4459ec4dad724"
},
{
"source_url": "https://api2.openreview.net/notes?content.venueid=SIAM.org%2F2026%2FConference_on_Data_Mining&limit=1",
"error": "HTTP Error 403: Forbidden",
"checked_at": "2026-11-08T12:07:43.286510+00:00"
}
]
},
{
"venue": "ECML-PKDD",
"year": 2026,
"track": "applied_data_science",
"status": "unknown",
"primary_url": "https://ecmlpkdd.org/2026/submissions-ads-track/",
"checked_on": "2026-11-08",
"note": "官方ADS采用CMT、双盲、Springer LNCS,并说明不在轨道间重新分配稿件;鼓励公开代码数据与可复现性,不等于公开投稿/拒稿决定。Research、journal、demo、workshop等轨道另查,不能由ADS推断全会公开范围。",
"evidence": [
{
"source_url": "https://ecmlpkdd.org/2026/submissions-ads-track/",
"resolved_url": "https://ecmlpkdd.org/2026/submissions-ads-track/",
"http_status": 200,
"checked_at": "2026-11-08T12:07:42.127752+00:00",
"source_sha256": "84308422cd240bd2ca63f4a316cbd60507f4b1b4d2b8f474cbd131d18e77ead8",
"source_html_sha256": "84308422cd240bd2ca63f4a316cbd60507f4b1b4d2b8f474cbd131d18e77ead8"
}
]
}
],
"sdm2026_anonymous_access_check": {
"group_id": "SIAM.org/2026/Conference_on_Data_Mining",
"public_flags_at_check": {
"public_submissions": false,
"public_withdrawn_submissions": false,
"public_desk_rejected_submissions": false
},
"group_receipt": {
"source_url": "https://api2.openreview.net/groups?id=SIAM.org%2F2026%2FConference_on_Data_Mining",
"resolved_url": "https://api2.openreview.net/groups?id=SIAM.org%2F2026%2FConference_on_Data_Mining",
"http_status": 200,
"checked_at": "2026-11-08T12:07:42.385042+00:00",
"source_sha256": "8aecd0bc5cf2ae980bab011e0454d4307f1426b2779018a619e4459ec4dad724"
},
"notes_query_receipt": {
"source_url": "https://api2.openreview.net/notes?content.venueid=SIAM.org%2F2026%2FConference_on_Data_Mining&limit=1",
"error": "HTTP Error 403: Forbidden",
"checked_at": "2026-11-08T12:07:43.286510+00:00"
},
"query_scope": "Onecontent.venueid=rootgroup query, limit1; did not query specificRejected_Submissionvenueid or claimcompleteexport. Noauthnobypass.",
"interpretation": "Publicgroupconfigurationreadable; notesrequest403. Notzero, notproofallhistorical/futureSDMnegativepublicationpolicy."
}
}
@@ -0,0 +1,425 @@
{
"source_url": "https://www.icaps-conference.org/conference-series/",
"resolved_url": "https://www.icaps-conference.org/conference-series/",
"checked_at": "2026-11-08T10:03:01.651775+00:00",
"source_sha256": "de1d217660cb819825f58112cdaf774d0f68da6ed87e3e90a59055e52f152081",
"expected_years": [
1990,
1991,
1992,
1993,
1994,
1995,
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027
],
"editions": [
{
"name": "ICAPS",
"year": 2026,
"label": "ICAPS 2026",
"url": "https://www.icaps-conference.org/conference/icaps-2026/"
},
{
"name": "ICAPS",
"year": 2025,
"label": "ICAPS 2025",
"url": "https://www.icaps-conference.org/conference/icaps-2025/"
},
{
"name": "ICAPS",
"year": 2024,
"label": "ICAPS 2024",
"url": "https://www.icaps-conference.org/conference/icaps-2024/"
},
{
"name": "ICAPS",
"year": 2023,
"label": "ICAPS 2023",
"url": "https://www.icaps-conference.org/conference/icaps-2023/"
},
{
"name": "ICAPS",
"year": 2022,
"label": "ICAPS 2022",
"url": "https://www.icaps-conference.org/conference/icaps-2022/"
},
{
"name": "ICAPS",
"year": 2021,
"label": "ICAPS 2021",
"url": "https://www.icaps-conference.org/conference/icaps-2021/"
},
{
"name": "ICAPS",
"year": 2020,
"label": "ICAPS 2020",
"url": "https://www.icaps-conference.org/conference/icaps-2020/"
},
{
"name": "ICAPS",
"year": 2019,
"label": "ICAPS 2019",
"url": "https://www.icaps-conference.org/conference/icaps-2019/"
},
{
"name": "ICAPS",
"year": 2018,
"label": "ICAPS 2018",
"url": "https://www.icaps-conference.org/conference/icaps-2018/"
},
{
"name": "ICAPS",
"year": 2017,
"label": "ICAPS 2017",
"url": "https://www.icaps-conference.org/conference/icaps-2017/"
},
{
"name": "ICAPS",
"year": 2016,
"label": "ICAPS 2016",
"url": "https://www.icaps-conference.org/conference/icaps-2016/"
},
{
"name": "ICAPS",
"year": 2015,
"label": "ICAPS 2015",
"url": "https://www.icaps-conference.org/conference/icaps-2015/"
},
{
"name": "ICAPS",
"year": 2014,
"label": "ICAPS 2014",
"url": "https://www.icaps-conference.org/conference/icaps-2014/"
},
{
"name": "ICAPS",
"year": 2013,
"label": "ICAPS 2013",
"url": "https://www.icaps-conference.org/conference/icaps-2013/"
},
{
"name": "ICAPS",
"year": 2012,
"label": "ICAPS 2012",
"url": "https://www.icaps-conference.org/conference/icaps-2012/"
},
{
"name": "ICAPS",
"year": 2011,
"label": "ICAPS 2011",
"url": "https://www.icaps-conference.org/conference/icaps-2011/"
},
{
"name": "ICAPS",
"year": 2010,
"label": "ICAPS 2010",
"url": "https://www.icaps-conference.org/conference/icaps-2010/"
},
{
"name": "ICAPS",
"year": 2009,
"label": "ICAPS 2009",
"url": "https://www.icaps-conference.org/conference/icaps-2009/"
},
{
"name": "ICAPS",
"year": 2008,
"label": "ICAPS 2008",
"url": "https://www.icaps-conference.org/conference/icaps-2008/"
},
{
"name": "ICAPS",
"year": 2007,
"label": "ICAPS 2007",
"url": "https://www.icaps-conference.org/conference/icaps-2007/"
},
{
"name": "ICAPS",
"year": 2006,
"label": "ICAPS 2006",
"url": "https://www.icaps-conference.org/conference/icaps-2006/"
},
{
"name": "ICAPS",
"year": 2005,
"label": "ICAPS 2005",
"url": "https://www.icaps-conference.org/conference/icaps-2005/"
},
{
"name": "ICAPS",
"year": 2004,
"label": "ICAPS 2004",
"url": "https://www.icaps-conference.org/conference/icaps-2004/"
},
{
"name": "ICAPS",
"year": 2003,
"label": "ICAPS 2003",
"url": "https://www.icaps-conference.org/conference/icaps-2003/"
},
{
"name": "AIPS",
"year": 2002,
"label": "AIPS 2002",
"url": "https://www.icaps-conference.org/conference/aips-2002/"
},
{
"name": "ECP",
"year": 2001,
"label": "ECP 2001",
"url": "https://www.icaps-conference.org/conference/ecp-2001/"
},
{
"name": "AIPS",
"year": 2000,
"label": "AIPS 2000",
"url": "https://www.icaps-conference.org/conference/aips-2000/"
},
{
"name": "ECP",
"year": 1999,
"label": "ECP 1999",
"url": "https://www.icaps-conference.org/conference/ecp-1999/"
},
{
"name": "AIPS",
"year": 1998,
"label": "AIPS 1998",
"url": "https://www.icaps-conference.org/conference/aips-1998/"
},
{
"name": "ECP",
"year": 1997,
"label": "ECP 1997",
"url": "https://www.icaps-conference.org/conference/1890/"
},
{
"name": "AIPS",
"year": 1996,
"label": "AIPS 1996",
"url": "https://www.icaps-conference.org/conference/aips-1996/"
},
{
"name": "EWSP",
"year": 1995,
"label": "EWSP 1995",
"url": "https://www.icaps-conference.org/conference/ewsp-1995/"
},
{
"name": "AIPS",
"year": 1994,
"label": "AIPS 1994",
"url": "https://www.icaps-conference.org/conference/aips-1994/"
},
{
"name": "EWSP",
"year": 1993,
"label": "EWSP 1993",
"url": "https://www.icaps-conference.org/conference/ewsp-1993/"
},
{
"name": "AIPS",
"year": 1992,
"label": "AIPS 1992",
"url": "https://www.icaps-conference.org/conference/aips-1992/"
},
{
"name": "EWSP",
"year": 1991,
"label": "EWSP 1991",
"url": "https://www.icaps-conference.org/conference/ewsp-1991/"
},
{
"name": "EPS",
"year": 1990,
"label": "EPS 1990",
"url": "https://www.icaps-conference.org/conference/eps-1990/"
}
],
"primary_name_years": [
2026,
2025,
2024,
2023,
2022,
2021,
2020,
2019,
2018,
2017,
2016,
2015,
2014,
2013,
2012,
2011,
2010,
2009,
2008,
2007,
2006,
2005,
2004,
2003
],
"predecessor_editions": [
{
"name": "AIPS",
"year": 2002,
"label": "AIPS 2002",
"url": "https://www.icaps-conference.org/conference/aips-2002/"
},
{
"name": "ECP",
"year": 2001,
"label": "ECP 2001",
"url": "https://www.icaps-conference.org/conference/ecp-2001/"
},
{
"name": "AIPS",
"year": 2000,
"label": "AIPS 2000",
"url": "https://www.icaps-conference.org/conference/aips-2000/"
},
{
"name": "ECP",
"year": 1999,
"label": "ECP 1999",
"url": "https://www.icaps-conference.org/conference/ecp-1999/"
},
{
"name": "AIPS",
"year": 1998,
"label": "AIPS 1998",
"url": "https://www.icaps-conference.org/conference/aips-1998/"
},
{
"name": "ECP",
"year": 1997,
"label": "ECP 1997",
"url": "https://www.icaps-conference.org/conference/1890/"
},
{
"name": "AIPS",
"year": 1996,
"label": "AIPS 1996",
"url": "https://www.icaps-conference.org/conference/aips-1996/"
},
{
"name": "EWSP",
"year": 1995,
"label": "EWSP 1995",
"url": "https://www.icaps-conference.org/conference/ewsp-1995/"
},
{
"name": "AIPS",
"year": 1994,
"label": "AIPS 1994",
"url": "https://www.icaps-conference.org/conference/aips-1994/"
},
{
"name": "EWSP",
"year": 1993,
"label": "EWSP 1993",
"url": "https://www.icaps-conference.org/conference/ewsp-1993/"
},
{
"name": "AIPS",
"year": 1992,
"label": "AIPS 1992",
"url": "https://www.icaps-conference.org/conference/aips-1992/"
},
{
"name": "EWSP",
"year": 1991,
"label": "EWSP 1991",
"url": "https://www.icaps-conference.org/conference/ewsp-1991/"
},
{
"name": "EPS",
"year": 1990,
"label": "EPS 1990",
"url": "https://www.icaps-conference.org/conference/eps-1990/"
}
],
"collector_scope_gaps": [
{
"name": "ECP",
"year": 2001,
"label": "ECP 2001",
"url": "https://www.icaps-conference.org/conference/ecp-2001/"
},
{
"name": "ECP",
"year": 1999,
"label": "ECP 1999",
"url": "https://www.icaps-conference.org/conference/ecp-1999/"
},
{
"name": "ECP",
"year": 1997,
"label": "ECP 1997",
"url": "https://www.icaps-conference.org/conference/1890/"
},
{
"name": "EWSP",
"year": 1995,
"label": "EWSP 1995",
"url": "https://www.icaps-conference.org/conference/ewsp-1995/"
},
{
"name": "EWSP",
"year": 1993,
"label": "EWSP 1993",
"url": "https://www.icaps-conference.org/conference/ewsp-1993/"
},
{
"name": "EWSP",
"year": 1991,
"label": "EWSP 1991",
"url": "https://www.icaps-conference.org/conference/ewsp-1991/"
},
{
"name": "EPS",
"year": 1990,
"label": "EPS 1990",
"url": "https://www.icaps-conference.org/conference/eps-1990/"
}
],
"scope": "Official combined family directory:24ICAPSnamededitions2003–2026 plus13namedpredecessors1990–2002. Preserve AIPS/ECP/EWSP/EPS labels, never rename their paper metadata to ICAPS. Existing collector only maps aips/icaps; ECP-lineage entries identify extra scope/data gaps needing separate follow-up. Year census is not a claim those papers are imported.",
"cutoff_year": 2026,
"source_html_sha256": "de1d217660cb819825f58112cdaf774d0f68da6ed87e3e90a59055e52f152081"
}
@@ -0,0 +1,392 @@
{
"source_url": "https://signalprocessingsociety.org/sites/default/files/uploads/conferences_events/docs/ICASSP_Proposal_Guidelines.pdf",
"resolved_url": "https://signalprocessingsociety.org/sites/default/files/uploads/conferences_events/docs/ICASSP_Proposal_Guidelines.pdf",
"http_status": 200,
"checked_at": "2026-11-08T11:44:10.502686+00:00",
"source_sha256": "3974cf5173ef4cbb55a729a6b605538ef81a48ce637d3e3caaaafe021357af69",
"source_representation": "official_pdf_table_page_1_visually_verified",
"source_html_sha256": null,
"source_pdf_sha256": "3974cf5173ef4cbb55a729a6b605538ef81a48ce637d3e3caaaafe021357af69",
"text_extract_sha256": "6eb7ae7f242c188fbec1f6c4948c88498903ff37d4cfaeef445cbcc7e8870e6d",
"cutoff_year": 2026,
"expected_years": [
1976,
1977,
1978,
1979,
1980,
1981,
1982,
1983,
1984,
1985,
1986,
1987,
1988,
1989,
1990,
1991,
1992,
1993,
1994,
1995,
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027,
2028,
2029
],
"editions": [
{
"year": 1976,
"source_label": "ICASSP 1976",
"location_label": "Philadelphia, PA, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 1977,
"source_label": "ICASSP 1977",
"location_label": "Hartford, CT, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 1978,
"source_label": "ICASSP 1978",
"location_label": "Tulsa, OK, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 1979,
"source_label": "ICASSP 1979",
"location_label": "Washington, DC, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 1980,
"source_label": "ICASSP 1980",
"location_label": "Denver, CO, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 1981,
"source_label": "ICASSP 1981",
"location_label": "Atlanta, GA, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 1982,
"source_label": "ICASSP 1982",
"location_label": "Paris, France",
"physical_event_status": "not_independently_classified"
},
{
"year": 1983,
"source_label": "ICASSP 1983",
"location_label": "Boston, MA, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 1984,
"source_label": "ICASSP 1984",
"location_label": "San Diego, CA, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 1985,
"source_label": "ICASSP 1985",
"location_label": "Tampa, FL, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 1986,
"source_label": "ICASSP 1986",
"location_label": "Tokyo, Japan",
"physical_event_status": "not_independently_classified"
},
{
"year": 1987,
"source_label": "ICASSP 1987",
"location_label": "Dallas, TX, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 1988,
"source_label": "ICASSP 1988",
"location_label": "New York, NY, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 1989,
"source_label": "ICASSP 1989",
"location_label": "Glasgow, Scotland",
"physical_event_status": "not_independently_classified"
},
{
"year": 1990,
"source_label": "ICASSP 1990",
"location_label": "Albuquerque, NM, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 1991,
"source_label": "ICASSP 1991",
"location_label": "Toronto, ON, Canada",
"physical_event_status": "not_independently_classified"
},
{
"year": 1992,
"source_label": "ICASSP 1992",
"location_label": "San Francisco, CA, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 1993,
"source_label": "ICASSP 1993",
"location_label": "Minneapolis, MN, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 1994,
"source_label": "ICASSP 1994",
"location_label": "Adelaide, Australia",
"physical_event_status": "not_independently_classified"
},
{
"year": 1995,
"source_label": "ICASSP 1995",
"location_label": "Detroit, MI, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 1996,
"source_label": "ICASSP 1996",
"location_label": "Atlanta, GA, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 1997,
"source_label": "ICASSP 1997",
"location_label": "Munich, Germany",
"physical_event_status": "not_independently_classified"
},
{
"year": 1998,
"source_label": "ICASSP 1998",
"location_label": "Seattle, WA, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 1999,
"source_label": "ICASSP 1999",
"location_label": "Phoenix, AZ, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 2000,
"source_label": "ICASSP 2000",
"location_label": "Istanbul, Turkey",
"physical_event_status": "not_independently_classified"
},
{
"year": 2001,
"source_label": "ICASSP 2001",
"location_label": "Salt Lake City, UT, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 2002,
"source_label": "ICASSP 2002",
"location_label": "Orlando, FL, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 2003,
"source_label": "ICASSP 2003",
"location_label": "Hong Kong (cancelled)",
"physical_event_status": "cancelled_as_marked_by_society"
},
{
"year": 2004,
"source_label": "ICASSP 2004",
"location_label": "Montreal, QC, Canada",
"physical_event_status": "not_independently_classified"
},
{
"year": 2005,
"source_label": "ICASSP 2005",
"location_label": "Philadelphia, PA, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 2006,
"source_label": "ICASSP 2006",
"location_label": "Toulouse, France",
"physical_event_status": "not_independently_classified"
},
{
"year": 2007,
"source_label": "ICASSP 2007",
"location_label": "Honolulu, HI, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 2008,
"source_label": "ICASSP 2008",
"location_label": "Las Vegas, NV, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 2009,
"source_label": "ICASSP 2009",
"location_label": "Taipei, Taiwan",
"physical_event_status": "not_independently_classified"
},
{
"year": 2010,
"source_label": "ICASSP 2010",
"location_label": "Dallas, TX, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 2011,
"source_label": "ICASSP 2011",
"location_label": "Prague, Czech Republic",
"physical_event_status": "not_independently_classified"
},
{
"year": 2012,
"source_label": "ICASSP 2012",
"location_label": "Kyoto, Japan",
"physical_event_status": "not_independently_classified"
},
{
"year": 2013,
"source_label": "ICASSP 2013",
"location_label": "Vancouver, BC, Canada",
"physical_event_status": "not_independently_classified"
},
{
"year": 2014,
"source_label": "ICASSP 2014",
"location_label": "Florence, Italy",
"physical_event_status": "not_independently_classified"
},
{
"year": 2015,
"source_label": "ICASSP 2015",
"location_label": "Brisbane, Australia",
"physical_event_status": "not_independently_classified"
},
{
"year": 2016,
"source_label": "ICASSP 2016",
"location_label": "Shanghai, China",
"physical_event_status": "not_independently_classified"
},
{
"year": 2017,
"source_label": "ICASSP 2017",
"location_label": "New Orleans, LA, USA",
"physical_event_status": "not_independently_classified"
},
{
"year": 2018,
"source_label": "ICASSP 2018",
"location_label": "Calgary, AB, Canada",
"physical_event_status": "not_independently_classified"
},
{
"year": 2019,
"source_label": "ICASSP 2019",
"location_label": "Brighton, UK",
"physical_event_status": "not_independently_classified"
},
{
"year": 2020,
"source_label": "ICASSP 2020",
"location_label": "Virtual, Formerly, Barcelona, Spain",
"physical_event_status": "not_independently_classified"
},
{
"year": 2021,
"source_label": "ICASSP 2021",
"location_label": "Virtual, Formerly Toronto, ON, Canada",
"physical_event_status": "not_independently_classified"
},
{
"year": 2022,
"source_label": "ICASSP 2022",
"location_label": "Singapore, Singapore",
"physical_event_status": "not_independently_classified"
},
{
"year": 2023,
"source_label": "ICASSP 2023",
"location_label": "Kos Island, Greece",
"physical_event_status": "not_independently_classified"
},
{
"year": 2024,
"source_label": "ICASSP 2024",
"location_label": "Seoul, Korea",
"physical_event_status": "not_independently_classified"
},
{
"year": 2025,
"source_label": "ICASSP 2025",
"location_label": "Hyderabad, India",
"physical_event_status": "not_independently_classified"
},
{
"year": 2026,
"source_label": "ICASSP 2026",
"location_label": "Barcelona, Spain",
"physical_event_status": "not_independently_classified"
}
],
"publication_evidence_for_cancelled_event": {
"year": 2003,
"source": {
"source_url": "https://api.crossref.org/works/10.1109/ICASSP.2003.1201769",
"resolved_url": "https://api.crossref.org/works/10.1109/ICASSP.2003.1201769",
"checked_at": "2026-11-08T11:47:39.032775+00:00",
"source_sha256": "ccf299df282642b9c5f5a4ce4080fe02d1da1ad1612b1466e6e927e4779cb473"
},
"doi": "10.1109/icassp.2003.1201769",
"publisher": "IEEE",
"container_title": "2003 IEEE International Conference on Acoustics, Speech, and Signal Processing, 2003. Proceedings. (ICASSP '03).",
"interpretation": "Publisher-deposited DOI record confirms a proceedings article exists. Cancellation of the physical event does not justify deleting publications or classifying papers as rejected."
},
"scope": "51 explicitly listed edition years1976–2026, including 2003 marked cancelled; this is not a claim that51inpersonmeetingsoccurred. Future2027/2028/2029 excluded. Keep virtual2020/2021 labels.1977is an explicit official entry missing in the fixed DB snapshot, not interpolated. Multiple volumes, main/special sessions, OJSP journal papers and no-show publication status need independent per-paper checks."
}
+153
View File
@@ -0,0 +1,153 @@
{
"source_url": "https://www.thecvf.com/?page_id=100",
"resolved_url": "https://www.thecvf.com/?page_id=100",
"http_status": 200,
"checked_at": "2026-11-08T10:47:26.989521+00:00",
"source_sha256": "59b10db1ad99b8e47871bea22c5739310ce02294d6b34e5a0665bd7b32d1ed64",
"source_html_sha256": "59b10db1ad99b8e47871bea22c5739310ce02294d6b34e5a0665bd7b32d1ed64",
"cutoff_year": 2026,
"expected_years": [
1987,
1988,
1990,
1993,
1995,
1998,
1999,
2001,
2003,
2005,
2007,
2009,
2011,
2013,
2015,
2017,
2019,
2021,
2023,
2025
],
"excluded_future_years": [
2027,
2029,
2031
],
"editions": [
{
"year": 2025,
"location_label": "Honolulu",
"links": [
"https://openaccess.thecvf.com/ICCV2025"
]
},
{
"year": 2023,
"location_label": "Paris",
"links": [
"https://openaccess.thecvf.com/ICCV2023"
]
},
{
"year": 2021,
"location_label": "Virtual",
"links": [
"https://openaccess.thecvf.com/ICCV2021"
]
},
{
"year": 2019,
"location_label": "Seoul",
"links": [
"http://openaccess.thecvf.com/ICCV2019.py"
]
},
{
"year": 2017,
"location_label": "Venice",
"links": [
"http://openaccess.thecvf.com/ICCV2017.py"
]
},
{
"year": 2015,
"location_label": "Santiago",
"links": [
"http://openaccess.thecvf.com/ICCV2015.py"
]
},
{
"year": 2013,
"location_label": "Sydney",
"links": [
"http://openaccess.thecvf.com/ICCV2013.py"
]
},
{
"year": 2011,
"location_label": "Barcelona",
"links": []
},
{
"year": 2009,
"location_label": "Kyoto",
"links": []
},
{
"year": 2007,
"location_label": "Rio de Janeiro",
"links": []
},
{
"year": 2005,
"location_label": "Beijing",
"links": []
},
{
"year": 2003,
"location_label": "Nice",
"links": []
},
{
"year": 2001,
"location_label": "Vancouver",
"links": []
},
{
"year": 1999,
"location_label": "Kerkyra",
"links": []
},
{
"year": 1998,
"location_label": "Bombay",
"links": []
},
{
"year": 1995,
"location_label": "Boston",
"links": []
},
{
"year": 1993,
"location_label": "Berlin",
"links": []
},
{
"year": 1990,
"location_label": "Osaka",
"links": []
},
{
"year": 1988,
"location_label": "Tampa",
"links": []
},
{
"year": 1987,
"location_label": "London",
"links": []
}
],
"scope": "Explicit rows from CVFcomprehensivepast/futureconference table, filteredat2026; notfirst/lastyear interpolation. Multiple proceedingsvolumes,tracksandfuturebidsdonotcreateextraeventyears. Doesnotproveperpaper/track/abstract/publicnegativecompleteness. Includes actual1988/1990/1998 entries; do notforceallhistoricaleditionsintooddyears orcreate2026.2027/2029/2031futureentriesexcluded."
}
+179
View File
@@ -0,0 +1,179 @@
{
"source_url": "https://icdm.zhonghuapu.com/main.shtml",
"resolved_url": "https://icdm.zhonghuapu.com/main.shtml",
"http_status": 200,
"checked_at": "2026-11-08T12:06:31.460027+00:00",
"source_sha256": "2ee351a898264b028f5d166d63e288149e86f569fb3d2b1d6574af7d63033e0a",
"source_html_sha256": "2ee351a898264b028f5d166d63e288149e86f569fb3d2b1d6574af7d63033e0a",
"cutoff_year": 2026,
"expected_years": [
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027,
2028,
2029
],
"editions": [
{
"year": 2001,
"source_label": "ICDM 2001",
"dates_location_label": "(11/29-12/02) San Jose, California, USA"
},
{
"year": 2002,
"source_label": "ICDM 2002",
"dates_location_label": "(12/09-12/12) Maebashi City, Japan"
},
{
"year": 2003,
"source_label": "ICDM 2003",
"dates_location_label": "(11/19-11/22) Melbourne, Florida, USA"
},
{
"year": 2004,
"source_label": "ICDM 2004",
"dates_location_label": "(11/01-11/04) Brighton, United Kingdom"
},
{
"year": 2005,
"source_label": "ICDM 2005",
"dates_location_label": "(11/27-11/30) Houston, Texas, USA"
},
{
"year": 2006,
"source_label": "ICDM 2006",
"dates_location_label": "(12/18-12/22) Hong Kong, China"
},
{
"year": 2007,
"source_label": "ICDM 2007",
"dates_location_label": "(10/28-10/31) Omaha, Nebraska, USA"
},
{
"year": 2008,
"source_label": "ICDM 2008",
"dates_location_label": "(12/15-12/19) Pisa, Italy"
},
{
"year": 2009,
"source_label": "ICDM 2009",
"dates_location_label": "(12/06-12/09) Miami, Florida, USA"
},
{
"year": 2010,
"source_label": "ICDM 2010",
"dates_location_label": "(12/14-12/17) Sydney, Australia"
},
{
"year": 2011,
"source_label": "ICDM 2011",
"dates_location_label": "(12/11-12/14) Vancouver, Canada"
},
{
"year": 2012,
"source_label": "ICDM 2012",
"dates_location_label": "(12/10-12/13) Brussels, Belgium"
},
{
"year": 2013,
"source_label": "ICDM 2013",
"dates_location_label": "(12/07-12/10) Dallas, TX, USA"
},
{
"year": 2014,
"source_label": "ICDM 2014",
"dates_location_label": "(12/14-12/17) Shenzhen, China"
},
{
"year": 2015,
"source_label": "ICDM 2015",
"dates_location_label": "(11/14-11/17) Atlantic City, NJ, USA"
},
{
"year": 2016,
"source_label": "ICDM 2016",
"dates_location_label": "(12/12-12/15) Barcelona, Spain"
},
{
"year": 2017,
"source_label": "ICDM 2017",
"dates_location_label": "(11/18-11/21) New Orleans, LA, USA"
},
{
"year": 2018,
"source_label": "ICDM 2018",
"dates_location_label": "(11/17-11/20) Singapore"
},
{
"year": 2019,
"source_label": "ICDM 2019",
"dates_location_label": "(11/8-11/11) Beijing, China"
},
{
"year": 2020,
"source_label": "ICDM 2020",
"dates_location_label": "(11/17-11/20) Sorrento, Italy"
},
{
"year": 2021,
"source_label": "ICDM 2021",
"dates_location_label": "(12/7-12/10) Auckland, New Zealand"
},
{
"year": 2022,
"source_label": "ICDM 2022",
"dates_location_label": "(11/30-12/3) Orlando, USA"
},
{
"year": 2023,
"source_label": "ICDM 2023",
"dates_location_label": "(12/1-12/4) Shanghai, China"
},
{
"year": 2024,
"source_label": "ICDM 2024",
"dates_location_label": "(12/9-12/12) Abu Dhabi, UAE"
},
{
"year": 2025,
"source_label": "ICDM 2025",
"dates_location_label": "(11/12-11/15) Washington DC, USA"
},
{
"year": 2026,
"source_label": "ICDM 2026",
"dates_location_label": "(11/12-11/15) Shenyang, China"
}
],
"upcoming_within_cutoff": [
2026
],
"source_note": "Society series page intro still says2001to2022 but actual table extends to2029. Read actual rows; duplicate2025/2026rowsdeduplicated.",
"scope": "26explicitserieseditionyears2001–2026;2026eventNov12–15isupcomingasofNov8,notproofproceedingsready.2027/2028/2029futureyears excluded. Regularmain/workshops/Applied/BlueSky/PhD have separate scopes. No individualnegativeinferredfromaggregateortripleblindreview. Originaldates/locationlabelsretained,notverifiedinpersonformat."
}
@@ -0,0 +1,88 @@
{
"source_url": "https://iclr.cc/",
"checked_at": "2026-11-08T07:28:29.958753+00:00",
"source_html_sha256": "a88e5db514670fcb6bcf80b58a338520d4ab4007d8cb5b85f2eb513408d799d7",
"cutoff_year": 2026,
"expected_years": [
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027
],
"edition_links": [
{
"text": "2027",
"url": "https://iclr.cc/Conferences/2027/index.html"
},
{
"text": "2026",
"url": "https://iclr.cc/Conferences/2026"
},
{
"text": "2025",
"url": "https://iclr.cc/Conferences/2025"
},
{
"text": "2024",
"url": "https://iclr.cc/Conferences/2024"
},
{
"text": "2023",
"url": "https://iclr.cc/Conferences/2023"
},
{
"text": "2022",
"url": "https://iclr.cc/Conferences/2022"
},
{
"text": "2021",
"url": "https://iclr.cc/Conferences/2021"
},
{
"text": "2020",
"url": "https://iclr.cc/Conferences/2020"
},
{
"text": "2019",
"url": "https://iclr.cc/Conferences/2019"
},
{
"text": "2018",
"url": "https://iclr.cc/Conferences/2018"
},
{
"text": "2017",
"url": "https://iclr.cc/archive/www/2017.html"
},
{
"text": "2016",
"url": "https://iclr.cc/archive/www/2016.html"
},
{
"text": "2015",
"url": "https://iclr.cc/archive/www/2015.html"
},
{
"text": "2014",
"url": "https://iclr.cc/archive/2014/"
},
{
"text": "2013",
"url": "https://iclr.cc/archive/2013/"
}
],
"scope": "Official conference-year directory only. Link targets not all fetched; per-track/paper/negative availability and current database completeness unverified."
}
+380
View File
@@ -0,0 +1,380 @@
{
"source_url": "https://icml.cc/Conferences/2008/past_icmls.shtml.html",
"resolved_url": "https://icml.cc/Conferences/2008/past_icmls.shtml.html",
"http_status": 200,
"checked_at": "2026-11-08T11:55:52.568028+00:00",
"source_sha256": "80cce886fe985551339a52b13c4077acf827e8fcc01555f854dc24077bdebdf0",
"source_html_sha256": "80cce886fe985551339a52b13c4077acf827e8fcc01555f854dc24077bdebdf0",
"additional_primary_sources": [
{
"source_url": "https://icml.cc/",
"resolved_url": "https://icml.cc/",
"http_status": 200,
"checked_at": "2026-11-08T11:55:55.401775+00:00",
"source_sha256": "a67cbcc28b56efc9020801901459e5aed56efdbe9d6d2a87939a80cc4c715f20",
"source_html_sha256": "a67cbcc28b56efc9020801901459e5aed56efdbe9d6d2a87939a80cc4c715f20"
},
{
"source_url": "https://icml.cc/Conferences/2012/",
"resolved_url": "https://icml.cc/Conferences/2012/",
"http_status": 200,
"checked_at": "2026-11-08T11:55:52.550215+00:00",
"source_sha256": "c2069fa350aaa3635ef380107e3531b69e4e501e7970993c96b1a28f135f1698",
"source_html_sha256": "c2069fa350aaa3635ef380107e3531b69e4e501e7970993c96b1a28f135f1698"
},
{
"source_url": "https://icml.cc/Conferences/2026",
"resolved_url": "https://icml.cc/Conferences/2026",
"http_status": 200,
"checked_at": "2026-11-08T11:55:57.066327+00:00",
"source_sha256": "75c650c61dfebd68da3e2bc2feca0a74fce37b2a29a3d9c9aebef12d0c864e1c",
"source_html_sha256": "75c650c61dfebd68da3e2bc2feca0a74fce37b2a29a3d9c9aebef12d0c864e1c"
}
],
"cutoff_year": 2026,
"expected_years": [
1980,
1983,
1985,
1987,
1988,
1989,
1990,
1991,
1992,
1993,
1994,
1995,
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027
],
"editions": [
{
"year": 1980,
"ordinal": 1,
"location_label": "Pittsburgh, Pennsylvania, USA",
"original_series_scope": "historical workshop predecessor",
"evidence_source": "official2008historictable"
},
{
"year": 1983,
"ordinal": 2,
"location_label": "Monticello, Illinois, USA",
"original_series_scope": "historical workshop predecessor",
"evidence_source": "official2008historictable"
},
{
"year": 1985,
"ordinal": 3,
"location_label": "Skytop, Pennsylvania, USA",
"original_series_scope": "historical workshop predecessor",
"evidence_source": "official2008historictable"
},
{
"year": 1987,
"ordinal": 4,
"location_label": "Irvine, California, USA",
"original_series_scope": "historical workshop predecessor",
"evidence_source": "official2008historictable"
},
{
"year": 1988,
"ordinal": 5,
"location_label": "Ann Arbor, Michigan, USA",
"original_series_scope": "historical workshop predecessor",
"evidence_source": "official2008historictable"
},
{
"year": 1989,
"ordinal": 6,
"location_label": "Ithaca, New York, USA",
"original_series_scope": "historical workshop predecessor",
"evidence_source": "official2008historictable"
},
{
"year": 1990,
"ordinal": 7,
"location_label": "Austin, Texas, USA",
"original_series_scope": "historical workshop predecessor",
"evidence_source": "official2008historictable"
},
{
"year": 1991,
"ordinal": 8,
"location_label": "Evanston, Illinois, USA",
"original_series_scope": "historical workshop predecessor",
"evidence_source": "official2008historictable"
},
{
"year": 1992,
"ordinal": 9,
"location_label": "Aberdeen, Scotland, UK",
"original_series_scope": "historical workshop predecessor",
"evidence_source": "official2008historictable"
},
{
"year": 1993,
"ordinal": 10,
"location_label": "Amherst, Massachusetts, USA",
"original_series_scope": "ICML conference",
"evidence_source": "official2008historictable"
},
{
"year": 1994,
"ordinal": 11,
"location_label": "New Brunswick, New Jersey, USA",
"original_series_scope": "ICML conference",
"evidence_source": "official2008historictable"
},
{
"year": 1995,
"ordinal": 12,
"location_label": "Tahoe City, California, USA",
"original_series_scope": "ICML conference",
"evidence_source": "official2008historictable"
},
{
"year": 1996,
"ordinal": 13,
"location_label": "Bari, Italy",
"original_series_scope": "ICML conference",
"evidence_source": "official2008historictable"
},
{
"year": 1997,
"ordinal": 14,
"location_label": "Nashville, Tennessee, USA",
"original_series_scope": "ICML conference",
"evidence_source": "official2008historictable"
},
{
"year": 1998,
"ordinal": 15,
"location_label": "Madison, Wisconsin, USA",
"original_series_scope": "ICML conference",
"evidence_source": "official2008historictable"
},
{
"year": 1999,
"ordinal": 16,
"location_label": "Bled, Slovenia",
"original_series_scope": "ICML conference",
"evidence_source": "official2008historictable"
},
{
"year": 2000,
"ordinal": 17,
"location_label": "Stanford, California, USA",
"original_series_scope": "ICML conference",
"evidence_source": "official2008historictable"
},
{
"year": 2001,
"ordinal": 18,
"location_label": "Williamstown, Massachusetts, USA",
"original_series_scope": "ICML conference",
"evidence_source": "official2008historictable"
},
{
"year": 2002,
"ordinal": 19,
"location_label": "Sydney Australia",
"original_series_scope": "ICML conference",
"evidence_source": "official2008historictable"
},
{
"year": 2003,
"ordinal": 20,
"location_label": "Washington DC, USA",
"original_series_scope": "ICML conference",
"evidence_source": "official2008historictable"
},
{
"year": 2004,
"ordinal": 21,
"location_label": "Banff, Alberta, Canada",
"original_series_scope": "ICML conference",
"evidence_source": "official2008historictable"
},
{
"year": 2005,
"ordinal": 22,
"location_label": "Bonn, Germany",
"original_series_scope": "ICML conference",
"evidence_source": "official2008historictable"
},
{
"year": 2006,
"ordinal": 23,
"location_label": "Pittsburgh, Pennsylvania, USA",
"original_series_scope": "ICML conference",
"evidence_source": "official2008historictable"
},
{
"year": 2007,
"ordinal": 24,
"location_label": "Corvallis, Oregon, USA",
"original_series_scope": "ICML conference",
"evidence_source": "official2008historictable"
},
{
"year": 2008,
"source_label": "ICML 2008",
"source_url": "https://icml.cc/Conferences/2008",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2009,
"source_label": "ICML 2009",
"source_url": "https://icml.cc/Conferences/2009",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2010,
"source_label": "ICML 2010",
"source_url": "https://icml.cc/Conferences/2010",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2011,
"source_label": "ICML 2011",
"source_url": "https://icml.cc/Conferences/2011",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2012,
"source_label": "ICML 2012",
"source_url": "https://icml.cc/Conferences/2012",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2013,
"source_label": "ICML 2013",
"source_url": "https://icml.cc/Conferences/2013",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2014,
"source_label": "ICML 2014",
"source_url": "https://icml.cc/Conferences/2014",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2015,
"source_label": "ICML 2015",
"source_url": "https://icml.cc/Conferences/2015",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2016,
"source_label": "ICML 2016",
"source_url": "https://icml.cc/Conferences/2016",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2017,
"source_label": "ICML 2017",
"source_url": "https://icml.cc/Conferences/2017",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2018,
"source_label": "ICML 2018",
"source_url": "https://icml.cc/Conferences/2018",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2019,
"source_label": "ICML 2019",
"source_url": "https://icml.cc/Conferences/2019/",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2020,
"source_label": "ICML 2020",
"source_url": "https://icml.cc/Conferences/2020/",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2021,
"source_label": "ICML 2021",
"source_url": "https://icml.cc/Conferences/2021/index.html",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2022,
"source_label": "ICML 2022",
"source_url": "https://icml.cc/Conferences/2022",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2023,
"source_label": "ICML 2023",
"source_url": "https://icml.cc/Conferences/2023",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2024,
"source_label": "ICML 2024",
"source_url": "https://icml.cc/Conferences/2024",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2025,
"source_label": "ICML 2025",
"source_url": "https://icml.cc/Conferences/2025",
"evidence_source": "officialcurrentmatchingyearnavigation"
},
{
"year": 2026,
"source_label": "ICML 2026",
"source_url": "https://icml.cc/Conferences/2026",
"evidence_source": "officialcurrentmatchingyearnavigation"
}
],
"predecessor_years": [
1980,
1983,
1985,
1987,
1988,
1989,
1990,
1991,
1992
],
"previous_partial_evidence_file": "icml-partial-editions-2026-11-08.json",
"scope": "43explicitconference-familyyears:24historic2008tableentries1980–2007plus19matchingcurrentnavigationentries2008–2026, current2026is43rd. No1981/1982/1984/1986interpolation.2012officialhistorysaysconferencenamebegan1993;1980–1992workshoppredecessorsretainoriginalnames. Brokencurrent2007/2006/2004navlabelsarenotusedtoinferyears; historictableindependentlyprovidesthem. Yearcensuscompletiondoesnotmeanearlyproceedingsdownloadedorrecordsimported;2007–2012publisher/sourceandmain/position/workshop/negativegapsneedindividualchecks."
}
@@ -0,0 +1,139 @@
{
"source_url": "https://icml.cc/",
"checked_at": "2026-11-08T07:28:28.878319+00:00",
"source_html_sha256": "ce6233fdf4dc4af5edeae7756fb1ba2ee4652069634f196918e4ba25c4cd2f09",
"status": "partial_official_archive_unavailable",
"cutoff_year": 2026,
"expected_years": null,
"observed_navigation_labels": [
{
"text": "2027",
"url": "https://icml.cc/Conferences/2027"
},
{
"text": "2026",
"url": "https://icml.cc/Conferences/2026"
},
{
"text": "2025",
"url": "https://icml.cc/Conferences/2025"
},
{
"text": "2024",
"url": "https://icml.cc/Conferences/2024"
},
{
"text": "2023",
"url": "https://icml.cc/Conferences/2023"
},
{
"text": "2022",
"url": "https://icml.cc/Conferences/2022"
},
{
"text": "2021",
"url": "https://icml.cc/Conferences/2021/index.html"
},
{
"text": "2020",
"url": "https://icml.cc/Conferences/2020/"
},
{
"text": "2019",
"url": "https://icml.cc/Conferences/2019/"
},
{
"text": "2018",
"url": "https://icml.cc/Conferences/2018"
},
{
"text": "2017",
"url": "https://icml.cc/Conferences/2017"
},
{
"text": "2016",
"url": "https://icml.cc/Conferences/2016"
},
{
"text": "2015",
"url": "https://icml.cc/Conferences/2015"
},
{
"text": "2014",
"url": "https://icml.cc/Conferences/2014"
},
{
"text": "2013",
"url": "https://icml.cc/Conferences/2013"
},
{
"text": "2012",
"url": "https://icml.cc/Conferences/2012"
},
{
"text": "2011",
"url": "https://icml.cc/Conferences/2011"
},
{
"text": "2010",
"url": "https://icml.cc/Conferences/2010"
},
{
"text": "2009",
"url": "https://icml.cc/Conferences/2009"
},
{
"text": "2008",
"url": "https://icml.cc/Conferences/2008"
},
{
"text": "2007",
"url": "https://icml.cc/Conferences/2008"
},
{
"text": "2006",
"url": "https://icml.cc/Conferences/2007"
},
{
"text": "2005",
"url": "https://icml.cc/Conferences/2005"
},
{
"text": "2004",
"url": "https://icml.cc/Conferences/2005"
},
{
"text": "2002",
"url": "https://icml.cc/Conferences/2002"
},
{
"text": "1996",
"url": "https://icml.cc/Conferences/1996"
}
],
"conflicting_navigation_links": [
{
"text": "2007",
"url": "https://icml.cc/Conferences/2008"
},
{
"text": "2006",
"url": "https://icml.cc/Conferences/2007"
},
{
"text": "2004",
"url": "https://icml.cc/Conferences/2005"
}
],
"external_archive_attempt": {
"source_url": "https://www.machinelearning.org/archive.html",
"error": "URLError",
"status": null
},
"scope": "Root navigation is incomplete and some labels link to other years. Official external IMLS archive request failed. Do not interpolate a complete historical year set or count this as completed independent year census.",
"later_independent_census": {
"checked_on": "2026-11-08",
"evidence_file": "icml-editions-2026-11-08.json",
"note": "Earlier partial receipt kept unchanged as historical evidence. Independent2008table resolves missing earlyyears; oldbadnavigationnotreclassifiedasvalid."
}
}
+259
View File
@@ -0,0 +1,259 @@
{
"source_url": "https://www.ieee-ras.org/conferences-workshops/fully-sponsored/icra/icra-venues-and-archive/",
"checked_at": "2026-11-08T11:49:47.378390+00:00",
"source_representation": "first_party_page_text_returned_by_web_tool",
"source_extract_sha256": "2b667b2945d1c228ace071b6318b9d2c33a3b0328565c0ca5c380936495fed6e",
"source_html_sha256": null,
"direct_fetch": {
"source_url": "https://www.ieee-ras.org/conferences-workshops/fully-sponsored/icra/icra-venues-and-archive/",
"error": "HTTP Error 403: Forbidden"
},
"retrieval_note": "Official web-tool extraction archived separately from raw HTTP. Direct403 retained, not bypassed and not represented as HTML hash.",
"cutoff_year": 2026,
"expected_years": [
1984,
1985,
1986,
1987,
1988,
1989,
1990,
1991,
1992,
1993,
1994,
1995,
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027,
2028,
2029,
2030
],
"editions": [
{
"year": 1984,
"source_label": "ICRA 1984 Atlanta (GA), USA"
},
{
"year": 1985,
"source_label": "ICRA 1985 St Louis (MO), USA"
},
{
"year": 1986,
"source_label": "ICRA 1986 San Francisco (CA), USA"
},
{
"year": 1987,
"source_label": "ICRA 1987 Raleigh (NC), USA"
},
{
"year": 1988,
"source_label": "ICRA 1988 Philadelphia (PA), USA"
},
{
"year": 1989,
"source_label": "ICRA 1989 Scottsdale (AZ), USA)"
},
{
"year": 1990,
"source_label": "ICRA 1990 Cincinnati (OH), USA"
},
{
"year": 1991,
"source_label": "ICRA 1991 Sacramento (CA), USA"
},
{
"year": 1992,
"source_label": "ICRA 1992 Nice, France"
},
{
"year": 1993,
"source_label": "ICRA 1993 Atlanta (GA), USA"
},
{
"year": 1994,
"source_label": "ICRA 1994 San Diego (CA), USA"
},
{
"year": 1995,
"source_label": "ICRA 1995 Nagoya, Japan"
},
{
"year": 1996,
"source_label": "ICRA 1996 Minneapolis (MN), USA"
},
{
"year": 1997,
"source_label": "ICRA 1997 Albuquerque (NM), USA"
},
{
"year": 1998,
"source_label": "ICRA 1998 Leuven, Belgium"
},
{
"year": 1999,
"source_label": "ICRA 1999 Detroit (MI), USA"
},
{
"year": 2000,
"source_label": "ICRA 2000 San Francisco (CA), USA"
},
{
"year": 2001,
"source_label": "ICRA 2001 Seoul, Korea"
},
{
"year": 2002,
"source_label": "ICRA 2002 Washington (DC), USA"
},
{
"year": 2003,
"source_label": "ICRA 2003 Taipei, China"
},
{
"year": 2004,
"source_label": "ICRA 2004 New Orleans (LA), USA"
},
{
"year": 2005,
"source_label": "ICRA 2005 Barcelona, Spain"
},
{
"year": 2006,
"source_label": "ICRA 2006 Orlando (FL), USA"
},
{
"year": 2007,
"source_label": "ICRA 2007 Rome, Italy"
},
{
"year": 2008,
"source_label": "ICRA 2008 Pasadena (CA), USA"
},
{
"year": 2009,
"source_label": "ICRA 2009 Kobe, Japan"
},
{
"year": 2010,
"source_label": "ICRA 2010 Anchorage (AK), USA"
},
{
"year": 2011,
"source_label": "ICRA 2011 Shanghai, China"
},
{
"year": 2012,
"source_label": "ICRA 2012 Minneapolis (MN), USA"
},
{
"year": 2013,
"source_label": "ICRA 2013 Karlsruhe, Germany"
},
{
"year": 2014,
"source_label": "ICRA 2014 Hong Kong, China"
},
{
"year": 2015,
"source_label": "ICRA 2015 Seattle (WA), USA"
},
{
"year": 2016,
"source_label": "ICRA 2016 Stockholm, Sweden"
},
{
"year": 2017,
"source_label": "ICRA 2017 Singapore"
},
{
"year": 2018,
"source_label": "ICRA 2018 Brisbane, Australia"
},
{
"year": 2019,
"source_label": "ICRA 2019 Montreal, Canada"
},
{
"year": 2020,
"source_label": "ICRA 2020 Paris, France (Virtual Event)"
},
{
"year": 2021,
"source_label": "ICRA 2021 Xi’an, China"
},
{
"year": 2022,
"source_label": "ICRA 2022 Philadelphia (PA), USA"
},
{
"year": 2023,
"source_label": "ICRA 2023 London, United Kingdom"
},
{
"year": 2024,
"source_label": "ICRA 2024 Yokohama, Japan"
},
{
"year": 2025,
"source_label": "ICRA 2025 Atlanta (GA), USA"
},
{
"year": 2026,
"source_label": "ICRA 2026 Vienna, Austria"
}
],
"scope": "Explicit society archive edition labels only; no interpolation from database years, dates or footer copyright. Multiple proceedings volumes, journal presentation options and workshops do not create additional main conference acceptances. Public negative-record completeness is not established.",
"additional_extract_receipts": [
{
"source_url": "https://www.ieee-ras.org/conferences-workshops/fully-sponsored/icra/icra-venues-and-archive/",
"checked_at": "2026-11-08T11:49:47.378390+00:00",
"source_extract_sha256": "6bc312efe214aab58a77d9c6a89008a380b560b4fcbf43e1a1566c3e680a784e",
"scope": "Tail extraction confirms 1987/1986/1985/1984 after initial text output stopped at 1988."
}
],
"source_disagreements": [
{
"year": 2002,
"edition_heading": "ICRA 2002",
"date_line": "11-15 May 2022",
"interpretation": "Preserve internally inconsistent date text. Census uses explicit edition heading; no date rewrite."
},
{
"year": 2003,
"scope": "Official archive states delay from May to September due to SARS. Do not confuse with cancelled ICASSP2003 physical meeting."
}
]
}
@@ -0,0 +1,464 @@
{
"source_url": "https://ijcai.org/past_conferences/",
"resolved_url": "https://ijcai.org/past_conferences/",
"checked_at": "2026-11-08T08:40:42.121749+00:00",
"source_html_sha256": "e38587dc922778c008bd355851ac3df7993bdf894154fc1ec81836f8803ee398",
"cutoff_year": 2026,
"expected_years": [
1969,
1971,
1973,
1975,
1977,
1979,
1981,
1983,
1985,
1987,
1989,
1991,
1993,
1995,
1997,
1999,
2001,
2003,
2005,
2007,
2009,
2011,
2013,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [],
"editions": [
{
"year": 2026,
"label": "IJCAI-ECAI-26",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2026/"
}
]
},
{
"year": 2025,
"label": "IJCAI-25",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2025/"
}
]
},
{
"year": 2024,
"label": "IJCAI-24",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2024/"
}
]
},
{
"year": 2023,
"label": "IJCAI-23",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2023/"
}
]
},
{
"year": 2022,
"label": "IJCAI-ECAI-22",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2022/"
}
]
},
{
"year": 2021,
"label": "IJCAI-21",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2021/"
}
]
},
{
"year": 2020,
"label": "IJCAI-PRICAI-20",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2020/"
}
]
},
{
"year": 2019,
"label": "IJCAI-19",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2019/"
}
]
},
{
"year": 2018,
"label": "IJCAI-ECAI-18",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2018/"
}
]
},
{
"year": 2017,
"label": "IJCAI-17",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2017/"
}
]
},
{
"year": 2016,
"label": "IJCAI-16",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2016/"
}
]
},
{
"year": 2015,
"label": "IJCAI-15",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2015/"
}
]
},
{
"year": 2013,
"label": "IJCAI-13",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2013/"
}
]
},
{
"year": 2011,
"label": "IJCAI-11",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2011/"
}
]
},
{
"year": 2009,
"label": "IJCAI-09",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2009/"
}
]
},
{
"year": 2007,
"label": "IJCAI-07",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2007/"
}
]
},
{
"year": 2005,
"label": "IJCAI-05",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2005/"
}
]
},
{
"year": 2003,
"label": "IJCAI-03",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/2003/"
}
]
},
{
"year": 2001,
"label": "IJCAI-01",
"proceedings_links": [
{
"label": "Proceedings vol. 1",
"url": "https://ijcai.org/proceedings/2001-1/"
},
{
"label": "vol. 2",
"url": "https://ijcai.org/proceedings/2001-2/"
}
]
},
{
"year": 1999,
"label": "IJCAI-99",
"proceedings_links": [
{
"label": "Proceedings vol. 1",
"url": "https://ijcai.org/proceedings/1999-1/"
},
{
"label": "vol. 2",
"url": "https://ijcai.org/proceedings/1999-2/"
}
]
},
{
"year": 1997,
"label": "IJCAI-97",
"proceedings_links": [
{
"label": "Proceedings vol. 1",
"url": "https://ijcai.org/proceedings/1997-1/"
},
{
"label": "vol. 2",
"url": "https://ijcai.org/proceedings/1997-2/"
}
]
},
{
"year": 1995,
"label": "IJCAI-95",
"proceedings_links": [
{
"label": "Proceedings vol. 1",
"url": "https://ijcai.org/proceedings/1995-1/"
},
{
"label": "vol. 2",
"url": "https://ijcai.org/proceedings/1995-2/"
}
]
},
{
"year": 1993,
"label": "IJCAI-93",
"proceedings_links": [
{
"label": "Proceedings vol. 1",
"url": "https://ijcai.org/proceedings/1993-1/"
},
{
"label": "vol. 2",
"url": "https://ijcai.org/proceedings/1993-2/"
}
]
},
{
"year": 1991,
"label": "IJCAI-91",
"proceedings_links": [
{
"label": "Proceedings vol. 1",
"url": "https://ijcai.org/proceedings/1991-1/"
},
{
"label": "vol. 2",
"url": "https://ijcai.org/proceedings/1991-2/"
}
]
},
{
"year": 1989,
"label": "IJCAI-89",
"proceedings_links": [
{
"label": "Proceedings vol. 1",
"url": "https://ijcai.org/proceedings/1989-1/"
},
{
"label": "vol. 2",
"url": "https://ijcai.org/proceedings/1989-2/"
}
]
},
{
"year": 1987,
"label": "IJCAI-87",
"proceedings_links": [
{
"label": "Proceedings vol. 1",
"url": "https://ijcai.org/proceedings/1987-1/"
},
{
"label": "vol. 2",
"url": "https://ijcai.org/proceedings/1987-2/"
}
]
},
{
"year": 1985,
"label": "IJCAI-85",
"proceedings_links": [
{
"label": "Proceedings vol. 1",
"url": "https://ijcai.org/proceedings/1985-1/"
},
{
"label": "vol. 2",
"url": "https://ijcai.org/proceedings/1985-2/"
}
]
},
{
"year": 1983,
"label": "IJCAI-83",
"proceedings_links": [
{
"label": "Proceedings vol. 1",
"url": "https://ijcai.org/proceedings/1983-1/"
},
{
"label": "vol. 2",
"url": "https://ijcai.org/proceedings/1983-2/"
}
]
},
{
"year": 1981,
"label": "IJCAI-81",
"proceedings_links": [
{
"label": "Proceedings vol. 1",
"url": "https://ijcai.org/proceedings/1981-1/"
},
{
"label": "vol. 2",
"url": "https://ijcai.org/proceedings/1981-2/"
}
]
},
{
"year": 1979,
"label": "IJCAI-79",
"proceedings_links": [
{
"label": "Proceedings vol. 1",
"url": "https://ijcai.org/proceedings/1979-1/"
},
{
"label": "vol. 2",
"url": "https://ijcai.org/proceedings/1979-2/"
}
]
},
{
"year": 1977,
"label": "IJCAI-77",
"proceedings_links": [
{
"label": "Proceedings vol. 1",
"url": "https://ijcai.org/proceedings/1977-1/"
},
{
"label": "vol. 2",
"url": "https://ijcai.org/proceedings/1977-2/"
}
]
},
{
"year": 1975,
"label": "IJCAI-75",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/1975/"
}
]
},
{
"year": 1973,
"label": "IJCAI-73",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/1973/"
}
]
},
{
"year": 1971,
"label": "IJCAI-71",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/1971/"
}
]
},
{
"year": 1969,
"label": "IJCAI-69",
"proceedings_links": [
{
"label": "Proceedings",
"url": "https://ijcai.org/proceedings/1969/"
}
]
}
],
"policy_sources": [
{
"source_url": "https://2025.ijcai.org/call-for-papers-main-track/",
"resolved_url": "https://2025.ijcai.org/call-for-papers-main-track/",
"checked_at": "2026-11-08T08:40:52.887317+00:00",
"source_html_sha256": "bef26040fbee191248efb333e255d37bac39c1ea2e83de26f3008d284f696405"
},
{
"source_url": "https://2025.ijcai.org/reviewers-faq/",
"resolved_url": "https://2025.ijcai.org/reviewers-faq/",
"checked_at": "2026-11-08T08:41:05.695475+00:00",
"source_html_sha256": "0c15b7d0817fed9e15599d763d1435ab1d269a80915886b946ddafdb7498e111"
}
],
"scope": "Official enumerated conference years only. IJCAI-ECAI and IJCAI-PRICAI labels preserved, multivolume proceedings not counted as extra conferences. Does not establish per-paper/track completeness or public rejection availability."
}
@@ -0,0 +1,311 @@
{
"source_url": "https://www.isca-archive.org/",
"resolved_url": "https://www.isca-archive.org/",
"http_status": 200,
"checked_at": "2026-11-08T11:44:20.741970+00:00",
"source_sha256": "ea110bbf0d9ace8297de8bab32bb1293125f854221f263a661e24373de815802",
"source_html_sha256": "ea110bbf0d9ace8297de8bab32bb1293125f854221f263a661e24373de815802",
"additional_primary_sources": [
{
"source_url": "https://isca-speech.org/page-18313",
"resolved_url": "https://isca-speech.org/page-18313",
"http_status": 200,
"checked_at": "2026-11-08T11:44:11.781820+00:00",
"source_sha256": "6414722eb62caed905058445f17a54efc7ac83e96c91c9db2b3acd18db09c35c"
}
],
"cutoff_year": 2026,
"expected_years": [
1987,
1989,
1990,
1991,
1992,
1993,
1994,
1995,
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [],
"editions": [
{
"year": 1987,
"source_label": "European Conference on Speech Technology",
"source_series": "ECST",
"source_url": "https://www.isca-archive.org/ecst_1987/index.html"
},
{
"year": 1989,
"source_label": "First European Conference on Speech Communication and Technology (Eurospeech 1989)",
"source_series": "Eurospeech",
"source_url": "https://www.isca-archive.org/eurospeech_1989/index.html"
},
{
"year": 1990,
"source_label": "First International Conference on Spoken Language Processing (ICSLP 1990)",
"source_series": "ICSLP",
"source_url": "https://www.isca-archive.org/icslp_1990/index.html"
},
{
"year": 1991,
"source_label": "2nd European Conference on Speech Communication and Technology (Eurospeech 1991)",
"source_series": "Eurospeech",
"source_url": "https://www.isca-archive.org/eurospeech_1991/index.html"
},
{
"year": 1992,
"source_label": "2nd International Conference on Spoken Language Processing (ICSLP 1992)",
"source_series": "ICSLP",
"source_url": "https://www.isca-archive.org/icslp_1992/index.html"
},
{
"year": 1993,
"source_label": "3rd European Conference on Speech Communication and Technology (Eurospeech 1993)",
"source_series": "Eurospeech",
"source_url": "https://www.isca-archive.org/eurospeech_1993/index.html"
},
{
"year": 1994,
"source_label": "3rd International Conference on Spoken Language Processing (ICSLP 1994)",
"source_series": "ICSLP",
"source_url": "https://www.isca-archive.org/icslp_1994/index.html"
},
{
"year": 1995,
"source_label": "4th European Conference on Speech Communication and Technology (Eurospeech 1995)",
"source_series": "Eurospeech",
"source_url": "https://www.isca-archive.org/eurospeech_1995/index.html"
},
{
"year": 1996,
"source_label": "4th International Conference on Spoken Language Processing (ICSLP 1996)",
"source_series": "ICSLP",
"source_url": "https://www.isca-archive.org/icslp_1996/index.html"
},
{
"year": 1997,
"source_label": "5th European Conference on Speech Communication and Technology (Eurospeech 1997)",
"source_series": "Eurospeech",
"source_url": "https://www.isca-archive.org/eurospeech_1997/index.html"
},
{
"year": 1998,
"source_label": "5th International Conference on Spoken Language Processing (ICSLP 1998)",
"source_series": "ICSLP",
"source_url": "https://www.isca-archive.org/icslp_1998/index.html"
},
{
"year": 1999,
"source_label": "6th European Conference on Speech Communication and Technology",
"source_series": "Eurospeech",
"source_url": "https://www.isca-archive.org/eurospeech_1999/index.html"
},
{
"year": 2000,
"source_label": "6th International Conference on Spoken Language Processing (ICSLP 2000)",
"source_series": "ICSLP",
"source_url": "https://www.isca-archive.org/icslp_2000/index.html"
},
{
"year": 2001,
"source_label": "7th European Conference on Speech Communication and Technology (Eurospeech 2001)",
"source_series": "Eurospeech",
"source_url": "https://www.isca-archive.org/eurospeech_2001/index.html"
},
{
"year": 2002,
"source_label": "7th International Conference on Spoken Language Processing (ICSLP 2002)",
"source_series": "ICSLP",
"source_url": "https://www.isca-archive.org/icslp_2002/index.html"
},
{
"year": 2003,
"source_label": "8th European Conference on Speech Communication and Technology (Eurospeech 2003)",
"source_series": "Eurospeech",
"source_url": "https://www.isca-archive.org/eurospeech_2003/index.html"
},
{
"year": 2004,
"source_label": "Interspeech 2004",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2004/index.html"
},
{
"year": 2005,
"source_label": "Interspeech 2005",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2005/index.html"
},
{
"year": 2006,
"source_label": "Interspeech 2006",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2006/index.html"
},
{
"year": 2007,
"source_label": "Interspeech 2007",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2007/index.html"
},
{
"year": 2008,
"source_label": "Interspeech 2008",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2008/index.html"
},
{
"year": 2009,
"source_label": "Interspeech 2009",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2009/index.html"
},
{
"year": 2010,
"source_label": "Interspeech 2010",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2010/index.html"
},
{
"year": 2011,
"source_label": "Interspeech 2011",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2011/index.html"
},
{
"year": 2012,
"source_label": "Interspeech 2012",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2012/index.html"
},
{
"year": 2013,
"source_label": "Interspeech 2013",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2013/index.html"
},
{
"year": 2014,
"source_label": "Interspeech 2014",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2014/index.html"
},
{
"year": 2015,
"source_label": "Interspeech 2015",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2015/index.html"
},
{
"year": 2016,
"source_label": "Interspeech 2016",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2016/index.html"
},
{
"year": 2017,
"source_label": "Interspeech 2017",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2017/index.html"
},
{
"year": 2018,
"source_label": "Interspeech 2018",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2018/index.html"
},
{
"year": 2019,
"source_label": "Interspeech 2019",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2019/index.html"
},
{
"year": 2020,
"source_label": "Interspeech 2020",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2020/index.html"
},
{
"year": 2021,
"source_label": "Interspeech 2021",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2021/index.html"
},
{
"year": 2022,
"source_label": "Interspeech 2022",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2022/index.html"
},
{
"year": 2023,
"source_label": "Interspeech 2023",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2023/index.html"
},
{
"year": 2024,
"source_label": "Interspeech 2024",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2024/index.html"
},
{
"year": 2025,
"source_label": "Interspeech 2025",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2025/index.html"
},
{
"year": 2026,
"source_label": "Interspeech 2026",
"source_series": "Interspeech",
"source_url": "https://www.isca-archive.org/interspeech_2026/index.html"
}
],
"predecessor_years": [
1987,
1989,
1990,
1991,
1992,
1993,
1994,
1995,
1996,
1997,
1998,
1999
],
"scope": "39 actual official archive entries for Interspeech/Eurospeech/ICSLP/ECST family1987–2026, no1988interpolation. ExactduplicateHTMLrowsdeduplicated. Society says common Interspeech label began2000, while archive retains original Eurospeech2001/2003 and ICSLP2000/2002 names; preserve these source labels. ECST1987 is an explicitly linked predecessor, not renamed a contemporaneous Interspeech conference. Other402archiveconferences and satelliteworkshops are excluded. Journal/conference/track/publicnegative completeness not proven."
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,45 @@
{
"checked_on": "2026-11-08",
"scope": "Two separate2026tracks; no public rejected export or database write. not_published concerns this official review release policy, not author self-disclosures or other tracks/years.",
"checks": [
{
"venue": "WWW",
"year": 2026,
"track": "research",
"status": "unknown",
"primary_url": "https://www2026.thewebconf.org/calls/research-tracks.html",
"checked_on": "2026-11-08",
"note": "官方Research使用EasyChair并实行双盲;当前可见政策未确认会后全体拒稿元数据范围。HTML注释中遗留的2025 OpenReview透明政策未作为2026证据;不能把产业轨道政策套用到研究轨道。",
"evidence": [
{
"source_url": "https://www2026.thewebconf.org/calls/research-tracks.html",
"resolved_url": "https://www2026.thewebconf.org/calls/research-tracks.html",
"http_status": 200,
"checked_at": "2026-11-08T11:57:16.998157+00:00",
"source_sha256": "52d6b3507eb3d45b75fb5c78b1949750a65cf8579a3664cf9a036018c2776385",
"source_html_sha256": "52d6b3507eb3d45b75fb5c78b1949750a65cf8579a3664cf9a036018c2776385"
}
]
},
{
"venue": "WWW",
"year": 2026,
"track": "industry",
"status": "not_published",
"primary_url": "https://www2026.thewebconf.org/calls/industry.html",
"checked_on": "2026-11-08",
"note": "官方Industry说明评审期间投稿不公开,最终仅录用稿件的原投稿、评审、meta-review和讨论公开于OpenReview;该范围不包括拒稿。产业稿件进入Main proceedings不意味着与Research为同一审稿轨道;有desk reject/withdraw规则不能生成逐篇决定。",
"evidence": [
{
"source_url": "https://www2026.thewebconf.org/calls/industry.html",
"resolved_url": "https://www2026.thewebconf.org/calls/industry.html",
"http_status": 200,
"checked_at": "2026-11-08T11:57:17.849915+00:00",
"source_sha256": "fdd4f96ef3102e1f47845f553a00419ea1f26e925ee756291fda0fb3479f0d46",
"source_html_sha256": "fdd4f96ef3102e1f47845f553a00419ea1f26e925ee756291fda0fb3479f0d46"
}
]
}
],
"html_comment_boundary": "Research page hidden2025transparencycomment excluded; rawHTML retained withSHA."
}
+216
View File
@@ -0,0 +1,216 @@
{
"source_url": "https://www.ieee-ras.org/conferences-workshops/financially-co-sponsored/iros/iros-past-and-future-venues/",
"checked_at": "2026-11-08T11:49:47.378390+00:00",
"source_representation": "first_party_page_text_returned_by_web_tool",
"source_extract_sha256": "3671feaccc8fecbf4b0074438a667209d203a62bdab2a71d32800da163215bb8",
"source_html_sha256": null,
"direct_fetch": {
"source_url": "https://www.ieee-ras.org/conferences-workshops/financially-co-sponsored/iros/iros-past-and-future-venues/",
"error": "HTTP Error 403: Forbidden"
},
"retrieval_note": "Official web-tool extraction archived separately from raw HTTP. Direct403 retained, not bypassed and not represented as HTML hash.",
"cutoff_year": 2026,
"expected_years": [
1988,
1989,
1990,
1991,
1992,
1993,
1994,
1995,
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027
],
"editions": [
{
"year": 1988,
"source_label": "IROS 1988 Tokyo, Japan (Proceedings)"
},
{
"year": 1989,
"source_label": "IROS 1989 Ysukuba, Japan (Proceedings)"
},
{
"year": 1990,
"source_label": "IROS 1990 Ibaraki, Japan (Proceedings)"
},
{
"year": 1991,
"source_label": "IROS 1991 Osaka, Japan (Proceedings)"
},
{
"year": 1992,
"source_label": "IROS 1992 Raleigh (NC) USA (Proceedings)"
},
{
"year": 1993,
"source_label": "IROS 1993 Tokyo, Japan (Proceedings)"
},
{
"year": 1994,
"source_label": "IROS 1994 Munich, Germany (Proceedings)"
},
{
"year": 1995,
"source_label": "IROS 1995 Pittsburgh (PA) USA (Proceedings)"
},
{
"year": 1996,
"source_label": "IROS 1996 Osaka, Japan (Proceedings)"
},
{
"year": 1997,
"source_label": "IROS 1997 Grenoble, France (Proceedings)"
},
{
"year": 1998,
"source_label": "IROS 1998 Victoria, Canada (Proceedings)"
},
{
"year": 1999,
"source_label": "IROS 1999 Kyongju, Korea (Proceedings)"
},
{
"year": 2000,
"source_label": "IROS 2000 Takamatsu, Japan (Proceedings)"
},
{
"year": 2001,
"source_label": "IROS 2001 Maui (HI) USA (Proceedings)"
},
{
"year": 2002,
"source_label": "IROS 2002 (Archived) Lausanne, Switerland (Website, Proceedings)"
},
{
"year": 2003,
"source_label": "IROS 2003 Las Vegas (NV) USA (Proceedings)"
},
{
"year": 2004,
"source_label": "IROS 2004 Sendai, Japan (Proceedings)"
},
{
"year": 2005,
"source_label": "IROS 2005 (Archived) Edmonton, Canada (Website, Proceedings)"
},
{
"year": 2006,
"source_label": "IROS 2006 Beijing, China (Proceedings)"
},
{
"year": 2007,
"source_label": "IROS 2007 San Diego (CA) USA (Proceedings)"
},
{
"year": 2008,
"source_label": "IROS 2008 (Archived) Nice, France (Website, Proceedings)"
},
{
"year": 2009,
"source_label": "IROS 2009 St. Louis (MO) USA (Proceedings)"
},
{
"year": 2010,
"source_label": "IROS 2010 Taipei, Taiwan (Proceedings)"
},
{
"year": 2011,
"source_label": "IROS 2011 San Francisco (CA) USA (Website)"
},
{
"year": 2012,
"source_label": "IROS 2012 Vilamoura, Algarve, Portugal (Website)"
},
{
"year": 2013,
"source_label": "IROS 2013 Tokyo, Japan (Website)"
},
{
"year": 2014,
"source_label": "IROS 2014 Chicago (IL) USA (Website)"
},
{
"year": 2015,
"source_label": "IROS 2015 Hamburg, Germany (Website)"
},
{
"year": 2016,
"source_label": "IROS 2016 Daejon, South Korea (Website)"
},
{
"year": 2017,
"source_label": "IROS 2017 Vancouver, Canada (Website)"
},
{
"year": 2018,
"source_label": "IROS 2018 Madrid, Spain (Website)"
},
{
"year": 2019,
"source_label": "IROS 2019 Macau, China (Website)"
},
{
"year": 2020,
"source_label": "IROS 2020 Las Vegas (NV) USA (Website)"
},
{
"year": 2021,
"source_label": "IROS 2021 Prague, Czech Republic (Website)"
},
{
"year": 2022,
"source_label": "IROS 2022 Kyoto, Japan (Website)"
},
{
"year": 2023,
"source_label": "IROS 2023 Detroit (MI), USA (Website)"
},
{
"year": 2024,
"source_label": "IROS 2024 Abu Dhabi, UAE"
},
{
"year": 2025,
"source_label": "IROS 2025 Hangzhou, China (Website)"
},
{
"year": 2026,
"source_label": "IROS 2026"
}
],
"scope": "Explicit society archive edition labels only; no interpolation from database years, dates or footer copyright. Multiple proceedings volumes, journal presentation options and workshops do not create additional main conference acceptances. Public negative-record completeness is not established. Includes1988–1990 before the oldest observed DBLP year1991; future2027 excluded. Archived location is not proof an edition occurred in person."
}
@@ -0,0 +1,171 @@
{
"source_url": "https://ismir.net/conferences/",
"checked_at": "2026-11-08T11:39:24.623314+00:00",
"source_representation": "first_party_page_text_returned_by_web_tool",
"source_extract_sha256": "873bc007add9fad226a46fcd9a6720c66a8931f8f73c0f42ea903fe8fe0d35b7",
"source_html_sha256": null,
"direct_fetch": {
"source_url": "https://ismir.net/conferences/",
"error": "HTTP Error 406: Not Acceptable"
},
"retrieval_note": "Anonymous direct HTTP returned 403/406. Archived official-page web-tool text is a separate representation, not a raw HTML response; no access-control bypass.",
"additional_primary_sources": [
{
"source_url": "https://ismir2026.ismir.net/",
"checked_at": "2026-11-08T11:39:24.623314+00:00",
"source_representation": "first_party_page_text_returned_by_web_tool",
"source_extract_sha256": "e661b42ec5216c1450e93993933f4ec5dd67bd0c132776428246d9861ec7d46a",
"source_html_sha256": null,
"direct_fetch": {
"source_url": "https://ismir2026.ismir.net/",
"error": "HTTP Error 403: Forbidden"
},
"retrieval_note": "Anonymous direct HTTP returned 403/406. Archived official-page web-tool text is a separate representation, not a raw HTML response; no access-control bypass."
}
],
"cutoff_year": 2026,
"expected_years": [
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [],
"editions": [
{
"year": 2025,
"source_label": "ISMIR 2025"
},
{
"year": 2024,
"source_label": "ISMIR 2024"
},
{
"year": 2023,
"source_label": "ISMIR 2023"
},
{
"year": 2022,
"source_label": "ISMIR 2022"
},
{
"year": 2021,
"source_label": "ISMIR 2021"
},
{
"year": 2020,
"source_label": "ISMIR 2020"
},
{
"year": 2019,
"source_label": "ISMIR 2019"
},
{
"year": 2018,
"source_label": "ISMIR 2018"
},
{
"year": 2017,
"source_label": "ISMIR 2017"
},
{
"year": 2016,
"source_label": "ISMIR 2016"
},
{
"year": 2015,
"source_label": "ISMIR 2015"
},
{
"year": 2014,
"source_label": "ISMIR 2014"
},
{
"year": 2013,
"source_label": "ISMIR 2013"
},
{
"year": 2012,
"source_label": "ISMIR 2012"
},
{
"year": 2011,
"source_label": "ISMIR 2011"
},
{
"year": 2010,
"source_label": "ISMIR 2010"
},
{
"year": 2009,
"source_label": "ISMIR 2009"
},
{
"year": 2008,
"source_label": "ISMIR 2008"
},
{
"year": 2007,
"source_label": "ISMIR 2007"
},
{
"year": 2006,
"source_label": "ISMIR 2006"
},
{
"year": 2005,
"source_label": "ISMIR 2005"
},
{
"year": 2004,
"source_label": "ISMIR 2004"
},
{
"year": 2003,
"source_label": "ISMIR 2003"
},
{
"year": 2002,
"source_label": "ISMIR 2002"
},
{
"year": 2001,
"source_label": "ISMIR 2001"
},
{
"year": 2000,
"source_label": "ISMIR 2000"
},
{
"year": 2026,
"source_label": "ISMIR 2026",
"dates_label": "November 8-12, 2026",
"event_status_at_cutoff": "starts_on_cutoff_date",
"publication_status": "not_independently_verified"
}
],
"scope": "26 explicit past-conference headings plus current official 27th 2026 conference. The event starts on the cutoff date; this is not proof proceedings or all accepted metadata are available. Historical workshop/symposium naming must remain as source records state it; directory uses retrospective ISMIR labels. Main, late-breaking demos, tutorials and music submissions are separate. No negative decisions inferred from missing publication."
}
+193
View File
@@ -0,0 +1,193 @@
{
"source_url": "https://www.kdd.org/conferences",
"resolved_url": "https://www.kdd.org/conferences",
"http_status": 200,
"checked_at": "2026-11-08T11:54:42.709760+00:00",
"source_sha256": "dc2ac9180ea9261818dd4d95996a7a27d6918921b7419ded5a96e80e06f48966",
"source_html_sha256": "dc2ac9180ea9261818dd4d95996a7a27d6918921b7419ded5a96e80e06f48966",
"cutoff_year": 2026,
"expected_years": [
1995,
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [],
"editions": [
{
"year": 1995,
"source_label": "KDD-1995 Montreal, QC August 20-21"
},
{
"year": 1996,
"source_label": "KDD-1996 Portland, OR August 2-4"
},
{
"year": 1997,
"source_label": "KDD-1997 Newport Beach, CA August 14-17"
},
{
"year": 1998,
"source_label": "KDD-1998 New York, NY August 27-31"
},
{
"year": 1999,
"source_label": "KDD-1999 San Diego, CA August 15-18"
},
{
"year": 2000,
"source_label": "KDD-2000 Boston, MA August 20-23"
},
{
"year": 2001,
"source_label": "KDD-2001 San Francisco, CA August 26-29"
},
{
"year": 2002,
"source_label": "KDD-2002 Edmonton, AB July 23-26"
},
{
"year": 2003,
"source_label": "KDD-2003 Washington, D.C. August 24-27"
},
{
"year": 2004,
"source_label": "KDD-2004 Seattle, WA August 22-25"
},
{
"year": 2005,
"source_label": "KDD-2005 Chicago, IL August 21-24"
},
{
"year": 2006,
"source_label": "KDD-2006 Philadelphia, PA August 20-23"
},
{
"year": 2007,
"source_label": "KDD-2007 San Jose, CA August 12-15"
},
{
"year": 2008,
"source_label": "KDD-2008 Las Vegas, NV August 24-27"
},
{
"year": 2009,
"source_label": "KDD-2009 Paris, France June 28 - July 1"
},
{
"year": 2010,
"source_label": "KDD-2010 Washington, DC July 25-28"
},
{
"year": 2011,
"source_label": "KDD-2011 San Diego, CA August 21-24, 2011"
},
{
"year": 2012,
"source_label": "KDD-2012, August 12-16, 2012, Beijing, China"
},
{
"year": 2013,
"source_label": "KDD-2013, August 11-14, Chicago, IL"
},
{
"year": 2014,
"source_label": "KDD-2014: August 24-27, 2014 New York City"
},
{
"year": 2015,
"source_label": "KDD-2015: August 10-13, 2015, Sydney, Australia"
},
{
"year": 2016,
"source_label": "KDD-2016: August 13-17, 2016 San Francisco, California"
},
{
"year": 2017,
"source_label": "KDD-2017: August 13-17, 2017, Halfiax, Nova Scotia"
},
{
"year": 2018,
"source_label": "KDD-2018: August 19-23, 2018, London, UK"
},
{
"year": 2019,
"source_label": "KDD-2019: August 4 - 8, 2019, Anchorage, AK"
},
{
"year": 2020,
"source_label": "KDD-2020: August 23 - 27, 2020, San Diego, CA"
},
{
"year": 2021,
"source_label": "KDD-2021: August 14 - 19, 2021, Singapore/Virtual"
},
{
"year": 2022,
"source_label": "KDD-2022: August 14 - 18, 2022, Washington DC, USA"
},
{
"year": 2023,
"source_label": "KDD-2023: August 6 - 10, 2023, Long Beach, CA"
},
{
"year": 2024,
"source_label": "KDD-2024: August 25 - 29, 2024, Barcelona, Spain"
},
{
"year": 2025,
"source_label": "KDD-2025: August 3 - 7, 2025, Toronto, Canada"
},
{
"year": 2026,
"source_label": "Join us for KDD 2026"
}
],
"named_predecessor_workshops": [
{
"year": 1989,
"source_label": "KDD-1989 workshop Detroit, MI, August 20"
},
{
"year": 1991,
"source_label": "KDD-1991 workshop Anaheim, CA, July 14-15"
},
{
"year": 1993,
"source_label": "KDD-1993 workshop Washington, D.C., July 11-12"
},
{
"year": 1994,
"source_label": "KDD-1994 workshop Seattle, WA, July 31-Aug 1"
}
],
"scope": "32 explicit conference headings1995–2026. Four separately named KDD workshops1989/1991/1993/1994 retained outside main conference expected years; no interpolation for1990/1992. KDD Cup is not the main research conference; AppliedDataScience/Research/Datasets/Benchmarks require individual track proof. Existing2026policy check retained, not generalized across all history."
}
+236
View File
@@ -0,0 +1,236 @@
{
"source_url": "https://kr.org/js/data.js",
"resolved_url": "https://kr.org/js/data.js",
"http_status": 200,
"checked_at": "2026-11-08T10:48:32.435524+00:00",
"source_sha256": "8d048de6a0b4bafb6c76f00b7240c08daf7da0a8d15eb8c79ac7740e9fb5bd72",
"source_representation": "official_static_javascript_data_not_executed",
"source_html_sha256": null,
"source_js_sha256": "8d048de6a0b4bafb6c76f00b7240c08daf7da0a8d15eb8c79ac7740e9fb5bd72",
"additional_primary_sources": [
{
"source_url": "https://kr.org/conferences.html",
"resolved_url": "https://kr.org/conferences.html",
"http_status": 200,
"checked_at": "2026-11-08T10:47:24.636636+00:00",
"source_sha256": "14a2b89b522853179814f61daaf57bda964486dc1a735e057ae6ddda23098454"
}
],
"cutoff_year": 2026,
"expected_years": [
1989,
1991,
1992,
1994,
1996,
1998,
2000,
2002,
2004,
2006,
2008,
2010,
2012,
2014,
2016,
2018,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027,
2028
],
"editions": [
{
"year": 2026,
"status": "past",
"location": "Lisbon, Portugal",
"dates": "July 20–23, 2026",
"link": "https://kr.org/KR2026/",
"proceedingsUrl": "https://proceedings.kr.org/2026/"
},
{
"year": 2025,
"status": "past",
"location": "Melbourne, Australia",
"dates": "November 11–17, 2025",
"link": "https://kr.org/KR2025/",
"proceedingsUrl": "https://proceedings.kr.org/2025/"
},
{
"year": 2024,
"status": "past",
"location": "Hanoi, Vietnam",
"dates": "November 2–8, 2024",
"link": "https://kr.org/KR2024/",
"proceedingsUrl": "https://proceedings.kr.org/2024/"
},
{
"year": 2023,
"status": "past",
"location": "Rhodes, Greece",
"dates": "September 2–8, 2023",
"link": "https://kr.org/KR2023/",
"proceedingsUrl": "https://proceedings.kr.org/2023/"
},
{
"year": 2022,
"status": "past",
"location": "Haifa, Israel",
"dates": "July 31–August 5, 2022",
"link": "https://kr.org/KR2022/",
"proceedingsUrl": "https://proceedings.kr.org/2022/"
},
{
"year": 2021,
"status": "past",
"location": "Hanoi, Vietnam (virtual)",
"dates": "November 3–12, 2021",
"link": "https://kr.org/KR2021/",
"proceedingsUrl": "https://proceedings.kr.org/2021/"
},
{
"year": 2020,
"status": "past",
"location": "Rhodes, Greece (virtual)",
"dates": "September 12–18, 2020",
"link": "https://kr.org/KR2020/",
"proceedingsUrl": "https://proceedings.kr.org/2020/"
},
{
"year": 2018,
"status": "past",
"location": "Tempe, Arizona, USA",
"dates": "October 27–November 2, 2018",
"link": "https://kr.org/KR2018/",
"proceedingsUrl": "https://aaai.org/proceeding/kr-16-2018/"
},
{
"year": 2016,
"status": "past",
"location": "Cape Town, South Africa",
"dates": "April 25–29, 2016",
"link": "https://kr.org/KR2016/",
"proceedingsUrl": "https://aaai.org/proceeding/kr-15-2016/"
},
{
"year": 2014,
"status": "past",
"location": "Vienna, Austria",
"dates": "July 20–24, 2014",
"link": "https://kr.org/KR2014/",
"proceedingsUrl": "https://aaai.org/proceeding/kr-14-2014/"
},
{
"year": 2012,
"status": "past",
"location": "Rome, Italy",
"dates": "June 10–14, 2012",
"link": "https://kr.org/KR2012/",
"proceedingsUrl": "https://aaai.org/proceeding/kr-13-2012/"
},
{
"year": 2010,
"status": "past",
"location": "Toronto, Canada",
"dates": "May 9–13, 2010",
"link": "https://kr.org/KR2010/",
"proceedingsUrl": "https://aaai.org/proceeding/kr-12-2010/"
},
{
"year": 2008,
"status": "past",
"location": "Sydney, Australia",
"dates": "September 16–19, 2008",
"link": "https://kr.org/KR2008/",
"proceedingsUrl": "https://aaai.org/proceeding/kr-2008/"
},
{
"year": 2006,
"status": "past",
"location": "Lake District, UK",
"dates": "June 2–5, 2006",
"link": "https://kr.org/KR2006/",
"proceedingsUrl": "https://aaai.org/proceeding/kr-2006/"
},
{
"year": 2004,
"status": "past",
"location": "Whistler, Canada",
"dates": "June 2–5, 2004",
"link": "https://kr.org/KR2004/",
"proceedingsUrl": "https://aaai.org/proceeding/kr-2004/"
},
{
"year": 2002,
"status": "past",
"location": "Toulouse, France",
"dates": "April 22–25, 2002",
"link": "https://kr.org/KR2002/",
"proceedingsUrl": "https://kr.org/proceedings/KR-2002-proceedings-scanned.pdf"
},
{
"year": 2000,
"status": "past",
"location": "Breckenridge, Colorado, USA",
"dates": "April 12–15, 2000",
"link": "https://kr.org/KR2000/",
"proceedingsUrl": "https://kr.org/proceedings/KR-2000-proceedings-scanned.pdf"
},
{
"year": 1998,
"status": "past",
"location": "Trento, Italy",
"dates": "June 2–5, 1998",
"link": "https://kr.org/KR1998/",
"proceedingsUrl": "https://kr.org/proceedings/KR-1998-proceedings-scanned.pdf"
},
{
"year": 1996,
"status": "past",
"location": "Cambridge, Massachusetts, USA",
"dates": "November 5–8, 1996",
"link": "https://kr.org/KR1996/",
"proceedingsUrl": "https://kr.org/proceedings/KR-1996-proceedings-scanned.pdf"
},
{
"year": 1994,
"status": "past",
"location": "Bonn, Germany",
"dates": "May 24–27, 1994",
"link": "https://dblp.org/db/conf/kr/kr94.html",
"proceedingsUrl": "https://kr.org/proceedings/KR-1994-proceedings-scanned.pdf"
},
{
"year": 1992,
"status": "past",
"location": "Cambridge, Massachusetts, USA",
"dates": "October 25–29, 1992",
"link": "https://dblp.org/db/conf/kr/kr92.html",
"proceedingsUrl": "https://kr.org/proceedings/KR-1992-proceedings-scanned.pdf"
},
{
"year": 1991,
"status": "past",
"location": "Cambridge, Massachusetts, USA",
"dates": "April 22–25, 1991",
"link": "https://dblp.org/db/conf/kr/kr91.html",
"proceedingsUrl": "https://kr.org/proceedings/KR-1991-proceedings-scanned.pdf"
},
{
"year": 1989,
"status": "past",
"location": "Toronto, Canada",
"dates": "May 15–18, 1989",
"link": "https://dblp.org/db/conf/kr/kr89.html",
"proceedingsUrl": "https://kr.org/proceedings/KR-1989-proceedings-scanned.pdf"
}
],
"scope": "23actualeventrows1989–2026 isolatedfromofficialCONFERENCESarray linkedbyconferencepage; staticstring/numberparsingonly,nocodeexecution. Excludesawards/otherarraysandannounced2027/2028. Datesandlinksretained; virtual2021keptdistinctfrominpersonlocation. ProceedingsPDFlinksaremetadataonly,nopaperPDFdownload; noindividualaccepted/negativeclaim."
}
@@ -0,0 +1,207 @@
{
"source_url": "https://miccai.org/past-conferences/",
"checked_at": "2026-11-08T11:39:24.623314+00:00",
"source_representation": "first_party_page_text_returned_by_web_tool",
"source_extract_sha256": "5f981fec02f6b3cc189833bea24e3214a91db4d9eaf27401e7d60070abebb6b2",
"source_html_sha256": null,
"direct_fetch": {
"source_url": "https://miccai.org/past-conferences/",
"error": "HTTP Error 403: Forbidden"
},
"retrieval_note": "Anonymous direct HTTP returned 403/406. Archived official-page web-tool text is a separate representation, not a raw HTML response; no access-control bypass.",
"cutoff_year": 2026,
"expected_years": [
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [],
"editions": [
{
"year": 2026,
"source_label": "MICCAI 2026"
},
{
"year": 2025,
"source_label": "MICCAI 2025"
},
{
"year": 2024,
"source_label": "MICCAI 2024"
},
{
"year": 2023,
"source_label": "MICCAI 2023"
},
{
"year": 2022,
"source_label": "MICCAI 2022"
},
{
"year": 2021,
"source_label": "MICCAI 2021"
},
{
"year": 2020,
"source_label": "MICCAI 2020"
},
{
"year": 2019,
"source_label": "MICCAI 2019"
},
{
"year": 2018,
"source_label": "MICCAI 2018"
},
{
"year": 2017,
"source_label": "MICCAI 2017"
},
{
"year": 2016,
"source_label": "MICCAI 2016"
},
{
"year": 2015,
"source_label": "MICCAI 2015"
},
{
"year": 2014,
"source_label": "MICCAI 2014"
},
{
"year": 2013,
"source_label": "MICCAI 2013"
},
{
"year": 2012,
"source_label": "MICCAI 2012"
},
{
"year": 2011,
"source_label": "MICCAI 2011"
},
{
"year": 2010,
"source_label": "MICCAI 2010"
},
{
"year": 2009,
"source_label": "MICCAI 2009"
},
{
"year": 2008,
"source_label": "MICCAI 2008"
},
{
"year": 2007,
"source_label": "MICCAI 2007"
},
{
"year": 2006,
"source_label": "MICCAI 2006"
},
{
"year": 2005,
"source_label": "MICCAI 2005"
},
{
"year": 2004,
"source_label": "MICCAI 2004"
},
{
"year": 2003,
"source_label": "MICCAI 2003"
},
{
"year": 2002,
"source_label": "MICCAI 2002"
},
{
"year": 2001,
"source_label": "MICCAI 2001"
},
{
"year": 2000,
"source_label": "MICCAI 2000"
},
{
"year": 1999,
"source_label": "MICCAI 99"
},
{
"year": 1998,
"source_label": "MICCAI 98"
}
],
"named_predecessor_events": [
{
"year": 1997,
"source_label": "CVRMed-MRCAS 97"
},
{
"year": 1996,
"source_label": "VBC 96"
},
{
"year": 1995,
"source_label": "MRCAS 95"
},
{
"year": 1995,
"source_label": "CVRMed 95"
},
{
"year": 1994,
"source_label": "MRCAS 94"
},
{
"year": 1994,
"source_label": "VBC 94"
},
{
"year": 1992,
"source_label": "VBC 92"
},
{
"year": 1990,
"source_label": "VBC 90"
}
],
"source_disagreements": [
{
"year": 2026,
"current_society_history": "Sept 27-Oct 1; Strasbourg, France",
"older_sponsorship_material": "Oct 4-8; Abu Dhabi, United Arab Emirates",
"older_source_url": "https://conferences.miccai.org/2026/files/downloads/MICCAI2026-sponsorship-prospectus.pdf",
"interpretation": "Retain primary-source conflict; event year is agreed. No database date/location rewrite or assumption the old prospectus describes the final venue."
}
],
"scope": "29 explicit MICCAI rows including two-digit 98/99 labels decoded as 1998/1999. Eight separately named predecessor events are preserved outside MICCAI expected years: same-year CVRMed/MRCAS/VBC events are not renamed or collapsed into MICCAI. Society incorporation in 2004 is not the conference start. Multiple LNCS volumes and workshops do not create extra main events; accepted reviews do not prove public rejection export."
}
@@ -0,0 +1,104 @@
{
"source_url": "https://mlsys.org/",
"checked_at": "2026-11-08T06:51:13.127546+00:00",
"source_html_sha256": "2309b47c1294e42a3b5eee4ffe52a192aabc25fcd642710750f4ade6928cdf7d",
"cutoff_year": 2026,
"expected_years": [
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027
],
"year_links": {
"2018": [
"https://mlsys.org/Conferences/2018"
],
"2019": [
"https://mlsys.org/Conferences/2019/"
],
"2020": [
"https://mlsys.org/Conferences/2020"
],
"2021": [
"https://mlsys.org/Conferences/2021"
],
"2022": [
"https://mlsys.org/Conferences/2022"
],
"2023": [
"https://mlsys.org/Conferences/2023"
],
"2024": [
"https://mlsys.org/Conferences/2024"
],
"2025": [
"https://mlsys.org/Conferences/2025"
],
"2026": [
"https://mlsys.org/Conferences/2026"
],
"2027": [
"https://mlsys.org/Conferences/2027/CallForResearchPapers",
"https://mlsys.org/Conferences/2027/Dates"
]
},
"proceedings_archive": {
"source_url": "https://proceedings.mlsys.org/",
"checked_at": "2026-11-08T06:51:09.375277+00:00",
"source_html_sha256": "3102f1921a5c120dd02749f3c7e31ec3d58c32e03da21c244469903f04f833ba",
"expected_proceedings_years": [
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"year_links": {
"2019": [
"https://proceedings.mlsys.org/paper_files/paper/2019"
],
"2020": [
"https://proceedings.mlsys.org/paper_files/paper/2020"
],
"2021": [
"https://proceedings.mlsys.org/paper_files/paper/2021"
],
"2022": [
"https://proceedings.mlsys.org/paper_files/paper/2022"
],
"2023": [
"https://proceedings.mlsys.org/paper_files/paper/2023"
],
"2024": [
"https://proceedings.mlsys.org/paper_files/paper/2024"
],
"2025": [
"https://proceedings.mlsys.org/paper_files/paper/2025"
],
"2026": [
"https://proceedings.mlsys.org/paper_files/paper/2026"
]
}
},
"predecessor_edition": {
"source_url": "https://mlsys.org/Conferences/2018/",
"checked_at": "2026-11-08T06:51:18.356899+00:00",
"source_html_sha256": "474b710e34c938d287f923c65b4bdc28ac3d61d6a97d14fde66db818e707673e",
"year": 2018,
"name": "SysML",
"publication_mode": "non_archival",
"note": "官方首届录用 oral/poster 非存档;允许近期已发表研究,后续可原样再投。不由 PDF 链接制造正式出版或重复录用;拒稿公开范围未核实。"
},
"scope": "Conference-year enumeration only; archival proceedings begin in 2019. Per-track/paper coverage and public negative availability require independent verification."
}
+165
View File
@@ -0,0 +1,165 @@
{
"source_url": "https://www.acmmm.org/",
"resolved_url": "https://www.acmmm.org/",
"checked_at": "2026-11-08T10:03:02.860428+00:00",
"source_sha256": "1b3428b0a898f66dc92a5bd517f882d06dada0164d805cabae627107cda05a47",
"expected_years": [
1993,
1994,
1995,
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027,
2028
],
"history_years": [
1993,
1994,
1995,
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015
],
"past_and_current_heading_years": [
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"research_track_statistic_year_labels": [
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025
],
"additional_primary_sources": [
{
"source_url": "https://www.sigmm.org/preservation/mm/",
"resolved_url": "https://www.sigmm.org/preservation/mm/",
"checked_at": "2026-11-08T10:03:03.844294+00:00",
"source_sha256": "711435f0d0c27e542342b92b0295bda95422b47b6e3dfa6be8b694a9b976f84e"
},
{
"source_url": "https://2026.acmmm.org/",
"resolved_url": "https://2026.acmmm.org/",
"checked_at": "2026-11-08T10:03:03.026686+00:00",
"source_sha256": "775794bad24dbbc8cabace5243485b51ff07789076cc7dbb4aa38d0615707020"
}
],
"announced_upcoming_events": [
{
"year": 2026,
"event_dates": "2026-11-10/2026-11-14",
"as_of": "2026-11-08",
"scope": "Not yet held; publication availability not independently inferred."
}
],
"broken_previous_editions_link": {
"url": "https://www.acmmm.org/ACMMM_pasteditions.html",
"observed_status": 404,
"interpretation": "Not absence evidence; SIGMMarchive and individually listed first-partyyearlabels used instead."
},
"policy_assets": [
{
"source_url": "https://www.acmmm.org/files/ACMMMDeskRej_2025.pdf",
"resolved_url": "https://www.acmmm.org/files/ACMMMDeskRej_2025.pdf",
"checked_at": "2026-11-08T10:03:04.577190+00:00",
"source_sha256": "649bb2309c4d18653a49b4fa4a4b5d9cc872e5a03e57c5342ecf4f169d17cf6d"
}
],
"policy_note": "Steering-committee website links a December2025approved desk-rejection PDF which retains proposal/alternative wording. Do not infer final sanction thresholds or actual per-paper decisions from that document, nor public rejection availability. First-party aggregate research-track submission/acceptance totals are not individual rejected-paper records.",
"scope": "34actualyearlabels through2026 from SIGMMhistory1993–2015, currenthomepagepast/currentheadings and separately listedresearch-trackstatistics2005–2025, checked against2026official34thconference announcement. No annual interpolation. Main/workshop/demo/other tracks remain independent; MM is not MMM or ICME.",
"cutoff_year": 2026,
"source_html_sha256": "1b3428b0a898f66dc92a5bd517f882d06dada0164d805cabae627107cda05a47",
"public_metadata_access_check": {
"official_group_url": "https://openreview.net/group?id=acmmm.org/ACMMM/2026/Conference",
"official_policy_url": "https://2026.acmmm.org/site/cfp-guidelines.html",
"checks": [
{
"url": "https://api2.openreview.net/groups?id=acmmm.org%2FACMMM%2F2026%2FConference",
"checked_at": "2026-11-08T10:08:54.026580+00:00",
"http_status": 200,
"response_sha256": "857dab80694ba7443cac711d9e567b427a1c43568c7d3b91e80aa7800e0db5f2",
"scope": "Only this anonymous public endpoint/query; not a rejection census or proof of absence."
},
{
"url": "https://api2.openreview.net/notes?content.venueid=acmmm.org%2FACMMM%2F2026%2FConference&limit=1",
"checked_at": "2026-11-08T10:08:57.480669+00:00",
"http_status": 403,
"response_sha256": "b8001134d8f50a8008037fd5a918a97e5479c019500404f741e6d13f6c8ddbfd",
"scope": "Only this anonymous public endpoint/query; not a rejection census or proof of absence."
}
],
"interpretation": "The public group endpoint returned200, while this anonymous venueid notes query returned403. This is an access limitation for the exact query, not zero records or evidence that rejected submissions are absent. CFP describes post-process public final reviews and applicable author responses, but does not establish that all rejected submissions are public. No access bypass or database write.",
"rejection_availability": "unknown"
}
}
@@ -0,0 +1,42 @@
{
"checked_on": "2026-11-08",
"scope": "One bounded main-track policy review; no per-paper rejection export and no database write. Existing MICCAI/FAccT checks remain unchanged.",
"checks": [
{
"venue": "ISMIR",
"year": 2026,
"track": "main",
"status": "unknown",
"primary_url": "https://ismir2026.ismir.net/authors/call-for-papers",
"checked_on": "2026-11-08",
"note": "官方CFP与作者指南说明双盲、CMT及可能desk rejection,但未确认会后全体拒稿元数据是否公开;匿名投稿及预印本规则不等于逐篇最终决定。late-breaking/demo、tutorial及music投稿另属轨道,不能混作主会拒稿。",
"evidence_file": "music-medical-fairness-policy-checks-2026-11-08.json",
"evidence": [
{
"source_url": "https://ismir2026.ismir.net/authors/call-for-papers",
"checked_at": "2026-11-08T11:39:24.623314+00:00",
"source_representation": "first_party_page_text_returned_by_web_tool",
"source_extract_sha256": "e1572ef05e361930fa8705b4d64bb8494d17793eb0bad42352f389dc87a4e8ae",
"source_html_sha256": null,
"direct_fetch": {
"source_url": "https://ismir2026.ismir.net/authors/call-for-papers",
"error": "HTTP Error 403: Forbidden"
},
"retrieval_note": "Anonymous direct HTTP returned 403/406. Archived official-page web-tool text is a separate representation, not a raw HTML response; no access-control bypass."
},
{
"source_url": "https://ismir2026.ismir.net/authors/author-guidelines",
"checked_at": "2026-11-08T11:39:24.623314+00:00",
"source_representation": "first_party_page_text_returned_by_web_tool",
"source_extract_sha256": "9cd75abefdbc4136a9de9d59d326d7df911ebfa0079f8047d45bae1277ae377f",
"source_html_sha256": null,
"direct_fetch": {
"source_url": "https://ismir2026.ismir.net/authors/author-guidelines",
"error": "HTTP Error 403: Forbidden"
},
"retrieval_note": "Anonymous direct HTTP returned 403/406. Archived official-page web-tool text is a separate representation, not a raw HTML response; no access-control bypass."
}
]
}
]
}
@@ -0,0 +1,516 @@
{
"source_url": "https://aclanthology.org/venues/naacl/",
"resolved_url": "https://aclanthology.org/venues/naacl/",
"checked_at": "2026-11-08T10:20:24.463381+00:00",
"http_status": 200,
"source_sha256": "d45623780479aa07c8afc419d5799decf59c9f1b124ea799281993f2a43ec14f",
"cutoff_year": 2026,
"expected_years": [
2000,
2001,
2003,
2004,
2006,
2007,
2009,
2010,
2012,
2013,
2015,
2016,
2018,
2019,
2021,
2022,
2024,
2025
],
"excluded_future_years": [],
"publisher_years": [
2000,
2001,
2003,
2004,
2006,
2007,
2009,
2010,
2012,
2013,
2015,
2016,
2018,
2019,
2021,
2022,
2024,
2025
],
"editions": [
{
"year": 2025,
"event_url": "https://aclanthology.org/events/naacl-2025/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2025.naacl-long/",
"title": "Proceedings of the 2025 Conference of the Nations of the Americas Chapter of the Association for Computational Linguistics: Human Language Technologies (Volume 1: Long Papers)"
},
{
"url": "https://aclanthology.org/volumes/2025.naacl-short/",
"title": "Proceedings of the 2025 Conference of the Nations of the Americas Chapter of the Association for Computational Linguistics: Human Language Technologies (Volume 2: Short Papers)"
},
{
"url": "https://aclanthology.org/volumes/2025.naacl-industry/",
"title": "Proceedings of the 2025 Conference of the Nations of the Americas Chapter of the Association for Computational Linguistics: Human Language Technologies (Volume 3: Industry Track)"
},
{
"url": "https://aclanthology.org/volumes/2025.naacl-srw/",
"title": "Proceedings of the 2025 Conference of the Nations of the Americas Chapter of the Association for Computational Linguistics: Human Language Technologies (Volume 4: Student Research Workshop)"
},
{
"url": "https://aclanthology.org/volumes/2025.naacl-tutorial/",
"title": "Proceedings of the 2025 Annual Conference of the Nations of the Americas Chapter of the Association for Computational Linguistics: Human Language Technologies (Volume 5: Tutorial Abstracts)"
},
{
"url": "https://aclanthology.org/volumes/2025.naacl-demo/",
"title": "Proceedings of the 2025 Conference of the Nations of the Americas Chapter of the Association for Computational Linguistics: Human Language Technologies (System Demonstrations)"
}
]
},
{
"year": 2024,
"event_url": "https://aclanthology.org/events/naacl-2024/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2024.naacl-long/",
"title": "Proceedings of the 2024 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies (Volume 1: Long Papers)"
},
{
"url": "https://aclanthology.org/volumes/2024.naacl-short/",
"title": "Proceedings of the 2024 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies (Volume 2: Short Papers)"
},
{
"url": "https://aclanthology.org/volumes/2024.naacl-demo/",
"title": "Proceedings of the 2024 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies (Volume 3: System Demonstrations)"
},
{
"url": "https://aclanthology.org/volumes/2024.naacl-srw/",
"title": "Proceedings of the 2024 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies (Volume 4: Student Research Workshop)"
},
{
"url": "https://aclanthology.org/volumes/2024.naacl-tutorials/",
"title": "Proceedings of the 2024 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies (Volume 5: Tutorial Abstracts)"
},
{
"url": "https://aclanthology.org/volumes/2024.naacl-industry/",
"title": "Proceedings of the 2024 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies (Volume 6: Industry Track)"
}
]
},
{
"year": 2022,
"event_url": "https://aclanthology.org/events/naacl-2022/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2022.naacl-main/",
"title": "Proceedings of the 2022 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies"
},
{
"url": "https://aclanthology.org/volumes/2022.naacl-srw/",
"title": "Proceedings of the 2022 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies: Student Research Workshop"
},
{
"url": "https://aclanthology.org/volumes/2022.naacl-demo/",
"title": "Proceedings of the 2022 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies: System Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/2022.naacl-tutorials/",
"title": "Proceedings of the 2022 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies: Tutorial Abstracts"
},
{
"url": "https://aclanthology.org/volumes/2022.naacl-industry/",
"title": "Proceedings of the 2022 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies: Industry Track"
}
]
},
{
"year": 2021,
"event_url": "https://aclanthology.org/events/naacl-2021/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/2021.naacl-main/",
"title": "Proceedings of the 2021 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies"
},
{
"url": "https://aclanthology.org/volumes/2021.naacl-demos/",
"title": "Proceedings of the 2021 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies: Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/2021.naacl-srw/",
"title": "Proceedings of the 2021 Conference of the North American Chapter of the Association for Computational Linguistics: Student Research Workshop"
},
{
"url": "https://aclanthology.org/volumes/2021.naacl-tutorials/",
"title": "Proceedings of the 2021 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies: Tutorials"
},
{
"url": "https://aclanthology.org/volumes/2021.naacl-industry/",
"title": "Proceedings of the 2021 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies: Industry Papers"
}
]
},
{
"year": 2019,
"event_url": "https://aclanthology.org/events/naacl-2019/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/N19-1/",
"title": "Proceedings of the 2019 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 1 (Long and Short Papers)"
},
{
"url": "https://aclanthology.org/volumes/N19-2/",
"title": "Proceedings of the 2019 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 2 (Industry Papers)"
},
{
"url": "https://aclanthology.org/volumes/N19-3/",
"title": "Proceedings of the 2019 Conference of the North American Chapter of the Association for Computational Linguistics: Student Research Workshop"
},
{
"url": "https://aclanthology.org/volumes/N19-4/",
"title": "Proceedings of the 2019 Conference of the North American Chapter of the Association for Computational Linguistics (Demonstrations)"
},
{
"url": "https://aclanthology.org/volumes/N19-5/",
"title": "Proceedings of the 2019 Conference of the North American Chapter of the Association for Computational Linguistics: Tutorials"
}
]
},
{
"year": 2018,
"event_url": "https://aclanthology.org/events/naacl-2018/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/N18-1/",
"title": "Proceedings of the 2018 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 1 (Long Papers)"
},
{
"url": "https://aclanthology.org/volumes/N18-2/",
"title": "Proceedings of the 2018 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 2 (Short Papers)"
},
{
"url": "https://aclanthology.org/volumes/N18-3/",
"title": "Proceedings of the 2018 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 3 (Industry Papers)"
},
{
"url": "https://aclanthology.org/volumes/N18-4/",
"title": "Proceedings of the 2018 Conference of the North American Chapter of the Association for Computational Linguistics: Student Research Workshop"
},
{
"url": "https://aclanthology.org/volumes/N18-5/",
"title": "Proceedings of the 2018 Conference of the North American Chapter of the Association for Computational Linguistics: Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/N18-6/",
"title": "Proceedings of the 2018 Conference of the North American Chapter of the Association for Computational Linguistics: Tutorial Abstracts"
}
]
},
{
"year": 2016,
"event_url": "https://aclanthology.org/events/naacl-2016/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/N16-1/",
"title": "Proceedings of the 2016 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies"
},
{
"url": "https://aclanthology.org/volumes/N16-2/",
"title": "Proceedings of the NAACL Student Research Workshop"
},
{
"url": "https://aclanthology.org/volumes/N16-3/",
"title": "Proceedings of the 2016 Conference of the North American Chapter of the Association for Computational Linguistics: Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/N16-4/",
"title": "Proceedings of the 2016 Conference of the North American Chapter of the Association for Computational Linguistics: Tutorial Abstracts"
}
]
},
{
"year": 2015,
"event_url": "https://aclanthology.org/events/naacl-2015/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/N15-1/",
"title": "Proceedings of the 2015 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies"
},
{
"url": "https://aclanthology.org/volumes/N15-2/",
"title": "Proceedings of the 2015 Conference of the North American Chapter of the Association for Computational Linguistics: Student Research Workshop"
},
{
"url": "https://aclanthology.org/volumes/N15-3/",
"title": "Proceedings of the 2015 Conference of the North American Chapter of the Association for Computational Linguistics: Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/N15-4/",
"title": "Proceedings of the 2015 Conference of the North American Chapter of the Association for Computational Linguistics: Tutorial Abstracts"
}
]
},
{
"year": 2013,
"event_url": "https://aclanthology.org/events/naacl-2013/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/N13-1/",
"title": "Proceedings of the 2013 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies"
},
{
"url": "https://aclanthology.org/volumes/N13-2/",
"title": "Proceedings of the 2013 NAACL HLT Student Research Workshop"
},
{
"url": "https://aclanthology.org/volumes/N13-3/",
"title": "Proceedings of the 2013 NAACL HLT Demonstration Session"
},
{
"url": "https://aclanthology.org/volumes/N13-4/",
"title": "NAACL HLT 2013 Tutorial Abstracts"
}
]
},
{
"year": 2012,
"event_url": "https://aclanthology.org/events/naacl-2012/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/N12-1/",
"title": "Proceedings of the 2012 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies"
},
{
"url": "https://aclanthology.org/volumes/N12-2/",
"title": "Proceedings of the NAACL HLT 2012 Student Research Workshop"
},
{
"url": "https://aclanthology.org/volumes/N12-3/",
"title": "Proceedings of the Demonstration Session at the Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies"
},
{
"url": "https://aclanthology.org/volumes/N12-4/",
"title": "Tutorial Abstracts at the Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies"
}
]
},
{
"year": 2010,
"event_url": "https://aclanthology.org/events/naacl-2010/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/N10-1/",
"title": "Human Language Technologies: The 2010 Annual Conference of the North American Chapter of the Association for Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/N10-2/",
"title": "Proceedings of the NAACL HLT 2010 Demonstration Session"
},
{
"url": "https://aclanthology.org/volumes/N10-3/",
"title": "Proceedings of the NAACL HLT 2010 Student Research Workshop"
},
{
"url": "https://aclanthology.org/volumes/N10-4/",
"title": "NAACL HLT 2010 Tutorial Abstracts"
}
]
},
{
"year": 2009,
"event_url": "https://aclanthology.org/events/naacl-2009/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/N09-1/",
"title": "Proceedings of Human Language Technologies: The 2009 Annual Conference of the North American Chapter of the Association for Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/N09-2/",
"title": "Proceedings of Human Language Technologies: The 2009 Annual Conference of the North American Chapter of the Association for Computational Linguistics, Companion Volume: Short Papers"
},
{
"url": "https://aclanthology.org/volumes/N09-3/",
"title": "Proceedings of Human Language Technologies: The 2009 Annual Conference of the North American Chapter of the Association for Computational Linguistics, Companion Volume: Student Research Workshop and Doctoral Consortium"
},
{
"url": "https://aclanthology.org/volumes/N09-4/",
"title": "Proceedings of Human Language Technologies: The 2009 Annual Conference of the North American Chapter of the Association for Computational Linguistics, Companion Volume: Tutorial Abstracts"
},
{
"url": "https://aclanthology.org/volumes/N09-5/",
"title": "Proceedings of Human Language Technologies: The 2009 Annual Conference of the North American Chapter of the Association for Computational Linguistics, Companion Volume: Demonstration Session"
}
]
},
{
"year": 2007,
"event_url": "https://aclanthology.org/events/naacl-2007/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/N07-1/",
"title": "Human Language Technologies 2007: The Conference of the North American Chapter of the Association for Computational Linguistics; Proceedings of the Main Conference"
},
{
"url": "https://aclanthology.org/volumes/N07-2/",
"title": "Human Language Technologies 2007: The Conference of the North American Chapter of the Association for Computational Linguistics; Companion Volume, Short Papers"
},
{
"url": "https://aclanthology.org/volumes/N07-3/",
"title": "Proceedings of the NAACL-HLT 2007 Doctoral Consortium"
},
{
"url": "https://aclanthology.org/volumes/N07-4/",
"title": "Proceedings of Human Language Technologies: The Annual Conference of the North American Chapter of the Association for Computational Linguistics (NAACL-HLT)"
},
{
"url": "https://aclanthology.org/volumes/N07-5/",
"title": "Proceedings of the Human Language Technology Conference of the NAACL, Companion Volume: Tutorial Abstracts"
}
]
},
{
"year": 2006,
"event_url": "https://aclanthology.org/events/naacl-2006/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/N06-1/",
"title": "Proceedings of the Human Language Technology Conference of the NAACL, Main Conference"
},
{
"url": "https://aclanthology.org/volumes/N06-2/",
"title": "Proceedings of the Human Language Technology Conference of the NAACL, Companion Volume: Short Papers"
},
{
"url": "https://aclanthology.org/volumes/N06-3/",
"title": "Proceedings of the Human Language Technology Conference of the NAACL, Companion Volume: Doctoral Consortium"
},
{
"url": "https://aclanthology.org/volumes/N06-4/",
"title": "Proceedings of the Human Language Technology Conference of the NAACL, Companion Volume: Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/N06-5/",
"title": "Proceedings of the Human Language Technology Conference of the NAACL, Companion Volume: Tutorial Abstracts"
}
]
},
{
"year": 2004,
"event_url": "https://aclanthology.org/events/naacl-2004/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/N04-1/",
"title": "Proceedings of the Human Language Technology Conference of the North American Chapter of the Association for Computational Linguistics: HLT-NAACL 2004"
},
{
"url": "https://aclanthology.org/volumes/N04-2/",
"title": "Proceedings of the Student Research Workshop at HLT-NAACL 2004"
},
{
"url": "https://aclanthology.org/volumes/N04-3/",
"title": "Demonstration Papers at HLT-NAACL 2004"
},
{
"url": "https://aclanthology.org/volumes/N04-4/",
"title": "Proceedings of HLT-NAACL 2004: Short Papers"
}
]
},
{
"year": 2003,
"event_url": "https://aclanthology.org/events/naacl-2003/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/N03-1/",
"title": "Proceedings of the 2003 Human Language Technology Conference of the North American Chapter of the Association for Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/N03-2/",
"title": "Companion Volume of the Proceedings of HLT-NAACL 2003 - Short Papers"
},
{
"url": "https://aclanthology.org/volumes/N03-3/",
"title": "Proceedings of the HLT-NAACL 2003 Student Research Workshop"
},
{
"url": "https://aclanthology.org/volumes/N03-4/",
"title": "Companion Volume of the Proceedings of HLT-NAACL 2003 - Demonstrations"
},
{
"url": "https://aclanthology.org/volumes/N03-5/",
"title": "Companion Volume of the Proceedings of HLT-NAACL 2003 - Tutorial Abstracts"
}
]
},
{
"year": 2001,
"event_url": "https://aclanthology.org/events/naacl-2001/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/N01-1/",
"title": "Second Meeting of the North American Chapter of the Association for Computational Linguistics"
}
]
},
{
"year": 2000,
"event_url": "https://aclanthology.org/events/naacl-2000/",
"volumes": [
{
"url": "https://aclanthology.org/volumes/A00-2/",
"title": "1st Meeting of the North American Chapter of the Association for Computational Linguistics"
},
{
"url": "https://aclanthology.org/volumes/A00-3/",
"title": "Proceedings of the ANLP-NAACL 2000 Student Research Workshop"
},
{
"url": "https://aclanthology.org/volumes/A00-4/",
"title": "Author Index to the Proceedings of ANLP-NAACL 2000 and the Student Research Workshop"
}
]
}
],
"scope": "Actual first-party publisher entries; multiple volumes/tracks do not create extra event years. Year census does not establish per-paper/track/abstract or public rejected-submission completeness. 18 published NAACLseries eventyears2000–2025, with first/second meetings and subsequent actual publisherentries, crosschecked against chapter list. No annual interpolation or fabricated NAACL2026.",
"additional_primary_sources": [
{
"source_url": "https://naacl.org/conferences/",
"resolved_url": "https://naacl.org/conferences/",
"checked_at": "2026-11-08T10:20:26.974206+00:00",
"http_status": 200,
"source_sha256": "bf0a00acb6be31011516080b7ef0311299236525e3db445be46b104c83a46f38"
},
{
"source_url": "https://naacl.org/posts/2001-09-01-newsletter",
"resolved_url": "https://naacl.org/posts/2001-09-01-newsletter",
"checked_at": "2026-11-08T10:22:01.105833+00:00",
"http_status": 200,
"source_sha256": "5ddef8c8bd3ec53301f2f8215eafc4190dc1891a76dd2ad47a240165a8c5e97c"
}
],
"chapter_hosted_acl_years_not_new_naacl_series_editions": [
2002,
2005,
2008,
2011,
2014,
2017
],
"chapter_hosting_note": "Currentchapterlist mixes independently named NAACL/HLT-NAACL with hosted ACL meetings. The2001officialnewsletter explicitly calls2002 co-hosting internationalACL, not an extra standalone NAACL series acceptance. Chapterschedule/hosting does not rename ACLpapers. Publisher first andsecond meetings2000/2001 supplement chapterweb list starting2003.",
"name_change": {
"formerly": "North American Chapter",
"current": "Nations of the Americas Chapter",
"publisher_stated_until": "2024-10",
"interpretation": "Preserve historic source titles/author fields; this organizational name change is not a new conference series or an extra submission."
},
"source_html_sha256": "d45623780479aa07c8afc419d5799decf59c9f1b124ea799281993f2a43ec14f"
}
@@ -0,0 +1,269 @@
{
"source_url": "https://neurips.cc/",
"checked_at": "2026-11-08T07:28:31.793833+00:00",
"source_html_sha256": "2adec2819b63be23b21960b4f1c8d0dff1af501b8593b16f029bbb3e0902ebdf",
"cutoff_year": 2026,
"expected_years": [
1987,
1988,
1989,
1990,
1991,
1992,
1993,
1994,
1995,
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [],
"published_years_in_official_proceedings_index": [
1987,
1988,
1989,
1990,
1991,
1992,
1993,
1994,
1995,
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025
],
"announced_years_without_proceedings_index": [
2026
],
"proceedings_index": {
"source_url": "https://proceedings.neurips.cc/",
"checked_at": "2026-11-08T07:28:27.754669+00:00",
"source_html_sha256": "c3bd4a4fd93a352393985c9e3ae3806ca34d7026c99d73e798910496babaad37",
"year_and_track_links": [
{
"text": "Advances in Neural Information Processing Systems Datasets and Benchmarks, 2021",
"url": "https://datasets-benchmarks-proceedings.neurips.cc/paper/2021"
},
{
"text": "Advances in Neural Information Processing Systems 38 Main Conference",
"url": "https://proceedings.neurips.cc/paper_files/paper/2025/vol38-main-conference"
},
{
"text": "Advances in Neural Information Processing Systems 38 Creative AI",
"url": "https://proceedings.neurips.cc/paper_files/paper/2025"
},
{
"text": "Advances in Neural Information Processing Systems 37",
"url": "https://proceedings.neurips.cc/paper_files/paper/2024"
},
{
"text": "Advances in Neural Information Processing Systems 36",
"url": "https://proceedings.neurips.cc/paper_files/paper/2023"
},
{
"text": "Advances in Neural Information Processing Systems 35",
"url": "https://proceedings.neurips.cc/paper_files/paper/2022"
},
{
"text": "Advances in Neural Information Processing Systems 34",
"url": "https://proceedings.neurips.cc/paper_files/paper/2021"
},
{
"text": "Advances in Neural Information Processing Systems 33",
"url": "https://proceedings.neurips.cc/paper_files/paper/2020"
},
{
"text": "Advances in Neural Information Processing Systems 32",
"url": "https://proceedings.neurips.cc/paper_files/paper/2019"
},
{
"text": "Advances in Neural Information Processing Systems 31",
"url": "https://proceedings.neurips.cc/paper_files/paper/2018"
},
{
"text": "Advances in Neural Information Processing Systems 30",
"url": "https://proceedings.neurips.cc/paper_files/paper/2017"
},
{
"text": "Advances in Neural Information Processing Systems 29",
"url": "https://proceedings.neurips.cc/paper_files/paper/2016"
},
{
"text": "Advances in Neural Information Processing Systems 28",
"url": "https://proceedings.neurips.cc/paper_files/paper/2015"
},
{
"text": "Advances in Neural Information Processing Systems 27",
"url": "https://proceedings.neurips.cc/paper_files/paper/2014"
},
{
"text": "Advances in Neural Information Processing Systems 26",
"url": "https://proceedings.neurips.cc/paper_files/paper/2013"
},
{
"text": "Advances in Neural Information Processing Systems 25",
"url": "https://proceedings.neurips.cc/paper_files/paper/2012"
},
{
"text": "Advances in Neural Information Processing Systems 24",
"url": "https://proceedings.neurips.cc/paper_files/paper/2011"
},
{
"text": "Advances in Neural Information Processing Systems 23",
"url": "https://proceedings.neurips.cc/paper_files/paper/2010"
},
{
"text": "Advances in Neural Information Processing Systems 22",
"url": "https://proceedings.neurips.cc/paper_files/paper/2009"
},
{
"text": "Advances in Neural Information Processing Systems 21",
"url": "https://proceedings.neurips.cc/paper_files/paper/2008"
},
{
"text": "Advances in Neural Information Processing Systems 20",
"url": "https://proceedings.neurips.cc/paper_files/paper/2007"
},
{
"text": "Advances in Neural Information Processing Systems 19",
"url": "https://proceedings.neurips.cc/paper_files/paper/2006"
},
{
"text": "Advances in Neural Information Processing Systems 18",
"url": "https://proceedings.neurips.cc/paper_files/paper/2005"
},
{
"text": "Advances in Neural Information Processing Systems 17",
"url": "https://proceedings.neurips.cc/paper_files/paper/2004"
},
{
"text": "Advances in Neural Information Processing Systems 16",
"url": "https://proceedings.neurips.cc/paper_files/paper/2003"
},
{
"text": "Advances in Neural Information Processing Systems 15",
"url": "https://proceedings.neurips.cc/paper_files/paper/2002"
},
{
"text": "Advances in Neural Information Processing Systems 14",
"url": "https://proceedings.neurips.cc/paper_files/paper/2001"
},
{
"text": "Advances in Neural Information Processing Systems 13",
"url": "https://proceedings.neurips.cc/paper_files/paper/2000"
},
{
"text": "Advances in Neural Information Processing Systems 12",
"url": "https://proceedings.neurips.cc/paper_files/paper/1999"
},
{
"text": "Advances in Neural Information Processing Systems 11",
"url": "https://proceedings.neurips.cc/paper_files/paper/1998"
},
{
"text": "Advances in Neural Information Processing Systems 10",
"url": "https://proceedings.neurips.cc/paper_files/paper/1997"
},
{
"text": "Advances in Neural Information Processing Systems 9",
"url": "https://proceedings.neurips.cc/paper_files/paper/1996"
},
{
"text": "Advances in Neural Information Processing Systems 8",
"url": "https://proceedings.neurips.cc/paper_files/paper/1995"
},
{
"text": "Advances in Neural Information Processing Systems 7",
"url": "https://proceedings.neurips.cc/paper_files/paper/1994"
},
{
"text": "Advances in Neural Information Processing Systems 6",
"url": "https://proceedings.neurips.cc/paper_files/paper/1993"
},
{
"text": "Advances in Neural Information Processing Systems 5",
"url": "https://proceedings.neurips.cc/paper_files/paper/1992"
},
{
"text": "Advances in Neural Information Processing Systems 4",
"url": "https://proceedings.neurips.cc/paper_files/paper/1991"
},
{
"text": "Advances in Neural Information Processing Systems 3",
"url": "https://proceedings.neurips.cc/paper_files/paper/1990"
},
{
"text": "Advances in Neural Information Processing Systems 2",
"url": "https://proceedings.neurips.cc/paper_files/paper/1989"
},
{
"text": "Advances in Neural Information Processing Systems 1",
"url": "https://proceedings.neurips.cc/paper_files/paper/1988"
},
{
"text": "Neural Information Processing Systems 0",
"url": "https://proceedings.neurips.cc/paper_files/paper/1987"
}
]
},
"track_boundaries": [
"2021 Datasets and Benchmarks has a separate index; from2022 it is inside main proceedings and requires per-paper track metadata.",
"2025 Main Conference and Creative AI have distinct official index URLs; count one conference year, preserve separate tracks."
],
"scope": "Official published years 1987–2025 plus announced 40th edition2026. At check time 2026 proceedings not listed; missing announced year is not a claim of missing published records. No per-paper/track/negative completeness claim."
}
@@ -0,0 +1,66 @@
{
"checked_on": "2026-11-08",
"scope": "Four bounded year/track primary-source checks; not a historical policy census, actual rejected-paper export, or production import. No access bypass.",
"checks": [
{
"venue": "NAACL",
"year": 2025,
"track": "main",
"status": "unknown",
"primary_url": "https://2025.naacl.org/calls/papers/",
"evidence": {
"source_url": "https://2025.naacl.org/calls/papers/",
"resolved_url": "https://2025.naacl.org/calls/papers/",
"checked_at": "2026-11-08T10:22:02.491032+00:00",
"http_status": 200,
"source_sha256": "8b8db0cf37f0ef1b30b2b1578f609306f292fa87bef8c97083961c4b777aa077"
},
"note": "ARR评审不公开,作者可选择公开匿名投稿;这不是NAACL最终拒稿公开证据。会议commitment与ARR评审周期分开,ARR的preferred venue不是已投会议;ARR desk rejection不能标成NAACL desk rejection。TACL/CL展示不自动产生新的主会录用。该年最终拒稿发布范围仍未确认。"
},
{
"venue": "EACL",
"year": 2026,
"track": "main",
"status": "unknown",
"primary_url": "https://2026.eacl.org/calls/papers/",
"evidence": {
"source_url": "https://2026.eacl.org/calls/papers/",
"resolved_url": "https://2026.eacl.org/calls/papers/",
"checked_at": "2026-11-08T10:23:05.391233+00:00",
"http_status": 200,
"source_sha256": "e71bcee71f1bd52ae9fce2c78f48f9ad3fb738461d8daef4fd62aaaec3597e15"
},
"note": "官方CFP确认ARR评审后commitment;未入主会的稿件会自动考虑Findings,两者同时通知,不能将Findings录用推断为最终会议Reject。TACL/CL期刊展示不自动当成主会录用;该页未明确会后拒稿元数据发布范围。"
},
{
"venue": "COLING",
"year": 2025,
"track": "main_direct",
"status": "not_published",
"primary_url": "https://coling2025.org/calls/main_conference_papers/",
"evidence": {
"source_url": "https://coling2025.org/calls/main_conference_papers/",
"resolved_url": "https://coling2025.org/calls/main_conference_papers/",
"checked_at": "2026-11-08T10:22:02.995232+00:00",
"http_status": 200,
"source_sha256": "3185283db3be9adda44c381074d61b9fbaaab9b62d1ddab6cbcbdc3ac4f971e0"
},
"note": "仅该年main直投通道明确说明投稿和评审不公开;ARR已评审稿件另经commitment,由SAC/PC决定,ARR评审不是最终COLING决定。不外推其他年份、轨道或独立数据集;不从未录用清单生成拒稿。"
},
{
"venue": "AAMAS",
"year": 2026,
"track": "main",
"status": "unknown",
"primary_url": "https://cyprusconferences.org/aamas2026/submission-instructions/",
"evidence": {
"source_url": "https://cyprusconferences.org/aamas2026/submission-instructions/",
"resolved_url": "https://cyprusconferences.org/aamas2026/submission-instructions/",
"checked_at": "2026-11-08T10:20:30.733617+00:00",
"http_status": 200,
"source_sha256": "c428a92e83ba913b1f36a8cca009ccf0f62fe29f20f8c4c74d173a4fb591b27a"
},
"note": "官方说明录用论文及评审将在OpenReview公开,投稿材料保密;未明确会后所有拒稿元数据发布范围。允许其他会议拒稿重投是资格规则,不能据此生成逐篇先前拒稿;不能把AAAI特殊轨道规则外推主会。"
}
]
}
@@ -0,0 +1,97 @@
{
"source_url": "https://recsys.acm.org/",
"checked_at": "2026-11-07T20:53:46.009213+00:00",
"source_html_sha256": "b2f68fbe060b34e24c2bbb9032aa69aac66a1a48a20cb4da1cd205b977c7f30b",
"cutoff_year": 2026,
"expected_years": [
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027
],
"year_links": {
"2007": [
"https://recsys.acm.org/recsys07/"
],
"2008": [
"https://recsys.acm.org/recsys08/"
],
"2009": [
"https://recsys.acm.org/recsys09/"
],
"2010": [
"https://recsys.acm.org/recsys10/"
],
"2011": [
"https://recsys.acm.org/recsys11/"
],
"2012": [
"https://recsys.acm.org/recsys12/"
],
"2013": [
"https://recsys.acm.org/recsys13/"
],
"2014": [
"https://recsys.acm.org/recsys14/"
],
"2015": [
"https://recsys.acm.org/recsys15/"
],
"2016": [
"https://recsys.acm.org/recsys16/"
],
"2017": [
"https://recsys.acm.org/recsys17/"
],
"2018": [
"https://recsys.acm.org/recsys18/"
],
"2019": [
"https://recsys.acm.org/recsys19/"
],
"2020": [
"https://recsys.acm.org/recsys20/"
],
"2021": [
"https://recsys.acm.org/recsys21/"
],
"2022": [
"https://recsys.acm.org/recsys22/"
],
"2023": [
"https://recsys.acm.org/recsys23/"
],
"2024": [
"https://recsys.acm.org/recsys24/"
],
"2025": [
"https://recsys.acm.org/recsys25/"
],
"2026": [
"https://recsys.acm.org/recsys26/"
],
"2027": [
"https://recsys.acm.org/recsys27/"
]
},
"scope": "Official conference-year archive enumeration only; not per-track/paper-list or rejection coverage."
}
@@ -0,0 +1,161 @@
{
"checked_on": "2026-11-08",
"scope": "补充三个会议各一项限定年份/轨道核查;不是完整历史政策普查或公开负面记录全集,无数据库写入。当前配置快照不代表永久发布政策。",
"checks": [
{
"venue": "CoNLL",
"year": 2025,
"track": "archival",
"status": "unknown",
"primary_url": "https://www.aclweb.org/portal/content/conll-2025-2nd-call-papers",
"checked_on": "2026-11-08",
"note": "2025第二次官方CFP改为只收直接投稿;不能继续用第一次CFP的ARR路径。Archival匿名、非存档展示不匿名且可为2023–2025已有发表论文,展示不生成新的主会存档录用。OpenReview托管路径含Workshop不代表CoNLL正式论文的语义track。公开group当前三个public标志false,未确认会后全部拒稿/withdrawn元数据范围,不能推断零条或永不公开。",
"evidence": [
{
"source_url": "https://www.aclweb.org/portal/content/conll-2025-2nd-call-papers",
"checked_at": "2026-11-08T12:23:12.646583+00:00",
"source_representation": "first_party_organizer_CFP_text_returned_by_web_tool",
"source_html_sha256": null,
"source_extract_sha256": "168aae01ee24b65f7b120d87bfd8a3a46e313a7e43482f755db3e13b2a52d9a8",
"direct_fetch": {
"source_url": "https://www.aclweb.org/portal/content/conll-2025-2nd-call-papers",
"error": "HTTP Error 418: Unknown",
"checked_at": "2026-11-08T12:21:07.703494+00:00"
}
},
{
"source_url": "https://api2.openreview.net/groups?id=aclweb.org%2FACL%2F2025%2FWorkshop%2FCoNLL",
"resolved_url": "https://api2.openreview.net/groups?id=aclweb.org%2FACL%2F2025%2FWorkshop%2FCoNLL",
"http_status": 200,
"checked_at": "2026-11-08T12:21:49.351048+00:00",
"source_sha256": "7ad88f486224f08bec7a673e541557d8b7d46238154bf21aa9e6a0cf636aa894"
}
]
},
{
"venue": "SIGIR",
"year": 2026,
"track": "full_papers",
"status": "unknown",
"primary_url": "https://sigir2026.org/en-AU/pages/submissions/full-papers-track",
"checked_on": "2026-11-08",
"note": "官方OpenReview group说明为2026 Full Papers Track并链接确切CFP;三个投稿公开标志当前为false。一次Rejected_Submission匿名notes查询403,未取得逐篇记录,不能当作零条或完整全历史拒稿核查。CFP直连HTTP200但web工具没有可读行,原HTML及路由限制保留;不把short/其他轨道或2027规则套用到2026。",
"evidence": [
{
"source_url": "https://api2.openreview.net/groups?id=ACM.org%2FSIGIR%2F2026%2FConference",
"resolved_url": "https://api2.openreview.net/groups?id=ACM.org%2FSIGIR%2F2026%2FConference",
"http_status": 200,
"checked_at": "2026-11-08T12:19:52.058120+00:00",
"source_sha256": "1b622a620e7f35f1648d25d08faada7c384d8c05cdc3f84cef3f2656cf141108"
},
{
"source_url": "https://sigir2026.org/en-AU/pages/submissions/full-papers-track",
"resolved_url": "https://sigir2026.org/en-AU/pages/submissions/full-papers-track",
"http_status": 200,
"checked_at": "2026-11-08T12:22:04.292334+00:00",
"source_sha256": "1adbff7531aa3f86c6c94605eaeefe349c8e760f222cf620b4572e52c8fc718e"
},
{
"source_url": "https://api2.openreview.net/notes?content.venueid=ACM.org%2FSIGIR%2F2026%2FConference%2FRejected_Submission&limit=1",
"error": "HTTP Error 403: Forbidden",
"checked_at": "2026-11-08T12:22:05.292689+00:00"
}
]
},
{
"venue": "IROS",
"year": 2025,
"track": "main",
"status": "unknown",
"primary_url": "https://www.iros25.org/CallForPapersv2",
"checked_on": "2026-11-08",
"note": "官方2025 CFP说明PaperPlaza、单盲审稿及Senior Program Committee最终决定;仅期刊展示不算常规IROS新录用。保密规则和已录用稿件发表安排未确认会后逐篇拒稿元数据公开范围。TLS校验失败保留,使用索引中的官方CFP文本;未关闭TLS验证。2026访问限制依旧,不能将2025结论推广为2026或全部历史。",
"evidence": [
{
"source_url": "https://www.iros25.org/CallForPapersv2",
"checked_at": "2026-11-08T12:23:12.646583+00:00",
"source_representation": "indexed_first_party_CFP_text_returned_by_search_tool",
"source_html_sha256": null,
"source_extract_sha256": "ae0c2d0211a8d2ade1a528d1758a5e7f58fb3111ae96af5807f570ee9f1a4318",
"direct_fetch": {
"source_url": "https://www.iros25.org/CallForPapersv2",
"error": "<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1081)>",
"checked_at": "2026-11-08T12:19:47.356024+00:00"
}
}
]
}
],
"public_group_snapshots": [
{
"venue": "CoNLL",
"group_id": "aclweb.org/ACL/2025/Workshop/CoNLL",
"public_flags_at_check": {
"public_submissions": false,
"public_withdrawn_submissions": false,
"public_desk_rejected_submissions": false
},
"submission_venue_id": "aclweb.org/ACL/2025/Workshop/CoNLL/Submission",
"rejected_venue_id": "aclweb.org/ACL/2025/Workshop/CoNLL/Rejected_Submission",
"receipt": {
"source_url": "https://api2.openreview.net/groups?id=aclweb.org%2FACL%2F2025%2FWorkshop%2FCoNLL",
"resolved_url": "https://api2.openreview.net/groups?id=aclweb.org%2FACL%2F2025%2FWorkshop%2FCoNLL",
"http_status": 200,
"checked_at": "2026-11-08T12:21:49.351048+00:00",
"source_sha256": "7ad88f486224f08bec7a673e541557d8b7d46238154bf21aa9e6a0cf636aa894"
}
},
{
"venue": "SIGIR",
"group_id": "ACM.org/SIGIR/2026/Conference",
"public_flags_at_check": {
"public_submissions": false,
"public_withdrawn_submissions": false,
"public_desk_rejected_submissions": false
},
"submission_venue_id": "ACM.org/SIGIR/2026/Conference/Submission",
"rejected_venue_id": "ACM.org/SIGIR/2026/Conference/Rejected_Submission",
"receipt": {
"source_url": "https://api2.openreview.net/groups?id=ACM.org%2FSIGIR%2F2026%2FConference",
"resolved_url": "https://api2.openreview.net/groups?id=ACM.org%2FSIGIR%2F2026%2FConference",
"http_status": 200,
"checked_at": "2026-11-08T12:19:52.058120+00:00",
"source_sha256": "1b622a620e7f35f1648d25d08faada7c384d8c05cdc3f84cef3f2656cf141108"
}
}
],
"anonymous_access_attempts": [
{
"venue": "SIGIR",
"year": 2026,
"track": "full_papers",
"receipt": {
"source_url": "https://api2.openreview.net/notes?content.venueid=ACM.org%2FSIGIR%2F2026%2FConference%2FRejected_Submission&limit=1",
"error": "HTTP Error 403: Forbidden",
"checked_at": "2026-11-08T12:22:05.292689+00:00"
},
"scope": "仅一次官方group配置所列Rejected_Submission venueid查询,limit1;403不是零记录,不绕过权限。"
}
],
"conll2025_policy_revision": {
"source": {
"source_url": "https://www.aclweb.org/portal/content/conll-2025-2nd-call-papers",
"checked_at": "2026-11-08T12:23:12.646583+00:00",
"source_representation": "first_party_organizer_CFP_text_returned_by_web_tool",
"source_html_sha256": null,
"source_extract_sha256": "168aae01ee24b65f7b120d87bfd8a3a46e313a7e43482f755db3e13b2a52d9a8",
"direct_fetch": {
"source_url": "https://www.aclweb.org/portal/content/conll-2025-2nd-call-papers",
"error": "HTTP Error 418: Unknown",
"checked_at": "2026-11-08T12:21:07.703494+00:00"
}
},
"revision": "2025-02-07 second CFP",
"direct_only": true,
"archival_anonymous": true,
"nonarchival_anonymous": false,
"nonarchival_scope": "已有2023–2025发表作品的展示,不额外生成存档主会录用。",
"hosting_path_semantics": "Workshop路径是OpenReview托管标识,不能单独决定论文track。"
},
"retrieval_boundaries": "CoNLL官方CFP直连418、IROS TLS失败,分别保留官方网页提取和索引文本哈希,与原HTML区分;SIGIR web路由无可读行,不执行其脚本。"
}
@@ -0,0 +1,127 @@
{
"checked_on": "2026-11-08",
"scope": "Three bounded main-track policy checks, no per-paper negative export and no DB write. IROS2025/2026 access attempts remain unverified rather than counted as completed policy reviews.",
"checks": [
{
"venue": "ICRA",
"year": 2026,
"track": "main",
"status": "unknown",
"primary_url": "https://2026.ieee-icra.org/contribute/call-for-icra-2026-papers-now-accepting-submissions/",
"checked_on": "2026-11-08",
"note": "官方主会说明双盲、保密及Paperplaza;IROS2025未录用稿件可带评审回复转投ICRA2026,仍需正常审稿。转投政策不是逐篇公开原拒稿证据,具体跨会历史需要逐篇标识与来源。期刊论文仅展示须与主会新录用分开,会后全部拒稿元数据范围未确认。",
"evidence": [
{
"source_url": "https://2026.ieee-icra.org/contribute/call-for-icra-2026-papers-now-accepting-submissions/",
"checked_at": "2026-11-08T11:49:47.378390+00:00",
"source_representation": "first_party_page_text_returned_by_web_tool",
"source_extract_sha256": "1b137225f3eddf70b52bc85a9e67283aecfd391345c6f11adda4ac41812e7896",
"source_html_sha256": null,
"direct_fetch": {
"source_url": "https://2026.ieee-icra.org/contribute/call-for-icra-2026-papers-now-accepting-submissions/",
"error": "HTTP Error 403: Forbidden"
},
"retrieval_note": "Official web-tool extraction archived separately from raw HTTP. Direct403 retained, not bypassed and not represented as HTML hash."
}
]
},
{
"venue": "ICASSP",
"year": 2026,
"track": "main",
"status": "unknown",
"primary_url": "https://2026.ieeeicassp.org/editorial-policies/",
"checked_on": "2026-11-08",
"note": "官方编辑政策说明初筛、至少三位评审、可选rebuttal及最终建议;存在desk rejection规则并不证明所有实际拒稿元数据公开。no-show未进IEEE Xplore也可能已向参会者分发论文集,不能因索引缺失或未展示推断Reject。OJSP期刊轨道与主会分开。",
"evidence": [
{
"source_url": "https://2026.ieeeicassp.org/editorial-policies/",
"checked_at": "2026-11-08T11:49:47.378390+00:00",
"source_representation": "first_party_page_text_returned_by_web_tool",
"source_extract_sha256": "fd0bea379c611f2f7bd7d0adaa5514ea0cb7f7468711cde247ac7b8874b1df6d",
"source_html_sha256": null,
"direct_fetch": {
"source_url": "https://2026.ieeeicassp.org/editorial-policies/",
"error": "HTTP Error 403: Forbidden"
},
"retrieval_note": "Official web-tool extraction archived separately from raw HTTP. Direct403 retained, not bypassed and not represented as HTML hash."
},
{
"source_url": "https://2026.ieeeicassp.org/sps-policies/",
"checked_at": "2026-11-08T11:49:47.378390+00:00",
"source_representation": "first_party_page_text_returned_by_web_tool",
"source_extract_sha256": "9147c23b94a5deaad9e807b758ea493c9404cfa10a0e371e63628c78dccbd6c6",
"source_html_sha256": null,
"direct_fetch": {
"source_url": "https://2026.ieeeicassp.org/sps-policies/",
"error": "HTTP Error 403: Forbidden"
},
"retrieval_note": "Official web-tool extraction archived separately from raw HTTP. Direct403 retained, not bypassed and not represented as HTML hash."
}
]
},
{
"venue": "INTERSPEECH",
"year": 2026,
"track": "main",
"status": "unknown",
"primary_url": "https://interspeech2026.org/pages/author-resources/submission-policy",
"checked_on": "2026-11-08",
"note": "官方响应内静态政策文字说明审稿保密、投稿不录用时版权暂转失效;允许预印本不是公开逐篇最终拒稿。会后全体拒稿元数据范围仍未确认。官网重定向页面的可渲染状态存在限制,已保留回执。",
"evidence": [
{
"source_url": "https://interspeech2026.org/pages/author-resources/submission-policy",
"resolved_url": "https://interspeech2026.org/en-AU/pages/author-resources/submission-policy",
"http_status": 200,
"checked_at": "2026-11-08T11:46:45.791744+00:00",
"source_sha256": "212d7bd47c1ed3974ee2ddd5c8ae66164fe6fb6b549812098e924e1bcbdfd6c3",
"source_representation": "static_policy_text_in_official_html_JSON_string_literals_not_executed",
"source_html_sha256": "212d7bd47c1ed3974ee2ddd5c8ae66164fe6fb6b549812098e924e1bcbdfd6c3",
"policy_text_sha256": "5c2fd10c43a418baf35ada26853b30126df387ac452741d0cbc644f17b61821a",
"retrieval_note": "HTTP200 redirects to en-AU; web-tool rendered route returned PageNotFound. Confidentiality policy text is embedded in response JSON strings and matches first-party search extraction, not claimed to be successfully rendered page. Keep routing limitation; no JS executed."
}
]
}
],
"unverified_access_attempts": [
{
"venue": "IROS",
"year": 2025,
"track": "main",
"receipt": {
"source_url": "https://iros25.org/CallForPapersv2",
"error": "<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1081)>"
},
"web_tool_error": "502 Bad Gateway",
"interpretation": "Do not disable TLS verification; not evidence of no public rejection data."
},
{
"venue": "IROS",
"year": 2026,
"track": "main",
"source_url": "https://2026.ieee-iros.org/contribute/call-for-papers/",
"web_tool_error": "blocked by robots.txt",
"interpretation": "No bypass and no claim of absent negative records."
}
],
"cross_conference_resubmission_policy": {
"source": {
"source_url": "https://2026.ieee-icra.org/contribute/call-for-icra-2026-papers-now-accepting-submissions/",
"checked_at": "2026-11-08T11:49:47.378390+00:00",
"source_representation": "first_party_page_text_returned_by_web_tool",
"source_extract_sha256": "1b137225f3eddf70b52bc85a9e67283aecfd391345c6f11adda4ac41812e7896",
"source_html_sha256": null,
"direct_fetch": {
"source_url": "https://2026.ieee-icra.org/contribute/call-for-icra-2026-papers-now-accepting-submissions/",
"error": "HTTP Error 403: Forbidden"
},
"retrieval_note": "Official web-tool extraction archived separately from raw HTTP. Direct403 retained, not bypassed and not represented as HTML hash."
},
"from_venue": "IROS",
"from_year": 2025,
"to_venue": "ICRA",
"to_year": 2026,
"category_label": "IROS-ICRA transfer",
"scope": "Authors include response and prior reviewer comments; new regular review required. Policy alone creates no submission, decision, merge or prior-rejection annotation."
}
}
+147
View File
@@ -0,0 +1,147 @@
{
"source_url": "https://www.roboticsproceedings.org/",
"resolved_url": "https://www.roboticsproceedings.org/",
"checked_at": "2026-11-08T10:03:01.144979+00:00",
"source_sha256": "0d61c8fe136b5eeb2422b37cd44ed5f090907a8c7659b32b8a613a7478713feb",
"expected_years": [
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"editions": [
{
"year": 2026,
"proceedings_url": "https://www.roboticsproceedings.org/rss22/index.html",
"roman_ordinal": "XXII"
},
{
"year": 2025,
"proceedings_url": "https://www.roboticsproceedings.org/rss21/index.html",
"roman_ordinal": "XXI"
},
{
"year": 2024,
"proceedings_url": "https://www.roboticsproceedings.org/rss20/index.html",
"roman_ordinal": "XX"
},
{
"year": 2023,
"proceedings_url": "https://www.roboticsproceedings.org/rss19/index.html",
"roman_ordinal": "XIX"
},
{
"year": 2022,
"proceedings_url": "https://www.roboticsproceedings.org/rss18/index.html",
"roman_ordinal": "XVIII"
},
{
"year": 2021,
"proceedings_url": "https://www.roboticsproceedings.org/rss17/index.html",
"roman_ordinal": "XVII"
},
{
"year": 2020,
"proceedings_url": "https://www.roboticsproceedings.org/rss16/index.html",
"roman_ordinal": "XVI"
},
{
"year": 2019,
"proceedings_url": "https://www.roboticsproceedings.org/rss15/index.html",
"roman_ordinal": "XV"
},
{
"year": 2018,
"proceedings_url": "https://www.roboticsproceedings.org/rss14/index.html",
"roman_ordinal": "XIV"
},
{
"year": 2017,
"proceedings_url": "https://www.roboticsproceedings.org/rss13/index.html",
"roman_ordinal": "XIII"
},
{
"year": 2016,
"proceedings_url": "https://www.roboticsproceedings.org/rss12/index.html",
"roman_ordinal": "XII"
},
{
"year": 2015,
"proceedings_url": "https://www.roboticsproceedings.org/rss11/index.html",
"roman_ordinal": "XI"
},
{
"year": 2014,
"proceedings_url": "https://www.roboticsproceedings.org/rss10/index.html",
"roman_ordinal": "X"
},
{
"year": 2013,
"proceedings_url": "https://www.roboticsproceedings.org/rss09/index.html",
"roman_ordinal": "IX"
},
{
"year": 2012,
"proceedings_url": "https://www.roboticsproceedings.org/rss08/index.html",
"roman_ordinal": "VIII"
},
{
"year": 2011,
"proceedings_url": "https://www.roboticsproceedings.org/rss07/index.html",
"roman_ordinal": "VII"
},
{
"year": 2010,
"proceedings_url": "https://www.roboticsproceedings.org/rss06/index.html",
"roman_ordinal": "VI"
},
{
"year": 2009,
"proceedings_url": "https://www.roboticsproceedings.org/rss05/index.html",
"roman_ordinal": "V"
},
{
"year": 2008,
"proceedings_url": "https://www.roboticsproceedings.org/rss04/index.html",
"roman_ordinal": "IV"
},
{
"year": 2007,
"proceedings_url": "https://www.roboticsproceedings.org/rss03/index.html",
"roman_ordinal": "III"
},
{
"year": 2006,
"proceedings_url": "https://www.roboticsproceedings.org/rss02/index.html",
"roman_ordinal": "II"
},
{
"year": 2005,
"proceedings_url": "https://www.roboticsproceedings.org/rss01/index.html",
"roman_ordinal": "I"
}
],
"scope": "Official proceedings enumeration of22actualconferenceyears. Event dates distinguish later printed-book publication years; linked journal special issues are separate publications, not new RSS acceptances. No per-paper/track or public rejection completeness claim.",
"cutoff_year": 2026,
"excluded_future_years": [],
"source_html_sha256": "0d61c8fe136b5eeb2422b37cd44ed5f090907a8c7659b32b8a613a7478713feb",
"conference_name": "Robotics: Science and Systems"
}
+191
View File
@@ -0,0 +1,191 @@
{
"source_url": "https://epubs.siam.org/action/showBookSeries?seriesCode=pr",
"checked_at": "2026-11-08T12:10:20.249437+00:00",
"source_representation": "indexed_first_party_publisher_page_text_returned_by_search_tool",
"source_html_sha256": null,
"source_extract_sha256": "5032af58a6979585e38ef43dc66c33ab7c3e458ff3a03217830c056118027430",
"direct_fetch": {
"source_url": "https://epubs.siam.org/action/showBookSeries?seriesCode=pr",
"error": "HTTP Error 403: Forbidden"
},
"additional_primary_sources": [
{
"source_url": "https://www.siam.org/conferences-events/siam-conferences/sdm26/",
"checked_at": "2026-11-08T12:10:20.249437+00:00",
"source_representation": "first_party_page_text_returned_by_web_tool",
"source_html_sha256": null,
"source_extract_sha256": "6dcfc45afb51ed0359e1e9cc9a5ea096e62af395545727026054601483d205f2",
"direct_fetch": {
"source_url": "https://www.siam.org/conferences-events/siam-conferences/sdm26/",
"error": "HTTP Error 403: Forbidden"
}
}
],
"cutoff_year": 2026,
"expected_years": [
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [],
"editions": [
{
"year": 2001,
"source_label": "SDM 2001",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2002,
"source_label": "SDM 2002",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2003,
"source_label": "SDM 2003",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2004,
"source_label": "SDM 2004",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2005,
"source_label": "SDM 2005",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2006,
"source_label": "SDM 2006",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2007,
"source_label": "SDM 2007",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2008,
"source_label": "SDM 2008",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2009,
"source_label": "SDM 2009",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2010,
"source_label": "SDM 2010",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2011,
"source_label": "SDM 2011",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2012,
"source_label": "SDM 2012",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2013,
"source_label": "SDM 2013",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2014,
"source_label": "SDM 2014",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2015,
"source_label": "SDM 2015",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2016,
"source_label": "SDM 2016",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2017,
"source_label": "SDM 2017",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2018,
"source_label": "SDM 2018",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2019,
"source_label": "SDM 2019",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2020,
"source_label": "SDM 2020",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2021,
"source_label": "SDM 2021",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2022,
"source_label": "SDM 2022",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2023,
"source_label": "SDM 2023",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2024,
"source_label": "SDM 2024",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2025,
"source_label": "SDM 2025",
"evidence_scope": "publisher-listed proceedings"
},
{
"year": 2026,
"source_label": "SDM26",
"dates_label": "November19–20,2026",
"location_label": "SaltLakeCity,Utah,U.S.",
"event_status_at_cutoff": "announced_upcoming",
"publication_status": "not_independently_verified"
}
],
"retrieval_note": "Rawpublisherfetch403andwebopen timeout retained. Searchtoolreturned indexed firstpartyproceedingslist with25explicityeartitles; extracthash identifies that representation, notrawHTML orfreshpublicationavailability. Current2026separateofficialeventpage confirmsupcomingevent.",
"scope": "25explicitpublisherproceedingsyears2001–2025plusofficialannounced2026,26editionyears; not26heldphysicalmeetings.2020haspublishedproceedings; physicaleventcancellation/formatdoesnotremoveanedition. Do nottreatMDS/ImagingSciencejointmeetingsasextraSDMmainacceptances. Proceedingscalendarandindividualpaper/track/abstract/negativerecordscope are distinct."
}
@@ -0,0 +1,381 @@
{
"source_url": "https://sigir.org/general-information/history/",
"resolved_url": "https://sigir.org/general-information/history/",
"http_status": 200,
"checked_at": "2026-11-08T11:54:43.994403+00:00",
"source_sha256": "8b8789c024b68515d1da53eccc0d25cef408b1be772fa9dba90535325c7ca791",
"source_html_sha256": "8b8789c024b68515d1da53eccc0d25cef408b1be772fa9dba90535325c7ca791",
"additional_primary_sources": [
{
"source_url": "https://sigir2026.org/",
"resolved_url": "https://sigir2026.org/en-AU",
"http_status": 200,
"checked_at": "2026-11-08T11:56:14.986412+00:00",
"source_sha256": "1353484731cc9609ac713c79a32babeff9acfd75536c352f47ddba12c358f6df",
"source_html_sha256": "1353484731cc9609ac713c79a32babeff9acfd75536c352f47ddba12c358f6df"
}
],
"cutoff_year": 2026,
"expected_years": [
1971,
1978,
1979,
1980,
1981,
1982,
1983,
1984,
1985,
1986,
1987,
1988,
1989,
1990,
1991,
1992,
1993,
1994,
1995,
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027
],
"editions": [
{
"year": 1971,
"source_label": "SIGIR 1971",
"series_scope": "separate historical Information Storage and Retrieval event"
},
{
"year": 1978,
"source_label": "SIGIR 1978",
"series_scope": "annual SIGIR series"
},
{
"year": 1979,
"source_label": "SIGIR 1979",
"series_scope": "annual SIGIR series"
},
{
"year": 1980,
"source_label": "SIGIR 1980",
"series_scope": "annual SIGIR series"
},
{
"year": 1981,
"source_label": "SIGIR 1981",
"series_scope": "annual SIGIR series"
},
{
"year": 1982,
"source_label": "SIGIR 1982",
"series_scope": "annual SIGIR series"
},
{
"year": 1983,
"source_label": "SIGIR 1983",
"series_scope": "annual SIGIR series"
},
{
"year": 1984,
"source_label": "SIGIR 1984",
"series_scope": "annual SIGIR series"
},
{
"year": 1985,
"source_label": "SIGIR 1985",
"series_scope": "annual SIGIR series"
},
{
"year": 1986,
"source_label": "SIGIR 1986",
"series_scope": "annual SIGIR series"
},
{
"year": 1987,
"source_label": "SIGIR 1987",
"series_scope": "annual SIGIR series"
},
{
"year": 1988,
"source_label": "SIGIR 1988",
"series_scope": "annual SIGIR series"
},
{
"year": 1989,
"source_label": "SIGIR 1989",
"series_scope": "annual SIGIR series"
},
{
"year": 1990,
"source_label": "SIGIR 1990",
"series_scope": "annual SIGIR series"
},
{
"year": 1991,
"source_label": "SIGIR 1991",
"series_scope": "annual SIGIR series"
},
{
"year": 1992,
"source_label": "SIGIR 1992",
"series_scope": "annual SIGIR series"
},
{
"year": 1993,
"source_label": "SIGIR 1993",
"series_scope": "annual SIGIR series"
},
{
"year": 1994,
"source_label": "SIGIR 1994",
"series_scope": "annual SIGIR series"
},
{
"year": 1995,
"source_label": "SIGIR 1995",
"series_scope": "annual SIGIR series"
},
{
"year": 1996,
"source_label": "SIGIR 1996",
"series_scope": "annual SIGIR series"
},
{
"year": 1997,
"source_label": "SIGIR 1997",
"series_scope": "annual SIGIR series"
},
{
"year": 1998,
"source_label": "SIGIR 1998",
"series_scope": "annual SIGIR series"
},
{
"year": 1999,
"source_label": "SIGIR 1999",
"series_scope": "annual SIGIR series"
},
{
"year": 2000,
"source_label": "SIGIR 2000",
"series_scope": "annual SIGIR series"
},
{
"year": 2001,
"source_label": "SIGIR 2001",
"series_scope": "annual SIGIR series"
},
{
"year": 2002,
"source_label": "SIGIR 2002",
"series_scope": "annual SIGIR series"
},
{
"year": 2003,
"source_label": "SIGIR 2003",
"series_scope": "annual SIGIR series"
},
{
"year": 2004,
"source_label": "SIGIR 2004",
"series_scope": "annual SIGIR series"
},
{
"year": 2005,
"source_label": "SIGIR 2005",
"series_scope": "annual SIGIR series"
},
{
"year": 2006,
"source_label": "SIGIR 2006",
"series_scope": "annual SIGIR series"
},
{
"year": 2007,
"source_label": "SIGIR 2007",
"series_scope": "annual SIGIR series"
},
{
"year": 2008,
"source_label": "SIGIR 2008",
"series_scope": "annual SIGIR series"
},
{
"year": 2009,
"source_label": "SIGIR 2009",
"series_scope": "annual SIGIR series"
},
{
"year": 2010,
"source_label": "SIGIR 2010",
"series_scope": "annual SIGIR series"
},
{
"year": 2011,
"source_label": "SIGIR 2011",
"series_scope": "annual SIGIR series"
},
{
"year": 2012,
"source_label": "SIGIR 2012",
"series_scope": "annual SIGIR series"
},
{
"year": 2013,
"source_label": "SIGIR 2013",
"series_scope": "annual SIGIR series"
},
{
"year": 2014,
"source_label": "SIGIR 2014",
"series_scope": "annual SIGIR series"
},
{
"year": 2015,
"source_label": "SIGIR 2015",
"series_scope": "annual SIGIR series"
},
{
"year": 2016,
"source_label": "SIGIR 2016",
"series_scope": "annual SIGIR series"
},
{
"year": 2017,
"source_label": "SIGIR 2017",
"series_scope": "annual SIGIR series"
},
{
"year": 2018,
"source_label": "SIGIR 2018",
"series_scope": "annual SIGIR series"
},
{
"year": 2019,
"source_label": "SIGIR 2019",
"series_scope": "annual SIGIR series"
},
{
"year": 2020,
"source_label": "SIGIR 2020",
"series_scope": "annual SIGIR series"
},
{
"year": 2021,
"source_label": "SIGIR 2021",
"series_scope": "annual SIGIR series"
},
{
"year": 2022,
"source_label": "SIGIR 2022",
"series_scope": "annual SIGIR series"
},
{
"year": 2023,
"source_label": "SIGIR 2023",
"series_scope": "annual SIGIR series"
},
{
"year": 2024,
"source_label": "SIGIR 2024",
"series_scope": "annual SIGIR series"
},
{
"year": 2025,
"source_label": "SIGIR 2025",
"series_scope": "annual SIGIR series"
},
{
"year": 2026,
"source_label": "SIGIR 2026",
"series_scope": "annual SIGIR series"
}
],
"annual_series_years": [
1978,
1979,
1980,
1981,
1982,
1983,
1984,
1985,
1986,
1987,
1988,
1989,
1990,
1991,
1992,
1993,
1994,
1995,
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"separate_historical_event_years": [
1971
],
"scope": "49 explicit history headings include1971InformationStorageandRetrieval event and48annual1978–2025entries; current2026officialpage identifies49thannualconference. Thus50familyeventyears, not50annualeditions. No1972–1977interpolation. Current website HTML metadata/embedded content confirms49th, rendered en-AU route has no readable lines in web tool. ICTIRco-location is not extraSIGIRmainacceptance; historicalnames and tracks remain distinct. Publicnegative scope still unverified."
}
+412
View File
@@ -0,0 +1,412 @@
{
"source_url": "https://www.auai.org/",
"checked_at": "2026-11-08T07:00:27.315635+00:00",
"source_html_sha256": "42138b961e725d6e1dbf5a336e991cbce1bb2f603fccb5aa9e776d079feea33f",
"cutoff_year": 2026,
"expected_years": [
1985,
1986,
1987,
1988,
1989,
1990,
1991,
1992,
1993,
1994,
1995,
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [],
"edition_entries": [
{
"year": 2025,
"official_entry": "41 2025 Rio de Janeiro, Brazil",
"links": [
{
"text": "Rio de Janeiro, Brazil",
"url": "https://www.auai.org/uai2025/"
}
]
},
{
"year": 2024,
"official_entry": "40 2024 Barcelona, Spain",
"links": [
{
"text": "Barcelona, Spain",
"url": "https://www.auai.org/uai2024/"
}
]
},
{
"year": 2023,
"official_entry": "39 2023 Pittsburgh, USA",
"links": [
{
"text": "Pittsburgh, USA",
"url": "https://www.auai.org/uai2023/"
}
]
},
{
"year": 2022,
"official_entry": "38 2022 Eindhoven, The Netherlands",
"links": [
{
"text": "Eindhoven, The Netherlands",
"url": "https://www.auai.org/uai2022/"
}
]
},
{
"year": 2021,
"official_entry": "37 2021 Virtual",
"links": [
{
"text": "Virtual",
"url": "https://www.auai.org/uai2021/"
}
]
},
{
"year": 2020,
"official_entry": "36 2020 Virtual",
"links": [
{
"text": "Virtual",
"url": "https://www.auai.org/uai2020/"
}
]
},
{
"year": 2019,
"official_entry": "35 2019 Tel Aviv, Israel",
"links": [
{
"text": "Tel Aviv, Israel",
"url": "https://www.auai.org/uai2019/"
}
]
},
{
"year": 2018,
"official_entry": "34 2018 Monterey, CA, USA",
"links": [
{
"text": "Monterey, CA, USA",
"url": "https://www.auai.org/uai2018/"
}
]
},
{
"year": 2017,
"official_entry": "33 2017 Sydney, Australia",
"links": [
{
"text": "Sydney, Australia",
"url": "https://www.auai.org/uai2017/"
}
]
},
{
"year": 2016,
"official_entry": "32 2016 New York, USA",
"links": [
{
"text": "New York, USA",
"url": "https://www.auai.org/uai2016/"
}
]
},
{
"year": 2015,
"official_entry": "31 2015 Amsterdam, Netherlands",
"links": [
{
"text": "Amsterdam, Netherlands",
"url": "https://www.auai.org/uai2015/"
}
]
},
{
"year": 2014,
"official_entry": "30 2014 Quebec City, Quebec, Canada",
"links": [
{
"text": "Quebec City, Quebec, Canada",
"url": "https://www.auai.org/uai2014/"
}
]
},
{
"year": 2013,
"official_entry": "29 2013 Bellevue, Washington, USA",
"links": [
{
"text": "Bellevue, Washington, USA",
"url": "https://www.auai.org/uai2013/"
}
]
},
{
"year": 2012,
"official_entry": "28 2012 Catalina Island, California, USA",
"links": [
{
"text": "Catalina Island, California, USA",
"url": "https://www.auai.org/uai2012/"
}
]
},
{
"year": 2011,
"official_entry": "27 2011 Barcelona, Spain",
"links": [
{
"text": "Barcelona, Spain",
"url": "https://www.auai.org/uai2011/"
}
]
},
{
"year": 2010,
"official_entry": "26 2010 Catalina Island, California, USA",
"links": [
{
"text": "Catalina Island, California, USA",
"url": "http://event.cwi.nl/uai2010/"
}
]
},
{
"year": 2009,
"official_entry": "25 2009 Montreal, Canada",
"links": [
{
"text": "Montreal, Canada",
"url": "https://www.auai.org/uai2009/"
}
]
},
{
"year": 2008,
"official_entry": "24 2008 Helsinki, Finland",
"links": [
{
"text": "Helsinki, Finland",
"url": "https://www.auai.org/uai2008/"
}
]
},
{
"year": 2007,
"official_entry": "23 2007 Vancouver, Canada",
"links": [
{
"text": "Vancouver, Canada",
"url": "https://www.auai.org/uai2007/"
}
]
},
{
"year": 2006,
"official_entry": "22 2006 Cambridge, Massachusetts, USA",
"links": [
{
"text": "Cambridge, Massachusetts, USA",
"url": "https://www.auai.org/uai2006/"
}
]
},
{
"year": 2005,
"official_entry": "21 2005 Edinburgh, Scotland, UK",
"links": [
{
"text": "Edinburgh, Scotland, UK",
"url": "https://www.auai.org/uai2005/"
}
]
},
{
"year": 2004,
"official_entry": "20 2004 Banff, Canada",
"links": [
{
"text": "Banff, Canada",
"url": "https://www.auai.org/uai2004/"
}
]
},
{
"year": 2003,
"official_entry": "19 2003 Acapulco, Mexico",
"links": [
{
"text": "Acapulco, Mexico",
"url": "https://www.auai.org/uai2003/"
}
]
},
{
"year": 2002,
"official_entry": "18 2002 Edmonton, Canada",
"links": [
{
"text": "Edmonton, Canada",
"url": "http://web.archive.org/web/20021201030651/http://www.cs.ucla.edu/~uai02/"
}
]
},
{
"year": 2001,
"official_entry": "17 2001 Seattle, Washington, USA",
"links": []
},
{
"year": 2000,
"official_entry": "16 2000 Stanford, California, USA",
"links": [
{
"text": "Stanford, California, USA",
"url": "https://www.auai.org/uai2000/"
}
]
},
{
"year": 1999,
"official_entry": "15 1999 Stockholm, Sweden",
"links": []
},
{
"year": 1998,
"official_entry": "14 1998 Madison, Wisconsin, USA",
"links": []
},
{
"year": 1997,
"official_entry": "13 1997 Providence, Rhode Island, USA",
"links": [
{
"text": "Providence, Rhode Island, USA",
"url": "https://www.auai.org/uai1997/"
}
]
},
{
"year": 1996,
"official_entry": "12 1996 Portland, Oregon, USA",
"links": [
{
"text": "Portland, Oregon, USA",
"url": "https://www.auai.org/uai1996/"
}
]
},
{
"year": 1995,
"official_entry": "11 1995 Montreal, Canada",
"links": [
{
"text": "Montreal, Canada",
"url": "https://www.auai.org/uai1995/"
}
]
},
{
"year": 1994,
"official_entry": "10 1994 Seattle, Washington, USA",
"links": [
{
"text": "Seattle, Washington, USA",
"url": "https://www.auai.org/uai1994/"
}
]
},
{
"year": 1993,
"official_entry": "9 1993 Washington, DC, USA",
"links": []
},
{
"year": 1992,
"official_entry": "8 1992 Stanford, California, USA",
"links": []
},
{
"year": 1991,
"official_entry": "7 1991 Los Angeles, California, USA",
"links": []
},
{
"year": 1990,
"official_entry": "6 1990 Cambridge, Massachusetts, USA",
"links": []
},
{
"year": 1989,
"official_entry": "5 1989 Windsor, Ontario, USA",
"links": []
},
{
"year": 1988,
"official_entry": "4 1988 Minneapolis, Minnesota, USA",
"links": []
},
{
"year": 1987,
"official_entry": "3 1987 Seattle, Washington, USA",
"links": []
},
{
"year": 1986,
"official_entry": "2 1986 Philadelphia, Pennsylvania, USA",
"links": []
},
{
"year": 1985,
"official_entry": "1 1985 Los Angeles, California, USA",
"links": []
}
],
"scope": "Official conference-year enumeration only. Entry links are recorded as published, not proof that every linked target was fetched or every track/paper/negative decision is covered.",
"current_edition_evidence": {
"source_url": "https://www.auai.org/uai2026/",
"checked_at": "2026-11-08T07:00:26.473380+00:00",
"source_html_sha256": "3cc4b89026fe83041838ffa0fc0a12902bbe0ea2ab6f00bb66665a27d95bb773",
"year": 2026,
"edition_number": 42
},
"publication_boundary": "1985–1990 collections were edited books; conference year and book publication year must remain separate. Root archive has some unlinked historical entries; missing links are not absent conferences."
}
@@ -0,0 +1,73 @@
{
"checked_on": "2026-11-08",
"scope": "Two boundedyear/main policyreviews, not actualRejectexport orcompletehistoricalpolicycensus. NoDBwrite.",
"checks": [
{
"venue": "ECCV",
"year": 2026,
"track": "main",
"status": "unknown",
"primary_url": "https://eccv.ecva.net/Conferences/2026/SubmissionPolicies",
"checked_on": "2026-11-08",
"evidence": [
{
"source_url": "https://eccv.ecva.net/Conferences/2026/AuthorGuide",
"resolved_url": "https://eccv.ecva.net/Conferences/2026/AuthorGuide",
"http_status": 200,
"checked_at": "2026-11-08T10:49:35.617521+00:00",
"source_sha256": "d6bd6656d5132b9e2c0c657fdb868fef1bac4710d0a2208927782d25233d974f"
},
{
"source_url": "https://eccv.ecva.net/Conferences/2026/SubmissionPolicies",
"resolved_url": "https://eccv.ecva.net/Conferences/2026/SubmissionPolicies",
"http_status": 200,
"checked_at": "2026-11-08T10:49:32.449048+00:00",
"source_sha256": "125f846b287ccfd1eea1ff5eb0b39fc169eeaf23960c38b4cecad7f69e86eb19"
},
{
"source_url": "https://eccv.ecva.net/Conferences/2026/AuthorContributionTypes",
"resolved_url": "https://eccv.ecva.net/Conferences/2026/AuthorContributionTypes",
"http_status": 200,
"checked_at": "2026-11-08T10:49:32.490036+00:00",
"source_sha256": "7756aacb752ebc827bad246fd8729618855977588d16f9dd66932b0364e2ba3c"
}
],
"note": "官方说明审稿中稿件仅分配的委员会可见,评审及作者回复永不公开;这未独立确认会后所有拒稿元数据的发布范围。投稿选择的一种primary Contribution Type是研究属性,不是轨道或最终决定;无逐篇原字段时不能用默认选项补写类型。"
},
{
"venue": "ECAI",
"year": 2025,
"track": "main",
"status": "unknown",
"primary_url": "https://ecai2025.org/call-for-papers/",
"checked_on": "2026-11-08",
"evidence": [
{
"source_url": "https://ecai2025.org/call-for-papers/",
"resolved_url": "https://ecai2025.org/call-for-papers/",
"http_status": 200,
"checked_at": "2026-11-08T10:49:38.238706+00:00",
"source_sha256": "f8d0360418662c17ab81b85ce37a3ac002a77efda0d05505c23b1e2e4a3e1170"
}
],
"note": "官方CFP说明投稿保密、可为识别重复投稿及减少重复评审与其他会议组织者共享;内部共享不是公开数据。过去12个月被其他会拒的作者可补充原评审及回复,不据此生成逐篇原拒稿、年份或决定。主会与PAIS/demo/journal展示分开;该年会后拒稿元数据范围未确认。"
}
],
"eccv2026_contribution_type_vocabulary": {
"source": {
"source_url": "https://eccv.ecva.net/Conferences/2026/AuthorContributionTypes",
"resolved_url": "https://eccv.ecva.net/Conferences/2026/AuthorContributionTypes",
"http_status": 200,
"checked_at": "2026-11-08T10:49:32.490036+00:00",
"source_sha256": "7756aacb752ebc827bad246fd8729618855977588d16f9dd66932b0364e2ba3c"
},
"labels": [
"Algorithms / General",
"Theory / Foundational",
"Applied / Systems",
"Datasets / Benchmarks",
"Concept & Feasibility"
],
"scope": "OneprimaryauthorselectedtypeforECCV2026;independentfromtopic/track/acceptance. PolicydefaultAlgorithms/Generalisnotsufficientperpaperevidencetofillmissingmetadata. Noautomaticcrossplatformtaxonomy mapping ornewannotationevents."
}
}
+139
View File
@@ -0,0 +1,139 @@
{
"source_url": "https://wsdm-conference.org/",
"resolved_url": "https://wsdm-conference.org/",
"http_status": 200,
"checked_at": "2026-11-08T11:54:42.458696+00:00",
"source_sha256": "681e529e2c513c111f9eea6887863690dd4e2d04add470cc79c81bb26f400736",
"source_html_sha256": "681e529e2c513c111f9eea6887863690dd4e2d04add470cc79c81bb26f400736",
"cutoff_year": 2026,
"expected_years": [
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027
],
"editions": [
{
"year": 2008,
"source_label": "WSDM 2008",
"source_url": "http://www.wsdm2009.org/wsdm2008.org/"
},
{
"year": 2009,
"source_label": "WSDM 2009",
"source_url": "http://www.wsdm2009.org/"
},
{
"year": 2010,
"source_label": "WSDM 2010",
"source_url": "http://www.wsdm-conference.org/2010/"
},
{
"year": 2011,
"source_label": "WSDM 2011",
"source_url": "http://www.wsdm2011.org/"
},
{
"year": 2012,
"source_label": "WSDM 2012",
"source_url": "http://www.wsdm2012.org/"
},
{
"year": 2013,
"source_label": "WSDM 2013",
"source_url": "http://www.dis.uniroma1.it/wsdm2013"
},
{
"year": 2014,
"source_label": "WSDM 2014",
"source_url": "http://www.wsdm-conference.org/2014"
},
{
"year": 2015,
"source_label": "WSDM 2015",
"source_url": "http://www.wsdm-conference.org/2015"
},
{
"year": 2016,
"source_label": "WSDM 2016",
"source_url": "http://www.wsdm-conference.org/2016"
},
{
"year": 2017,
"source_label": "WSDM 2017",
"source_url": "http://www.wsdm-conference.org/2017"
},
{
"year": 2018,
"source_label": "WSDM 2018",
"source_url": "http://www.wsdm-conference.org/2018"
},
{
"year": 2019,
"source_label": "WSDM 2019",
"source_url": "http://www.wsdm-conference.org/2019"
},
{
"year": 2020,
"source_label": "WSDM 2020",
"source_url": "http://www.wsdm-conference.org/2020"
},
{
"year": 2021,
"source_label": "WSDM 2021",
"source_url": "http://www.wsdm-conference.org/2021"
},
{
"year": 2022,
"source_label": "WSDM 2022",
"source_url": "http://www.wsdm-conference.org/2022"
},
{
"year": 2023,
"source_label": "WSDM 2023",
"source_url": "http://www.wsdm-conference.org/2023"
},
{
"year": 2024,
"source_label": "WSDM 2024",
"source_url": "http://www.wsdm-conference.org/2024"
},
{
"year": 2025,
"source_label": "WSDM 2025",
"source_url": "http://www.wsdm-conference.org/2025"
},
{
"year": 2026,
"source_label": "WSDM 2026",
"source_url": "http://www.wsdm-conference.org/2026"
}
],
"source_disagreements": [
{
"year": 2008,
"source_label": "WSDM 2008",
"linked_url": "http://www.wsdm2009.org/wsdm2008.org/",
"interpretation": "The official2008labelandStanforddescriptionlinkto2009domain. Keep badlinkreceipt; yearcomesfromactual2008labelanddescription, notredirecttarget. No2009duplicateedition."
}
],
"scope": "19actualconferenceyearlabels2008–2026, future2027excluded and2028callforproposalsnotaneventrow. Virtual2021/2022distinctfrominpersonclaims. Existing2026limitedpolicyretained; notproofperpaper/publicnegativecompleteness."
}
@@ -0,0 +1,747 @@
{
"checked_at": "2026-11-08",
"status": "primary_source_inventory_complete_not_normalized_or_imported",
"sources": [
{
"url": "https://archives.iw3c2.org/proceedings/www1/index.html",
"resolved": "https://archives.iw3c2.org/proceedings/www1/index.html",
"http_status": 200,
"sha256": "dc0ca83f552c3bb89b5c8cf40a688e41874087a0ac29979720a53120938f818a",
"checked_at": "2026-11-08T13:11:50.509805+00:00",
"decoded_as": "utf-8"
},
{
"url": "https://archives.iw3c2.org/proceedings/www2/index.html",
"resolved": "https://archives.iw3c2.org/proceedings/www2/index.html",
"http_status": 200,
"sha256": "ead63295f45dc68bbd55e3c1f4f28f5fbaed0a1e902068a0e16073ab277a25cc",
"checked_at": "2026-11-08T13:11:52.335785+00:00",
"decoded_as": "utf-8"
},
{
"url": "https://archives.iw3c2.org/proceedings/www3/index.html",
"resolved": "https://archives.iw3c2.org/proceedings/www3/index.html",
"http_status": 200,
"sha256": "5a4bfa0e44d3723500ced8c5375bb1d5447838ab91d3c62cf21a3ac5fd533f74",
"checked_at": "2026-11-08T13:11:53.350674+00:00",
"decoded_as": "utf-8"
},
{
"url": "https://archives.iw3c2.org/www3/proceedings/proceedings.html",
"resolved": "https://archives.iw3c2.org/www3/proceedings/proceedings.html",
"http_status": 200,
"sha256": "93457641ea3291dc250af40c284f3c9f7df34830d383bc6e972249b7e5c50792",
"checked_at": "2026-11-08T13:11:54.408737+00:00",
"decoded_as": "utf-8"
},
{
"url": "https://archives.iw3c2.org/www1/Proceedings.html",
"resolved": "https://archives.iw3c2.org/www1/Proceedings.html",
"http_status": 200,
"sha256": "ffc8766e1771398988d4c0ef1c648510e4ab6c689a94b675a3e6f068ab88e20d",
"checked_at": "2026-11-08T13:11:55.626468+00:00",
"decoded_as": "utf-8"
},
{
"url": "https://archives.iw3c2.org/www1/PrelimProcs.html",
"resolved": "https://archives.iw3c2.org/www1/PrelimProcs.html",
"http_status": 200,
"sha256": "f2e0e0efcdd748059597a1d82bacd30901a5e7bf72b2d21df2307b79892ca616",
"bytes": 21649,
"checked_at": "2026-11-08T13:12:19.093459+00:00",
"decoded_as": "utf-8"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/WWW2_Proceedings.html",
"resolved": "https://archives.iw3c2.org/www2/Proceedings/WWW2_Proceedings.html",
"http_status": 200,
"sha256": "62bcb038775cdffa50454037cbd0db60255bc52c190691adaab9a286e7c84c76",
"bytes": 3052,
"checked_at": "2026-11-08T13:12:18.071445+00:00",
"decoded_as": "utf-8"
},
{
"url": "https://archives.iw3c2.org/www3/proceedings/papers/author.html",
"resolved": "https://archives.iw3c2.org/www3/proceedings/papers/author.html",
"http_status": 200,
"sha256": "19aa53681f21b33e2f126ea4e050a5843cf27b55989fde6b53fca1a5875ecb23",
"bytes": 17760,
"checked_at": "2026-11-08T13:12:18.257055+00:00",
"decoded_as": "iso-8859-1"
},
{
"url": "https://archives.iw3c2.org/www3/proceedings/papers/session.html",
"resolved": "https://archives.iw3c2.org/www3/proceedings/papers/session.html",
"http_status": 200,
"sha256": "df9d09c330c6eb30c1138e63175bc2079c417db4a77e8577367d25edf29949a9",
"bytes": 5207,
"checked_at": "2026-11-08T13:12:19.798816+00:00",
"decoded_as": "utf-8"
},
{
"url": "https://archives.iw3c2.org/www3/proceedings/papers/abstract.html",
"resolved": "https://archives.iw3c2.org/www3/proceedings/papers/abstract.html",
"http_status": 200,
"sha256": "dd6861a4f9905c690ae59beea8dc2e7214d6349c001f5a6101f17088753d0f2b",
"bytes": 47315,
"checked_at": "2026-11-08T13:12:20.090797+00:00",
"decoded_as": "iso-8859-1"
},
{
"url": "https://archives.iw3c2.org/www3/proceedings/posters/author.html",
"resolved": "https://archives.iw3c2.org/www3/proceedings/posters/author.html",
"http_status": 200,
"sha256": "f0d20819e675874b67527675eb96c633117f412790daa1477cb7da17ac0ae679",
"bytes": 17561,
"checked_at": "2026-11-08T13:12:20.189771+00:00",
"decoded_as": "utf-8"
},
{
"url": "https://archives.iw3c2.org/www3/proceedings/posters/abstract.html",
"resolved": "https://archives.iw3c2.org/www3/proceedings/posters/abstract.html",
"http_status": 200,
"sha256": "bb1cbbc0391a6168947763e8aa2edc61a0e2a48634dda421b686250c68d693c0",
"bytes": 47202,
"checked_at": "2026-11-08T13:12:21.727587+00:00",
"decoded_as": "utf-8"
}
],
"events": [
{
"year": 1994,
"event_key": "www-1994-spring",
"source_url": "https://archives.iw3c2.org/www1/PrelimProcs.html",
"title_field_occurrences": 50,
"homepage_formal_presentations_claim": 49,
"count_discrepancy": "50 explicit Title fields vs homepage49 formal presentations; per-entry audit required, neither number is an accepted-paper total.",
"track_scope": "Some keyword lines explicitly say BUSINESS TRACK?; preserve raw scope, not all regularmain.",
"abstracts": "Not on this HTML list; PDF files not fetched.",
"journal_boundary": "Official publication note says journal specialissue contains selected fullpapers plus abstracts ofotherpapers; not a full conference acceptance listing."
},
{
"year": 1994,
"event_key": "www-1994-fall",
"source_url": "https://archives.iw3c2.org/www2/Proceedings/WWW2_Proceedings.html",
"top_level_categories": 34,
"scope": "Categories include Birds ofaFeather, DevelopersDay, tutorials, products as well as papers. No individualpaper count inferred from34categories; unlinked title does notmeanReject."
},
{
"year": 1995,
"event_key": "www-1995-spring",
"source_url": "https://archives.iw3c2.org/www3/proceedings/proceedings.html",
"papers": {
"author_index_link_occurrences": 90,
"distinct_author_index_entry_ids": 38,
"session_index_entry_ids": 38,
"abstract_index_entry_ids": 38,
"all_three_id_sets_equal": true,
"entry_ids": [
"44",
"46",
"47",
"48",
"49",
"50",
"51",
"52",
"54",
"55",
"58",
"59",
"60",
"62",
"65",
"67",
"68",
"70",
"72",
"75",
"76",
"77",
"78",
"79",
"80",
"82",
"84",
"86",
"87",
"88",
"89",
"90",
"94",
"95",
"97",
"100",
"104",
"105"
],
"literal_url_sets_equal": false,
"url_discrepancy": {
"entry_id": "80",
"author_and_session": "80/userpatterns/UserPatterns.Paper4.formatted.html",
"abstract": "80/userpatterns/ UserPatterns.Paper4.formatted.html",
"action": "Retain raw malformed href; use exact same event/entry ID corroborated byboth otherindexes, neverfuzzytitle-only join."
}
},
"posters": {
"author_index_link_occurrences": 83,
"distinct_linked_author_index_entry_ids": 47,
"abstract_index_entry_ids": 53,
"abstract_only_entry_ids": [
"37",
"41",
"47",
"50",
"55",
"59"
],
"scope": "53 linked poster abstractentries are not 53 mainpapers; authorindexhasplaceholder#links andsuspectperson/place strings, so missinglinks ornames requireper-entry verification.",
"entry_ids": [
"01",
"03",
"04",
"05",
"06",
"07",
"08",
"09",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20",
"21",
"22",
"23",
"24",
"26",
"27",
"28",
"29",
"30",
"31",
"32",
"33",
"34",
"35",
"36",
"37",
"38",
"40",
"41",
"42",
"43",
"44",
"45",
"46",
"47",
"48",
"50",
"51",
"52",
"53",
"54",
"55",
"56",
"57",
"58",
"59",
"60"
]
},
"separate_not_fetched": [
"Tutorial notes",
"Workshop proceedings",
"Developers Day notes"
]
}
],
"production_boundary": {
"existing_www1995_fall_edition_id": 1212,
"existing_fall_submissions": 59,
"new_source_rows_imported": 0,
"source_record_ids_assigned": false,
"no_rejected_decision_acquired": true,
"no_pdf_downloaded": true
},
"next_actions": [
"Implementmaintainedcollectorwithsourcecaching,exactevent/trackidentity,sourceevidenceandparserfixtures;build/testonlyremoteapprovedrunner.",
"ResolveWWW1count/scopeandWWW2category-per-itemboundariesbeforeacceptedmainassignment.",
"NormalizeWWW3papers/postersindependently,verifyabstractsauthorsandmalformedhrefhandling,preflightcurrentPGidentitiesbeforeimport.",
"Productioneventmigrationindependentlyaccepted f5dbb8a8;preserve59Fallrows,no reimport. Newearlysourcepapersstillnotnormalizedorimported."
],
"server_raw_cache": {
"status": "46of46HTML_sources_HTTP200",
"directory": "/data/paper-index/collected/www-early-archive-source-v1",
"manifest_sha256": "c9388ccef44486e0684c9ee9e8620a465cdc4574e6bc9ea9391d743e01a3312c",
"html_bytes": 222803,
"sources": [
{
"url": "https://archives.iw3c2.org/proceedings/www1/index.html",
"checked_at": "2026-11-08T13:23:28.781495+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/proceedings/www1/index.html",
"content_type": "text/html",
"file": "source-00.html",
"bytes": 98,
"sha256": "dc0ca83f552c3bb89b5c8cf40a688e41874087a0ac29979720a53120938f818a"
},
{
"url": "https://archives.iw3c2.org/proceedings/www2/index.html",
"checked_at": "2026-11-08T13:23:28.782745+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/proceedings/www2/index.html",
"content_type": "text/html",
"file": "source-01.html",
"bytes": 115,
"sha256": "ead63295f45dc68bbd55e3c1f4f28f5fbaed0a1e902068a0e16073ab277a25cc"
},
{
"url": "https://archives.iw3c2.org/proceedings/www3/index.html",
"checked_at": "2026-11-08T13:23:28.784438+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/proceedings/www3/index.html",
"content_type": "text/html",
"file": "source-02.html",
"bytes": 110,
"sha256": "5a4bfa0e44d3723500ced8c5375bb1d5447838ab91d3c62cf21a3ac5fd533f74"
},
{
"url": "https://archives.iw3c2.org/www1/PrelimProcs.html",
"checked_at": "2026-11-08T13:23:29.910554+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www1/PrelimProcs.html",
"content_type": "text/html",
"file": "source-03.html",
"bytes": 21649,
"sha256": "f2e0e0efcdd748059597a1d82bacd30901a5e7bf72b2d21df2307b79892ca616"
},
{
"url": "https://archives.iw3c2.org/www1/Proceedings.html",
"checked_at": "2026-11-08T13:23:29.911932+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www1/Proceedings.html",
"content_type": "text/html",
"file": "source-04.html",
"bytes": 723,
"sha256": "ffc8766e1771398988d4c0ef1c648510e4ab6c689a94b675a3e6f068ab88e20d"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/Agents.html",
"checked_at": "2026-11-08T13:23:29.914010+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/Agents.html",
"content_type": "text/html",
"file": "source-05.html",
"bytes": 1197,
"sha256": "556a583cde97ff393ef6cf7358ea823bb943513be9266eb9d4af5e19d20d88dd"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/Arts.html",
"checked_at": "2026-11-08T13:23:30.679804+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/Arts.html",
"content_type": "text/html",
"file": "source-06.html",
"bytes": 2155,
"sha256": "19226f05834727aee9be6fad4183e5360a4d0307db4bfb86459e0f2495035796"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/Astronomy.html",
"checked_at": "2026-11-08T13:23:30.716223+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/Astronomy.html",
"content_type": "text/html",
"file": "source-07.html",
"bytes": 1912,
"sha256": "2f8c66b1b175f18367774c407678b71d7f8fcfcd7a5593681e65ce7bf7356bfa"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/Autools.html",
"checked_at": "2026-11-08T13:23:30.929960+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/Autools.html",
"content_type": "text/html",
"file": "source-08.html",
"bytes": 2386,
"sha256": "e477b77a2c90797fabe3caa5feae81e93f4c1e4c4cc62ee17b9566d3b7630f91"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/BioChem.html",
"checked_at": "2026-11-08T13:23:31.471326+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/BioChem.html",
"content_type": "text/html",
"file": "source-09.html",
"bytes": 1220,
"sha256": "ef6284cb2c65c83b821e2f7b484ff39513223b2a7285d02b4f4cdb63d43c76eb"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/BofF.html",
"checked_at": "2026-11-08T13:23:31.477667+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/BofF.html",
"content_type": "text/html",
"file": "source-10.html",
"bytes": 820,
"sha256": "83405fc3732a470d0c431116d36b0c0f1c0dbdef0e04172891a1ff04034665a1"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/CSCW.html",
"checked_at": "2026-11-08T13:23:31.717781+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/CSCW.html",
"content_type": "text/html",
"file": "source-11.html",
"bytes": 2212,
"sha256": "c1cbf984dca24d81e4547a12307219431ec5d99d041ec126bd981c018ff648e4"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/Campus.Infosys.html",
"checked_at": "2026-11-08T13:23:32.251580+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/Campus.Infosys.html",
"content_type": "text/html",
"file": "source-12.html",
"bytes": 1488,
"sha256": "cc9c742790f6375ecef16ab291227cc5a66b2a9525306268b788b1b73f2baf72"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/ComEc.html",
"checked_at": "2026-11-08T13:23:32.262571+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/ComEc.html",
"content_type": "text/html",
"file": "source-13.html",
"bytes": 1661,
"sha256": "c64889cfb1b34f0c28429ae5b891dc7864587a790f29badca970e827f0f30bf5"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/CorInfSys.html",
"checked_at": "2026-11-08T13:23:32.472184+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/CorInfSys.html",
"content_type": "text/html",
"file": "source-14.html",
"bytes": 3472,
"sha256": "90de7baec3289086dcc76bb2f2ba8c7cb98237054f0a1a5952f1e9389030d5d1"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/DDay.html",
"checked_at": "2026-11-08T13:23:33.044684+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/DDay.html",
"content_type": "text/html",
"file": "source-15.html",
"bytes": 6461,
"sha256": "de191af59155231919b14aa3d74386e8f41fe38529467f9b33cee6f0f381f7da"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/EarSci.html",
"checked_at": "2026-11-08T13:23:33.051137+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/EarSci.html",
"content_type": "text/html",
"file": "source-16.html",
"bytes": 1869,
"sha256": "b0c1314d65cb8ac4a618aec136e438e8f3af016de9636f33302308ab5675222c"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/Educ.html",
"checked_at": "2026-11-08T13:23:33.254789+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/Educ.html",
"content_type": "text/html",
"file": "source-17.html",
"bytes": 4982,
"sha256": "318471e7e2b37398752817ae5f8bacbc03c1c3e61f32d50f4aa1e9ae4494aca9"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/EvolvingInter.html",
"checked_at": "2026-11-08T13:23:33.798705+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/EvolvingInter.html",
"content_type": "text/html",
"file": "source-18.html",
"bytes": 1744,
"sha256": "340697fae542f59333c7feb330b251165ace4a69455b48325fb4ac097002c2a5"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/Fin.html",
"checked_at": "2026-11-08T13:23:33.803029+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/Fin.html",
"content_type": "text/html",
"file": "source-19.html",
"bytes": 1035,
"sha256": "d7e64c662e3961ca1258047ac727e3676f6cb91838ac6c310e20b84e8c6b257b"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/GenSci.html",
"checked_at": "2026-11-08T13:23:34.040529+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/GenSci.html",
"content_type": "text/html",
"file": "source-20.html",
"bytes": 742,
"sha256": "3f3e469dea3dc36877b3a67ecb9389d7c0e3b5d1d1f7835e5be50d5bdca1fac3"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/HCI.html",
"checked_at": "2026-11-08T13:23:34.601259+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/HCI.html",
"content_type": "text/html",
"file": "source-21.html",
"bytes": 1821,
"sha256": "ad75aa91e433101d580552e60831894d2d57904076c090fb5f3511386abd718f"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/Int.html",
"checked_at": "2026-11-08T13:23:34.603284+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/Int.html",
"content_type": "text/html",
"file": "source-22.html",
"bytes": 987,
"sha256": "63a345fea731b8613afb66e5889b0e66196ae1eaa3cd8b271daafbb84d57bdde"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/LibApps.html",
"checked_at": "2026-11-08T13:23:34.796908+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/LibApps.html",
"content_type": "text/html",
"file": "source-23.html",
"bytes": 1373,
"sha256": "6f8bd049f10d036a5c093a640a8d9d855d038f103dd9204dbfab7106cc5be99d"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/LocalCom.html",
"checked_at": "2026-11-08T13:23:35.361878+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/LocalCom.html",
"content_type": "text/html",
"file": "source-24.html",
"bytes": 937,
"sha256": "1701270af1d2cfc80b8944ebb846374b6d0af5bc7f17c953ac0e25dd048a8466"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/MedEd.html",
"checked_at": "2026-11-08T13:23:35.384200+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/MedEd.html",
"content_type": "text/html",
"file": "source-25.html",
"bytes": 1297,
"sha256": "af813365720e6d57abf015023f3dcb489b30c6e2d69a252497251a46dd712423"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/MedTrack.html",
"checked_at": "2026-11-08T13:23:35.552044+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/MedTrack.html",
"content_type": "text/html",
"file": "source-26.html",
"bytes": 1631,
"sha256": "9fa188317d5ba0ac6f251911e9a5b939431dc7f952706a7229f95a891ad0afe8"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/Meta.html",
"checked_at": "2026-11-08T13:23:36.121248+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/Meta.html",
"content_type": "text/html",
"file": "source-27.html",
"bytes": 612,
"sha256": "d7726ccc65bddf3c65a5ea96bfe56aba45c2313de25437e641e245dc22630d97"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/Museum.html",
"checked_at": "2026-11-08T13:23:36.143441+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/Museum.html",
"content_type": "text/html",
"file": "source-28.html",
"bytes": 1004,
"sha256": "b9421c11f64e02b470f643a50f226545256047545f3a6db4a526cd031af67ff0"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/NationWideSites.html",
"checked_at": "2026-11-08T13:23:36.340067+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/NationWideSites.html",
"content_type": "text/html",
"file": "source-29.html",
"bytes": 1457,
"sha256": "bcfe65ee71d714e25bfac73a9e568c4073287ead07198c52e40499d203032e21"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/Overviews.html",
"checked_at": "2026-11-08T13:23:36.903238+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/Overviews.html",
"content_type": "text/html",
"file": "source-30.html",
"bytes": 1212,
"sha256": "dc4313537799b0e33d95a53183faaec0c1841e1359c2dd27721e33331df53239"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/Prod.html",
"checked_at": "2026-11-08T13:23:36.914194+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/Prod.html",
"content_type": "text/html",
"file": "source-31.html",
"bytes": 968,
"sha256": "37cf01790b2536ebbaf7ebf6398fc905db1e481bd0bfbabd9a91bd2fb447dab4"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/Pub.html",
"checked_at": "2026-11-08T13:23:37.127844+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/Pub.html",
"content_type": "text/html",
"file": "source-32.html",
"bytes": 2096,
"sha256": "e5c17f3e74574795c7458da87bc121d95104d5d7e4409a560041c34661ea66f7"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/Searching.html",
"checked_at": "2026-11-08T13:23:37.657431+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/Searching.html",
"content_type": "text/html",
"file": "source-33.html",
"bytes": 2813,
"sha256": "7aea8a29d7fe7d93da1df5969396c51db42b81517158f7637a0f7816deac8449"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/Security.html",
"checked_at": "2026-11-08T13:23:37.668203+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/Security.html",
"content_type": "text/html",
"file": "source-34.html",
"bytes": 1223,
"sha256": "75e91b9c97e78af9202d56921116b3897b12d72f2cad34cd969e943a6237198c"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/SocialSci.html",
"checked_at": "2026-11-08T13:23:37.882372+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/SocialSci.html",
"content_type": "text/html",
"file": "source-35.html",
"bytes": 1167,
"sha256": "3c0e1d58b033cfab6de6d507272374f88aa1901ad33b483bc571a89a1d7ede6a"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/Tutor.html",
"checked_at": "2026-11-08T13:23:38.420164+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/Tutor.html",
"content_type": "text/html",
"file": "source-36.html",
"bytes": 2462,
"sha256": "dabe18d58d19b184bcf44ed5b131c08229301ffe6fc3ec641bf025883da007ef"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/VR.html",
"checked_at": "2026-11-08T13:23:38.456039+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/VR.html",
"content_type": "text/html",
"file": "source-37.html",
"bytes": 1226,
"sha256": "ba3d0f123456170a62c201626526b60a1f362aa4f1cd02db0b958da3796e2cfa"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/WWW2_Proceedings.html",
"checked_at": "2026-11-08T13:23:38.673738+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/WWW2_Proceedings.html",
"content_type": "text/html",
"file": "source-38.html",
"bytes": 3052,
"sha256": "62bcb038775cdffa50454037cbd0db60255bc52c190691adaab9a286e7c84c76"
},
{
"url": "https://archives.iw3c2.org/www2/Proceedings/WebProd.html",
"checked_at": "2026-11-08T13:23:39.177032+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www2/Proceedings/WebProd.html",
"content_type": "text/html",
"file": "source-39.html",
"bytes": 862,
"sha256": "a8bf4a7d9dd597c7fc1fe2e782319c2f12e5ddfdb4e823cd1f55c3738af07924"
},
{
"url": "https://archives.iw3c2.org/www3/proceedings/papers/abstract.html",
"checked_at": "2026-11-08T13:23:39.239517+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www3/proceedings/papers/abstract.html",
"content_type": "text/html",
"file": "source-40.html",
"bytes": 47315,
"sha256": "dd6861a4f9905c690ae59beea8dc2e7214d6349c001f5a6101f17088753d0f2b"
},
{
"url": "https://archives.iw3c2.org/www3/proceedings/papers/author.html",
"checked_at": "2026-11-08T13:23:39.462217+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www3/proceedings/papers/author.html",
"content_type": "text/html",
"file": "source-41.html",
"bytes": 17760,
"sha256": "19aa53681f21b33e2f126ea4e050a5843cf27b55989fde6b53fca1a5875ecb23"
},
{
"url": "https://archives.iw3c2.org/www3/proceedings/papers/session.html",
"checked_at": "2026-11-08T13:23:40.476927+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www3/proceedings/papers/session.html",
"content_type": "text/html",
"file": "source-42.html",
"bytes": 5207,
"sha256": "df9d09c330c6eb30c1138e63175bc2079c417db4a77e8577367d25edf29949a9"
},
{
"url": "https://archives.iw3c2.org/www3/proceedings/posters/abstract.html",
"checked_at": "2026-11-08T13:23:40.702777+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www3/proceedings/posters/abstract.html",
"content_type": "text/html",
"file": "source-43.html",
"bytes": 47202,
"sha256": "bb1cbbc0391a6168947763e8aa2edc61a0e2a48634dda421b686250c68d693c0"
},
{
"url": "https://archives.iw3c2.org/www3/proceedings/posters/author.html",
"checked_at": "2026-11-08T13:23:40.952774+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www3/proceedings/posters/author.html",
"content_type": "text/html",
"file": "source-44.html",
"bytes": 17561,
"sha256": "f0d20819e675874b67527675eb96c633117f412790daa1477cb7da17ac0ae679"
},
{
"url": "https://archives.iw3c2.org/www3/proceedings/proceedings.html",
"checked_at": "2026-11-08T13:23:41.262929+00:00",
"status": 200,
"resolved_url": "https://archives.iw3c2.org/www3/proceedings/proceedings.html",
"content_type": "text/html",
"file": "source-45.html",
"bytes": 1507,
"sha256": "93457641ea3291dc250af40c284f3c9f7df34830d383bc6e972249b7e5c50792"
}
],
"normalized": false,
"imported": false,
"PDF_downloaded": false
}
}
+357
View File
@@ -0,0 +1,357 @@
{
"source_url": "https://www2024.thewebconf.org/about/the-web-conference/",
"resolved_url": "https://www2024.thewebconf.org/about/the-web-conference/",
"http_status": 200,
"checked_at": "2026-11-08T11:54:48.803606+00:00",
"source_sha256": "fefa73c83154fe329f3c85d338fdbcae00c02292d1e8bdd4397561dff20fb20c",
"source_html_sha256": "fefa73c83154fe329f3c85d338fdbcae00c02292d1e8bdd4397561dff20fb20c",
"additional_primary_sources": [
{
"source_url": "https://thewebconf.org/",
"resolved_url": "https://thewebconf.org/",
"http_status": 200,
"checked_at": "2026-11-08T11:54:44.622249+00:00",
"source_sha256": "ed617c308779eaf08458d9d64b02eb01b799c2579812f766d7c6c04811079f3b",
"source_html_sha256": "ed617c308779eaf08458d9d64b02eb01b799c2579812f766d7c6c04811079f3b"
}
],
"cutoff_year": 2026,
"expected_years": [
1994,
1995,
1996,
1997,
1998,
1999,
2000,
2001,
2002,
2003,
2004,
2005,
2006,
2007,
2008,
2009,
2010,
2011,
2012,
2013,
2014,
2015,
2016,
2017,
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
],
"excluded_future_years": [
2027,
2028
],
"editions": [
{
"year": 1994,
"dates_label": "May 25-27, 1994",
"location_label": "CERN, Geneva, Switzerland",
"source_url": "https://thewebconf.org/www1",
"census_event_key": "www:1994:may-25-27-1994"
},
{
"year": 1994,
"dates_label": "October 17-20, 1994",
"location_label": "Chicago, IL (USA)",
"source_url": "https://thewebconf.org/www2",
"census_event_key": "www:1994:october-17-20-1994"
},
{
"year": 1995,
"dates_label": "April 10-14, 1995",
"location_label": "Darmstadt, Germany",
"source_url": "https://thewebconf.org/www3",
"census_event_key": "www:1995:april-10-14-1995"
},
{
"year": 1995,
"dates_label": "December 11-14, 1995",
"location_label": "Boston, MA (USA)",
"source_url": "https://thewebconf.org/www4",
"census_event_key": "www:1995:december-11-14-1995"
},
{
"year": 1996,
"dates_label": "May 6-10, 1996",
"location_label": "Paris, France",
"source_url": "https://thewebconf.org/www5",
"census_event_key": "www:1996:may-6-10-1996"
},
{
"year": 1997,
"dates_label": "April 7-11, 1997",
"location_label": "Santa Clara, CA (USA)",
"source_url": "https://thewebconf.org/www6",
"census_event_key": "www:1997:april-7-11-1997"
},
{
"year": 1998,
"dates_label": "April 14-18, 1998",
"location_label": "Brisbane, Australia",
"source_url": "https://thewebconf.org/www7",
"census_event_key": "www:1998:april-14-18-1998"
},
{
"year": 1999,
"dates_label": "May 11-14, 1999",
"location_label": "Toronto, Canada",
"source_url": "https://thewebconf.org/www8",
"census_event_key": "www:1999:may-11-14-1999"
},
{
"year": 2000,
"dates_label": "May 15-19, 2000",
"location_label": "Amsterdam, The Netherlands",
"source_url": "https://thewebconf.org/www9",
"census_event_key": "www:2000:may-15-19-2000"
},
{
"year": 2001,
"dates_label": "May 1-5, 2001",
"location_label": "Hong Kong, China",
"source_url": "https://thewebconf.org/www10",
"census_event_key": "www:2001:may-1-5-2001"
},
{
"year": 2002,
"dates_label": "May 6-11, 2002",
"location_label": "Honolulu, HI (USA)",
"source_url": "https://thewebconf.org/www2002",
"census_event_key": "www:2002:may-6-11-2002"
},
{
"year": 2003,
"dates_label": "May 20-24, 2003",
"location_label": "Budapest, Hungary",
"source_url": "https://thewebconf.org/www2003",
"census_event_key": "www:2003:may-20-24-2003"
},
{
"year": 2004,
"dates_label": "May 17-22, 2004",
"location_label": "New York, NY (USA)",
"source_url": "https://thewebconf.org/www2004",
"census_event_key": "www:2004:may-17-22-2004"
},
{
"year": 2005,
"dates_label": "May 10-14, 2005",
"location_label": "Chiba, Japan",
"source_url": "https://thewebconf.org/www2005",
"census_event_key": "www:2005:may-10-14-2005"
},
{
"year": 2006,
"dates_label": "May 22-26, 2006",
"location_label": "Edinburgh, Scotland (UK)",
"source_url": "https://thewebconf.org/www2006",
"census_event_key": "www:2006:may-22-26-2006"
},
{
"year": 2007,
"dates_label": "May 8-12, 2007",
"location_label": "Banff, Canada",
"source_url": "https://thewebconf.org/www2007",
"census_event_key": "www:2007:may-8-12-2007"
},
{
"year": 2008,
"dates_label": "April 21-25, 2008",
"location_label": "Beijing, China",
"source_url": "https://thewebconf.org/www2008",
"census_event_key": "www:2008:april-21-25-2008"
},
{
"year": 2009,
"dates_label": "April 20-24, 2009",
"location_label": "Madrid, Spain",
"source_url": "https://thewebconf.org/www2009",
"census_event_key": "www:2009:april-20-24-2009"
},
{
"year": 2010,
"dates_label": "April 26-30, 2010",
"location_label": "Raleigh, NC (USA)",
"source_url": "https://thewebconf.org/www2010",
"census_event_key": "www:2010:april-26-30-2010"
},
{
"year": 2011,
"dates_label": "March 28-April 1, 2011",
"location_label": "Hyderabad, India",
"source_url": "https://thewebconf.org/www2011",
"census_event_key": "www:2011:march-28-april-1-2011"
},
{
"year": 2012,
"dates_label": "April 16-20, 2012",
"location_label": "Lyon, France",
"source_url": "https://thewebconf.org/www2012",
"census_event_key": "www:2012:april-16-20-2012"
},
{
"year": 2013,
"dates_label": "May 13-17, 2013",
"location_label": "Rio de Janeiro, Brazil",
"source_url": "https://thewebconf.org/www2013",
"census_event_key": "www:2013:may-13-17-2013"
},
{
"year": 2014,
"dates_label": "May 7-11, 2014",
"location_label": "Seoul, South Korea",
"source_url": "https://thewebconf.org/www2014",
"census_event_key": "www:2014:may-7-11-2014"
},
{
"year": 2015,
"dates_label": "May 18-22, 2015",
"location_label": "Florence, Italy",
"source_url": "https://thewebconf.org/www2015",
"census_event_key": "www:2015:may-18-22-2015"
},
{
"year": 2016,
"dates_label": "April 11-15, 2016",
"location_label": "Montreal, Canada",
"source_url": "https://thewebconf.org/www2016",
"census_event_key": "www:2016:april-11-15-2016"
},
{
"year": 2017,
"dates_label": "April 3-7, 2017",
"location_label": "Perth, Western Australia",
"source_url": "https://thewebconf.org/www2017",
"census_event_key": "www:2017:april-3-7-2017"
},
{
"year": 2018,
"dates_label": "April 23-27, 2018",
"location_label": "Lyon, France",
"source_url": "https://thewebconf.org/www2018",
"census_event_key": "www:2018:april-23-27-2018"
},
{
"year": 2019,
"dates_label": "May 13-17 2019",
"location_label": "San Francisco, California, USA",
"source_url": "https://thewebconf.org/www2019",
"census_event_key": "www:2019:may-13-17-2019"
},
{
"year": 2020,
"dates_label": "April 20-24, 2020",
"location_label": "Taipei",
"source_url": "https://thewebconf.org/www2020",
"census_event_key": "www:2020:april-20-24-2020"
},
{
"year": 2021,
"dates_label": "April 19-23, 2021",
"location_label": "Ljubljana, Slovenia",
"source_url": "https://thewebconf.org/www2021",
"census_event_key": "www:2021:april-19-23-2021"
},
{
"year": 2022,
"dates_label": "April 25-20, 2022",
"location_label": "Lyon, France",
"source_url": "https://www2022.thewebconf.org/",
"census_event_key": "www:2022:april-25-20-2022"
},
{
"year": 2023,
"dates_label": "April 30-May 4, 2023",
"location_label": "Austin, Texas",
"source_url": "https://www2023.thewebconf.org/",
"census_event_key": "www:2023:april-30-may-4-2023"
},
{
"year": 2024,
"dates_label": "May 13-17, 2024",
"location_label": "Singapore",
"source_url": "https://www2024.thewebconf.org/",
"census_event_key": "www:2024:may-13-17-2024"
},
{
"year": 2025,
"source_label": "The ACM Web Conference 2025",
"source_url": "https://archives.iw3c2.org/www2025",
"census_event_key": "www:2025:annual"
},
{
"year": 2026,
"source_label": "The ACM Web Conference 2026",
"source_url": "https://www2026.thewebconf.org",
"census_event_key": "www:2026:annual"
}
],
"event_count": 35,
"multiple_events_in_same_year": {
"1994": 2,
"1995": 2
},
"blocking_model_gap": {
"status": "production_event_identity_migration_independently_accepted",
"code_evidence": "paper_atlas/db/schema.sql UNIQUE(venue_id,year,track), also mirrored by PostgreSQL schema",
"problem": "Two main events in one year cannot be distinguished by the current edition uniqueness. The1995observedyear does not prove both events imported.",
"next_action": "Preserveexisting1212and59Fallhistories. Implementmaintainedcollectorwithpreciseevent/track/sourceidentityforWWW1994and1995Spring;sourcecacheonlyisnotimport."
},
"scope": "35explicitactualevents1994–2026in33years:1994and1995eachhavetwoevents. Official2024historylists33eventrows1994–2024, serieshomepageadds2025/2026. Future2027/2028excluded. Sourceeventkeysarecensusidentifiers,notdatabaseIDsorverifiedcrosssourcealiases. RenamedTheWebConferencefrom2018, ACM/SIGWEBfrom2022; preserveoriginalWWWnames. Workshops/companion/industry/researchtracksandOpenReviewpoliciesseparate.",
"existing_event_identity_preflight": {
"snapshot_at": "2026-11-08 12:13:48.722149+00:00",
"report_path": "/data/paper-index/collected/same-year-event-preflight-v1.json",
"report_sha256": "50e213d5fdc194ae4fee8b74059252fa3f6f9a3bb2d2b593993ba1b95636e3b5",
"database_written": false,
"scope": "All59sourceevidencerowsunderexistingWWW1995editionanchortofallvolume. NoWWW1994editionobservedwithinthiscanonical/aliasvenuequery. Notproofnoexternal1994/spring1995papers.",
"status": "fall_1995_only_observed_spring_still_pending",
"edition_id": 1212,
"venue_id": 53,
"year": 1995,
"track": "main",
"submissions": 59,
"booktitle": "WWW (Fall)",
"dblp_volume": "db/conf/www/www1995f.html",
"next_action": "Preserveexisting1212and59histories; implementdistinctsamevenue/yearmaineventidentitybeforeaddingSpring1995orboth1994events. Noautomaticdeletion/reimport."
},
"early_proceedings_source_inventory": "www-early-proceedings-2026-11-08.json",
"event_identity_production_acceptance": {
"source_commit": "4182070e76dfa13ef7dbb526a0b6a4d155f19cd6",
"snapshot_at": "2026-11-08 13:26:53.095310+00:00",
"report_sha256": "f5dbb8a8e387904adb076896e9c50a89c9e16cc6781ad8a93b7d7f29fe31acdf",
"existing_edition_id": 1212,
"event_key": "www-1995-fall",
"existing_submissions_preserved": 59,
"original_edition_ids_fields_unchanged": 1399,
"global_raw_histories_unchanged": {
"submissions": {
"rows": 512006,
"sha256": "ac9e7cb403b1850a959140fcdbce51900a5e888f8bce12d53f6b861be060a25c"
},
"decisions": {
"rows": 551558,
"sha256": "f507601e2fe09acd84cf32cdd0f07beb57c2bede57246c992408e00f487b6ca2"
},
"decision_sources": {
"rows": 551558,
"sha256": "cb419b2943972c3766585a2b845a00466ec0be955a48dbec1c79d038691d4572"
}
},
"new_source_imported": false,
"optional_annotations_initialized": false
}
}
+81
View File
@@ -16,6 +16,8 @@
- [ACL Anthology 权威 XML 与 API](https://aclanthology.org/info/development/)
- [NeurIPS](https://proceedings.neurips.cc/)
- [COLM](https://proceedings.colm.cc/)
- [MLSys](https://proceedings.mlsys.org/)
- [ACM Multimedia 历史目录](https://dblp.org/db/conf/mm/index.html)
- [CVF](https://openaccess.thecvf.com/)
- [ECVA](https://www.ecva.net/papers.php)
- [IJCAI](https://www.ijcai.org/all_proceedings/)
@@ -29,6 +31,7 @@
| 机器学习、理论 | NeurIPS、ICML、ICLR、COLM、COLT、AISTATS、UAI、CLeaR | OpenReview、PMLR、NeurIPS、COLM 官方论文集 |
| 自然语言 | ACL、EMNLP、NAACL、EACL、COLING、CoNLL | ACL Anthology |
| 视觉 | CVPR、ICCV、ECCV | CVF、ECVA |
| 多模态与机器学习系统 | ACM MM、MLSys | ACM / DBLP、MLSys 官方论文集 |
| 综合 AI | AAAI、IJCAI、ECAI | 官方论文集、DBLP |
| 检索与数据 | KDD、SIGIR、WWW、WSDM、RecSys、CIKM、ICDM、SDM、ECML-PKDD | 官方出版方、DBLP,具体年份入口待逐项登记 |
| 机器人 | ICRA、IROS、RSS、CoRL | 官方论文集、PMLR、DBLP |
@@ -38,6 +41,25 @@
这些是领域覆盖候选,不构成统一排名,也不能据此声称已全部入库。逐年目录以真实举办届次和正式出版清单为准:双年会议不补造不存在的年份;主会、Findings、workshop 分开。`edition_sources` 保存实际采集状态,不能用候选名单代替覆盖率报告。
最新已入库基线与逐年公开拒稿核查状态见 [会议覆盖清单](coverage/README.md)。它分开记录政策证据、实际导入和未核实缺口;不是历史覆盖完成声明。
## ACM MM 与 MLSys
会议注册表包含 `MM`(别名 `ACMMM`、`ACM MM`)和 `MLSys`。MLSys 官方根目录目前列出 2019–2026 年的 8 卷,直接采集每篇标题、摘要、公开作者和引用元数据:
```sh
paper-atlas collect mlsys --cache /data/paper-index/raw/http-cache \
--out /data/paper-index/collected/mlsys
```
每年清单核对官方声明数量,缺摘要标为 partial;未知现代轨道、空目录或读取失败不能记为成功。`SysML 2019` 归于同一 MLSys 系列并保留别名。2018 年官方说明接受的投稿为 non-archival,论文集从 2019 年开始;不拼造 2018 年归档卷,也不把未出现在论文集中的投稿判为拒稿。参见 [2018 年官方说明](https://mlsys.org/Conferences/2018/)。
MLSys 老式 `/paper/<year>/hash/…` 与新式 `/paper_files/paper/<year>/hash/…` 链接规范为同一个 `publication_mlsys` 标识,也支持 2023 年实际使用的 `-Abstract-mlsys2023.html` 及对应年份标签;标签年份必须与目录年份一致。DBLP 和官方摘要源共用它,避免同一发表记录成为两个论文实体或两次投稿。只从自身出版社链接提取,不从摘要参考文献提取,也不把发表标识用于合并某次拒稿尝试。共享投稿身份入口要求 MLSys 源具有有效的同年出版社身份,缺失或错年的文件不能生成投稿事件;旧版 DBLP 整理文件可利用已保留的唯一自身出版社链接补得此身份,不需要丢弃来源或依靠标题猜测。
ACM MM 使用固定 DBLP 原始快照和已核验的 proceedings crossref 盘点历史,主会 `ACM Multimedia`、历史编号分卷与同系列 workshop 分开。主会卷也包含 Doctoral Symposium、Reproducibility Companion Papers、Tutorials 等章节(参见 [2025 年目录](https://dblp.org/db/conf/mm/mm2025.html)),而原始 XML 不含逐篇章节,所以这类记录暂标 `proceedings_unspecified`,不能整卷当作 regular 主轨道;后续需逐篇目录证据补齐。旧版候选 JSONL 没有 `mm` / `mlsys` 家族,不能用它假装覆盖新增会议;应从已经下载并校验的原始 XML 重新筛选这两个会议,保留完整扫描数量、卷证据与遗漏原因。DBLP 没有摘要,后续须通过 DOI、真实 forum 等独立标识关联官方或公开元数据,不能将书目导入成功表述为摘要已齐全。
公开拒稿镜像的 `acmmm` 家族映射到 `MM`,只接受明确的负面状态,继续保留镜像与原始签名决定的区别。现有固定 OpenReview 镜像只含 ACM MM 2024 的录用记录,没有据此证明其他年份没有公开拒稿;[2025 年官方 CFP](https://acmmm2025.org/call-for-papers/) 仅说明审稿期间不公开,不能外推为会后永不公开。
## 官方会议元数据采集
```sh
@@ -58,6 +80,36 @@ PMLR 的同一出版 ID 可能对应多份 Git 元数据,例如 CoRL 2023 的
PeerRead 采集仅选择作者公开发布的 ICLR 2017 投稿元数据,固定到源仓库 commit。只依据明确的布尔 `accepted` 标签形成 accepted/rejected;空标签为 unknown,不使用其他数据分区中的 probably-rejected 推断。不会保存 reviews 或 parsed_pdfs 正文。
### 其他会议的公开拒稿
范围是逐会议、逐年份寻找已公开的拒稿投稿,不能只补录已发表名单。ICML、NeurIPS 部分年份由作者选择是否公开拒稿,因此公开子集不能用于推算完整拒稿数或录用率。其他会议没有在某个镜像中出现 Reject,也不代表该会议没有公开拒稿;需要继续核对官方公开政策、原平台与其他有明确标签的公开快照。
`collect public-openreview` 读取 [PaperCopilot 的公开元数据镜像](https://github.com/papercopilot/openreview/tree/41ee277825d685bd78e88e48b69da6aead9a69bb),固定版本并核验每个文件的 Git blob 哈希。默认盘点该版本截至 2026 年的非 ICLR 文件;ICLR 默认沿用独立的公开原始投稿/决定快照,需要补查时可显式指定 `--family iclr`。只保留明确的 Reject、Desk rejected、Withdrawn 标签,不根据 Submitted、Active、Pending、TBD、分数或录用名单缺席推断拒稿。
```sh
paper-atlas collect public-openreview --out /data/paper-index/collected/public-openreview-v1
paper-atlas audit public-openreview --db /data/paper-index/papers.sqlite \
--inventory /data/paper-index/collected/public-openreview-v1/public-openreview-inventory.json \
--out /data/paper-index/collected/public-openreview-preimport.json
```
输出按会议、届次及 main、position、datasets_benchmarks 分文件。workshop 默认进入单独的 held 清单;有明确 workshop 名称时可通过 `--include-workshops` 单列采集,不合并到主会。Retraction、未映射的轨道或负面标签也保留在 `held-records.jsonl`,不强改为 Reject 或 Withdrawn。当前决定表没有独立 retracted 状态,因此撤回发表记录仍需后续专门建模。
该来源明确标记为 `curated_public_status_assertion`:保留源 commit、文件哈希、行号、原标签和 forum ID,不声称已核验原始 PC 签名。只保存标题、摘要、公开作者名、关键词、领域、索引与决定来源,不缓存镜像中的个人资料、邮箱、性别、评审内容或 PDF。所有输出清单均为 partial;盘点中的零条记录仅描述这个固定镜像。
入库前审计核验文件哈希、数量、轨道和来源声明,并用真实 forum ID 对比同届同轨道已有投稿。存在不同决定时阻止整批导入,交由来源和时序核查;另一会议的后续录用属于独立投稿历史,不构成该次拒稿的冲突。同一 forum 的镜像不新增投稿事件,但论文实体的跨平台去重仍须在全量结束后核验。审计通过的报告包含带 SHA-256 的导入队列;应在单写入维护锁下及时串行导入,主库变化后重新审计。
ICML 2026 另有[公开原始投稿快照](https://github.com/HemantKumar01/ICML-2026-data/blob/1a1b9d973a8dfbf254f740fb8100a2fcf36757ea/data/rejected.json),包含 214 条投稿根记录。`collect icml-public-archive` 固定该 commit、文件长度及 Git blob 哈希,逐条要求 `readers` 包含 everyone、forum 等于自身 ID、域及投稿邀请属于主会、平台 `venueid` 明确为 `ICML.cc/2026/Conference/Rejected_Submission`。不能仅根据显示文案 Submitted to ICML 2026 推断拒稿。
```sh
paper-atlas collect icml-public-archive --out /data/paper-index/collected/icml-2026-public-archive
paper-atlas audit public-openreview --db /data/paper-index/papers.sqlite \
--inventory /data/paper-index/collected/icml-2026-public-archive/public-openreview-inventory.json \
--out /data/paper-index/collected/icml-2026-public-preimport.json
```
这批证据标记为 `public_submission_venueid`,保留逐投稿许可及快照出处;它与整理者的 Reject 标签、原始签名决定分别表述。记录修改时间不当作决定日期,观察时间采用快照上界,不采用今天的导入时间。214 是这个公开 opt-in 子集的投稿数,不能当作会议全部拒稿数,也不能直接当作去重论文实体数。该采集器同样只提取元数据与标题摘要,丢弃 authorids、个人资料、评审和 PDF 字段。
```sh
python3 -B -m paper_atlas collect peerread --cache /data/paper-index/raw/http-cache \
--out /data/paper-index/collected
@@ -223,6 +275,25 @@ python3 -B -m paper_atlas query --db /data/paper-index/papers.sqlite \
只将 Conference 来源的论文视为 ICLR 主会录用,排除 Blog 和期刊转会展示,并在审计清单保存排除计数。2020/2021 旧数据允许依据官方主会 paper program 形成录用证据;无 forum ID 时保留 program 身份和匹配候选,不伪造标识。历史年度返回 404 会登记 unavailable,未来未发表届次登记 not_yet_published,其他访问或解析失败登记 blocked;这些状态都不能宣称该年已覆盖。
ICLR 2020 的现代程序 JSON 没有真实 forum 链接,数字 event ID 也不能拼接为旧版海报地址。该年未核验身份的记录先使用官方 Papers 索引地址。旧版官方页面实际引用的 [papers.json](https://iclr.cc/virtual_2020/papers.json) 提供 687 个 forum;可用固定大小及 SHA-256 校验的副本进行独立身份核对:
```sh
paper-atlas download --url https://iclr.cc/virtual_2020/papers.json \
--output /data/paper-index/raw/iclr-2020-legacy-papers.json \
--expected-bytes 391687 \
--sha256 2405f2da6e2641fa600762f7d7cdf7c9d27f4d0ae65799168f3aee46036d30d2
paper-atlas audit iclr-legacy \
--program /data/paper-index/collected/iclr-program-2020-main.jsonl \
--snapshot /data/paper-index/collected/openreview-snapshot-2020-main.jsonl \
--legacy /data/paper-index/raw/iclr-2020-legacy-papers.json \
--out /data/paper-index/collected/iclr-2020-verified
```
核对同时要求同届公开录用、唯一投稿编号和官方 forum 清单一致;编号只是候选关联,还必须有独立的标题/摘要/公开作者证据。旧版作者缩写或姓名格式差异不会放宽全库作者匹配规则。一篇 Explain Your Move 有三个来源中的三种标题,使用逐个核对的精确标题组合及至少两名共同公开作者作例外,不启用通用模糊标题合并。
输出保留原 `2020/program-编号` 来源 ID、标题、摘要和作者,补充真实 forum、核验证据和旧版官方海报 URL。它不写数据库,也不修改输入文件。先在维护锁下使用输出的 `iclr-2020-backfill-queue.json` 给已有程序投稿回填身份,再导入核验后的程序文件与原始投稿快照;这样补充拒稿不会把已有录用事件再建一次。`iclr-2020-snapshot-queue.json` 和审计报告均记录待用文件的哈希,合并前仍须复核。
主题、关键词使用 `iclr_program:topic`、`iclr_program:keyword` 命名空间。通用导入器按源记录刷新标签证据,保留同一论文其他源记录及 `custom:*` 标签。每年的 JSONL、manifest、`iclr-program-year-status.json` 和 `iclr-program-last-run.json` 保存实际范围、独立展示数、主会展示数、论文数、缺失摘要与缺失 forum 数。录用程序不能提供拒稿全集,公开投稿及拒稿补充仍需独立来源。
### CVF / ECVA 视觉会议元数据
@@ -251,3 +322,13 @@ paper-atlas collect cvf --cache /data/paper-index/raw/http-cache \
```
parser_version 2 的清单还保存实际遍历的 index_urls、入口错误及缺失摘要页面。补采结果经过清单与身份核验后才导入,不能因重试任务启动就标记缺口已解决。
## PMLR 中的 ICML 多轨道论文
ICML 2024 起的一个 PMLR 卷可以同时包含研究主轨道与 Position Paper,不能把整卷都标为 `main`。采集器 v3 按轨道输出 `pmlr-v<VOLUME>-main.jsonl`、`pmlr-v<VOLUME>-position.jsonl` 及各自 manifest;卷级 `pmlr-v<VOLUME>.inventory.json` 和目录清单的 `files` 数组列出实际文件。导入队列应展开 `files`,不能假定每卷只有一个 `file`。
2025、2026 年通过出版社元数据的真实 OpenReview forum ID,匹配官方完整节目单中的 `Conference` / `Position_Paper_Track` 来源组;忽略负编号生成的口头报告副本,遇到冲突、缺少身份或未匹配的发表记录停止发布结果。每条记录保存节目单 URL、SHA-256、事件 ID、关联身份及轨道证据。
2024 年的官方节目单把两轨都放在 `Conference`,但提供 PMLR 论文自链接。该年仅采用组织方在 [2025 Position CFP](https://icml.cc/Conferences/2025/CallForPositionPapers) 明确链接的 [2024 Position 论文标题筛选](https://icml.cc/virtual/2024/papers.html?filter=titles&search=position%3A) 规则;同时保存规则页面的哈希。这个规则不用于其他会议或年份。官方节目单将 `guyard24a` 链接误写为 `theo24a`:只对这条已核查的映射额外要求标题精确一致、至少两名公开作者重合,不进行全库模糊匹配。
导入与身份回填拒绝 ICML 2024 起 parser_version<3 或没有官方轨道证据的旧文件。已有主库中的错误轨道需要在独占维护锁内迁移原投稿事件、保留决定与来源关联;仅重新导入拆分文件会留下旧的主轨道事件,不能作为修复方式。完成迁移前,不把新文件直接导入现有库。
+91
View File
@@ -1,7 +1,83 @@
# 运行维护与数据核验
## PostgreSQL 迁移
共享实例的容器名为 `foundry-postgres`,底层镜像为 `postgres:17-alpine`;Compose 服务名仍为 `postgres`。数据库和 schema 是可配置的逻辑边界,表按研究数据域组织,不按调用项目复制。其他项目可获授 `research` 的 USAGE 及必要表权限,复用相同论文 ID 和表。未来换库只更新 libpq service;换 schema 可更新角色 search_path 或查询的 `--pg-schema`。
复用已确认的现有实例,在共享 `foundry_data` 数据库按数据域使用 `research` schema 和专用角色,不修改其他业务库。安装、测试和构建在已批准的 `ces-control:host` 执行环境运行。libpq service 文件由服务器提供,权限必须为 `0600`,不得放进仓库或带密码的命令行参数。
冻结 SQLite 写入,确认维护进程实际结束、WAL 已清空;采集到独立文件不修改索引。迁移持有源维护锁和目标 advisory lock,还须确保没有绕过协调器的旧版手工写入。
```sh
export PGSERVICEFILE=/etc/paper-atlas/pg_service.conf
paper-atlas maintain postgres \
--db /data/paper-index/papers.sqlite --pg-service foundry-research \
--storage-path /var/lib/docker/volumes/endoleap-dev_postgres/_data \
--min-free-gib 8 --out /data/paper-index/collected/postgres-migration.json
```
全部 21 张业务表保留原 ID、原始 JSON 文本、NULL、来源、投稿、决定、标签出处和合并记录。`sqlite_sequence` 用于重设 PostgreSQL identity 序列,并考虑已合并的历史 ID,避免复用;SQLite FTS5 shadow 表根据完整标题/摘要重建为原生 GIN 索引,不逐字复制引擎文件。
SQLite 允许文本包含 `U+0000`(NUL),PostgreSQL `text` 不允许。迁移使用 `nul-soh-v1` 可逆编码:NUL 存为 `U+0001 U+0001`,原有 `U+0001` 存为 `U+0001 U+0002`,其他字符不变;包括字串前缀在内的二进制排序保持一致,主键、唯一约束和外键可继续验证。编码版本保存在 `<schema>_migration.run.text_codec`,发布时同时写入 schema 注释 `paper-atlas:text-codec=nul-soh-v1`,其他项目只需研究表的权限即可读取格式信息,无须访问迁移控制表。CLI 的只读连接自动还原结果并编码筛选参数;直接 SQL/ETL 调用者应使用 `paper_atlas.postgres.text.encode/decode`,不能删除或直接替换控制字符。全文检索把这些控制字符当作分隔符,不承担逐字节匹配。
先 COPY 到独立暂存 schema,每张表提交和记录哈希。中断后以同一命令、同一报告路径恢复,必须仍是**完全相同的未变更快照**。不同输入、已发布目标、未清空 WAL、新的未知业务表都会拒绝覆盖;恢复只会清空本次运行尚未完成且尚未发布的暂存表。保留错误现场,不盲目从头复制。
恢复旧版本未发布的暂存数据时,在一个事务中转义已提交表里原有的 `U+0001`,然后记录新编码版本;失败回滚,重复恢复不会二次编码。已经提交的表无需从 SQLite 重新复制。报告中的 `source_sha256`、`target_sha256` 比较完整还原后的原始值;`target_storage_sha256` 另记实际存储值的哈希,包含转义的表两种哈希可以不同。
发布前逐表按主键完整回读,比较数量及逐行 SHA-256;建立并验证所有主键、唯一约束、CHECK 和外键,重设序列、建立 GIN 并 ANALYZE。全部通过后原子重命名为 `research` schema,报告才为 `complete`。`copying`、`prepared`、部分表通过或 CI 通过均不代表生产迁移完成,也不替代原任务最后的实体去重和会议覆盖审计。
发布后核对 PostgreSQL 的统计、全文检索、论文详情,以及 reject 后另会 accept 的历史。确认后保留 SQLite 只读备份,并在旁保存 `<SQLite路径>.postgresql-cutover.json`,记录报告路径、源哈希、目标 service/schema;新版本旧写入入口见此标记会拒绝写入。标记不含密码。后续导入适配属于下一阶段,不可继续更新 SQLite 后声称 PostgreSQL 已同步。
远程集成测试通过 `PAPER_ATLAS_TEST_PG_SERVICE` 显式指定,使用随机前缀 schema 并仅清理自己的 fixture;没有该配置时会跳过,应另外报告“未运行”,不能用 SQLite 测试代替 PostgreSQL 验证。
## PostgreSQL 增量写入
`import records`、`import arxiv`、`maintain backfill` 使用 `--pg-service` 选择主库,`--pg-schema` 可覆盖配置的 search_path。写入只接受已经发布、拥有完整业务表和受支持编码标记的 schema,不自动建库或引导空表。SQLite 样本仍使用 `--db`,已切换备份继续禁止写入。
写入连接按数据库/schema 获取会话级 advisory lock,文件提交、回滚以及 arXiv 分批提交均不释放;关闭连接才释放,其他写入者立即得到明确的占用错误。只读查询继续使用独立一致性快照。锁是所有调用方必须遵守的协议,其他项目不要绕过接口并发修改同一论文和投稿;[PostgreSQL 会话锁说明](https://www.postgresql.org/docs/17/explicit-locking.html#ADVISORY-LOCKS)解释了其事务边界。
论文身份匹配、跨来源合并、投稿/决定来源和标签维护复用同一套领域逻辑。PostgreSQL 使用原生 RETURNING 和 identity 序列分配 ID,继承迁移时设定的历史 ID 高水位;失败和冲突尝试可以留下序列空洞,不能把最大 ID 当作行数。绑定文本按 `nul-soh-v1` 编码,结果解码,GIN 随论文写入自动更新。
会议文件的数据变化在同一事务内完成,manifest 数量不符等错误会回滚整份文件,`ingest_runs` 另保留 failed、已处理数和零写入数;身份回填整个队列一次提交。arXiv 每 500 行提交数据和 checkpoint,异常只回滚尚未提交部分,重试必须仍为同一压缩包。大批次开始前核对独立审计清单、当前主库冲突和磁盘空间;完成后对数量、实际来源/决定关联及检索做数据验收,代码测试成功不代表生产导入成功。
`audit public-openreview --pg-service ...` 在只读快照中核验两个受支持公开负面决定来源的固定 revision、逐文件哈希、manifest、原始出处标记和既有同届投稿。最新决定排序与查询端一致:观察时间、决定日期(为空时回退观察时间)、ID。实际导入持有写锁后再次复核该投稿的最新状态,阻止过期预检或弱来源标签覆盖冲突决定;冲突文件整体回滚并等待进一步证据核查,其他会议录用不构成同一次投稿的冲突。
会议导入按原始字节流计算 SHA-256,在提交前与 manifest 提供的 `file_sha256` 比较;不符则回滚整份文件。成功批次的 checkpoint 会记录实际读取内容的哈希,便于复核导入时使用的文件版本。
代码以固定 commit 部署,已经启动的任务继续使用其原版本。目录重构不要求迁移数据库,也不更改已有 JSONL 和 manifest 格式。
## arXiv 原始编号与类别证据
原始行数、唯一 arXiv 编号数和合并后的论文实体数分别核验。以下只读原始压缩包,流式处理到 ZIP EOF/CRC 检查完成;输出审计 JSON 与编号 SQLite 索引,不修改论文主库:
```sh
paper-atlas audit arxiv --archive /data/paper-index/raw/arxiv-metadata.zip \
--out /data/paper-index/collected/arxiv-source-audit.json
```
同编号的重复行会记录出现位置、次数和内容哈希版本,不直接视作不同论文;同篇论文的多个 arXiv 编号则保留各自来源及类别证据。旧导入器使用共享类别证据键,可能在论文实体合并时丢失某个编号的相同类别出处。新导入使用逐记录证据键;已有数据须在没有其他主库写入任务时按保留的来源 metadata 修复:
```sh
paper-atlas maintain arxiv-tags --db /data/paper-index/papers.sqlite \
--out /data/paper-index/collected/arxiv-tag-repair.json
```
修复使用同一维护锁,分批提交并保存断点,保留 `custom:*` 和其他来源证据;失败后确认原因已解决,再增加 `--resume` 从上次提交位置继续。完成报告不能作为重新扫描的断点,重新核验应指定新报告。源审计和标签修复均保留 8 GiB 空闲空间,不能代替所有来源入库后的实体、投稿去重与完整性检查。
修复结束后还须核对每条 arXiv 来源记录的类别集合,不能只看旧证据键是否清零。下面的只读审计比较来源 metadata 中的类别、所属论文实体和逐记录证据键,同时检查没有合法 arXiv 来源的类别行:
```sh
paper-atlas audit arxiv-tags --db /data/paper-index/papers.sqlite \
--repair-report /data/paper-index/collected/arxiv-tag-repair.json \
--out /data/paper-index/collected/arxiv-tag-coverage-audit.json
```
审计持有共享维护锁;修复或其他协调写入尚未结束时会拒绝运行。提供修复报告时,还会核对其已完成状态、数据库路径和固定来源范围。审计以一致的只读快照分批读取,记录完整扫描数量、缺失/多余证据、错误论文归属、残留旧键及少量异常样例,不修改主库。
来源记录按整数主键区间读取,避免 SQLite 误选按 external_id 排列的来源索引、每批重新排序整个来源;其他来源交错在编号区间内时仍按 source_id 过滤。类别证据继续使用 source_record_id 索引批量读取。完整核验范围不因查询优化缩小。
只有全量记录核对完毕且无差异时才标记 `passed`;存在差异为 `failed` 并返回非零退出码,解析或执行中断为 `error`。运行中的报告不能作为完成证明。重新核验须使用新输出路径,不能覆盖已有报告;该检查不替代最后的实体去重、外键、SQLite 与全文索引核验。
## 长期维护与更新
1. 每次采集先核对来源、许可、可访问性、空闲空间和现有运行批次。保持低并发,遵守来源限流、重试与人机验证要求。
@@ -29,3 +105,18 @@ paper-atlas coverage --db /data/paper-index/papers.sqlite \
manifest 和采集器状态清单用于确认文件是否齐全及是否缺摘要;`ingest_runs` 和协调器日志用于确认主库导入是否成功。官方程序、书目目录和公开投稿快照分别保留,未出现在某份清单不等于被拒稿;第三方快照也不能代表平台当前全量状态。代码测试成功不能代替最终全库去重、完整性和逐届覆盖核验。
当前代码与合并状态以 [Pull Requests](https://gitea.entroia.com/Zayden-Jung/paper-atlas/pulls) 为准;CI 结果以对应提交的 Actions 检查为准。工作分支交付后等待用户手动合并。合并代码不自动部署、不自动启动采集,也不代表数据批次已完成。
## 修正已有 PMLR 投稿的轨道
先用采集器 v3 把 ICML 多轨道卷采集到新目录,保留旧文件。以下命令默认只读生成迁移计划;`--inventory` 可重复指定,以完整卷为单位核对,不能只提供 Position 子集:
```sh
paper-atlas maintain pmlr-tracks --db /data/paper-index/papers.sqlite \
--inventory /data/paper-index/collected/pmlr-tracks-v3/pmlr-v235.inventory.json \
--inventory /data/paper-index/collected/pmlr-tracks-v3/pmlr-v267.inventory.json \
--inventory /data/paper-index/collected/pmlr-tracks-v3/pmlr-v306.inventory.json \
--out /data/paper-index/collected/pmlr-track-plan.json
```
检查报告后,在同一命令添加 `--apply` 并使用新的 `--out` 路径执行迁移。计划使用共享维护锁,实际迁移使用独占锁;已有 arXiv 类别修复或其他写入运行时会拒绝启动,不会停止或重启它们。一次事务内核对整个来源集合、原始题目/摘要/作者、forum 身份、已有事件及目标冲突,更新原投稿的 edition 和身份归属,回填官方轨道出处及逐轨道覆盖数,最后复查轨道与外键后提交。论文、来源、投稿、决定的 ID 及决定观察均保留,不重新创建事件、不做实体合并、不改论文正文元数据或标签。
报告记录每个迁移事件的旧 edition、原身份、完整决定观察及新轨道证据。`planned` 是未执行的计划;`complete` 才表示事务已提交;`error` 表示执行失败。若进程在提交前后中断而报告停在 `prepared`,先对照主库和报告核查,不根据日志缺失自行重启任务。新路径重跑会重新核对当前数据库,已正确的轨道不会再次迁移。共享多个来源、重复目标事件或冲突决定会停止迁移,需另行核对,不能直接删掉其中一条。
+49 -3
View File
@@ -2,6 +2,24 @@
先在已确认的远程环境安装项目,使用 `paper-atlas`。从源码运行时,将命令前缀替换为 `python3 -B -m paper_atlas`,其余参数相同。数据目录位于仓库外。
## PostgreSQL 查询
在远程环境安装 `.[postgres]`,通过权限为 `0600` 的 libpq service 文件连接,不把密码放入 URL、命令行或仓库。
```sh
export PGSERVICEFILE=/etc/paper-atlas/pg_service.conf
paper-atlas query --pg-service foundry-research --stats
paper-atlas query --pg-service foundry-research --query '"language model"' --tag arxiv:category=cs.CL
paper-atlas query --pg-service foundry-research --status rejected --outcome accepted --limit 20
paper-atlas query --pg-service foundry-research --paper 123
```
使用只读一致性事务,支持论文 ID、会议别名、年份、轨道、标签、最新决定和跨会议录用筛选。全文检索使用 PostgreSQL `websearch_to_tsquery('english', ...)`,支持引号短语、`OR` 和减号排除;与 SQLite FTS5 的语法及分词结果不完全相同。JSON 来源列保留原始文本;转成 `jsonb` 前须确认原始值符合该类型的限制。
CLI 自动还原迁移中的 NUL/SOH 文本转义,详情中的来源摘要和筛选参数保留原字符。直接 SQL 读取可能看到 `U+0001` 转义序列;跨项目 ETL 应按迁移元数据中的 `text_codec` 使用 `paper_atlas.postgres.text.encode/decode`。存储格式和无损哈希验收见[运行维护](operations.md#postgresql-迁移)。
迁移与切换见[运行维护](operations.md#postgresql-迁移)。`import records`、`import arxiv` 和 `maintain backfill` 均支持 `--pg-service` 和可选 `--pg-schema`;与 `--db` 二选一。SQLite 导入仅用于未切换的索引或独立样本。尚未适配 PostgreSQL 的维护、覆盖审计命令仍可只读检查冻结备份,不能当作主库的当前状态。
## 1. 下载固定快照
`paper-atlas download --help` 说明大小、校验和与续传参数。各来源的固定版本与具体命令见[数据源说明](data-sources.md)。下载成功只表示原始文件已核验。
@@ -14,16 +32,44 @@ paper-atlas collect cvf --cache /data/paper-index/raw/http-cache --out /data/pap
paper-atlas collect ecva --cache /data/paper-index/raw/http-cache --out /data/paper-index/collected
paper-atlas catalogue dblp --help
paper-atlas audit iclr --help
paper-atlas collect public-openreview --help
paper-atlas collect icml-public-archive --help
paper-atlas audit public-openreview --help
```
采集输出 JSONL、manifest 和逐卷或逐年 catalogue。逐项检查 blocked、partial、缺失摘要及目标会议归属。DBLP 候选目录还需核验届次和 track,不能直接当作主会录用名单。
## 3. 串行导入
其他会议的公开拒稿使用 `collect public-openreview`,再以 `audit public-openreview` 核对既有投稿身份和决定冲突。来源版本、逐文件状态盘点和未解决记录分别保存在 inventory 与 held 清单中,具体命令见[数据源说明](data-sources.md#其他会议的公开拒稿)。这类公开子集不能当作会议完整投稿名单。
首次 arXiv 导入使用 `paper-atlas import arxiv --db ... --archive ...`。现有数据库合并已核验的会议文件使用:
主库切换后,预检须直接连接当前 PostgreSQL,不能用冻结的 SQLite 备份推断当前决定:
```sh
paper-atlas maintain merge --db /data/paper-index/papers.sqlite \
paper-atlas audit public-openreview --pg-service foundry-research \
--inventory /data/paper-index/collected/public-openreview-v1/public-openreview-inventory.json \
--out /data/paper-index/collected/public-negative-pg-preflight.json
```
预检使用只读一致性快照,报告会记录实际数据库、schema、文件哈希和同届次/轨道的决定冲突;其他会议的录用保留为独立历史。预检不预留写锁,实际导入这两类公开负面决定时会在写事务中再次复核同一次投稿的最新状态;过期预检报告不能覆盖已经变化的决定。
## 3. 串行导入
PostgreSQL 主库逐文件导入已经核验的资料:
```sh
paper-atlas import records --pg-service foundry-research \
/data/paper-index/collected/selected-file.jsonl
paper-atlas maintain backfill --pg-service foundry-research \
--queue /data/paper-index/collected/audited-identity-queue.json
```
文件和 queue 须替换为实际核验通过的路径。会议导入按文件提交,失败时该文件的论文、标签和决定更改全部回滚,失败批次日志保留;重跑会按来源标识与决定证据去重。回填使用已有源记录,只合并经独立身份佐证的投稿,不重新导入文本。所有写入者须遵守同一数据库/schema 的会话锁;其他项目也应通过相同的写入接口更新共享论文和投稿。
未来需要导入新的 arXiv 元数据包时使用 `paper-atlas import arxiv --pg-service foundry-research --archive ... --storage-path ...`。每 500 行提交断点,恢复同一文件时保留已提交 ID 和标签证据;`--storage-path` 指定运行主机上要监测的文件系统,在数据库主机执行时应指向数据库卷。已完成的历史压缩包不需要重复导入。
SQLite 独立样本的首次 arXiv 导入使用 `paper-atlas import arxiv --db ... --archive ...`。SQLite 协调器仍适用于未切换的索引:
```sh
paper-atlas maintain merge --db /data/paper-index/samples/example.sqlite \
--archive /data/paper-index/raw/arxiv-metadata.zip \
/data/paper-index/collected/selected-file.jsonl
```
+90
View File
@@ -0,0 +1,90 @@
"""Independently count raw arXiv IDs and their payload variants to ZIP EOF."""
import argparse
from contextlib import closing
import fcntl
import hashlib
import json
from pathlib import Path
import shutil
import sqlite3
import tempfile
import zipfile
from paper_atlas.db.submissions import timestamp
from paper_atlas.io.snapshots import digest_file
MEMBER='arxiv-metadata-oai-snapshot.json'
def fingerprint(path):
info=path.stat()
return {'bytes':info.st_size,'mtime_ns':info.st_mtime_ns}
def audit(archive,out,expected_sha256=None):
out=Path(out).resolve();out.parent.mkdir(parents=True,exist_ok=True)
with out.with_suffix('.lock').open('a') as lock:
fcntl.flock(lock,fcntl.LOCK_EX|fcntl.LOCK_NB)
return _audit(archive,out,expected_sha256)
def _audit(archive,out,expected_sha256=None):
archive=Path(archive).resolve();out=Path(out).resolve()
ids=out.with_suffix('.ids.sqlite')
if out.exists() or ids.exists():raise ValueError('Audit output exists; inspect it before another run')
out.parent.mkdir(parents=True,exist_ok=True)
before=fingerprint(archive);identity=digest_file(archive)
if expected_sha256 and identity['sha256']!=expected_sha256:raise ValueError('Archive checksum mismatch')
if shutil.disk_usage(out.parent).free<8*1024**3:raise RuntimeError('Less than 8 GiB free before source audit')
count=0;missing_title=0;missing_abstract=0
with tempfile.TemporaryDirectory(prefix='.arxiv-audit-',dir=out.parent) as temporary:
stage=Path(temporary)/ids.name
with closing(sqlite3.connect(stage)) as c:
c.executescript('PRAGMA cache_size=-16384; CREATE TABLE raw_ids(external_id TEXT PRIMARY KEY,first_line INTEGER,last_line INTEGER,occurrences INTEGER,first_sha256 BLOB,has_payload_variants INTEGER) WITHOUT ROWID; CREATE TABLE duplicate_variants(external_id TEXT,payload_sha256 BLOB,first_line INTEGER,last_line INTEGER,occurrences INTEGER,PRIMARY KEY(external_id,payload_sha256)) WITHOUT ROWID;')
with zipfile.ZipFile(archive) as zipped:
info=zipped.getinfo(MEMBER)
with zipped.open(info) as stream:
for count,line in enumerate(stream,1):
row=json.loads(line);external=row.get('id')
if not isinstance(external,str) or not external or external!=external.strip():raise ValueError('Missing or malformed arXiv ID')
payload=hashlib.sha256(json.dumps(row,ensure_ascii=False,sort_keys=True,separators=(',',':')).encode()).digest()
inserted=c.execute('INSERT OR IGNORE INTO raw_ids VALUES(?,?,?,1,?,0)',(external,count,count,payload)).rowcount
if not inserted:
first_line,first=c.execute('SELECT first_line,first_sha256 FROM raw_ids WHERE external_id=?',(external,)).fetchone()
c.execute('INSERT OR IGNORE INTO duplicate_variants VALUES(?,?,?,?,1)',(external,first,first_line,first_line))
c.execute('INSERT INTO duplicate_variants VALUES(?,?,?,?,1) ON CONFLICT(external_id,payload_sha256) DO UPDATE SET last_line=excluded.last_line,occurrences=duplicate_variants.occurrences+1',(external,payload,count,count))
c.execute('UPDATE raw_ids SET last_line=?,occurrences=occurrences+1,has_payload_variants=has_payload_variants OR first_sha256!=? WHERE external_id=?',(count,payload,external))
missing_title+=not bool((row.get('title') or '').strip())
missing_abstract+=not bool((row.get('abstract') or '').strip())
if count%10000==0:
c.commit()
if shutil.disk_usage(out.parent).free<8*1024**3:raise RuntimeError('Less than 8 GiB free during source audit')
if count%100000==0:print(json.dumps({'source':'arxiv_audit','raw_rows':count}),flush=True)
# zipfile verifies the member CRC only when its stream reaches EOF.
if not count:raise ValueError('Empty arXiv metadata member')
if fingerprint(archive)!=before:raise ValueError('Archive changed during audit')
c.commit()
if c.execute('PRAGMA quick_check').fetchone()[0]!='ok':raise ValueError('Audit index failed SQLite quick_check')
unique=c.execute('SELECT count(*) FROM raw_ids').fetchone()[0]
duplicate_ids=[]
for key,first,last,occurrences,variants in c.execute('SELECT external_id,first_line,last_line,occurrences,has_payload_variants FROM raw_ids WHERE occurrences>1 ORDER BY external_id'):
duplicate_ids.append({'external_id':key,'first_line':first,'last_line':last,'occurrences':occurrences,'has_payload_variants':bool(variants),
'variants':[{'sha256':digest.hex(),'first_line':a,'last_line':b,'occurrences':n} for digest,a,b,n in c.execute('SELECT payload_sha256,first_line,last_line,occurrences FROM duplicate_variants WHERE external_id=? ORDER BY first_line',(key,))]})
result={'checked_at':timestamp(),'archive':str(archive),'archive_identity':identity,'member':MEMBER,'member_crc32':f'{info.CRC:08x}',
'uncompressed_bytes':info.file_size,'zip_eof_crc_verified':True,'raw_rows':count,'unique_external_ids':unique,'extra_rows_for_repeated_ids':count-unique,
'repeated_id_count':len(duplicate_ids),'repeated_ids_with_payload_variants':sum(item['has_payload_variants'] for item in duplicate_ids),
'missing_title_rows':missing_title,'missing_abstract_rows':missing_abstract,'duplicate_ids':duplicate_ids,'id_index':str(ids),
'interpretation':'Raw ID/payload audit, not a count of unique research works. Payload variants are retained as evidence; latest source import uses the last row for each ID. Cross-source entity/submission dedup requires a separate database audit.'}
stage.replace(ids)
part=out.with_suffix('.part');part.write_text(json.dumps(result,ensure_ascii=False,indent=2)+'\n');part.replace(out)
print(json.dumps({key:value for key,value in result.items() if key!='duplicate_ids'}),flush=True)
return result
def main(argv=None,*,prog=None):
parser=argparse.ArgumentParser(prog=prog);parser.add_argument('--archive',required=True);parser.add_argument('--out',required=True)
parser.add_argument('--expected-sha256');args=parser.parse_args(argv)
audit(args.archive,args.out,args.expected_sha256)
if __name__=='__main__':main()
+143
View File
@@ -0,0 +1,143 @@
"""Compare every arXiv record's category evidence with retained source metadata."""
import argparse
from collections import defaultdict
from contextlib import closing
import fcntl
import json
from pathlib import Path
import sqlite3
from paper_atlas.db.submissions import timestamp
def save(path, state):
part = path.with_suffix('.part')
part.write_text(json.dumps(state, ensure_ascii=False, indent=2) + '\n')
part.replace(path)
def audit(db, out, repair_report=None, batch_size=500):
db, out = Path(db).resolve(), Path(out).resolve()
if not db.is_file():
raise ValueError('Existing database required')
if not 1 <= batch_size <= 500:
raise ValueError('Batch size must be between 1 and 500')
if out == db or repair_report and out == Path(repair_report).resolve():
raise ValueError('Audit output must preserve its inputs')
out.parent.mkdir(parents=True, exist_ok=True)
with Path(str(db) + '.maintenance.lock').open('a') as maintenance, Path(str(out) + '.lock').open('a') as output_lock:
# A partial repair is not a useful full-category audit. This also keeps
# cooperating maintenance writers out for the entire read-only snapshot.
fcntl.flock(maintenance, fcntl.LOCK_SH | fcntl.LOCK_NB)
fcntl.flock(output_lock, fcntl.LOCK_EX | fcntl.LOCK_NB)
if out.exists():
raise ValueError('Audit report exists; select a new output path')
with closing(sqlite3.connect(db.as_uri() + '?mode=ro', uri=True)) as c:
c.execute('PRAGMA cache_size=-32768')
c.execute('BEGIN')
source = c.execute("SELECT id FROM sources WHERE name='arxiv'").fetchone()
if source is None:
raise ValueError('No imported arXiv source')
total, maximum = c.execute('SELECT count(*),COALESCE(max(id),0) FROM source_records WHERE source_id=?', source).fetchone()
if not total:
raise ValueError('No imported arXiv records')
scope = {'db': str(db), 'source_id': source[0], 'source_record_count': total,
'maximum_source_record_id': maximum}
if repair_report:
repair = json.loads(Path(repair_report).read_text())
if repair.get('status') != 'complete' or repair.get('records_refreshed') != total:
raise ValueError('Category repair has not completed this source inventory')
if any(repair.get(key) != value for key, value in scope.items()):
raise ValueError('Repair report belongs to a different source inventory')
state = {**scope, 'started_at': timestamp(), 'status': 'running', 'records_checked': 0,
'last_record_id': 0, 'expected_evidence': 0, 'actual_evidence': 0,
'records_with_mismatches': 0, 'missing_evidence': 0, 'unexpected_evidence': 0,
'legacy_evidence': 0, 'examples': [], 'repair_report': str(Path(repair_report).resolve()) if repair_report else None}
save(out, state)
try:
while True:
# The (source_id,external_id) index orders by external ID,
# so choosing it sorts the entire source again per batch.
# This fixed ID interval must use the integer primary key.
records = c.execute('''SELECT id,external_id,paper_id,metadata_json FROM source_records NOT INDEXED
WHERE source_id=? AND id>? AND id<=? ORDER BY id LIMIT ?''',
(source[0], state['last_record_id'], maximum, batch_size)).fetchall()
if not records:
break
ids = [row[0] for row in records]
actual = defaultdict(set)
for record, paper, category, evidence in c.execute('''SELECT pt.source_record_id,pt.paper_id,t.value,pt.evidence_key
FROM paper_tags pt JOIN tags t ON t.id=pt.tag_id WHERE t.namespace='arxiv:category'
AND pt.source_record_id IN (''' + ','.join('?' for _ in ids) + ')', ids):
actual[record].add((category, paper, evidence))
state['legacy_evidence'] += evidence == 'arxiv:categories'
for record, external, paper, payload in records:
metadata = json.loads(payload)
if not isinstance(metadata, dict):
raise ValueError('arXiv source metadata must be an object')
categories = metadata.get('categories')
if categories is None:
categories = ''
if not isinstance(categories, str):
raise ValueError('arXiv source categories must be text')
evidence_key = f'arxiv:record:{record}:tags'
expected = {(category, paper, evidence_key) for category in categories.split()}
found = actual[record]
missing, unexpected = expected - found, found - expected
state['expected_evidence'] += len(expected)
state['actual_evidence'] += len(found)
state['missing_evidence'] += len(missing)
state['unexpected_evidence'] += len(unexpected)
if missing or unexpected:
state['records_with_mismatches'] += 1
if len(state['examples']) < 20:
state['examples'].append({'record_id': record, 'external_id': external,
'paper_id': paper, 'missing': sorted(missing), 'unexpected': sorted(unexpected)})
state['records_checked'] += 1
state['last_record_id'] = ids[-1]
if state['records_checked'] % 10000 < len(records):
save(out, state)
print(json.dumps({k: state[k] for k in ('status', 'records_checked', 'source_record_count', 'records_with_mismatches')}), flush=True)
if state['records_checked'] != total:
raise ValueError('Audited record count differs from the fixed source inventory')
# Every category row must also have an arXiv source-record owner.
# The full namespace total catches orphan and wrong-source evidence
# that cannot appear in the per-record traversal above.
all_evidence = c.execute("SELECT count(*) FROM paper_tags pt JOIN tags t ON t.id=pt.tag_id WHERE t.namespace='arxiv:category'").fetchone()[0]
unscoped = all_evidence - state['actual_evidence']
if unscoped < 0:
raise ValueError('Category evidence totals are inconsistent')
state.update(namespace_evidence=all_evidence, evidence_without_arxiv_record=unscoped)
if unscoped:
state['unscoped_examples'] = [dict(zip(('paper_id', 'category', 'source_record_id', 'evidence_key'), row))
for row in c.execute('''SELECT pt.paper_id,t.value,pt.source_record_id,pt.evidence_key
FROM paper_tags pt JOIN tags t ON t.id=pt.tag_id
LEFT JOIN source_records r ON r.id=pt.source_record_id
WHERE t.namespace='arxiv:category' AND (r.source_id IS NULL OR r.source_id<>?) LIMIT 20''', source)]
passed = not state['records_with_mismatches'] and not unscoped
state.update(status='passed' if passed else 'failed', finished_at=timestamp(),
note='Full per-record category, canonical paper and evidence-key equality. '
'Read-only; not a global paper deduplication or full database-integrity audit.')
save(out, state)
except BaseException as error:
state.update(status='error', error=str(error), finished_at=timestamp())
save(out, state)
raise
print(json.dumps(state), flush=True)
return state
def main(argv=None, *, prog=None):
parser = argparse.ArgumentParser(prog=prog)
parser.add_argument('--db', required=True)
parser.add_argument('--out', required=True)
parser.add_argument('--repair-report')
parser.add_argument('--batch-size', type=int, default=500)
args = parser.parse_args(argv)
result = audit(args.db, args.out, args.repair_report, args.batch_size)
if result['status'] != 'passed':
raise SystemExit('arXiv category evidence audit failed; inspect the report')
if __name__ == '__main__':
main()
+172
View File
@@ -0,0 +1,172 @@
"""Reconcile the 2020 program with independently identified official papers."""
import argparse
from collections import Counter, defaultdict
import copy
import fcntl
import hashlib
import json
from pathlib import Path
import re
import tempfile
from paper_atlas.audits.iclr import load
from paper_atlas.db.store import author_keys, normalized
from paper_atlas.db.submissions import timestamp
LEGACY_URL = 'https://iclr.cc/virtual_2020/papers.json'
LEGACY_SHA256 = '2405f2da6e2641fa600762f7d7cdf7c9d27f4d0ae65799168f3aee46036d30d2'
LEGACY_BYTES = 391687
EXPECTED = 687
# This one paper has three documented titles across the pinned official legacy
# list, current official program, and public submission snapshot. The exception
# also requires independent public-author agreement; it is not fuzzy matching.
REVIEWED_TITLE_VARIANT = {
'forum': 'SJgzLkBKPB',
'program': 'Explain Your Move: Understanding Agent Actions Using Salient and Relevant Feature Attribution',
'legacy': 'Explain Your Move: Understanding Agent Actions Using Focused Feature Saliency',
'snapshot': 'Explain Your Move: Understanding Agent Actions Using Specific and Relevant Feature Attribution',
}
def reconcile(program, snapshot, legacy):
by_number = defaultdict(list)
for row in snapshot.values():
by_number[row['metadata'].get('source_submission_number')].append(row)
legacy_by_forum = {}
for note in legacy:
forum = note.get('forum')
content = note.get('content') or {}
if not isinstance(forum, str) or not re.fullmatch(r'[A-Za-z0-9_-]+', forum):
raise ValueError('Invalid legacy forum identity')
if note.get('id') != forum or content.get('iclr_id') != forum or forum in legacy_by_forum:
raise ValueError('Conflicting or repeated official legacy forum')
if not isinstance(content.get('title'), str) or not content['title'].strip() or not isinstance(content.get('authors'), list):
raise ValueError('Legacy paper lacks title or public authors')
legacy_by_forum[forum] = content
if len(program) != len(legacy_by_forum):
raise ValueError('Official program and legacy inventories differ')
title_counts = Counter(normalized(row['title']) for row in legacy_by_forum.values())
enriched = []
assigned = set()
numbers = set()
evidence_counts = Counter()
for original in program:
if any(original.get(k) != v for k, v in {'source': 'iclr_program', 'venue': 'ICLR', 'year': 2020, 'track': 'main', 'status': 'accepted'}.items()):
raise ValueError('Program record is outside the accepted 2020 main track')
metadata = original.get('metadata') or {}
number = metadata.get('program_source_id')
if metadata.get('program_identity_type') != 'submission' or type(number) is not int or number <= 0 or number in numbers:
raise ValueError('Missing or repeated program submission number')
numbers.add(number)
candidates = by_number[number]
if len(candidates) != 1:
raise ValueError('Submission number is absent or ambiguous in the public snapshot')
submission = candidates[0]
forum = submission['identifiers']['openreview']
if submission['status'] != 'accepted' or forum not in legacy_by_forum or forum in assigned:
raise ValueError('Snapshot acceptance and official forum inventory do not agree')
content = legacy_by_forum[forum]
shared_legacy = len(author_keys(original['authors']) & author_keys(content['authors']))
shared_snapshot = len(author_keys(original['authors']) & author_keys(submission['authors']))
checks = {'legacy_title': normalized(original['title']) == normalized(content['title']),
'snapshot_title': normalized(original['title']) == normalized(submission['title']),
'snapshot_abstract': bool(original.get('abstract')) and original['abstract'].strip() == (submission.get('abstract') or '').strip(),
'two_snapshot_authors': shared_snapshot >= 2}
independent_snapshot = sum(checks[k] for k in ('snapshot_title', 'snapshot_abstract', 'two_snapshot_authors')) >= 2
checks['legacy_title_unique'] = title_counts[normalized(content['title'])] == 1
independent_legacy = checks['legacy_title'] and checks['legacy_title_unique'] and shared_legacy >= 1
reviewed_variant = (forum == REVIEWED_TITLE_VARIANT['forum']
and normalized(original['title']) == normalized(REVIEWED_TITLE_VARIANT['program'])
and normalized(content['title']) == normalized(REVIEWED_TITLE_VARIANT['legacy'])
and normalized(submission['title']) == normalized(REVIEWED_TITLE_VARIANT['snapshot'])
and shared_legacy >= 2 and shared_snapshot >= 2)
if not (independent_snapshot or independent_legacy or reviewed_variant):
raise ValueError('Submission number alone cannot establish forum identity: ' + original['external_id'])
own = original.get('identifiers') or {}
if own.get('openreview') not in (None, forum):
raise ValueError('Existing program forum conflicts with independent evidence')
row = copy.deepcopy(original)
row['identifiers'] = {**own, 'openreview': forum}
row['url'] = 'https://iclr.cc/virtual_2020/poster_' + forum + '.html'
row['metadata'].update(identity_state='forum', program_submission_number_verified=True,
program_identity_verification={'method': 'official_legacy_and_public_submission_crosscheck',
'legacy_url': LEGACY_URL, 'legacy_sha256': LEGACY_SHA256,
'original_program_url': original['url'], 'legacy_forum': forum,
'checks': checks, 'shared_legacy_authors': shared_legacy,
'shared_snapshot_authors': shared_snapshot, 'reviewed_title_variant': reviewed_variant})
enriched.append(row)
assigned.add(forum)
evidence_counts.update({'independent_snapshot': int(independent_snapshot),
'independent_legacy': int(independent_legacy),
'reviewed_title_variant': int(reviewed_variant)})
if assigned != legacy_by_forum.keys():
raise ValueError('Unmatched official legacy forum identities remain')
if assigned != {forum for forum, row in snapshot.items() if row['status'] == 'accepted'}:
raise ValueError('Accepted snapshot forum inventory differs from the official program')
return enriched, dict(evidence_counts)
def audit(program_path, snapshot_path, legacy_path, out):
program_path, snapshot_path, legacy_path = map(lambda p: Path(p).resolve(), (program_path, snapshot_path, legacy_path))
raw = legacy_path.read_bytes()
if len(raw) != LEGACY_BYTES or hashlib.sha256(raw).hexdigest() != LEGACY_SHA256:
raise ValueError('Official legacy snapshot checksum mismatch')
legacy = json.loads(raw)
if not isinstance(legacy, list) or len(legacy) != EXPECTED:
raise ValueError('Official legacy count mismatch')
manifest = json.loads(program_path.with_suffix('.manifest.json').read_text())
if manifest.get('parser_version', 0) < 2 or any(manifest.get(k) != v for k, v in {'source': 'iclr_program', 'venue': 'ICLR', 'year': 2020, 'track': 'main', 'count': EXPECTED}.items()):
raise ValueError('Invalid collected program inventory')
program_bytes = program_path.read_bytes()
program = [json.loads(line) for line in program_bytes.splitlines()]
if len(program) != EXPECTED or len({r['external_id'] for r in program}) != EXPECTED:
raise ValueError('Program count or source identity mismatch')
snapshot, snapshot_manifest, snapshot_sha = load(snapshot_path, 'openreview_snapshot', 2020)
rows, checks = reconcile(program, snapshot, legacy)
out = Path(out).resolve()
if out / 'iclr-program-2020-main.jsonl' in (program_path, snapshot_path, legacy_path):
raise ValueError('Output must preserve the original input files')
out.mkdir(parents=True, exist_ok=True)
with (out / 'iclr-legacy.lock').open('a') as lock:
fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB)
if (out / 'iclr-2020-identity-audit.json').exists():
raise ValueError('Completed identity audit exists; choose a new output directory')
with tempfile.TemporaryDirectory(prefix='.iclr-legacy-', dir=out) as temporary:
stage = Path(temporary)
path = stage / 'iclr-program-2020-main.jsonl'
path.write_text(''.join(json.dumps(row, ensure_ascii=False) + '\n' for row in rows))
digest = hashlib.sha256(path.read_bytes()).hexdigest()
manifest.update(parser_version=3, file=str(out / path.name), file_sha256=digest,
missing_forum_count=0, legacy_identity_sha256=LEGACY_SHA256)
path.with_suffix('.manifest.json').write_text(json.dumps(manifest, indent=2) + '\n')
backfill = {'files': [str(out / path.name)], 'file_sha256': {str(out / path.name): digest}}
snapshots = {'files': [str(snapshot_path)], 'file_sha256': {str(snapshot_path): snapshot_sha}}
result = {'year': 2020, 'checked_at': timestamp(), 'program_records': len(rows),
'snapshot_records': len(snapshot), 'snapshot_status_counts': snapshot_manifest['submission_status_counts'],
'legacy_url': LEGACY_URL, 'legacy_sha256': LEGACY_SHA256,
'program_input_sha256': hashlib.sha256(program_bytes).hexdigest(),
'corroboration_counts': checks, 'backfill_queue': backfill, 'snapshot_files': snapshots,
'note': 'No database writes. Backfill existing program identities before importing the snapshot; source IDs, titles and abstracts are preserved.'}
(stage / 'iclr-2020-backfill-queue.json').write_text(json.dumps(backfill, indent=2) + '\n')
(stage / 'iclr-2020-snapshot-queue.json').write_text(json.dumps(snapshots, indent=2) + '\n')
report = stage / 'iclr-2020-identity-audit.json'
report.write_text(json.dumps(result, ensure_ascii=False, indent=2) + '\n')
for child in sorted(stage.iterdir(), key=lambda child: child == report):
child.replace(out / child.name)
print(json.dumps(result), flush=True)
return result
def main(argv=None, *, prog=None):
parser = argparse.ArgumentParser(prog=prog)
parser.add_argument('--program', required=True)
parser.add_argument('--snapshot', required=True)
parser.add_argument('--legacy', required=True)
parser.add_argument('--out', required=True)
args = parser.parse_args(argv)
audit(args.program, args.snapshot, args.legacy, args.out)
if __name__ == '__main__':
main()
+108
View File
@@ -0,0 +1,108 @@
"""Check curated negative assertions against existing submission decisions."""
import argparse
from contextlib import closing
import hashlib
import json
from pathlib import Path
from paper_atlas.collectors.public_openreview import SOURCE, REVISION
from paper_atlas.collectors.icml_public_archive import SOURCE as ARCHIVE_SOURCE, REVISION as ARCHIVE_REVISION
from paper_atlas.db.submissions import timestamp, latest_status
from paper_atlas.db.backend import database_arguments, open_read_connection
def audit(db, inventory, out, *, pg_service=None, pg_schema=None):
inventory = Path(inventory).resolve()
result = json.loads(inventory.read_text())
specs = {SOURCE: (REVISION, 'curated_public_status_assertion'),
ARCHIVE_SOURCE: (ARCHIVE_REVISION, 'public_submission_venueid')}
source = result.get('source')
if source not in specs or result.get('revision') != specs[source][0]:
raise ValueError('Unsupported public source inventory')
revision, evidence_kind = specs[source]
conflicts = []
seen = set()
checked = 0
existing_attempts = 0
files = []
checksums = {}
with closing(open_read_connection(db, pg_service=pg_service, pg_schema=pg_schema)) as c:
if pg_service:
identity = c.execute('SELECT current_database(),current_schema()').fetchone()
database, actual_schema = identity[0], identity[1]
else:
database, actual_schema = str(Path(db).resolve()), None
for manifest in result['files']:
path = Path(manifest['file'])
if hashlib.sha256(path.read_bytes()).hexdigest() != manifest['file_sha256']:
raise ValueError('Collected file differs from pinned inventory')
if json.loads(path.with_suffix('.manifest.json').read_text()) != manifest:
raise ValueError('Collected manifest differs from inventory')
count = 0
for line in path.read_text().splitlines():
row = json.loads(line)
if any(row[key] != manifest[key] for key in ('source', 'venue', 'year', 'track')):
raise ValueError('Record edition differs from inventory')
meta = row['metadata']
if meta.get('evidence_kind') != evidence_kind or meta.get('source_revision') != revision:
raise ValueError('Missing explicit public source provenance')
if meta.get('original_decision_signature_verified') is not False:
raise ValueError('Curated metadata must not claim original signatures')
if row['status'] not in ('rejected', 'desk_rejected', 'withdrawn'):
raise ValueError('Unsupported negative assertion')
forum = row['identifiers']['openreview']
if forum in seen:
raise ValueError('Repeated forum in normalized inventory')
seen.add(forum)
existing = c.execute('''SELECT s.id FROM submission_identifiers i
JOIN submissions s ON s.id=i.submission_id JOIN editions e ON e.id=i.edition_id
JOIN venues v ON v.id=e.venue_id WHERE v.acronym=? AND e.year=? AND e.track=?
AND i.scheme='openreview' AND i.value=?''',
(row['venue'], row['year'], row['track'], forum)).fetchall()
if len(existing) > 1:
raise ValueError('Multiple canonical attempts for one forum')
if existing:
existing_attempts += 1
latest = latest_status(c, existing[0][0])
if latest and latest not in ('unknown', 'under_review', row['status']):
conflicts.append({'forum': forum, 'venue': row['venue'], 'year': row['year'],
'track': row['track'], 'submission_id': existing[0][0],
'existing_status': latest, 'curated_status': row['status']})
count += 1
if count != manifest['count']:
raise ValueError('Collected record count differs from inventory')
checked += count
files.append(str(path))
checksums[str(path)] = manifest['file_sha256']
if checked != result['normalized_records']:
raise ValueError('Normalized inventory total differs from checked records')
report = {'source': source, 'revision': revision, 'database': database,
'engine': 'postgresql' if pg_service else 'sqlite', 'schema': actual_schema, 'pg_service': pg_service,
'inventory': str(inventory), 'checked_at': timestamp(), 'records_checked': checked,
'existing_same_edition_attempts': existing_attempts, 'conflicts': conflicts,
'status': 'blocked' if conflicts else 'ready_for_serial_import',
'files': [] if conflicts else files, 'file_sha256': {} if conflicts else checksums,
'note': 'Read-only preflight. Other-conference acceptances remain separate history; '
'this is not an entity deduplication or complete rejection-coverage proof.'}
out = Path(out)
out.parent.mkdir(parents=True, exist_ok=True)
part = out.with_suffix('.part')
part.write_text(json.dumps(report, ensure_ascii=False, indent=2) + '\n')
part.replace(out)
print(json.dumps(report), flush=True)
return report
def main(argv=None, *, prog=None):
parser = argparse.ArgumentParser(prog=prog)
database_arguments(parser)
parser.add_argument('--inventory', required=True)
parser.add_argument('--out', required=True)
args = parser.parse_args(argv)
report = audit(args.db, args.inventory, args.out, pg_service=args.pg_service, pg_schema=args.pg_schema)
if report['status'] == 'blocked':
raise SystemExit('Conflicting existing decisions require review before import')
if __name__ == '__main__':
main()
+10
View File
@@ -13,9 +13,12 @@ COMMANDS = {
('collect','acl'): ('paper_atlas.collectors.acl', {}, 'ACL Anthology XML'),
('collect','iclr-program'): ('paper_atlas.collectors.iclr', {}, 'ICLR 官方公开程序'),
('collect','iclr-snapshot'): ('paper_atlas.collectors.openreview', {}, 'ICLR 公开投稿与决定快照'),
('collect','public-openreview'): ('paper_atlas.collectors.public_openreview', {}, '核验其他会议的公开拒稿及撤稿标签'),
('collect','icml-public-archive'): ('paper_atlas.collectors.icml_public_archive', {}, 'ICML 2026 公开拒稿原始投稿快照'),
('collect','peerread'): ('paper_atlas.collectors.peerread', {}, 'PeerRead 历史决定补充'),
('collect','colm'): ('paper_atlas.collectors.proceedings', {'source':'colm'}, 'COLM 官方论文集'),
('collect','neurips'): ('paper_atlas.collectors.proceedings', {'source':'neurips'}, 'NeurIPS 官方论文集'),
('collect','mlsys'): ('paper_atlas.collectors.proceedings', {'source':'mlsys'}, 'MLSys 官方历年标题与摘要'),
('collect','cvf'): ('paper_atlas.collectors.vision', {'source':'cvf'}, 'CVPR / ICCV 官方开放目录'),
('collect','ecva'): ('paper_atlas.collectors.vision', {'source':'ecva'}, 'ECCV 官方开放目录'),
('collect','dblp'): ('paper_atlas.collectors.dblp_records', {}, '核对并整理 DBLP 历史发表记录'),
@@ -24,7 +27,14 @@ COMMANDS = {
('import','records'): ('paper_atlas.ingestion.records', {}, '导入核验过的会议文件'),
('maintain','merge'): ('paper_atlas.ingestion.maintenance', {}, '协调单写入合并与恢复'),
('maintain','backfill'): ('paper_atlas.ingestion.backfill', {}, '回填既有投稿的来源身份'),
('maintain','arxiv-tags'): ('paper_atlas.ingestion.arxiv_tags', {}, '恢复逐来源记录的 arXiv 类别证据'),
('maintain','pmlr-tracks'): ('paper_atlas.ingestion.pmlr_tracks', {}, '核对并迁移既有 PMLR 投稿轨道'),
('maintain','postgres'): ('paper_atlas.postgres.migration', {}, '迁移 SQLite 完整业务数据并核验 PostgreSQL'),
('audit','iclr'): ('paper_atlas.audits.iclr', {}, '核对 ICLR 快照与同届官方程序'),
('audit','iclr-legacy'): ('paper_atlas.audits.iclr_legacy', {}, '独立核验 ICLR 2020 旧目录投稿身份'),
('audit','arxiv'): ('paper_atlas.audits.arxiv', {}, '核验 arXiv 原始编号、重复行与 ZIP 完整性'),
('audit','arxiv-tags'): ('paper_atlas.audits.arxiv_tags', {}, '逐记录核验 arXiv 类别及出处完整性'),
('audit','public-openreview'): ('paper_atlas.audits.public_openreview', {}, '核对公开负面决定与已有投稿历史'),
}
+1 -1
View File
@@ -20,7 +20,7 @@ DTD_MD5='96e4283e71886dec2173718957293648'
DTD_NAMES={'dblp.dtd','dblp-2023-06-28.dtd'}
RELEASE='https://doi.org/10.4230/dblp.xml.2026-11-01'
# Broad discovery candidates, including historical names; not a venue mapping.
FAMILIES=set('nips icml iclr colm colt aistats uai clear acl emnlp naacl eacl coling conll cvpr iccv eccv aaai ijcai ecai kdd sigir www wsdm recsys cikm icdm sdm ecml pkdd ecmlpkdd icra iros rss corl aips icaps kr atal aamas icassp interspeech eurospeech icslp ismir miccai fat facct lrec'.split())
FAMILIES=set('nips icml iclr colm colt aistats uai clear acl emnlp naacl eacl coling conll cvpr iccv eccv aaai ijcai ecai kdd sigir www wsdm recsys cikm icdm sdm ecml pkdd ecmlpkdd icra iros rss corl aips icaps kr atal aamas icassp interspeech eurospeech icslp ismir miccai fat facct lrec mm mlsys'.split())
def records(archive,dtd_bytes):
+15 -3
View File
@@ -17,6 +17,7 @@ from paper_atlas.collectors.dblp import XML_SHA,DTD_MD5,RELEASE,records
from paper_atlas.collectors.dblp_scope import scope
from paper_atlas.db.submissions import timestamp
from paper_atlas.io.snapshots import digest_file
from paper_atlas.io.publication_ids import mlsys_id
AS_OF='2026-11-01T00:00:00.000Z'
MATERIAL_PART=r'(?:title(?: page)?|preface|foreword|editorial|front\s?matter|back\s?matter|(?:table of )?contents|(?:author |subject )?index|contributors|(?:conference |program |organizing |steering )?committee|conference organization|reviewers)'
@@ -36,8 +37,10 @@ def material_reason(title,authors,key,year,track):
def identifiers(fields):
dois=set();arxiv=set();forums=set()
dois=set();arxiv=set();forums=set();mlsys=set()
for link in fields.get('ee',[]):
if own_mlsys := mlsys_id(link):
mlsys.add(own_mlsys)
parsed=urlsplit(link);path=unquote(parsed.path)
doi=None
if parsed.netloc in ('doi.org','dx.doi.org','doi.ieeecomputersociety.org'):doi=path.lstrip('/')
@@ -57,9 +60,10 @@ def identifiers(fields):
if match:arxiv.add(re.sub(r'v\d+$','',match[1]))
publications={doi for doi in dois if not doi.startswith('10.48550/arxiv.')}
own={}
for scheme,values in (('doi',publications),('arxiv',arxiv),('openreview',forums)):
groups=(('doi',publications),('arxiv',arxiv),('openreview',forums),('publication_mlsys',mlsys))
for scheme,values in groups:
if len(values)==1:own[scheme]=next(iter(values))
ambiguous={scheme:sorted(values) for scheme,values in (('doi',publications),('arxiv',arxiv),('openreview',forums)) if len(values)>1}
ambiguous={scheme:sorted(values) for scheme,values in groups if len(values)>1}
return own,ambiguous
@@ -84,6 +88,8 @@ def normalize_row(row,volumes,targets,include_workshops=False,through_year=2026)
'scope_rule':edition['rule'],'author_names_raw':fields.get('author',[]),'publtype':row.get('publtype'),
'bibliography':{key:value for key,value in fields.items() if key in ('booktitle','year','ee','url','pages','volume','number','publisher','series','isbn')},
'ambiguous_identifiers':ambiguous,'publication_evidence':'inproceedings bibliography; not an original decision note'}
if edition.get('track_scope_note'):
metadata['track_scope_note']=edition['track_scope_note']
flagged=bool(re.search(r'\b(?:withdrawn|retracted)\b',row.get('publtype') or '',re.I))
result={'source':'dblp','external_id':row['key'],'url':'https://dblp.org/rec/'+row['key']+'.html',
'title':title,'abstract':None,'authors':authors,'identifiers':own,
@@ -110,6 +116,12 @@ def collect(catalogue,out,venues=None,candidates=None,archive=None,dtd=None,incl
allowed={row['acronym'].casefold():row['acronym'] for row in json.loads(DEFAULT_REGISTRY.read_text())['venues']}
if venues and set(name.casefold() for name in venues)-allowed.keys():raise ValueError('Unknown registry venue')
targets={allowed[name.casefold()] for name in venues} if venues else set(allowed.values())
if candidates:
families = manifest.get('candidate_family_counts', {})
missing = [venue for venue, family in [('MM', 'mm'), ('MLSys', 'mlsys')]
if venue in targets and not families.get(family)]
if missing:
raise ValueError('Candidate file predates requested families ' + ', '.join(missing) + '; use the original --archive')
out=Path(out);out.mkdir(parents=True,exist_ok=True)
with (out/'dblp.normalize.lock').open('a') as lock:
fcntl.flock(lock,fcntl.LOCK_EX|fcntl.LOCK_NB)
+12 -2
View File
@@ -33,6 +33,8 @@ BOOKS = {
'interspeech':[('INTERSPEECH','INTERSPEECH',[]),('EUROSPEECH','EUROSPEECH',['INTERSPEECH']),('ICSLP','ICSLP',['INTERSPEECH']),('ECST','ECST',['INTERSPEECH'])],
'ismir':[('ISMIR','ISMIR',[])], 'miccai':[('MICCAI','MICCAI',[])],
'fat':[('FAccT','FAccT',[]),('FAT*','FAccT',[]),('FAT','FAccT',[])],
'mm':[('ACM Multimedia','MM',['ACMMM','ACM MM'])],
'mlsys':[('MLSys','MLSys',[]),('SysML','MLSys',['SysML'])],
}
@@ -45,6 +47,7 @@ def scope(row,volume,through_year=2026):
if not volume:return None,'missing_proceedings'
title=' '.join(volume['fields'].get('title',[]))
if family=='clear2' and 'causal learning and reasoning' not in title.casefold():return None,'ambiguous_venue_name'
if family=='mlsys' and 'machine learning and systems' not in title.casefold():return None,'ambiguous_venue_name'
matched=None
for base,venue,aliases in BOOKS[family]:
match=re.fullmatch(re.escape(base)+r'(?:\s+\((.*)\)|\s+(.*)|,\s*(Vol\.\s*\d+))?',book,re.I)
@@ -67,6 +70,7 @@ def scope(row,volume,through_year=2026):
if year%100!=int(short[1]):return None,'unverified_edition_year'
year_basis='unique explicit event year in proceedings title, corroborated by two-digit proceedings key'
if year>through_year:return None,'future_edition'
if venue=='MLSys' and year<2019:return None,'nonarchival_predecessor'
bibliographic=fields.get('year',[])
if len(bibliographic)!=1 or not re.fullmatch(r'\d{4}',bibliographic[0]):return None,'ambiguous_bibliographic_year'
if int(bibliographic[0])!=year and not re.search(r'\b'+str(year)+r'\b',title):return None,'unverified_year_difference'
@@ -92,5 +96,11 @@ def scope(row,volume,through_year=2026):
elif suffix.casefold() in ('poster','posters') and venue not in ('ICLR','ACL','EMNLP','NAACL','EACL','COLING','CoNLL'):track='poster'
if venue=='AAAI+IAAI':track='proceedings_unspecified'
if venue=='AAMAS' and year<2002:return None,'predecessor_not_aamas'
return {'venue':venue,'venue_aliases':aliases,'year':year,'track':track,'bibliographic_year':int(bibliographic[0]),
'rule':family+':'+base,'proceedings_title':title,'edition_year_basis':year_basis},None
result = {'venue':venue,'venue_aliases':aliases,'year':year,'track':track,'bibliographic_year':int(bibliographic[0]),
'rule':family+':'+base,'proceedings_title':title,'edition_year_basis':year_basis}
if venue=='MM' and track=='main':
# A main MM volume also includes doctoral, tutorials, companion papers
# and other sections. DBLP XML omits the per-paper TOC section.
result['track']='proceedings_unspecified'
result['track_scope_note']='Main proceedings volume; per-paper section is absent from the bibliography. Do not infer a regular research track.'
return result,None
+4
View File
@@ -141,6 +141,10 @@ def parse_program(data, abstracts, year, index_url):
external = f'{year}/{forum}' if forum else f'{year}/program-{identity[1]}'
missing_identity += not bool(forum)
page = urljoin(ROOT, primary.get('virtualsite_url') or f'/virtual/{year}/{str(primary.get("eventtype", "Poster")).lower()}/{primary["id"]}')
if year == 2020 and not primary.get('virtualsite_url'):
# Numeric modern event IDs do not identify legacy poster pages.
# The independently verified forum bridge supplies the paper URL.
page = index_url
topics = sorted({str(row['topic']).strip() for row in group if row.get('topic')})
keywords = sorted({str(keyword).strip() for row in group for keyword in row.get('keywords', []) if keyword})
records.append({'source': SOURCE, 'external_id': external, 'url': page,
@@ -0,0 +1,125 @@
"""ICML 2026 public submission roots with explicit Rejected_Submission IDs."""
import argparse
import fcntl
import hashlib
import json
from pathlib import Path
import re
import shutil
import tempfile
from paper_atlas.collectors.openreview import date_ms, invitations, public, value
from paper_atlas.collectors.public_openreview import download
from paper_atlas.db.submissions import timestamp
SOURCE = 'openreview_public_archive'
REVISION = '1a1b9d973a8dfbf254f740fb8100a2fcf36757ea'
AS_OF = '2026-08-08T12:03:26.000Z'
URL = 'https://raw.githubusercontent.com/HemantKumar01/ICML-2026-data/' + REVISION + '/data/rejected.json'
BLOB_SHA1 = 'cebdcddffe3eb2145d32d328db89a1626e3f85eb'
BYTES = 1600856
EXPECTED = 214
DOMAIN = 'ICML.cc/2026/Conference'
VENUEID = DOMAIN + '/Rejected_Submission'
def normalize(note):
forum = note.get('id')
if not isinstance(forum, str) or not re.fullmatch(r'[A-Za-z0-9_-]{8,32}', forum) or note.get('forum') != forum:
raise ValueError('Not a public submission root with a real forum identity')
if not public(note) or note.get('ddate'):
raise ValueError('Submission is not explicitly public and live in the archive')
if note.get('domain') != DOMAIN or DOMAIN + '/-/Submission' not in invitations(note):
raise ValueError('Submission is outside the ICML 2026 conference track')
content = note.get('content') or {}
if value(content, 'venueid') != VENUEID:
raise ValueError('Missing explicit platform Rejected_Submission classification')
title, abstract = value(content, 'title'), value(content, 'abstract')
if not isinstance(title, str) or not title.strip():
raise ValueError('Submission lacks a title')
if abstract is not None and not isinstance(abstract, str):
raise ValueError('Submission abstract must be text')
authors = value(content, 'authors', []) or []
if not isinstance(authors, list):
raise ValueError('Unexpected public author format')
authors = [a.strip() for a in authors if isinstance(a, str) and a.strip() and '@' not in a
and not re.fullmatch(r'anonymous(?: authors?)?', a.strip(), re.I)]
tags = []
for field in ('keywords', 'primary_area'):
raw = value(content, field)
terms = raw if isinstance(raw, list) else re.split(r'[,;]', raw) if field == 'keywords' and isinstance(raw, str) else [raw]
tags.extend({'namespace': SOURCE + ':' + field, 'value': term.strip()}
for term in terms if isinstance(term, str) and term.strip())
url = 'https://openreview.net/forum?id=' + forum
return {'source': SOURCE, 'external_id': 'icml/2026/' + forum, 'url': url,
'title': ' '.join(title.split()), 'abstract': abstract.strip() if abstract else None,
'authors': authors, 'identifiers': {'openreview': forum},
'submission_identifiers': [{'scheme': 'openreview', 'value': forum}],
'venue': 'ICML', 'year': 2026, 'track': 'main', 'status': 'rejected',
'raw_decision': VENUEID, 'evidence_url': url, 'observed_at': AS_OF,
'submitted_at': date_ms(note.get('cdate') or note.get('tcdate')), 'tags': tags,
'metadata': {'source_revision': REVISION, 'source_blob_sha1': BLOB_SHA1,
'source_file': URL, 'original_forum': forum, 'license': note.get('license'),
'venue': value(content, 'venue'), 'venueid': VENUEID,
'public_readers_verified': True, 'original_invitations': invitations(note),
'source_note_modified_at': date_ms(note.get('mdate')),
'evidence_kind': 'public_submission_venueid',
'original_decision_signature_verified': False,
'source_snapshot_upper_bound': AS_OF}}
def collect(out, fetcher=None):
fetcher = fetcher or download
out = Path(out)
out.mkdir(parents=True, exist_ok=True)
with (out / 'collect.lock').open('a') as lock:
fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB)
if (out / 'public-openreview-inventory.json').exists():
raise ValueError('Completed inventory exists; select a new output directory')
if shutil.disk_usage(out).free < 8 * 1024**3:
raise RuntimeError('Less than 8 GiB free before collection')
data = fetcher(URL, BYTES)
blob = hashlib.sha1(b'blob ' + str(len(data)).encode() + b'\0' + data).hexdigest()
if len(data) != BYTES or blob != BLOB_SHA1:
raise ValueError('Public archive checksum mismatch')
archive = json.loads(data)
notes = archive['notes']
if archive.get('count') != EXPECTED or not isinstance(notes, list) or len(notes) != EXPECTED:
raise ValueError('Public archive inventory count mismatch')
records = [normalize(note) for note in notes]
if len({row['identifiers']['openreview'] for row in records}) != EXPECTED:
raise ValueError('Repeated submission forum in public archive')
records.sort(key=lambda row: row['external_id'])
with tempfile.TemporaryDirectory(prefix='.icml-public-', dir=out) as temporary:
stage = Path(temporary)
path = stage / 'public-openreview-icml-2026-main.jsonl'
path.write_text(''.join(json.dumps(row, ensure_ascii=False) + '\n' for row in records))
manifest = {'source': SOURCE, 'parser_version': 1, 'venue': 'ICML', 'year': 2026,
'track': 'main', 'count': EXPECTED, 'status': 'partial', 'list_url': URL,
'file': str(out / path.name), 'file_sha256': hashlib.sha256(path.read_bytes()).hexdigest(),
'source_revision': REVISION, 'missing_abstract_count': sum(not row['abstract'] for row in records),
'evidence_kind': 'public_submission_venueid',
'note': 'Public opt-in subset; explicit platform venueid, not original signed PC notes.'}
path.with_suffix('.manifest.json').write_text(json.dumps(manifest, indent=2) + '\n')
result = {'source': SOURCE, 'revision': REVISION, 'finished_at': timestamp(),
'input_rows': EXPECTED, 'normalized_records': EXPECTED, 'files': [manifest],
'source_files': [{'url': URL, 'git_blob_sha1': blob, 'input_bytes': len(data)}],
'note': 'Snapshot preserves per-note public visibility and licenses; no reviews, authorids or PDFs retained.'}
inventory = stage / 'public-openreview-inventory.json'
inventory.write_text(json.dumps(result, indent=2) + '\n')
for child in sorted(stage.iterdir(), key=lambda child: child == inventory):
child.replace(out / child.name)
print(json.dumps(result), flush=True)
return result
def main(argv=None, *, prog=None):
parser = argparse.ArgumentParser(prog=prog)
parser.add_argument('--out', required=True)
args = parser.parse_args(argv)
collect(args.out)
if __name__ == '__main__':
main()
+80 -45
View File
@@ -1,5 +1,7 @@
"""Collect official PMLR metadata, never the PDFs linked by the metadata."""
import argparse
from collections import defaultdict
import hashlib
from paper_atlas.config import DEFAULT_REGISTRY
import io
import json
@@ -8,6 +10,7 @@ import os
import subprocess
import tarfile
import time
import tempfile
from pathlib import Path
import yaml
@@ -37,6 +40,7 @@ def venue_key(shortname):
from paper_atlas.io.http import fetch
from paper_atlas.collectors.pmlr_tracks import collect_track_evidence, record_track
def metadata_texts(volume,cache):
@@ -98,57 +102,88 @@ def collect_volume(volume,cache,out,allowed=None):
track = 'workshop' if 'workshop' in title.lower() else 'main'
path = Path(out)/f'pmlr-v{volume}.jsonl'
path.parent.mkdir(parents=True,exist_ok=True)
part = path.with_suffix('.part')
mixed_icml = venue == 'ICML' and year >= 2024
mapping, track_program = collect_track_evidence(year, cache) if mixed_icml else ({}, None)
records = {}
duplicate_posts = 0
with part.open('w') as output:
for member_name,content in metadata_texts(volume,cache):
parts = re.split(r'(?m)^---\s*$',content,maxsplit=2)
if len(parts)<3 or parts[0].strip():
raise RuntimeError('Missing YAML frontmatter: '+member_name)
row = load_metadata(parts[1])
if row.get('layout') not in ('inproceedings','article'):
continue
if not row.get('title'):
raise ValueError('Paper metadata has no title: '+member_name)
if not row.get('id'):
raise ValueError('Paper metadata has no publication ID: '+member_name)
external = f"v{volume}/{row['id']}"
ids = {}
for key in ('doi','openreview','arxiv'):
value = row.get(key)
if value:
value = str(value)
if key=='arxiv':
value = re.sub(r'^https?://arxiv.org/(abs|pdf)/','',value).removesuffix('.pdf')
if key=='openreview':
value = value.split('id=')[-1].split('&')[0]
ids[key] = value
record = {'source':'pmlr','external_id':external,'url':f"https://proceedings.mlr.press/v{volume}/{row.get('id')}.html",'title':row['title'],'abstract':row.get('abstract'),'authors':row.get('author',[]),'identifiers':ids,'venue':venue,'year':year,'track':track,'status':'accepted','list_url':f'https://proceedings.mlr.press/v{volume}/','metadata':{key:row[key] for key in ('id','volume','date','page','doi','openreview','arxiv','publisher') if key in row}}
version={'path':member_name,'date':row.get('date')}
if external in records:
previous=records[external]
if ({k:v for k,v in previous.items() if k!='metadata'} != {k:v for k,v in record.items() if k!='metadata'}
or {k:v for k,v in previous['metadata'].items() if k not in ('date','source_versions')} != {k:v for k,v in record['metadata'].items() if k!='date'}):
raise ValueError('Conflicting metadata posts share a publication ID: '+external)
previous['metadata']['source_versions'].append(version)
if str(row.get('date') or '')>str(previous['metadata'].get('date') or ''):
previous['metadata']['date']=row['date']
duplicate_posts+=1
continue
record['metadata']['source_versions']=[version]
records[external]=record
for record in records.values():
output.write(json.dumps(record,ensure_ascii=False,default=str)+'\n')
for member_name,content in metadata_texts(volume,cache):
parts = re.split(r'(?m)^---\s*$',content,maxsplit=2)
if len(parts)<3 or parts[0].strip():
raise RuntimeError('Missing YAML frontmatter: '+member_name)
row = load_metadata(parts[1])
if row.get('layout') not in ('inproceedings','article'):
continue
if not row.get('title'):
raise ValueError('Paper metadata has no title: '+member_name)
if not row.get('id'):
raise ValueError('Paper metadata has no publication ID: '+member_name)
external = f"v{volume}/{row['id']}"
ids = {}
for key in ('doi','openreview','arxiv'):
value = row.get(key)
if value:
value = str(value)
if key=='arxiv':
value = re.sub(r'^https?://arxiv.org/(abs|pdf)/','',value).removesuffix('.pdf')
if key=='openreview':
value = value.split('id=')[-1].split('&')[0]
ids[key] = value
record = {'source':'pmlr','external_id':external,'url':f"https://proceedings.mlr.press/v{volume}/{row.get('id')}.html",'title':row['title'],'abstract':row.get('abstract'),'authors':row.get('author',[]),'identifiers':ids,'venue':venue,'year':year,'track':track,'status':'accepted','list_url':f'https://proceedings.mlr.press/v{volume}/','metadata':{key:row[key] for key in ('id','volume','date','page','doi','openreview','arxiv','publisher') if key in row}}
version={'path':member_name,'date':row.get('date')}
if external in records:
previous=records[external]
if ({k:v for k,v in previous.items() if k!='metadata'} != {k:v for k,v in record.items() if k!='metadata'}
or {k:v for k,v in previous['metadata'].items() if k not in ('date','source_versions')} != {k:v for k,v in record['metadata'].items() if k!='date'}):
raise ValueError('Conflicting metadata posts share a publication ID: '+external)
previous['metadata']['source_versions'].append(version)
if str(row.get('date') or '')>str(previous['metadata'].get('date') or ''):
previous['metadata']['date']=row['date']
duplicate_posts+=1
continue
record['metadata']['source_versions']=[version]
records[external]=record
count=len(records)
missing_abstracts=sum(not (record.get('abstract') or '').strip() for record in records.values())
if count==0:
part.unlink(missing_ok=True)
raise RuntimeError('No papers parsed; refusing an empty successful collection')
part.replace(path)
result = {'source':'pmlr','parser_version':2,'venue':venue,'year':year,'track':track,'volume':volume,'count':count,'metadata_post_count':count+duplicate_posts,'duplicate_post_count':duplicate_posts,'missing_abstract_count':missing_abstracts,'list_url':f'https://proceedings.mlr.press/v{volume}/','file':str(path),'status':'partial' if missing_abstracts else 'collected'}
path.with_suffix('.manifest.json').write_text(json.dumps(result,indent=2))
print(json.dumps(result),flush=True)
grouped = defaultdict(list)
for record in records.values():
if mixed_icml:
record_track(record, mapping, track_program)
grouped[record['track']].append(record)
# Parse and verify the entire volume before replacing any published output.
manifests = []
with tempfile.TemporaryDirectory(prefix=f'.pmlr-v{volume}-', dir=path.parent) as temporary:
stage = Path(temporary)
for current_track, rows in sorted(grouped.items()):
filename = f'pmlr-v{volume}-{current_track}.jsonl' if mixed_icml else path.name
output = stage / filename
output.write_text(''.join(json.dumps(row, ensure_ascii=False, default=str)+'\n' for row in rows))
absent = sum(not (row.get('abstract') or '').strip() for row in rows)
manifest = {'source': 'pmlr', 'parser_version': 3, 'venue': venue, 'year': year,
'track': current_track, 'volume': volume, 'count': len(rows),
'missing_abstract_count': absent, 'list_url': f'https://proceedings.mlr.press/v{volume}/',
'file': str(path.parent / filename), 'file_sha256': hashlib.sha256(output.read_bytes()).hexdigest(),
'status': 'partial' if absent else 'collected'}
if track_program:
manifest['track_program'] = track_program
output.with_suffix('.manifest.json').write_text(json.dumps(manifest, indent=2)+'\n')
manifests.append(manifest)
result = {'source': 'pmlr', 'parser_version': 3, 'venue': venue, 'year': year,
'track': next(iter(grouped)) if len(grouped) == 1 else 'mixed', 'volume': volume,
'count': count, 'metadata_post_count': count + duplicate_posts,
'duplicate_post_count': duplicate_posts, 'missing_abstract_count': missing_abstracts,
'list_url': f'https://proceedings.mlr.press/v{volume}/', 'files': manifests,
'status': 'partial' if missing_abstracts else 'collected'}
if len(manifests) == 1:
result['file'] = manifests[0]['file']
if track_program:
result['track_program'] = track_program
inventory = stage / f'pmlr-v{volume}.inventory.json'
inventory.write_text(json.dumps(result, indent=2)+'\n')
for child in sorted(stage.iterdir(), key=lambda child: child == inventory):
child.replace(path.parent / child.name)
print(json.dumps(result), flush=True)
return result
+140
View File
@@ -0,0 +1,140 @@
"""Resolve mixed ICML proceedings tracks from the official paper program."""
from collections import Counter
import hashlib
import json
import re
from urllib.parse import parse_qs, urlsplit
from paper_atlas.collectors.iclr import identifiers, source_number
from paper_atlas.db.store import author_keys, normalized
from paper_atlas.io.html import Document, clean
from paper_atlas.io.http import fetch
POSITION_LIST_POLICY = 'https://icml.cc/Conferences/2025/CallForPositionPapers'
PUBLISHER_LINK_ALIASES = {'v235/theo24a': 'v235/guyard24a'}
def position_list_policy(data):
"""The organizers explicitly link this title filter as the 2024 position list."""
for node in Document(data.decode()).root.walk():
if node.tag != 'a' or clean(node.text()).casefold() != 'position papers':
continue
url = node.attrs.get('href', '')
parsed = urlsplit(url)
query = parse_qs(parsed.query)
if (parsed.netloc in ('', 'icml.cc') and parsed.path == '/virtual/2024/papers.html'
and query.get('filter') == ['titles'] and query.get('search') == ['position:']):
return {'url': POSITION_LIST_POLICY, 'sha256': hashlib.sha256(data).hexdigest(),
'position_list_url': 'https://icml.cc' + parsed.path + '?' + parsed.query}
raise ValueError('Official policy no longer identifies the 2024 position-paper title list')
def program_tracks(data, year, policy=None):
program = json.loads(data)
events = program.get('results') if isinstance(program, dict) else None
if (not isinstance(events, list) or program.get('count') != len(events)
or program.get('next') or program.get('previous')):
raise ValueError('Official ICML program must be a complete counted event list')
if len({str(row['id']) for row in events}) != len(events):
raise ValueError('Repeated event identity in official ICML program')
if year == 2024 and policy is None:
raise ValueError('The 2024 position-list policy is required')
mapping = {}
excluded = Counter()
for row in events:
number = source_number(row)
if number is not None and number < 0:
excluded['synthetic_oral_event'] += 1
continue
parsed = urlsplit(row.get('sourceurl') or '')
group = parse_qs(parsed.query).get('id', [])
groups = {f'ICML.cc/{year}/Conference': 'main',
f'ICML.cc/{year}/Position_Paper_Track': 'position'}
if (parsed.netloc != 'openreview.net' or parsed.path != '/group'
or len(group) != 1 or group[0] not in groups):
excluded['other_source'] += 1
continue
if not str(row.get('decision') or '').casefold().startswith('accept'):
raise ValueError('Non-accepted event in official ICML paper program')
if year == 2024:
# The 2024 program flattens both tracks into Conference and links
# PMLR publication IDs instead of forums. Use only this year-specific,
# organizer-endorsed list rule, never a global title heuristic.
link = urlsplit(row.get('paper_pdf_url') or '')
if link.netloc != 'proceedings.mlr.press' or not re.fullmatch(r'/v\d+/[^/]+\.html', link.path):
raise ValueError('2024 ICML paper has no publisher self-link')
key = ('pmlr', link.path.lstrip('/').removesuffix('.html'))
track = 'position' if re.match(r'^Position(?: Paper)?:', row.get('name') or '', re.I) else 'main'
kind = 'official_2024_position_list'
else:
forum = identifiers(row).get('openreview')
if not forum:
raise ValueError('ICML paper has no real OpenReview self-identity')
key = ('openreview', forum)
track, kind = groups[group[0]], 'official_openreview_track_group'
evidence = {'track': track, 'kind': kind, 'event_ids': [row['id']],
'source_group': group[0], 'program_title': row.get('name')}
if key[0] == 'pmlr' and key[1] in PUBLISHER_LINK_ALIASES:
evidence['publisher_link_alias'] = key[1]
evidence['_authors'] = [author['fullname'] for author in row.get('authors', [])]
key = ('pmlr', PUBLISHER_LINK_ALIASES[key[1]])
if key in mapping:
if mapping[key]['track'] != track:
raise ValueError('One paper identity has conflicting official tracks')
mapping[key]['event_ids'].append(row['id'])
else:
mapping[key] = evidence
if not mapping:
raise ValueError('Official ICML program contains no supported paper identities')
return mapping, {'event_count': len(events), 'paper_identity_count': len(mapping),
'excluded_events': dict(excluded)}
def collect_track_evidence(year, cache):
url = f'https://icml.cc/static/virtual/data/icml-{year}-orals-posters.json'
data = fetch(url, cache)
policy = position_list_policy(fetch(POSITION_LIST_POLICY, cache)) if year == 2024 else None
mapping, inventory = program_tracks(data, year, policy)
provenance = {'url': url, 'sha256': hashlib.sha256(data).hexdigest(), **inventory}
if policy:
provenance['position_list_policy'] = policy
return mapping, provenance
def record_track(record, mapping, provenance):
key = ('pmlr', record['external_id']) if record['year'] == 2024 else ('openreview', record['identifiers'].get('openreview'))
if key not in mapping:
raise ValueError('Published ICML paper is absent from the verified official track inventory: ' + record['external_id'])
evidence = {**mapping[key], 'identity_scheme': key[0], 'identity_value': key[1],
'program_url': provenance['url'], 'program_sha256': provenance['sha256']}
if 'publisher_link_alias' in evidence:
overlap = author_keys(record.get('authors', [])) & author_keys(evidence.pop('_authors', []))
if normalized(record['title']) != normalized(evidence['program_title']) or len(overlap) < 2:
raise ValueError('Reviewed publisher-link alias lacks exact title and independent author corroboration')
evidence['corroborating_author_count'] = len(overlap)
if 'position_list_policy' in provenance:
evidence['position_list_policy'] = provenance['position_list_policy']
record['track'] = evidence['track']
record['metadata']['track_evidence'] = evidence
def require_track_manifest(manifest):
if (manifest.get('source') == 'pmlr' and str(manifest.get('venue', '')).upper() == 'ICML'
and int(manifest.get('year', 0)) >= 2024
and (manifest.get('parser_version', 0) < 3 or not manifest.get('track_program'))):
raise ValueError('Recollect mixed ICML PMLR proceedings with parser_version>=3 and official track evidence')
def require_track_record(row, manifest):
require_track_manifest({**manifest, **{key: row.get(key) for key in ('source', 'venue', 'year')}})
if manifest.get('track_program'):
evidence = row.get('metadata', {}).get('track_evidence', {})
program = manifest['track_program']
if (evidence.get('track') != row.get('track') or evidence.get('program_url') != program.get('url')
or evidence.get('program_sha256') != program.get('sha256')
or not evidence.get('event_ids') or evidence.get('identity_scheme') not in ('pmlr', 'openreview')):
raise ValueError('PMLR record differs from its official track evidence')
own = row['external_id'] if evidence['identity_scheme'] == 'pmlr' else row.get('identifiers', {}).get('openreview')
if not own or evidence.get('identity_value') != own:
raise ValueError('PMLR track evidence belongs to a different paper identity')
+26 -4
View File
@@ -1,4 +1,4 @@
"""Collect COLM/NeurIPS official abstract pages without downloading PDFs."""
"""Collect COLM, NeurIPS and MLSys official metadata without downloading PDFs."""
import argparse
import json
import re
@@ -8,8 +8,11 @@ from pathlib import Path
from urllib.parse import urljoin,urlsplit
from paper_atlas.io.http import fetch
from paper_atlas.io.publication_ids import mlsys_id
ROOTS={'colm':'https://proceedings.colm.cc/','neurips':'https://proceedings.neurips.cc/'}
ROOTS={'colm':'https://proceedings.colm.cc/','neurips':'https://proceedings.neurips.cc/',
'mlsys':'https://proceedings.mlsys.org/'}
VENUES={'colm':'COLM','neurips':'NeurIPS','mlsys':'MLSys'}
from paper_atlas.io.html import Document,Node,clean
@@ -72,6 +75,22 @@ def parse_paper(html,url,source,year,index_url):
track_text=' '.join(clean(n.text()) for n in nodes if 'paper-track' in n.attrs.get('class','').split())
track=track_key(track_text or url)
identifiers={}
if source == 'mlsys':
if year < 2019:
raise ValueError('SysML 2018 was non-archival; official proceedings begin in 2019')
own = mlsys_id(url)
if not own or int(own.split('/')[0]) != year:
raise ValueError('MLSys paper URL does not identify this publication year')
identifiers['publication_mlsys'] = own
if track_text:
explicit = {'conference': 'main', 'main track': 'main', 'research track': 'main',
'industry track': 'industry', 'industrial track': 'industry',
'mlsys' + str(year): 'main'}
if track_text.casefold() not in explicit:
raise ValueError('Unclassified official MLSys track: ' + track_text)
track = explicit[track_text.casefold()]
elif year >= 2025 and not url.endswith('-Abstract-Conference.html'):
raise ValueError('Modern MLSys paper lacks an explicit conference track')
if meta['citation_doi']:
identifiers['doi']=meta['citation_doi'][0]
action_nodes=[]
@@ -90,8 +109,11 @@ def parse_paper(html,url,source,year,index_url):
from urllib.parse import parse_qs
forum=parse_qs(parsed.query).get('id')
if forum: identifiers['openreview']=forum[0]
venue='COLM' if source=='colm' else 'NeurIPS'
return {'source':source,'external_id':urlsplit(url).path,'url':url,'title':clean(title),'abstract':abstract,'authors':authors,'identifiers':identifiers,'venue':venue,'year':year,'track':track,'status':'accepted','raw_decision':'listed in official proceedings','list_url':index_url,'metadata':{'citation':dict(meta),'publication_state':'pre-proceedings' if 'pre-proceedings' in html.lower() else 'proceedings'}}
venue=VENUES[source]
result = {'source':source,'external_id':urlsplit(url).path,'url':url,'title':clean(title),'abstract':abstract,'authors':authors,'identifiers':identifiers,'venue':venue,'year':year,'track':track,'status':'accepted','raw_decision':'listed in official proceedings','list_url':index_url,'metadata':{'citation':dict(meta),'publication_state':'pre-proceedings' if 'pre-proceedings' in html.lower() else 'proceedings'}}
if source == 'mlsys' and year == 2019:
result['venue_aliases'] = ['SysML']
return result
def discover(source,cache):
+252
View File
@@ -0,0 +1,252 @@
"""Collect explicit public negative labels without inferring unobserved decisions.
PaperCopilot is a curated mirror, not the conference's signed decision feed.
Only metadata is retained; source profiles, reviews and PDFs are never cached.
"""
import argparse
from collections import Counter, defaultdict
import fcntl
import hashlib
import io
import json
from pathlib import Path
import re
import shutil
import tempfile
import urllib.request
from paper_atlas.config import DEFAULT_REGISTRY
from paper_atlas.db.submissions import timestamp
SOURCE = 'papercopilot_openreview'
REVISION = '41ee277825d685bd78e88e48b69da6aead9a69bb'
AS_OF = '2026-10-31T01:25:52.000Z'
REPOSITORY = 'https://github.com/papercopilot/openreview'
RAW_ROOT = 'https://raw.githubusercontent.com/papercopilot/openreview/' + REVISION + '/'
TREE_URL = 'https://api.github.com/repos/papercopilot/openreview/git/trees/' + REVISION + '?recursive=1'
NEGATIVE = {'reject': 'rejected', 'rejected': 'rejected',
'desk reject': 'desk_rejected', 'desk rejected': 'desk_rejected',
'withdrawn': 'withdrawn', 'withdrawal': 'withdrawn'}
TRACKS = {'main': 'main', 'Position': 'position',
'Datasets & Benchmarks': 'datasets_benchmarks'}
WORKSHOP_REJECT_LABELS = {"aim-fm workshop @ neurips'24 reject",
'coginterp @ neurips 2025 reject'}
def download(url, limit):
request = urllib.request.Request(url, headers={'User-Agent': 'PaperAtlas/0.1 (public scholarly metadata)'})
with urllib.request.urlopen(request, timeout=90) as response:
if response.status != 200:
raise ValueError('Expected a complete HTTP 200 response')
result = response.read(limit + 1)
if len(result) > limit:
raise ValueError('Public metadata exceeds byte limit')
return result
def negative_status(raw):
"""A closed mapping: pending, absent, low-score and retracted are not Reject."""
if not isinstance(raw, str):
raise ValueError('Status must be text')
key = ' '.join(raw.casefold().split())
if key in NEGATIVE:
return NEGATIVE[key]
if re.fullmatch(r'(?:icml|neurips) 20\d{2} (?:conference|workshop [a-z0-9 -]+) withdrawn submission', key):
return 'withdrawn'
if key in WORKSHOP_REJECT_LABELS:
return 'rejected'
return None
def normalize(row, family, year, provenance, include_workshops=False):
"""Return a normalized assertion or a reason requiring separate review."""
raw_status = row.get('status', '')
status = negative_status(raw_status)
if status is None:
if re.search(r'\bretract\w*\b', raw_status, re.I):
return None, 'retracted'
if re.search(r'\b(?:reject\w*|withdraw\w*|desk)\b', raw_status, re.I):
return None, 'unmapped_negative_label'
return None, 'not_explicit_negative'
forum = row.get('id')
if not isinstance(forum, str) or not re.fullmatch(r'[A-Za-z0-9_-]{8,32}', forum) or re.match(r'20\d{2}-Oral-', forum):
raise ValueError('Invalid public submission forum ID')
track = row.get('track')
if not isinstance(track, str):
raise ValueError('Track must be explicit text')
normalized_track = TRACKS.get(track)
if normalized_track is None:
if re.fullmatch(r'workshop_[a-z0-9_]+', track) and include_workshops:
normalized_track = track
else:
return None, 'separate_workshop' if track.startswith('workshop') else 'unmapped_track'
prefixed = re.match(r'^(ICML|NeurIPS) (20\d{2}) ', raw_status)
if prefixed and (prefixed[1].casefold() != ('neurips' if family == 'nips' else family) or int(prefixed[2]) != year):
raise ValueError('Status label conflicts with source conference year')
allowed = {v['acronym'].casefold(): v['acronym'] for v in json.loads(DEFAULT_REGISTRY.read_text())['venues']}
venue = allowed.get({'nips': 'neurips', 'acmmm': 'mm'}.get(family, family))
if venue is None:
return None, 'unmapped_venue'
title = row.get('title')
abstract = row.get('abstract')
if not isinstance(title, str) or not title.strip():
raise ValueError('Public submission lacks a title')
if abstract is not None and not isinstance(abstract, str):
raise ValueError('Abstract must be text or null')
author_text = row.get('author') or ''
if not isinstance(author_text, str):
raise ValueError('Unexpected public author format')
authors = [a.strip() for a in author_text.split(';') if a.strip() and '@' not in a
and not re.fullmatch(r'anonymous(?: authors?)?', a.strip(), re.I)]
tags = []
for field in ('keywords', 'primary_area'):
value = row.get(field)
if value is None:
continue
terms = value if isinstance(value, list) else re.split(r'[,;]', value) if field == 'keywords' and isinstance(value, str) else [value]
tags.extend({'namespace': SOURCE + ':' + field, 'value': term.strip()}
for term in terms if isinstance(term, str) and term.strip())
evidence = provenance['source_file'] + '#L' + str(provenance['source_line'])
return {'source': SOURCE, 'external_id': f'{family}/{year}/{forum}',
'url': 'https://openreview.net/forum?id=' + forum,
'title': ' '.join(title.split()), 'abstract': abstract.strip() if abstract else None,
'authors': authors, 'identifiers': {'openreview': forum},
'submission_identifiers': [{'scheme': 'openreview', 'value': forum}],
'venue': venue, 'year': year, 'track': normalized_track,
'status': status, 'raw_decision': raw_status, 'evidence_url': evidence,
'observed_at': AS_OF, 'tags': tags,
'metadata': {**provenance, 'raw_track': track, 'raw_status': raw_status,
'evidence_kind': 'curated_public_status_assertion',
'original_decision_signature_verified': False,
'source_snapshot_upper_bound': AS_OF}}, None
def held_metadata(row, reason, provenance):
# Retractions and unresolved track scopes remain visible without becoming
# invented Reject/Withdrawn events in a schema that cannot represent them.
return {key: row.get(key) for key in ('id', 'title', 'abstract', 'track', 'status')} | {
'reason': reason, 'provenance': provenance}
def collect(out, families=None, years=None, include_workshops=False, fetcher=None):
fetcher = fetcher or download
out = Path(out)
out.mkdir(parents=True, exist_ok=True)
with (out / 'collect.lock').open('a') as lock:
fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB)
if (out / 'public-openreview-inventory.json').exists():
raise ValueError('Completed inventory exists; select a new output directory')
if shutil.disk_usage(out).free < 8 * 1024**3:
raise RuntimeError('Less than 8 GiB free before collection')
tree = json.loads(fetcher(TREE_URL, 8 * 1024**2))
if tree.get('truncated') is not False or tree.get('sha') != REVISION:
raise ValueError('Incomplete or unpinned public source tree')
selected = []
for item in tree['tree']:
match = re.fullmatch(r'venues/([a-z0-9]+)/\1((?:19|20)\d{2})\.jsonl', item['path'])
if item['type'] != 'blob' or not match:
continue
family, year = match[1], int(match[2])
if year > 2026 or (families is None and family == 'iclr'):
continue
if families is not None and family not in families or years is not None and year not in years:
continue
selected.append((item, family, year))
if not selected:
raise ValueError('No pinned source files match the request')
if families and set(families) - {family for _, family, _ in selected}:
raise ValueError('Requested venue has no selected source file')
if years and set(years) - {year for _, _, year in selected}:
raise ValueError('Requested year has no selected source file')
return _collect_files(out, selected, include_workshops, fetcher)
def _collect_files(out, selected, include_workshops, fetcher):
summaries = []
groups = defaultdict(list)
global_forums = {}
with tempfile.TemporaryDirectory(prefix='.public-openreview-', dir=out) as temporary:
stage = Path(temporary)
held_path = stage / 'held-records.jsonl'
with held_path.open('w') as held:
for item, family, year in sorted(selected, key=lambda entry: entry[0]['path']):
size = item['size']
if not isinstance(size, int) or not 0 < size <= 96 * 1024**2:
raise ValueError('Unexpected metadata file size')
data = fetcher(RAW_ROOT + item['path'], size)
blob = hashlib.sha1(b'blob ' + str(len(data)).encode() + b'\0' + data).hexdigest()
if len(data) != size or blob != item['sha']:
raise ValueError('Pinned source blob checksum mismatch')
matrix = Counter()
reasons = Counter()
seen = set()
rows = 0
for number, line in enumerate(io.BytesIO(data), 1):
if len(line) > 4 * 1024**2:
raise ValueError('Oversized metadata row')
row = json.loads(line)
forum = row.get('id')
if not isinstance(forum, str) or forum in seen:
raise ValueError('Missing or duplicate source forum ID')
seen.add(forum)
edition = (family, year, row.get('track'))
if forum in global_forums and global_forums[forum] != edition:
raise ValueError('One forum appears in multiple source editions or tracks')
global_forums[forum] = edition
rows += 1
matrix[(row.get('track'), row.get('status'))] += 1
provenance = {'source_revision': REVISION, 'source_blob_sha1': blob,
'source_file': RAW_ROOT + item['path'], 'source_line': number}
record, reason = normalize(row, family, year, provenance, include_workshops)
if record is None:
reasons[reason] += 1
if reason != 'not_explicit_negative':
held.write(json.dumps(held_metadata(row, reason, provenance), ensure_ascii=False) + '\n')
else:
groups[(family, year, record['track'])].append(record)
summary = {'path': item['path'], 'input_bytes': size, 'git_blob_sha1': blob,
'rows': rows, 'excluded_or_held': dict(reasons),
'status_matrix': [{'track': t, 'status': s, 'count': n} for (t, s), n in matrix.items()]}
summaries.append(summary)
print(json.dumps({key: summary[key] for key in ('path', 'rows', 'excluded_or_held')}), flush=True)
files = []
for (family, year, track), records in sorted(groups.items()):
name = f'public-openreview-{family}-{year}-{track}.jsonl'
path = stage / name
path.write_text(''.join(json.dumps(row, ensure_ascii=False) + '\n' for row in records))
manifest = {'source': SOURCE, 'parser_version': 1, 'venue': records[0]['venue'],
'year': year, 'track': track, 'count': len(records), 'status': 'partial',
'file': str(out / name), 'file_sha256': hashlib.sha256(path.read_bytes()).hexdigest(),
'list_url': REPOSITORY + '/tree/' + REVISION, 'source_revision': REVISION,
'missing_abstract_count': sum(not row['abstract'] for row in records),
'evidence_kind': 'curated_public_status_assertion',
'note': 'Public subset only; no population coverage or original decision-signature claim.'}
path.with_suffix('.manifest.json').write_text(json.dumps(manifest, indent=2) + '\n')
files.append(manifest)
result = {'source': SOURCE, 'revision': REVISION, 'finished_at': timestamp(),
'input_rows': sum(item['rows'] for item in summaries), 'source_files': summaries,
'normalized_records': sum(item['count'] for item in files), 'files': files,
'include_workshops': include_workshops, 'held_file': str(out / held_path.name),
'held_file_sha256': hashlib.sha256(held_path.read_bytes()).hexdigest(),
'note': 'Zero explicit negative records in this mirror does not prove no public rejections exist.'}
inventory = stage / 'public-openreview-inventory.json'
inventory.write_text(json.dumps(result, ensure_ascii=False, indent=2) + '\n')
# Publish only after every selected source has passed its pinned hash.
for path in sorted(stage.iterdir(), key=lambda path: path == inventory):
path.replace(out / path.name)
return result
def main(argv=None, *, prog=None):
parser = argparse.ArgumentParser(prog=prog)
parser.add_argument('--out', required=True)
parser.add_argument('--family', action='append', help='Source family, e.g. icml, nips, emnlp')
parser.add_argument('--year', type=int, action='append')
parser.add_argument('--include-workshops', action='store_true')
args = parser.parse_args(argv)
collect(args.out, args.family, args.year, args.include_workshops)
if __name__ == '__main__':
main()
+50
View File
@@ -0,0 +1,50 @@
"""Prevent legacy writers from diverging after an explicit PostgreSQL cutover."""
from pathlib import Path
def database_arguments(parser):
target = parser.add_mutually_exclusive_group(required=True)
target.add_argument('--db', help='Writable SQLite sample; never the frozen production backup')
target.add_argument('--pg-service', help='Protected libpq service for the published PostgreSQL dataset')
parser.add_argument('--pg-schema', help='Optional schema; otherwise use the configured search_path')
def open_store(db=None, *, pg_service=None, pg_schema=None):
if bool(db) == bool(pg_service) or (pg_schema and not pg_service):
raise ValueError('Choose exactly one of SQLite db or PostgreSQL service; schema requires PostgreSQL')
if pg_service:
from paper_atlas.postgres.writer import PostgresStore
return PostgresStore(pg_service, pg_schema)
from paper_atlas.db.store import Store
return Store(db)
def open_read_connection(db=None, *, pg_service=None, pg_schema=None):
if bool(db) == bool(pg_service) or (pg_schema and not pg_service):
raise ValueError('Choose exactly one of SQLite db or PostgreSQL service; schema requires PostgreSQL')
if pg_service:
from paper_atlas.postgres.client import ReadConnection
return ReadConnection(pg_service, pg_schema)
import sqlite3
path = Path(db).resolve()
if not path.is_file():
raise ValueError('Existing database required for read-only audit')
connection = sqlite3.connect(path.as_uri() + '?mode=ro', uri=True)
try:
connection.execute('BEGIN')
except BaseException:
connection.close()
raise
return connection
def inserted_id(connection, sql, params=()):
if getattr(connection, 'postgres', False):
return connection.execute(sql + ' RETURNING id', params).fetchone()[0]
return connection.execute(sql, params).lastrowid
def require_sqlite_writable(path):
marker = Path(str(Path(path).resolve()) + '.postgresql-cutover.json')
if marker.exists():
raise RuntimeError('This SQLite source was cut over to PostgreSQL; use the configured PostgreSQL database. Marker: ' + str(marker))
+22 -15
View File
@@ -5,7 +5,8 @@ import re
import sqlite3
import unicodedata
from pathlib import Path
from paper_atlas.db.submissions import attach_submission,migrate_sources,write_decision
from paper_atlas.db.submissions import attach_submission,migrate_sources,write_decision,latest_status
from paper_atlas.db.backend import require_sqlite_writable, inserted_id
def normalized(value):
@@ -29,6 +30,7 @@ def author_keys(authors):
class Store:
def __init__(self,path):
require_sqlite_writable(path)
self.conn = sqlite3.connect(path,timeout=60)
self.conn.executescript(files('paper_atlas.db').joinpath('schema.sql').read_text())
self.conn.execute('PRAGMA synchronous=NORMAL')
@@ -36,7 +38,7 @@ class Store:
migrate_sources(self.conn)
def source(self,name,url):
self.conn.execute('INSERT OR IGNORE INTO sources(name,homepage) VALUES(?,?)',(name,url))
self.conn.execute('INSERT INTO sources(name,homepage) VALUES(?,?) ON CONFLICT DO NOTHING',(name,url))
return self.conn.execute('SELECT id FROM sources WHERE name=?',(name,)).fetchone()[0]
def merge(self,target,other,reason):
@@ -53,7 +55,7 @@ class Store:
c.execute('UPDATE identifiers SET paper_id=? WHERE paper_id=?',(target,other))
c.execute('UPDATE source_records SET paper_id=? WHERE paper_id=?',(target,other))
c.execute('UPDATE submissions SET paper_id=? WHERE paper_id=?',(target,other))
c.execute('INSERT OR IGNORE INTO paper_tags SELECT ?,tag_id,source_record_id,evidence_key FROM paper_tags WHERE paper_id=?',(target,other))
c.execute('INSERT INTO paper_tags SELECT ?,tag_id,source_record_id,evidence_key FROM paper_tags WHERE paper_id=? ON CONFLICT DO NOTHING',(target,other))
c.execute('DELETE FROM paper_tags WHERE paper_id=?',(other,))
c.execute('UPDATE paper_merges SET surviving_paper_id=? WHERE surviving_paper_id=?',(target,other))
# Reattach pending candidate evidence without losing colliding rows.
@@ -63,7 +65,7 @@ class Store:
left = target if left == other else left
right = target if right == other else right
if left != right:
c.execute('INSERT OR IGNORE INTO match_candidates VALUES(?,?,?,?,?,?)',(min(left,right),max(left,right),method,score,evidence,status))
c.execute('INSERT INTO match_candidates VALUES(?,?,?,?,?,?) ON CONFLICT DO NOTHING',(min(left,right),max(left,right),method,score,evidence,status))
c.execute('DELETE FROM papers WHERE id=?',(other,))
def record(self,source,external_id,url,title,abstract,authors,identifiers=None,metadata=None,published=None):
@@ -109,18 +111,19 @@ class Store:
c.execute("UPDATE papers SET title=?,abstract=COALESCE(NULLIF(?,''),abstract),title_key=?,authors_json=CASE WHEN ?='[]' THEN authors_json ELSE ? END WHERE id=? AND title=? AND COALESCE(abstract,'')=COALESCE(?,'')",(title,abstract,key,json.dumps(authors,ensure_ascii=False),json.dumps(authors,ensure_ascii=False),paper,old[1],old_abstract))
c.execute("UPDATE papers SET abstract=CASE WHEN abstract IS NULL OR abstract='' THEN ? ELSE abstract END WHERE id=?",(abstract,paper))
else:
paper = c.execute('INSERT INTO papers(title,abstract,title_key,authors_json,first_published) VALUES(?,?,?,?,?)',(title,abstract,key,json.dumps(authors,ensure_ascii=False),published)).lastrowid
paper = inserted_id(c,'INSERT INTO papers(title,abstract,title_key,authors_json,first_published) VALUES(?,?,?,?,?)',(title,abstract,key,json.dumps(authors,ensure_ascii=False),published))
for scheme,value in ids:
c.execute('INSERT OR IGNORE INTO identifiers VALUES(?,?,?)',(scheme,value,paper))
c.execute('INSERT INTO identifiers VALUES(?,?,?) ON CONFLICT DO NOTHING',(scheme,value,paper))
metadata=dict(metadata or {});metadata['record_identifiers']=dict(ids)
if old and not abstract:
previous={'abstract':old[2],'observed_at':old[3]} if old[2] else json.loads(old[4]).get('last_known_abstract')
if previous:metadata['last_known_abstract']=previous
c.execute('INSERT INTO source_records(source_id,external_id,paper_id,url,title,abstract,authors_json,metadata_json) VALUES(?,?,?,?,?,?,?,?) ON CONFLICT(source_id,external_id) DO UPDATE SET paper_id=excluded.paper_id,url=excluded.url,title=excluded.title,abstract=excluded.abstract,authors_json=excluded.authors_json,metadata_json=excluded.metadata_json,retrieved_at=CURRENT_TIMESTAMP',(source_id,external_id,paper,url,title,abstract,json.dumps(authors,ensure_ascii=False),json.dumps(metadata,ensure_ascii=False,default=str)))
from paper_atlas.db.submissions import timestamp
c.execute('INSERT INTO source_records(source_id,external_id,paper_id,url,title,abstract,authors_json,metadata_json,retrieved_at) VALUES(?,?,?,?,?,?,?,?,?) ON CONFLICT(source_id,external_id) DO UPDATE SET paper_id=excluded.paper_id,url=excluded.url,title=excluded.title,abstract=excluded.abstract,authors_json=excluded.authors_json,metadata_json=excluded.metadata_json,retrieved_at=excluded.retrieved_at',(source_id,external_id,paper,url,title,abstract,json.dumps(authors,ensure_ascii=False),json.dumps(metadata,ensure_ascii=False,default=str),timestamp()))
record = c.execute('SELECT id FROM source_records WHERE source_id=? AND external_id=?',(source_id,external_id)).fetchone()[0]
for other,_,_ in title_matches:
if other != paper and c.execute('SELECT 1 FROM papers WHERE id=?',(other,)).fetchone():
c.execute('INSERT OR IGNORE INTO match_candidates VALUES(?,?,?,?,?,?)',(min(paper,other),max(paper,other),'exact_title_unconfirmed',None,json.dumps({'title':title}), 'pending'))
c.execute('INSERT INTO match_candidates VALUES(?,?,?,?,?,?) ON CONFLICT DO NOTHING',(min(paper,other),max(paper,other),'exact_title_unconfirmed',None,json.dumps({'title':title}), 'pending'))
return paper,record
def record_tags(self,paper,record,source,tags):
@@ -135,22 +138,26 @@ class Store:
c=self.conn
c.execute('DELETE FROM paper_tags WHERE source_record_id=? AND evidence_key=?',(record,evidence))
for namespace,value in sorted(values):
c.execute('INSERT OR IGNORE INTO tags(namespace,value) VALUES(?,?)',(namespace,value))
c.execute('INSERT INTO tags(namespace,value) VALUES(?,?) ON CONFLICT DO NOTHING',(namespace,value))
tag=c.execute('SELECT id FROM tags WHERE namespace=? AND value=?',(namespace,value)).fetchone()[0]
c.execute('INSERT OR IGNORE INTO paper_tags VALUES(?,?,?,?)',(paper,tag,record,evidence))
c.execute('INSERT INTO paper_tags VALUES(?,?,?,?) ON CONFLICT DO NOTHING',(paper,tag,record,evidence))
def decision(self,paper,record,venue,year,track,external_id,url,status,raw_value,aliases=None,identities=None,observed_at=None,decision_date=None,source_decision_id='',submitted_at=None):
def decision(self,paper,record,venue,year,track,external_id,url,status,raw_value,aliases=None,identities=None,observed_at=None,decision_date=None,source_decision_id='',submitted_at=None,guard_status=False):
c = self.conn
existing=c.execute('SELECT id FROM venues WHERE acronym=? COLLATE NOCASE',(venue,)).fetchone()
existing=c.execute('SELECT id FROM venues WHERE lower(acronym)=lower(?)',(venue,)).fetchone()
if existing:venue_id=existing[0]
else:venue_id=c.execute("INSERT INTO venues(acronym,name,field,venue_type) VALUES(?,?,?,'conference')",(venue,venue,'unclassified')).lastrowid
else:venue_id=inserted_id(c,"INSERT INTO venues(acronym,name,field,venue_type) VALUES(?,?,?,'conference')",(venue,venue,'unclassified'))
for alias in aliases or []:
c.execute('INSERT OR IGNORE INTO venue_aliases VALUES(?,?)',(venue_id,alias))
c.execute('INSERT OR IGNORE INTO editions(venue_id,year,track) VALUES(?,?,?)',(venue_id,int(year),track))
c.execute('INSERT INTO venue_aliases VALUES(?,?) ON CONFLICT DO NOTHING',(venue_id,alias))
c.execute('INSERT INTO editions(venue_id,year,track) VALUES(?,?,?) ON CONFLICT DO NOTHING',(venue_id,int(year),track))
edition = c.execute('SELECT id FROM editions WHERE venue_id=? AND year=? AND track=?',(venue_id,int(year),track)).fetchone()[0]
# A previous event in this row may already have merged the input paper.
paper=c.execute('SELECT paper_id FROM source_records WHERE id=?',(record,)).fetchone()[0]
submission=attach_submission(self,edition,paper,record,external_id,identities or [])
if guard_status and status in ('rejected','desk_rejected','withdrawn'):
current = latest_status(c, submission)
if current and current not in ('unknown','under_review',status):
raise ValueError('Curated decision conflicts with current canonical submission status: ' + current)
if submitted_at:
from paper_atlas.db.submissions import timestamp
c.execute('UPDATE submissions SET submitted_at=COALESCE(submitted_at,?) WHERE id=?',(timestamp(submitted_at),submission))
+35 -8
View File
@@ -1,9 +1,10 @@
"""Canonical submission events with independent source and decision evidence."""
from datetime import datetime, timezone
import re
from paper_atlas.io.publication_ids import mlsys_id
PUBLICATIONS={'pmlr','acl_anthology','colm','neurips','cvf','ecva','dblp'}
PUBLICATIONS={'pmlr','acl_anthology','colm','neurips','mlsys','cvf','ecva','dblp'}
def timestamp(value=None):
@@ -15,11 +16,26 @@ def timestamp(value=None):
def identities_for_row(row):
identities=list(row.get('submission_identifiers') or [])
own=row.get('identifiers') or {}
if row['source']=='mlsys':
value=own.get('publication_mlsys')
if (not isinstance(value,str) or not re.fullmatch(str(row['year'])+r'/[a-f0-9]{32}',value)
or row['venue']!='MLSys'):
raise ValueError('Invalid authoritative MLSys publisher identity')
if own.get('openreview'):
identities.append({'scheme':'openreview','value':own['openreview']})
if row['source'] in PUBLICATIONS and row.get('status')=='accepted' and own.get('doi'):
doi=re.sub(r'^https?://(?:dx\.)?doi\.org/','',str(own['doi']),flags=re.I).strip().lower()
if re.fullmatch(r'10\.\d{4,9}/\S+',doi):identities.append({'scheme':'publication_doi','value':doi})
publication_mlsys = own.get('publication_mlsys')
if not publication_mlsys and row['source']=='dblp' and row['venue']=='MLSys':
# Older normalized DBLP files retain their own publisher links even
# when a newly supported historical URL label was not yet parsed.
links = (row.get('metadata') or {}).get('bibliography', {}).get('ee', [])
candidates = {identity for link in links if (identity := mlsys_id(link))}
if len(candidates)==1:
publication_mlsys = candidates.pop()
if row['source'] in PUBLICATIONS and row.get('status')=='accepted' and publication_mlsys:
identities.append({'scheme':'publication_mlsys','value':publication_mlsys})
meta=row.get('metadata') or {}
if row['source']=='iclr_program' and row['venue']=='ICLR' and meta.get('program_identity_type')=='submission' and meta.get('program_submission_number_verified') is True:
identities.append({'scheme':'iclr_number','value':str(meta['program_source_id'])})
@@ -30,6 +46,9 @@ def identities_for_row(row):
valid=re.fullmatch(r'[A-Za-z0-9_-]+',value) and not re.match(r'20\d{2}-Oral-',value)
elif scheme=='iclr_number':valid=re.fullmatch(r'[1-9]\d*',value) and row['venue']=='ICLR'
elif scheme=='publication_doi':valid=re.fullmatch(r'10\.\d{4,9}/\S+',value)
elif scheme=='publication_mlsys':
valid=(re.fullmatch(str(row['year'])+r'/[a-f0-9]{32}',value)
and row['venue']=='MLSys' and row['source'] in PUBLICATIONS and row.get('status')=='accepted')
else:valid=False
if not valid:raise ValueError('Invalid authoritative submission identity')
result.add((scheme,value))
@@ -39,21 +58,29 @@ def identities_for_row(row):
def migrate_sources(c):
if c.execute("SELECT 1 FROM schema_migrations WHERE name='submission_source_baseline_v1'").fetchone():return
with c:
c.execute('INSERT OR IGNORE INTO submission_sources SELECT id,source_record_id,source_submission_id FROM submissions')
c.execute("INSERT OR IGNORE INTO decision_sources SELECT d.id,s.source_record_id,'' FROM decisions d JOIN submissions s ON s.id=d.submission_id")
c.execute('INSERT INTO submission_sources SELECT id,source_record_id,source_submission_id FROM submissions WHERE 1=1 ON CONFLICT DO NOTHING')
c.execute("INSERT INTO decision_sources SELECT d.id,s.source_record_id,'' FROM decisions d JOIN submissions s ON s.id=d.submission_id WHERE 1=1 ON CONFLICT DO NOTHING")
c.execute("INSERT INTO schema_migrations(name) VALUES('submission_source_baseline_v1')")
def next_id(c,table,audit,former):
# Merged IDs are kept in audit; never allocate them to a later unrelated event.
if getattr(c, 'postgres', False):
return c.next_id(table)
return max(c.execute('SELECT COALESCE(max(id),0) FROM '+table).fetchone()[0],c.execute('SELECT COALESCE(max('+former+'),0) FROM '+audit).fetchone()[0])+1
def latest_status(c, submission):
row = c.execute('''SELECT status FROM decisions WHERE submission_id=?
ORDER BY observed_at DESC,COALESCE(decision_date,observed_at) DESC,id DESC LIMIT 1''', (submission,)).fetchone()
return row[0] if row else None
def merge_submissions(c,target,other):
if target==other:return
editions=c.execute('SELECT id,edition_id FROM submissions WHERE id IN (?,?)',(target,other)).fetchall()
if len(editions)!=2 or editions[0][1]!=editions[1][1]:raise ValueError('Cannot combine submissions from different editions')
c.execute('INSERT OR IGNORE INTO submission_sources SELECT ?,source_record_id,source_submission_id FROM submission_sources WHERE submission_id=?',(target,other))
c.execute('INSERT INTO submission_sources SELECT ?,source_record_id,source_submission_id FROM submission_sources WHERE submission_id=? ON CONFLICT DO NOTHING',(target,other))
c.execute('DELETE FROM submission_sources WHERE submission_id=?',(other,))
for decision,status,raw,url,observed,date in c.execute('SELECT id,status,raw_value,evidence_url,observed_at,decision_date FROM decisions WHERE submission_id=?',(other,)).fetchall():
duplicate=c.execute('SELECT id,decision_date FROM decisions WHERE submission_id=? AND status=? AND raw_value=? AND evidence_url=? AND observed_at=?',(target,status,raw,url,observed)).fetchone()
@@ -61,7 +88,7 @@ def merge_submissions(c,target,other):
surviving=duplicate[0]
if date and duplicate[1] and date!=duplicate[1]:raise ValueError('Conflicting dates for the same decision observation')
if date and not duplicate[1]:c.execute('UPDATE decisions SET decision_date=? WHERE id=?',(date,surviving))
c.execute('INSERT OR IGNORE INTO decision_sources SELECT ?,source_record_id,source_decision_id FROM decision_sources WHERE decision_id=?',(surviving,decision))
c.execute('INSERT INTO decision_sources SELECT ?,source_record_id,source_decision_id FROM decision_sources WHERE decision_id=? ON CONFLICT DO NOTHING',(surviving,decision))
c.execute('DELETE FROM decision_sources WHERE decision_id=?',(decision,))
c.execute('UPDATE decision_merges SET surviving_decision_id=? WHERE surviving_decision_id=?',(surviving,decision))
c.execute("INSERT INTO decision_merges(former_decision_id,surviving_decision_id,reason) VALUES(?,?,'same decision observation on merged submission')",(decision,surviving))
@@ -95,9 +122,9 @@ def attach_submission(store,edition,paper,record,external_id,identities):
else:
submission=next_id(c,'submissions','submission_merges','former_submission_id')
c.execute('INSERT INTO submissions(id,paper_id,edition_id,source_record_id,source_submission_id) VALUES(?,?,?,?,?)',(submission,paper,edition,record,external_id))
c.execute('INSERT OR IGNORE INTO submission_sources VALUES(?,?,?)',(submission,record,external_id))
c.execute('INSERT INTO submission_sources VALUES(?,?,?) ON CONFLICT DO NOTHING',(submission,record,external_id))
for scheme,value in identities:
c.execute('INSERT OR IGNORE INTO submission_identifiers VALUES(?,?,?,?)',(edition,scheme,value,submission))
c.execute('INSERT INTO submission_identifiers VALUES(?,?,?,?) ON CONFLICT DO NOTHING',(edition,scheme,value,submission))
return submission
@@ -111,5 +138,5 @@ def write_decision(store,submission,record,status,raw,url,observed_at=None,decis
else:
decision=next_id(c,'decisions','decision_merges','former_decision_id')
c.execute('INSERT INTO decisions(id,submission_id,status,raw_value,evidence_url,observed_at,decision_date) VALUES(?,?,?,?,?,?,?)',(decision,submission,status,raw,url,observed,date))
c.execute('INSERT OR IGNORE INTO decision_sources VALUES(?,?,?)',(decision,record,source_decision_id or ''))
c.execute('INSERT INTO decision_sources VALUES(?,?,?) ON CONFLICT DO NOTHING',(decision,record,source_decision_id or ''))
return decision
+40 -33
View File
@@ -1,4 +1,4 @@
"""Stream the official metadata ZIP into SQLite. No PDFs, source files or builds."""
"""Stream the official metadata ZIP into the configured metadata database."""
import argparse
import json
import time
@@ -7,31 +7,40 @@ import zipfile
from pathlib import Path
from paper_atlas.db.store import Store
from paper_atlas.db.backend import database_arguments, open_store, inserted_id
from paper_atlas.db.submissions import timestamp
def ingest(db, archive):
store = Store(db)
def refresh_categories(store,paper,record,categories):
"""Keep category evidence for each arXiv record, including merged papers."""
if not isinstance(categories,str):raise ValueError('arXiv categories must be text')
store.record_tags(paper,record,'arxiv',[{'namespace':'arxiv:category','value':value} for value in categories.split()])
store.conn.execute("DELETE FROM paper_tags WHERE source_record_id=? AND evidence_key='arxiv:categories' AND tag_id IN (SELECT id FROM tags WHERE namespace='arxiv:category')",(record,))
def ingest(db, archive, *, pg_service=None, pg_schema=None, storage_path=None):
store = open_store(db,pg_service=pg_service,pg_schema=pg_schema)
conn = store.conn
conn.execute("INSERT OR IGNORE INTO sources(name,homepage) VALUES('arxiv','https://arxiv.org')")
source = conn.execute("SELECT id FROM sources WHERE name='arxiv'").fetchone()[0]
previous = conn.execute('SELECT id,checkpoint_json FROM ingest_runs WHERE source_id=? AND status IN (\'running\',\'failed\') ORDER BY id DESC LIMIT 1', (source,)).fetchone()
fingerprint = {'path':str(Path(archive).resolve()), 'bytes':Path(archive).stat().st_size, 'mtime_ns':Path(archive).stat().st_mtime_ns}
start = 0
if previous:
checkpoint = json.loads(previous[1] or '{}')
if checkpoint.get('archive') == fingerprint:
run = previous[0]
start = checkpoint.get('line', 0)
conn.execute("UPDATE ingest_runs SET status='running',error=NULL WHERE id=?", (run,))
else:
raise RuntimeError('Pending run belongs to a different archive; resolve it explicitly')
else:
run = conn.execute('INSERT INTO ingest_runs(source_id,checkpoint_json) VALUES(?,?)', (source,json.dumps({'archive':fingerprint,'line':0}))).lastrowid
conn.commit()
line_number = start
last = time.monotonic()
run = None
try:
source = store.source('arxiv','https://arxiv.org')
previous = conn.execute('SELECT id,checkpoint_json FROM ingest_runs WHERE source_id=? AND status IN (\'running\',\'failed\') ORDER BY id DESC LIMIT 1', (source,)).fetchone()
fingerprint = {'path':str(Path(archive).resolve()), 'bytes':Path(archive).stat().st_size, 'mtime_ns':Path(archive).stat().st_mtime_ns}
start = 0
if previous:
checkpoint = json.loads(previous[1] or '{}')
if checkpoint.get('archive') == fingerprint:
run = previous[0]
start = checkpoint.get('line', 0)
conn.execute("UPDATE ingest_runs SET status='running',error=NULL WHERE id=?", (run,))
else:
raise RuntimeError('Pending run belongs to a different archive; resolve it explicitly')
else:
run = inserted_id(conn,'INSERT INTO ingest_runs(source_id,checkpoint_json) VALUES(?,?)', (source,json.dumps({'archive':fingerprint,'line':0})))
conn.commit()
line_number = start
last = time.monotonic()
monitored = Path(storage_path) if storage_path else (Path(db).parent if db else Path(archive).parent)
with zipfile.ZipFile(archive) as zipped:
# Reading the member to EOF also checks its CRC.
with zipped.open('arxiv-metadata-oai-snapshot.json') as stream:
@@ -45,26 +54,23 @@ def ingest(db, archive):
authors = row.get('authors_parsed') or row.get('authors') or []
metadata = {k:v for k,v in row.items() if k not in ('title','abstract','authors','authors_parsed')}
paper,record = store.record('arxiv',external_id,'https://arxiv.org/abs/'+external_id,title,abstract,authors,{'arxiv':external_id,'doi':row.get('doi')},metadata,(row.get('versions') or [{}])[0].get('created'))
conn.execute("DELETE FROM paper_tags WHERE source_record_id=? AND evidence_key='arxiv:categories'", (record,))
for category in (row.get('categories') or '').split():
conn.execute("INSERT OR IGNORE INTO tags(namespace,value) VALUES('arxiv:category',?)",(category,))
tag = conn.execute("SELECT id FROM tags WHERE namespace='arxiv:category' AND value=?",(category,)).fetchone()[0]
conn.execute('INSERT OR IGNORE INTO paper_tags VALUES(?,?,?,?)',(paper,tag,record,'arxiv:categories'))
refresh_categories(store,paper,record,row.get('categories') or '')
if line_number % 500 == 0:
if shutil.disk_usage(Path(db).parent).free < 4*1024**3:
if shutil.disk_usage(monitored).free < 4*1024**3:
raise RuntimeError('Stopped before exhausting disk: less than 4 GiB free')
conn.execute('UPDATE ingest_runs SET records_seen=?,records_written=?,checkpoint_json=? WHERE id=?',(line_number,line_number,json.dumps({'archive':fingerprint,'line':line_number}),run))
conn.commit()
if time.monotonic()-last >= 20:
print(json.dumps({'run':run,'rows':line_number}),flush=True)
last = time.monotonic()
conn.execute("UPDATE ingest_runs SET status='complete',finished_at=CURRENT_TIMESTAMP,records_seen=?,records_written=?,checkpoint_json=? WHERE id=?",(line_number,line_number,json.dumps({'archive':fingerprint,'line':line_number}),run))
conn.execute("UPDATE ingest_runs SET status='complete',finished_at=?,records_seen=?,records_written=?,checkpoint_json=? WHERE id=?",(timestamp(),line_number,line_number,json.dumps({'archive':fingerprint,'line':line_number}),run))
conn.commit()
print(json.dumps({'status':'complete','rows':line_number}),flush=True)
except BaseException as exc:
conn.rollback()
conn.execute("UPDATE ingest_runs SET status='failed',error=? WHERE id=?",(str(exc),run))
conn.commit()
if run is not None:
conn.execute("UPDATE ingest_runs SET status='failed',error=? WHERE id=?",(str(exc),run))
conn.commit()
raise
finally:
conn.close()
@@ -72,10 +78,11 @@ def ingest(db, archive):
def main(argv=None, *, prog=None):
parser = argparse.ArgumentParser(prog=prog)
parser.add_argument('--db', required=True)
database_arguments(parser)
parser.add_argument('--archive', required=True)
parser.add_argument('--storage-path', help='Local filesystem to monitor for free space; specify the database volume when running beside PostgreSQL')
args = parser.parse_args(argv)
ingest(args.db,args.archive)
ingest(args.db,args.archive,pg_service=args.pg_service,pg_schema=args.pg_schema,storage_path=args.storage_path)
if __name__ == '__main__':
+76
View File
@@ -0,0 +1,76 @@
"""Rebuild per-record arXiv category evidence from retained source metadata."""
import argparse
from contextlib import closing
import fcntl
import json
from pathlib import Path
import shutil
import sqlite3
from paper_atlas.db.store import Store
from paper_atlas.db.submissions import timestamp
from paper_atlas.ingestion.arxiv import refresh_categories
def save(path,state):
part=path.with_suffix('.part');part.write_text(json.dumps(state,indent=2)+'\n');part.replace(path)
def repair(db,out,resume=False,batch_size=1000):
db=Path(db).resolve();out=Path(out).resolve()
from paper_atlas.db.backend import require_sqlite_writable
require_sqlite_writable(db)
if not db.is_file():raise ValueError('Existing database required')
if batch_size<1 or batch_size>10000:raise ValueError('Batch size must be between 1 and 10000')
out.parent.mkdir(parents=True,exist_ok=True)
with Path(str(db)+'.maintenance.lock').open('a') as lock:
fcntl.flock(lock,fcntl.LOCK_EX|fcntl.LOCK_NB)
with closing(sqlite3.connect(db.as_uri()+'?mode=ro',uri=True)) as c:
source=c.execute("SELECT id FROM sources WHERE name='arxiv'").fetchone()
if not source:raise ValueError('No imported arXiv source')
total,maximum=c.execute('SELECT count(*),COALESCE(max(id),0) FROM source_records WHERE source_id=?',source).fetchone()
scope={'db':str(db),'source_id':source[0],'source_record_count':total,'maximum_source_record_id':maximum}
if resume:
state=json.loads(out.read_text())
if any(state.get(key)!=value for key,value in scope.items()):raise ValueError('Repair scope changed since checkpoint')
if state['status']=='complete':raise ValueError('Completed report exists; use a new report for a fresh repair')
else:
if out.exists():raise ValueError('Repair report exists; inspect it or explicitly resume')
state={**scope,'started_at':timestamp(),'last_record_id':0,'records_refreshed':0}
if shutil.disk_usage(db.parent).free<8*1024**3:raise RuntimeError('Less than 8 GiB free before repair')
state.update(status='running',error=None);save(out,state)
c=None
try:
store=Store(db);c=store.conn
while True:
rows=c.execute('SELECT id,paper_id,metadata_json FROM source_records WHERE source_id=? AND id>? AND id<=? ORDER BY id LIMIT ?',(source[0],state['last_record_id'],maximum,batch_size)).fetchall()
if not rows:break
for record,paper,payload in rows:
categories=json.loads(payload).get('categories','')
if categories is None:categories=''
refresh_categories(store,paper,record,categories)
c.commit()
state.update(last_record_id=rows[-1][0],records_refreshed=state['records_refreshed']+len(rows));save(out,state)
if state['records_refreshed']%10000<len(rows):print(json.dumps(state),flush=True)
if shutil.disk_usage(db.parent).free<8*1024**3:raise RuntimeError('Less than 8 GiB free during repair')
if state['records_refreshed']!=total:raise ValueError('Repaired count differs from fixed source inventory')
current=c.execute('SELECT count(*),COALESCE(max(id),0) FROM source_records WHERE source_id=?',source).fetchone()
if current!=(total,maximum):raise ValueError('arXiv source inventory changed during repair')
legacy=c.execute("SELECT count(*) FROM paper_tags pt JOIN source_records r ON r.id=pt.source_record_id JOIN tags t ON t.id=pt.tag_id WHERE r.source_id=? AND t.namespace='arxiv:category' AND pt.evidence_key='arxiv:categories'",source).fetchone()[0]
if legacy:raise ValueError('Legacy category evidence remains after repair')
state.update(status='complete',finished_at=timestamp(),legacy_category_evidence_remaining=legacy);save(out,state)
except BaseException as error:
if c is not None:c.rollback()
state.update(status='failed',error=str(error));save(out,state);raise
finally:
if c is not None:c.close()
print(json.dumps(state),flush=True);return state
def main(argv=None,*,prog=None):
parser=argparse.ArgumentParser(prog=prog);parser.add_argument('--db',required=True);parser.add_argument('--out',required=True)
parser.add_argument('--resume',action='store_true');parser.add_argument('--batch-size',type=int,default=1000);args=parser.parse_args(argv)
repair(args.db,args.out,args.resume,args.batch_size)
if __name__=='__main__':main()
+10 -7
View File
@@ -4,8 +4,9 @@ import hashlib
import json
from pathlib import Path
from paper_atlas.db.store import Store
from paper_atlas.db.backend import database_arguments, open_store
from paper_atlas.db.submissions import attach_submission,identities_for_row
from paper_atlas.collectors.pmlr_tracks import require_track_manifest, require_track_record
def queue_files(path):
@@ -18,14 +19,15 @@ def queue_files(path):
return files
def backfill(db,files):
def backfill(db,files, *, pg_service=None, pg_schema=None):
for filename in files:
manifest=json.loads(Path(filename).with_suffix('.manifest.json').read_text())
require_track_manifest(manifest)
if manifest['source'] in ('colm','neurips','iclr_program') and manifest.get('parser_version',0)<2:
raise ValueError('Recollect old parser output before submission evidence backfill')
store=Store(db);c=store.conn;count=0
before=c.execute('SELECT count(*) FROM submissions').fetchone()[0]
store=open_store(db,pg_service=pg_service,pg_schema=pg_schema);c=store.conn;count=0
try:
before=c.execute('SELECT count(*) FROM submissions').fetchone()[0]
for filename in files:
path=Path(filename);manifest=json.loads(path.with_suffix('.manifest.json').read_text());seen=set()
with path.open() as stream:
@@ -35,8 +37,9 @@ def backfill(db,files):
seen.add(row['external_id'])
if any(row.get(key)!=manifest.get(key) for key in ('source','venue','year','track')):
raise ValueError('Evidence row differs from edition manifest')
require_track_record(row, manifest)
record=c.execute('SELECT r.id,r.paper_id,r.metadata_json FROM source_records r JOIN sources s ON s.id=r.source_id WHERE s.name=? AND r.external_id=?',(row['source'],row['external_id'])).fetchone()
edition=c.execute('SELECT e.id FROM editions e JOIN venues v ON v.id=e.venue_id WHERE v.acronym=? COLLATE NOCASE AND e.year=? AND e.track=?',(row['venue'],row['year'],row['track'])).fetchone()
edition=c.execute('SELECT e.id FROM editions e JOIN venues v ON v.id=e.venue_id WHERE lower(v.acronym)=lower(?) AND e.year=? AND e.track=?',(row['venue'],row['year'],row['track'])).fetchone()
if not record or not edition:raise ValueError('Evidence backfill requires an already imported record and edition')
if not c.execute('SELECT 1 FROM submission_sources ss JOIN submissions s ON s.id=ss.submission_id WHERE ss.source_record_id=? AND ss.source_submission_id=? AND s.edition_id=?',(record[0],row['external_id'],edition[0])).fetchone():
raise ValueError('No existing submission to backfill')
@@ -59,8 +62,8 @@ def backfill(db,files):
def main(argv=None, *, prog=None):
parser=argparse.ArgumentParser(prog=prog);parser.add_argument('--db',required=True);parser.add_argument('--queue',required=True)
args=parser.parse_args(argv);backfill(args.db,queue_files(args.queue))
parser=argparse.ArgumentParser(prog=prog);database_arguments(parser);parser.add_argument('--queue',required=True)
args=parser.parse_args(argv);backfill(args.db,queue_files(args.queue),pg_service=args.pg_service,pg_schema=args.pg_schema)
if __name__ == '__main__':
+2
View File
@@ -15,6 +15,7 @@ from pathlib import Path
from paper_atlas.ingestion.records import ingest_file
from paper_atlas.db.store import Store
from paper_atlas.ingestion.backfill import backfill,queue_files
from paper_atlas.db.backend import require_sqlite_writable
UNIT='paper-atlas-arxiv-import.service'
@@ -25,6 +26,7 @@ def property_value(name):
def merge_locked(db,archive,files,backfill_queue=None):
require_sqlite_writable(db)
# Validate inputs before stopping the existing writer.
for filename in files:
path=Path(filename)
+203
View File
@@ -0,0 +1,203 @@
"""Move existing PMLR submission events to verified tracks without reimporting."""
import argparse
from contextlib import closing
import fcntl
import hashlib
import json
from pathlib import Path
import sqlite3
from paper_atlas.collectors.pmlr_tracks import require_track_manifest, require_track_record
from paper_atlas.db.submissions import identities_for_row, timestamp
def save(path, result):
part = path.with_suffix('.part')
part.write_text(json.dumps(result, ensure_ascii=False, indent=2) + '\n')
part.replace(path)
def load_inventories(paths):
scopes, seen, forums = [], set(), set()
for filename in paths:
path = Path(filename).resolve()
inventory = json.loads(path.read_text())
require_track_manifest(inventory)
if inventory.get('source') != 'pmlr' or inventory.get('venue') != 'ICML' or inventory.get('year', 0) < 2024:
raise ValueError('Only verified modern ICML PMLR volumes may be reclassified')
if not inventory.get('count') or not inventory.get('files'):
raise ValueError('A nonempty complete publication inventory is required')
rows, manifests = [], []
tracks = set()
for manifest in inventory['files']:
require_track_manifest(manifest)
if any(manifest.get(key) != inventory.get(key) for key in ('source', 'venue', 'year', 'volume', 'track_program')):
raise ValueError('Track manifest differs from volume inventory')
if manifest['track'] not in ('main', 'position') or manifest['track'] in tracks:
raise ValueError('Invalid or repeated track in volume inventory')
tracks.add(manifest['track'])
data = Path(manifest['file']).read_bytes()
if hashlib.sha256(data).hexdigest() != manifest.get('file_sha256'):
raise ValueError('Track file differs from its verified inventory')
chunk = [json.loads(line) for line in data.splitlines()]
if not chunk or len(chunk) != manifest['count']:
raise ValueError('Track inventory count mismatch')
for row in chunk:
if any(row.get(key) != manifest.get(key) for key in ('source', 'venue', 'year', 'track')):
raise ValueError('Record differs from its track manifest')
if not row['external_id'].startswith('v' + str(inventory['volume']) + '/') or row['status'] != 'accepted':
raise ValueError('Record is outside the accepted publication scope')
if row['external_id'] in seen:
raise ValueError('Repeated publication in reclassification inventory')
seen.add(row['external_id'])
require_track_record(row, manifest)
own_forum = row.get('identifiers', {}).get('openreview')
if not own_forum or (row['year'], own_forum) in forums:
raise ValueError('Missing or repeated forum identity in one ICML edition')
forums.add((row['year'], own_forum))
rows.extend(chunk); manifests.append(manifest)
if len(rows) != inventory['count']:
raise ValueError('Volume count differs from its track files')
scopes.append({'path': str(path), 'sha256': hashlib.sha256(path.read_bytes()).hexdigest(),
'inventory': inventory, 'manifests': manifests, 'rows': rows})
if not scopes:
raise ValueError('At least one complete volume inventory is required')
return scopes
def plan(c, scopes):
updates, changes = [], []
for scope in scopes:
volume = scope['inventory']['volume']
source_rows = c.execute('''SELECT r.id,r.external_id FROM source_records r JOIN sources src ON src.id=r.source_id
WHERE src.name='pmlr' AND r.external_id LIKE ?''', ('v' + str(volume) + '/%',)).fetchall()
if {r[1] for r in source_rows} != {r['external_id'] for r in scope['rows']}:
raise ValueError('Existing PMLR volume differs from the complete audited publication inventory')
for row in scope['rows']:
record = c.execute('''SELECT r.id,r.paper_id,r.title,r.abstract,r.authors_json,r.metadata_json FROM source_records r
JOIN sources src ON src.id=r.source_id WHERE src.name='pmlr' AND r.external_id=?''', (row['external_id'],)).fetchone()
if (record[2] != row['title'] or record[3] != row.get('abstract')
or json.loads(record[4]) != row.get('authors', [])):
raise ValueError('Reclassification must preserve existing publisher text and authors: ' + row['external_id'])
metadata = json.loads(record[5])
forum = str(metadata.get('openreview') or (metadata.get('record_identifiers') or {}).get('openreview') or '')
forum = forum.split('id=')[-1].split('&')[0]
if not forum or forum != row['identifiers'].get('openreview'):
raise ValueError('Publisher forum identity differs from retained source metadata')
events = c.execute('''SELECT s.id,s.paper_id,s.edition_id,e.venue_id,e.year,e.track,v.acronym,s.source_record_id,s.source_submission_id
FROM submission_sources ss JOIN submissions s ON s.id=ss.submission_id JOIN editions e ON e.id=s.edition_id
JOIN venues v ON v.id=e.venue_id WHERE ss.source_record_id=? AND ss.source_submission_id=?''',
(record[0], row['external_id'])).fetchall()
if len(events) != 1:
raise ValueError('Publication must have exactly one existing submission event')
event = events[0]
sid, paper, old_edition, venue, year, old_track, acronym, owner, external = event
if paper != record[1] or year != row['year'] or acronym.upper() != 'ICML' or old_track not in ('main', 'position'):
raise ValueError('Existing submission is outside this publication scope')
identities = c.execute('SELECT scheme,value FROM submission_identifiers WHERE submission_id=? ORDER BY scheme,value', (sid,)).fetchall()
own = identities_for_row(row)
if {value for scheme, value in identities if scheme == 'openreview'} - {forum}:
raise ValueError('Existing event has a conflicting forum identity')
target = c.execute('SELECT id FROM editions WHERE venue_id=? AND year=? AND track=?', (venue, year, row['track'])).fetchone()
if target:
for scheme, value in sorted(set(identities) | set(own)):
collision = c.execute('SELECT submission_id FROM submission_identifiers WHERE edition_id=? AND scheme=? AND value=?', (target[0], scheme, value)).fetchone()
if collision and collision[0] != sid:
raise ValueError('Target track already has another event for this identity; reconcile sources before moving')
if c.execute('SELECT 1 FROM submissions WHERE source_record_id=? AND source_submission_id=? AND edition_id=? AND id<>?', (owner, external, target[0], sid)).fetchone():
raise ValueError('Target track already has this publication event')
if old_track != row['track']:
links = c.execute('SELECT source_record_id,source_submission_id FROM submission_sources WHERE submission_id=?', (sid,)).fetchall()
if links != [(record[0], row['external_id'])] or owner != record[0] or external != row['external_id']:
raise ValueError('Moving an event shared by multiple sources requires a separate reconciliation')
decisions = c.execute('SELECT id,status,raw_value,evidence_url,observed_at,decision_date FROM decisions WHERE submission_id=? ORDER BY id', (sid,)).fetchall()
if not decisions or any(d[1] != 'accepted' for d in decisions):
raise ValueError('Moving a publication with conflicting decision history requires reconciliation')
changes.append({'submission_id': sid, 'source_record_id': record[0], 'external_id': row['external_id'],
'paper_id': paper, 'from_edition_id': old_edition, 'from_track': old_track,
'to_track': row['track'], 'year': year, 'before_identifiers': identities,
'before_decisions': decisions, 'track_evidence': row['metadata']['track_evidence']})
updates.append((row, record, event, own))
return updates, changes
def reclassify(db, inventories, out, apply=False):
db, out = Path(db).resolve(), Path(out).resolve()
if apply:
from paper_atlas.db.backend import require_sqlite_writable
require_sqlite_writable(db)
if not db.is_file() or out == db:
raise ValueError('Existing database and distinct report path required')
scopes = load_inventories(inventories)
inputs = {Path(scope['path']) for scope in scopes}
inputs.update(Path(m['file']).resolve() for scope in scopes for m in scope['manifests'])
inputs.update(Path(m['file']).with_suffix('.manifest.json').resolve() for scope in scopes for m in scope['manifests'])
if out in inputs:
raise ValueError('Report must preserve evidence inputs')
out.parent.mkdir(parents=True, exist_ok=True)
with Path(str(db) + '.maintenance.lock').open('a') as lock, Path(str(out) + '.lock').open('a') as output_lock:
fcntl.flock(lock, (fcntl.LOCK_EX if apply else fcntl.LOCK_SH) | fcntl.LOCK_NB)
fcntl.flock(output_lock, fcntl.LOCK_EX | fcntl.LOCK_NB)
if out.exists():
raise ValueError('Reclassification report exists; use a new path')
mode = 'rw' if apply else 'ro'
with closing(sqlite3.connect(db.as_uri() + '?mode=' + mode, uri=True)) as c:
c.execute('PRAGMA foreign_keys=ON'); c.execute('PRAGMA cache_size=-32768')
c.execute('BEGIN IMMEDIATE' if apply else 'BEGIN')
updates, changes = plan(c, scopes)
result = {'status': 'planned', 'db': str(db), 'started_at': timestamp(),
'records_verified': len(updates), 'events_to_move': len(changes), 'changes': changes,
'inputs': [{key: scope[key] for key in ('path', 'sha256')} for scope in scopes],
'note': 'Preserves paper/source/submission/decision IDs and all decision observations; no entity merges or text reimport.'}
save(out, result)
if not apply:
return result
try:
for row, record, event, own in updates:
sid, _, old_edition, venue, year, old_track, _, _, _ = event
c.execute('INSERT OR IGNORE INTO editions(venue_id,year,track) VALUES(?,?,?)', (venue, year, row['track']))
target = c.execute('SELECT id FROM editions WHERE venue_id=? AND year=? AND track=?', (venue, year, row['track'])).fetchone()[0]
if target != old_edition:
c.execute('UPDATE submission_identifiers SET edition_id=? WHERE submission_id=?', (target, sid))
c.execute('UPDATE submissions SET edition_id=? WHERE id=?', (target, sid))
for scheme, value in own:
c.execute('INSERT OR IGNORE INTO submission_identifiers VALUES(?,?,?,?)', (target, scheme, value, sid))
metadata = json.loads(record[5]); metadata.update(row['metadata'])
c.execute('UPDATE source_records SET metadata_json=? WHERE id=?', (json.dumps(metadata, ensure_ascii=False), record[0]))
for scope in scopes:
for m in scope['manifests']:
edition = c.execute('SELECT e.id FROM editions e JOIN venues v ON v.id=e.venue_id WHERE v.acronym=? COLLATE NOCASE AND e.year=? AND e.track=?', ('ICML', m['year'], m['track'])).fetchone()[0]
source = c.execute("SELECT id FROM sources WHERE name='pmlr'").fetchone()[0]
c.execute('''INSERT INTO edition_sources(edition_id,source_id,list_url,status,expected_count,imported_count,last_success_at)
VALUES(?,?,?,?,?,?,?) ON CONFLICT(edition_id,source_id,list_url) DO UPDATE SET status=excluded.status,
expected_count=excluded.expected_count,imported_count=excluded.imported_count,last_success_at=excluded.last_success_at,last_error=NULL''',
(edition, source, m['list_url'], 'partial' if m.get('missing_abstract_count') or m.get('status') == 'partial' else 'complete', m['count'], m['count'], timestamp()))
_, remaining = plan(c, scopes)
if remaining:
raise ValueError('Post-migration track comparison still has mismatches')
print(json.dumps({'stage': 'checking_foreign_keys', 'events_moved': len(changes)}), flush=True)
if c.execute('PRAGMA foreign_key_check').fetchone():
raise ValueError('Foreign key violations after track reclassification')
result.update(status='prepared', events_moved=len(changes))
save(out, result)
c.commit()
except BaseException as error:
c.rollback(); result.update(status='error', error=str(error)); save(out, result); raise
result.update(status='complete', finished_at=timestamp())
save(out, result)
return result
def main(argv=None, *, prog=None):
parser = argparse.ArgumentParser(prog=prog)
parser.add_argument('--db', required=True)
parser.add_argument('--inventory', action='append', required=True)
parser.add_argument('--out', required=True)
parser.add_argument('--apply', action='store_true', help='Apply the verified migration under an exclusive maintenance lock')
args = parser.parse_args(argv)
result = reclassify(args.db, args.inventory, args.out, args.apply)
print(json.dumps({key: value for key, value in result.items() if key != 'changes'}), flush=True)
if __name__ == '__main__':
main()
+26 -14
View File
@@ -1,41 +1,50 @@
"""Import normalized conference JSONL files with coverage evidence."""
import argparse
import hashlib
import json
import time
from pathlib import Path
from paper_atlas.db.store import Store
from paper_atlas.db.backend import database_arguments, open_store, inserted_id
from paper_atlas.db.submissions import identities_for_row,timestamp
from paper_atlas.collectors.pmlr_tracks import require_track_manifest, require_track_record
from paper_atlas.collectors.public_openreview import SOURCE as PUBLIC_SOURCE
from paper_atlas.collectors.icml_public_archive import SOURCE as ARCHIVE_SOURCE
def ingest_file(db,path):
def ingest_file(db,path, *, pg_service=None, pg_schema=None):
path = Path(path)
manifest_path = path.with_suffix('.manifest.json')
manifest = json.loads(manifest_path.read_text()) if manifest_path.exists() else {}
require_track_manifest(manifest)
if manifest.get('source') in ('colm','neurips') and manifest.get('parser_version',0)<2:
raise ValueError('Recollect proceedings with parser_version>=2 before identity matching')
if manifest.get('source')=='iclr_program' and manifest.get('parser_version',0)<2:
raise ValueError('Recollect ICLR with parser_version>=2 before submission identity matching')
store = Store(db)
c = store.conn
source_name = manifest.get('source')
if not source_name:
raise ValueError('A source manifest is required')
source_id = store.source(source_name,manifest['list_url'])
run = c.execute('INSERT INTO ingest_runs(source_id,checkpoint_json) VALUES(?,?)',(source_id,json.dumps({'file':str(path)}))).lastrowid
c.commit()
store = open_store(db, pg_service=pg_service, pg_schema=pg_schema)
c = store.conn
run = None
count = 0
missing_abstracts = 0
seen = set()
editions = set()
try:
with path.open() as stream:
source_id = store.source(source_name,manifest['list_url'])
run = inserted_id(c,'INSERT INTO ingest_runs(source_id,checkpoint_json) VALUES(?,?)',(source_id,json.dumps({'file':str(path),'expected_sha256':manifest.get('file_sha256')})))
c.commit()
digest = hashlib.sha256()
with path.open('rb') as stream:
for line in stream:
digest.update(line)
row = json.loads(line)
if row['source'] != source_name:
raise ValueError('Source differs from manifest')
if any(key in manifest and manifest[key]!=row[key] for key in ('venue','year','track')):
raise ValueError('Conference edition differs from manifest')
require_track_record(row, manifest)
external = row['external_id']
if external in seen:
raise ValueError('Duplicate external ID in one collected file: '+external)
@@ -56,7 +65,7 @@ def ingest_file(db,path):
status=event['status']
if events and status is None:raise ValueError('Explicit decision event requires a status')
if status is not None and status not in ('accepted','rejected','desk_rejected','withdrawn','under_review','unknown'):raise ValueError('Unsupported decision event')
edition=store.decision(paper,record,row['venue'],row['year'],row['track'],external,event.get('evidence_url',row['url']),status,event.get('raw_value',''),row.get('venue_aliases'),identities=identities,observed_at=event.get('observed_at') or row_observed,decision_date=event.get('decision_date'),source_decision_id=event.get('source_decision_id',''),submitted_at=row.get('submitted_at'))
edition=store.decision(paper,record,row['venue'],row['year'],row['track'],external,event.get('evidence_url',row['url']),status,event.get('raw_value',''),row.get('venue_aliases'),identities=identities,observed_at=event.get('observed_at') or row_observed,decision_date=event.get('decision_date'),source_decision_id=event.get('source_decision_id',''),submitted_at=row.get('submitted_at'),guard_status=source_name in (PUBLIC_SOURCE,ARCHIVE_SOURCE))
editions.add(edition)
else:
raise ValueError('This importer requires an explicit supported decision status')
@@ -64,6 +73,8 @@ def ingest_file(db,path):
missing_abstracts += not bool((row.get('abstract') or '').strip())
if not count:
raise ValueError('Empty metadata file')
if manifest.get('file_sha256') and digest.hexdigest() != manifest['file_sha256']:
raise ValueError('Collected file hash differs from manifest')
if len(editions) != 1:
raise ValueError('A manifest must describe exactly one conference edition and track')
edition = next(iter(editions))
@@ -72,13 +83,14 @@ def ingest_file(db,path):
raise ValueError(f'Manifest count {expected} differs from records {count}')
complete=expected==count and manifest.get('status') not in ('partial','blocked') and not manifest.get('missing_abstract_count',0) and not missing_abstracts
c.execute('INSERT INTO edition_sources(edition_id,source_id,list_url,status,expected_count,imported_count,last_success_at) VALUES(?,?,?,?,?,?,?) ON CONFLICT(edition_id,source_id,list_url) DO UPDATE SET status=excluded.status,expected_count=excluded.expected_count,imported_count=excluded.imported_count,last_success_at=excluded.last_success_at,last_error=NULL',(edition,source_id,manifest['list_url'],'complete' if complete else 'partial',expected,count,time.strftime('%Y-%m-%dT%H:%M:%SZ',time.gmtime())))
c.execute("UPDATE ingest_runs SET status='complete',finished_at=CURRENT_TIMESTAMP,records_seen=?,records_written=? WHERE id=?",(count,count,run))
c.execute("UPDATE ingest_runs SET status='complete',finished_at=?,records_seen=?,records_written=?,checkpoint_json=? WHERE id=?",(timestamp(),count,count,json.dumps({'file':str(path),'file_sha256':digest.hexdigest()}),run))
c.commit()
print(json.dumps({'file':str(path),'status':'imported','records':count,'missing_abstract_count':missing_abstracts}),flush=True)
except BaseException as exc:
c.rollback()
c.execute("UPDATE ingest_runs SET status='failed',finished_at=CURRENT_TIMESTAMP,error=? WHERE id=?",(str(exc),run))
c.commit()
if run is not None:
c.execute("UPDATE ingest_runs SET status='failed',finished_at=?,records_seen=?,records_written=0,error=? WHERE id=?",(timestamp(),count,str(exc),run))
c.commit()
raise
finally:
c.close()
@@ -86,11 +98,11 @@ def ingest_file(db,path):
def main(argv=None, *, prog=None):
parser = argparse.ArgumentParser(prog=prog)
parser.add_argument('--db',required=True)
database_arguments(parser)
parser.add_argument('files',nargs='+')
args = parser.parse_args(argv)
for filename in args.files:
ingest_file(args.db,filename)
ingest_file(args.db,filename,pg_service=args.pg_service,pg_schema=args.pg_schema)
if __name__ == '__main__':
+13
View File
@@ -0,0 +1,13 @@
"""Stable identities from publisher-owned metadata self-links."""
import re
from urllib.parse import urlsplit
def mlsys_id(url):
parsed = urlsplit(url)
if parsed.scheme not in ('https', 'http') or parsed.netloc != 'proceedings.mlsys.org':
return None
match = re.fullmatch(r'/paper(?:_files/paper)?/((?:19|20)\d{2})/hash/([a-f0-9]{32})-Abstract(?:-(?:Conference|mlsys(20\d{2})))?\.html', parsed.path)
if not match or match[3] and match[3] != match[1]:
return None
return match[1] + '/' + match[2]
+1
View File
@@ -0,0 +1 @@
"""PostgreSQL migration and read access for the paper index."""
+96
View File
@@ -0,0 +1,96 @@
"""Libpq service connections; credentials never belong in CLI arguments."""
from collections.abc import Mapping
import re
from paper_atlas.postgres import text
SEARCH_VECTOR = "to_tsvector('english'::regconfig,coalesce(title,'') || ' ' || coalesce(abstract,''))"
def driver():
try:
import psycopg
except ImportError as error:
raise RuntimeError('Install paper-atlas[postgres] on the approved remote runner') from error
return psycopg
def connect(service, *, readonly=False):
if not re.fullmatch(r'[A-Za-z0-9_-]+', service):
raise ValueError('Use a libpq service name, never a password or connection URL')
connection = driver().connect(service=service, connect_timeout=15, autocommit=True,
application_name='paper-atlas')
connection.execute("SET timezone='UTC'")
connection.execute("SET lock_timeout='5s'")
connection.execute("SET work_mem='2MB'")
connection.execute("SET maintenance_work_mem='16MB'")
connection.execute('SET max_parallel_workers_per_gather=0')
connection.execute('SET max_parallel_maintenance_workers=0')
if readonly:
connection.execute('BEGIN ISOLATION LEVEL REPEATABLE READ READ ONLY')
return connection
class Row(Mapping):
"""The small mapping/positional interface used by existing query output."""
def __init__(self, columns, values):
self.columns, self.values = columns, values
def __getitem__(self, key):
return self.values[key if isinstance(key, int) else self.columns.index(key)]
def __iter__(self):
return iter(self.columns)
def __len__(self):
return len(self.columns)
def row_factory(cursor, *, encoded=False):
columns = [column.name for column in cursor.description] if cursor.description else []
return lambda values: Row(columns, tuple(map(text.decode, values)) if encoded else values)
class ReadConnection:
postgres = True
def __init__(self, service, schema=None):
if schema is not None and not re.fullmatch(r'[a-z][a-z0-9_]{0,35}', schema):
raise ValueError('Invalid schema name')
self.connection = connect(service, readonly=True)
from paper_atlas.postgres.schema import quote
if schema is not None:
self.connection.execute('SET LOCAL search_path TO ' + quote(schema) + ',pg_catalog')
if not self.has_table('papers'):
self.close()
raise RuntimeError('PostgreSQL publication is not ready in the configured search_path')
current = self.connection.execute('SELECT current_schema()').fetchone()[0]
# Schema comments are readable by other projects granted table access;
# consumers need no privileges on the private migration controller.
annotation = self.connection.execute("SELECT obj_description(oid,'pg_namespace') FROM pg_namespace WHERE nspname=%s", (current,)).fetchone()[0]
self.encoded = False
if annotation and annotation.startswith('paper-atlas:text-codec='):
codec = annotation.removeprefix('paper-atlas:text-codec=')
if codec != text.CODEC:
self.close()
raise RuntimeError('Unsupported PostgreSQL text storage codec')
self.encoded = codec == text.CODEC
self.connection.row_factory = lambda cursor: row_factory(cursor, encoded=self.encoded)
def execute(self, query, params=()):
# All caller SQL is static; user values are always bound parameters.
if 'sqlite_master' in query:
match = re.search(r"name='([a-z_]+)'", query)
if not match or match[1] not in ('decision_sources', 'submission_sources', 'venue_aliases'):
raise ValueError('Unsupported legacy table lookup')
return self.connection.execute('''SELECT 1 FROM information_schema.tables
WHERE table_schema=current_schema() AND table_name=%s''',
(match[1],))
values = tuple(map(text.encode, params)) if self.encoded else params
return self.connection.execute(query.replace('?', '%s'), values)
def has_table(self, name):
return bool(self.connection.execute('''SELECT 1 FROM information_schema.tables
WHERE table_schema=current_schema() AND table_name=%s''', (name,)).fetchone())
def close(self):
self.connection.close()
+279
View File
@@ -0,0 +1,279 @@
"""Resumable, unpublished COPY followed by complete ordered content verification."""
import argparse
from contextlib import closing
import fcntl
import hashlib
import json
from pathlib import Path
import re
import shutil
import sqlite3
import uuid
import zlib
from paper_atlas.db.submissions import timestamp
from paper_atlas.postgres.client import connect, SEARCH_VECTOR
from paper_atlas.postgres.schema import TABLES, inspect, fingerprint, quote, select_sql, table_sql
from paper_atlas.postgres import text
def digest_file(path):
digest = hashlib.sha256()
with path.open('rb') as stream:
while block := stream.read(8 * 1024 ** 2):
digest.update(block)
return digest.hexdigest()
def update_hash(digest, row):
# Raw JSON columns remain text: whitespace, escapes and source evidence survive.
data = json.dumps(tuple(row), ensure_ascii=False, separators=(',', ':')).encode()
digest.update(len(data).to_bytes(8, 'big')); digest.update(data)
def save(path, result):
path.parent.mkdir(parents=True, exist_ok=True)
part = path.with_suffix(path.suffix + '.part')
part.write_text(json.dumps(result, ensure_ascii=False, indent=2) + '\n')
part.replace(path)
def free_space(path, minimum):
if path and shutil.disk_usage(path).free < minimum * 1024 ** 3:
raise RuntimeError('Migration storage headroom fell below the configured minimum')
def qualify(schema, table):
return quote(schema) + '.' + quote(table)
def add_constraints(pg, stage, plan):
def constraint(table, name, clause):
exists = pg.execute('''SELECT 1 FROM pg_constraint co JOIN pg_class cl ON cl.oid=co.conrelid
JOIN pg_namespace ns ON ns.oid=cl.relnamespace WHERE ns.nspname=%s AND cl.relname=%s AND co.conname=%s''',
(stage, table, name)).fetchone()
if not exists:
pg.execute('ALTER TABLE ' + qualify(stage, table) + ' ADD CONSTRAINT ' + quote(name) + ' ' + clause)
for table, spec in plan.items():
constraint(table, table + '_pkey', 'PRIMARY KEY (' + ','.join(map(quote, spec['pk'])) + ')')
for number, index in enumerate(spec['indexes']):
if index['origin'] == 'u':
constraint(table, table + '_unique_' + str(number), 'UNIQUE (' + ','.join(quote(n) for n, desc in index['terms']) + ')')
else:
terms = ','.join(quote(n) + (' DESC' if desc else '') for n, desc in index['terms'])
pg.execute('CREATE ' + ('UNIQUE ' if index['unique'] else '') + 'INDEX IF NOT EXISTS ' +
quote(index['name']) + ' ON ' + qualify(stage, table) + '(' + terms + ')')
for table, spec in plan.items():
for number, fk in enumerate(spec['foreign_keys']):
clause = ('FOREIGN KEY (' + ','.join(map(quote, fk['columns'])) + ') REFERENCES ' +
qualify(stage, fk['table']) + '(' + ','.join(map(quote, fk['references'])) + ') NOT VALID')
constraint(table, table + '_fk_' + str(number), clause)
for number, check in enumerate(spec['checks']):
constraint(table, table + '_check_' + str(number), 'CHECK (' + check + ') NOT VALID')
constraints = pg.execute('''SELECT cl.relname,co.conname FROM pg_constraint co
JOIN pg_class cl ON cl.oid=co.conrelid JOIN pg_namespace ns ON ns.oid=cl.relnamespace
WHERE ns.nspname=%s AND NOT co.convalidated ORDER BY cl.relname,co.conname''', (stage,)).fetchall()
for table, name in constraints:
pg.execute('ALTER TABLE ' + qualify(stage, table) + ' VALIDATE CONSTRAINT ' + quote(name))
def sequences(pg, source, stage, plan):
old = dict(source.execute('SELECT name,seq FROM sqlite_sequence'))
history = {'papers': ('paper_merges', 'former_paper_id'),
'submissions': ('submission_merges', 'former_submission_id'),
'decisions': ('decision_merges', 'former_decision_id')}
result = {}
for table, spec in plan.items():
if spec['pk'] != ['id']:
continue
value = max(source.execute('SELECT coalesce(max(id),0) FROM ' + quote(table)).fetchone()[0], old.get(table, 0))
if table in history:
audit, column = history[table]
value = max(value, source.execute('SELECT coalesce(max(' + quote(column) + '),0) FROM ' + quote(audit)).fetchone()[0])
sequence = pg.execute('SELECT pg_get_serial_sequence(%s,%s)', (qualify(stage, table), 'id')).fetchone()[0]
pg.execute('SELECT setval(%s,%s,%s)', (sequence, max(value, 1), value > 0))
result[table] = value
return result
def upgrade_text_codec(pg, control, stage, plan):
"""Upgrade committed legacy staging rows once; never recopy their source."""
changed = {}
with pg.transaction():
copied = {r[0] for r in pg.execute('SELECT name FROM ' + qualify(control, 'tables'))}
if not copied <= plan.keys():
raise ValueError('Unknown committed staging tables')
# An older run may have reached constraint validation. Replacing SOH
# can temporarily equal another legacy key even though the final mapping
# is bijective. Rebuild unpublished constraints/indexes after the upgrade.
constraints = pg.execute('''SELECT cl.relname,co.conname FROM pg_constraint co
JOIN pg_class cl ON cl.oid=co.conrelid JOIN pg_namespace ns ON ns.oid=cl.relnamespace
WHERE ns.nspname=%s AND co.contype IN ('f','p','u')
ORDER BY CASE WHEN co.contype='f' THEN 0 ELSE 1 END''', (stage,)).fetchall()
for table, name in constraints:
pg.execute('ALTER TABLE ' + qualify(stage, table) + ' DROP CONSTRAINT ' + quote(name))
indexes = pg.execute('''SELECT cl.relname FROM pg_index i JOIN pg_class cl ON cl.oid=i.indexrelid
JOIN pg_namespace ns ON ns.oid=cl.relnamespace WHERE ns.nspname=%s AND i.indisunique''', (stage,)).fetchall()
for name, in indexes:
pg.execute('DROP INDEX ' + qualify(stage, name))
for table in plan:
if table not in copied:
continue
columns = [quote(c['name']) for c in plan[table]['columns'] if c['type'] == 'TEXT']
if columns:
assignments = ','.join(c + '=replace(' + c + ',%s,%s)' for c in columns)
predicate = ' OR '.join('strpos(' + c + ',%s)>0' for c in columns)
params = [v for c in columns for v in (text.ESCAPE, text.encode(text.ESCAPE))]
params += [text.ESCAPE] * len(columns)
changed[table] = pg.execute('UPDATE ' + qualify(stage, table) + ' SET ' + assignments +
' WHERE ' + predicate, params).rowcount
pg.execute('UPDATE ' + qualify(control, 'run') + ' SET text_codec=%s WHERE id=1', (text.CODEC,))
return changed
def migrate(db, service, out, *, schema='research', storage_path=None, min_free_gib=8):
if not re.fullmatch(r'[a-z][a-z0-9_]{0,35}', schema):
raise ValueError('Use a short lowercase target schema name')
db, out = Path(db).resolve(), Path(out).resolve()
if not db.is_file() or out == db:
raise ValueError('Existing source and a distinct report are required')
if out.exists() and json.loads(out.read_text()).get('status') == 'complete':
raise ValueError('Completed report must be preserved')
free_space(storage_path, min_free_gib)
control = schema + '_migration'
report = {'status': 'preflight', 'source': str(db), 'service': service, 'schema': schema,
'started_at': timestamp(), 'tables': {}, 'scope': 'All 21 business tables; FTS5 internals rebuilt as native PostgreSQL GIN.'}
with Path(str(db) + '.maintenance.lock').open('a') as lock:
fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB)
if Path(str(db) + '-wal').exists() and Path(str(db) + '-wal').stat().st_size:
raise ValueError('Freeze writers and checkpoint SQLite WAL before migrating')
with closing(sqlite3.connect(db.as_uri() + '?mode=ro', uri=True)) as source, closing(connect(service)) as pg:
source.execute('PRAGMA query_only=ON'); source.execute('PRAGMA cache_size=-16384'); source.execute('BEGIN')
plan = inspect(source)
stat = db.stat()
identity = {'file_sha256': digest_file(db), 'bytes': stat.st_size, 'mtime_ns': stat.st_mtime_ns,
'schema_sha256': fingerprint(plan)}
report['source_identity'] = identity
advisory = zlib.crc32(schema.encode()) & 0x7fffffff
if not pg.execute('SELECT pg_try_advisory_lock(%s,%s)', (615173, advisory)).fetchone()[0]:
raise RuntimeError('Another migration holds the target lock')
if pg.execute('SELECT 1 FROM pg_namespace WHERE nspname=%s', (schema,)).fetchone():
raise ValueError('Target schema already exists; published data will never be overwritten')
pg.execute('CREATE SCHEMA IF NOT EXISTS ' + quote(control))
pg.execute('CREATE TABLE IF NOT EXISTS ' + qualify(control, 'run') +
'(id INTEGER PRIMARY KEY CHECK(id=1), source_json TEXT NOT NULL, stage TEXT NOT NULL, status TEXT NOT NULL)')
pg.execute('CREATE TABLE IF NOT EXISTS ' + qualify(control, 'tables') +
'(name TEXT PRIMARY KEY, rows BIGINT NOT NULL, sha256 TEXT NOT NULL, verified BOOLEAN NOT NULL DEFAULT false)')
pg.execute('ALTER TABLE ' + qualify(control, 'run') + " ADD COLUMN IF NOT EXISTS text_codec TEXT NOT NULL DEFAULT 'legacy'")
run = pg.execute('SELECT source_json,stage,status,text_codec FROM ' + qualify(control, 'run') + ' WHERE id=1').fetchone()
if run:
if json.loads(run[0]) != identity or run[2] == 'complete':
raise ValueError('Resume requires the exact same unpublished SQLite snapshot')
stage = run[1]
if run[3] == 'legacy':
report['legacy_text_upgrade_rows'] = upgrade_text_codec(pg, control, stage, plan)
elif run[3] != text.CODEC:
raise ValueError('Unsupported staging text storage codec')
else:
stage = schema + '_stage_' + uuid.uuid4().hex[:12]
with pg.transaction():
pg.execute('CREATE SCHEMA ' + quote(stage))
for table, spec in plan.items():
pg.execute(table_sql(stage, table, spec))
pg.execute('INSERT INTO ' + qualify(control, 'run') +
'(id,source_json,stage,status,text_codec) VALUES(1,%s,%s,%s,%s)',
(json.dumps(identity, sort_keys=True), stage, 'copying', text.CODEC))
report.update(status='copying', stage=stage, text_codec=text.CODEC,
content_hash_scope='Decoded original SQLite values; storage escapes are reversible.')
save(out, report)
try:
for table, spec in plan.items():
free_space(storage_path, min_free_gib)
previous = pg.execute('SELECT rows,sha256 FROM ' + qualify(control, 'tables') + ' WHERE name=%s', (table,)).fetchone()
if previous:
rows, digest = previous
else:
digest = hashlib.sha256(); rows = 0
with pg.transaction():
# Only this run's unpublished, incomplete table can be reset.
pg.execute('TRUNCATE ' + qualify(stage, table))
columns = ','.join(quote(c['name']) for c in spec['columns'])
with pg.cursor().copy('COPY ' + qualify(stage, table) + '(' + columns + ') FROM STDIN') as copy:
for row in source.execute(select_sql(None, table, spec)):
copy.write_row(tuple(map(text.encode, row))); update_hash(digest, row); rows += 1
if rows % 10000 == 0:
free_space(storage_path, min_free_gib)
if rows % 100000 == 0:
print(json.dumps({'stage': 'copying', 'table': table, 'rows': rows}), flush=True)
digest = digest.hexdigest()
pg.execute('INSERT INTO ' + qualify(control, 'tables') + '(name,rows,sha256) VALUES(%s,%s,%s)', (table, rows, digest))
report['tables'][table] = {'source_rows': rows, 'source_sha256': digest}
save(out, report)
print(json.dumps({'stage': 'copied', 'table': table, 'rows': rows}), flush=True)
report['status'] = 'validating_constraints'; save(out, report)
add_constraints(pg, stage, plan)
report['sequences'] = sequences(pg, source, stage, plan)
report['status'] = 'verifying_contents'; save(out, report)
for table, spec in plan.items():
digest = hashlib.sha256(); storage_digest = hashlib.sha256(); rows = 0
with pg.transaction(), pg.cursor(name='verify_' + table) as cursor:
cursor.itersize = 512
cursor.execute(select_sql(stage, table, spec))
for row in cursor:
update_hash(storage_digest, row)
update_hash(digest, tuple(map(text.decode, row))); rows += 1
entry = report['tables'][table]
entry.update(target_rows=rows, target_sha256=digest.hexdigest(),
target_storage_sha256=storage_digest.hexdigest())
if rows != entry['source_rows'] or digest.hexdigest() != entry['source_sha256']:
raise ValueError('Complete content verification failed for ' + table)
pg.execute('UPDATE ' + qualify(control, 'tables') + ' SET verified=true WHERE name=%s', (table,))
save(out, report)
print(json.dumps({'stage': 'verified', 'table': table, 'rows': rows}), flush=True)
report['status'] = 'building_search_index'; save(out, report)
free_space(storage_path, min_free_gib)
pg.execute('CREATE INDEX IF NOT EXISTS papers_search_gin ON ' + qualify(stage, 'papers') + ' USING gin (' + SEARCH_VECTOR + ')')
search = pg.execute('''SELECT am.amname,i.indisvalid,i.indisready,t.relname
FROM pg_index i JOIN pg_class ix ON ix.oid=i.indexrelid
JOIN pg_class t ON t.oid=i.indrelid JOIN pg_namespace ns ON ns.oid=ix.relnamespace
JOIN pg_am am ON am.oid=ix.relam WHERE ns.nspname=%s AND ix.relname='papers_search_gin' ''', (stage,)).fetchone()
if search != ('gin', True, True, 'papers'):
raise ValueError('Native full-text index is not valid and ready')
for table in TABLES:
pg.execute('ANALYZE ' + qualify(stage, table))
invalid = pg.execute('''SELECT count(*) FROM pg_constraint co JOIN pg_class cl ON cl.oid=co.conrelid
JOIN pg_namespace ns ON ns.oid=cl.relnamespace WHERE ns.nspname=%s AND NOT co.convalidated''', (stage,)).fetchone()[0]
if invalid:
raise ValueError('Unvalidated constraints remain')
if (db.stat().st_size, db.stat().st_mtime_ns) != (identity['bytes'], identity['mtime_ns']):
raise ValueError('Source changed during migration')
if Path(str(db) + '-wal').exists() and Path(str(db) + '-wal').stat().st_size:
raise ValueError('A source writer committed during migration')
report.update(status='prepared', foreign_keys='all_validated', checks='all_validated', native_search_index=True)
save(out, report)
with pg.transaction():
pg.execute('COMMENT ON SCHEMA ' + quote(stage) + " IS 'paper-atlas:text-codec=" + text.CODEC + "'")
pg.execute('ALTER SCHEMA ' + quote(stage) + ' RENAME TO ' + quote(schema))
pg.execute('UPDATE ' + qualify(control, 'run') + " SET status='complete' WHERE id=1")
report.update(status='complete', finished_at=timestamp())
save(out, report)
return report
except BaseException as error:
report.update(status='error', error_type=type(error).__name__, error=str(error), failed_at=timestamp())
save(out, report)
raise
def main(argv=None, *, prog=None):
parser = argparse.ArgumentParser(prog=prog)
parser.add_argument('--db', required=True, help='Frozen SQLite source')
parser.add_argument('--pg-service', required=True, help='Protected libpq service name')
parser.add_argument('--schema', default='research')
parser.add_argument('--out', required=True)
parser.add_argument('--storage-path', help='Target filesystem path for free-space checks')
parser.add_argument('--min-free-gib', type=float, default=8)
args = parser.parse_args(argv)
result = migrate(args.db, args.pg_service, args.out, schema=args.schema,
storage_path=args.storage_path, min_free_gib=args.min_free_gib)
print(json.dumps(result, ensure_ascii=False), flush=True)
+120
View File
@@ -0,0 +1,120 @@
"""Inspect the complete business schema; rebuild SQLite engine internals natively."""
import hashlib
import json
import re
TABLES = ('sources', 'papers', 'identifiers', 'source_records', 'venues', 'editions',
'venue_aliases', 'edition_sources', 'submissions', 'decisions',
'submission_sources', 'submission_identifiers', 'decision_sources',
'submission_merges', 'decision_merges', 'schema_migrations', 'tags',
'paper_tags', 'match_candidates', 'paper_merges', 'ingest_runs')
CHECKS = {
'venues': ["venue_type IN ('conference','journal','review_platform')"],
'edition_sources': ["status IN ('pending','running','complete','partial','blocked','unavailable','not_yet_published')"],
'decisions': ["status IN ('accepted','rejected','desk_rejected','withdrawn','under_review','unknown')"],
'match_candidates': ["status IN ('pending','merged','distinct')"],
}
TYPES = {'INTEGER': 'BIGINT', 'TEXT': 'TEXT COLLATE "C"', 'REAL': 'DOUBLE PRECISION'}
def checks_in(ddl):
result = []
for match in re.finditer(r'\bCHECK\s*\(', ddl, re.I):
start = position = match.end()
depth, quoted = 1, False
while position < len(ddl) and depth:
char = ddl[position]
if char == "'":
if quoted and position + 1 < len(ddl) and ddl[position + 1] == "'":
position += 2; continue
quoted = not quoted
elif not quoted:
depth += (char == '(') - (char == ')')
position += 1
if depth:
raise ValueError('Unclosed CHECK constraint')
result.append(ddl[start:position - 1])
return result
def normalize_check(expression):
# Normalize SQL layout/keywords, retaining case and spaces inside literals.
tokens = re.findall(r"'(?:[^']|'')*'|[^']+", expression)
return ''.join(token if token.startswith("'") else re.sub(r'\s+', '', token).lower() for token in tokens)
def quote(name):
return '"' + name.replace('"', '""') + '"'
def inspect(connection):
business = {name for schema, name, kind, *_ in connection.execute('PRAGMA table_list')
if schema == 'main' and kind == 'table' and not name.startswith('sqlite_')}
if business != set(TABLES):
raise ValueError('Unexpected business tables: ' + repr(sorted(business ^ set(TABLES))))
result = {}
for table in TABLES:
columns = [{'name': r[1], 'type': r[2].upper(), 'notnull': bool(r[3]),
'default': r[4], 'pk': r[5]}
for r in connection.execute('PRAGMA table_info(' + quote(table) + ')')]
if any(c['type'] not in TYPES for c in columns):
raise ValueError('Unsupported storage type in ' + table)
pk = [c['name'] for c in sorted(columns, key=lambda c: c['pk']) if c['pk']]
if not pk:
raise ValueError('A deterministic primary key is required for ' + table)
indexes = []
for row in connection.execute('PRAGMA index_list(' + quote(table) + ')'):
if row[3] == 'pk':
continue
if row[4]:
raise ValueError('Partial indexes require explicit migration support')
terms = [(r[2], bool(r[3]), r[4]) for r in connection.execute('PRAGMA index_xinfo(' + quote(row[1]) + ')') if r[5]]
if any(name is None or coll != 'BINARY' for name, desc, coll in terms):
raise ValueError('Unsupported expression or collation in ' + table)
indexes.append({'name': row[1], 'unique': bool(row[2]), 'origin': row[3],
'terms': [(name, desc) for name, desc, coll in terms]})
fks = {}
for row in connection.execute('PRAGMA foreign_key_list(' + quote(table) + ')'):
if row[5:7] != ('NO ACTION', 'NO ACTION'):
raise ValueError('Unsupported foreign key actions')
fk = fks.setdefault(row[0], {'table': row[2], 'columns': [], 'references': []})
fk['columns'].append(row[3]); fk['references'].append(row[4])
ddl = connection.execute("SELECT sql FROM sqlite_schema WHERE type='table' AND name=?", (table,)).fetchone()[0]
checks = CHECKS.get(table, [])
if sorted(map(normalize_check, checks_in(ddl))) != sorted(map(normalize_check, checks)):
raise ValueError('Unrecognized CHECK constraint in ' + table)
result[table] = {'columns': columns, 'pk': pk, 'indexes': indexes,
'foreign_keys': list(fks.values()), 'checks': checks}
return result
def fingerprint(plan):
return hashlib.sha256(json.dumps(plan, sort_keys=True, separators=(',', ':')).encode()).hexdigest()
def default_sql(value):
if value is None:
return ''
if value.upper() == 'CURRENT_TIMESTAMP':
return " DEFAULT to_char(CURRENT_TIMESTAMP AT TIME ZONE 'UTC','YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"')"
if re.fullmatch(r'-?\d+|\'(?:[^\']|\'\')*\'', value):
return ' DEFAULT ' + value
raise ValueError('Unsupported column default')
def table_sql(schema, table, spec):
columns = []
for column in spec['columns']:
generated = column['name'] == 'id' and spec['pk'] == ['id'] and column['type'] == 'INTEGER'
value = quote(column['name']) + ' ' + TYPES[column['type']]
value += ' GENERATED BY DEFAULT AS IDENTITY' if generated else default_sql(column['default'])
if column['notnull']:
value += ' NOT NULL'
columns.append(value)
return 'CREATE TABLE ' + quote(schema) + '.' + quote(table) + '(' + ','.join(columns) + ')'
def select_sql(schema, table, spec):
prefix = quote(schema) + '.' if schema else ''
return ('SELECT ' + ','.join(quote(c['name']) for c in spec['columns']) +
' FROM ' + prefix + quote(table) + ' ORDER BY ' + ','.join(quote(c) for c in spec['pk']))
+31
View File
@@ -0,0 +1,31 @@
"""Order-preserving, reversible storage for SQLite text containing NUL.
PostgreSQL text forbids U+0000. Encode it as SOH/SOH, and encode a literal
SOH as SOH/STX. All other characters stay unchanged. The mapping preserves
binary lexicographic order, including string prefixes and composite keys.
"""
CODEC = 'nul-soh-v1'
ESCAPE = '\x01'
def encode(value):
if isinstance(value, str):
return value.replace(ESCAPE, ESCAPE + '\x02').replace('\x00', ESCAPE + ESCAPE)
return value
def decode(value):
if not isinstance(value, str) or ESCAPE not in value:
return value
result = []
start = 0
while (position := value.find(ESCAPE, start)) >= 0:
result.append(value[start:position])
following = value[position + 1:position + 2]
if following not in (ESCAPE, '\x02'):
raise ValueError('Invalid nul-soh-v1 text escape')
result.append('\x00' if following == ESCAPE else ESCAPE)
start = position + 2
result.append(value[start:])
return ''.join(result)
+87
View File
@@ -0,0 +1,87 @@
"""Native transactional writes reusing the shared identity/provenance policy."""
import re
import zlib
from paper_atlas.db.store import Store
from paper_atlas.postgres import text
from paper_atlas.postgres.client import connect
from paper_atlas.postgres.schema import TABLES, quote
class Result:
def __init__(self, cursor):
self.cursor = cursor
def fetchone(self):
row = self.cursor.fetchone()
return tuple(map(text.decode, row)) if row is not None else None
def fetchall(self):
return [tuple(map(text.decode, row)) for row in self.cursor.fetchall()]
def __iter__(self):
return (tuple(map(text.decode, row)) for row in self.cursor)
@property
def rowcount(self):
return self.cursor.rowcount
class WriteConnection:
postgres = True
def __init__(self, service, schema=None):
self.connection = connect(service)
try:
if schema is None:
schema = self.connection.execute('SELECT current_schema()').fetchone()[0]
if not isinstance(schema, str) or not re.fullmatch(r'[a-z][a-z0-9_]{0,35}', schema):
raise ValueError('Invalid PostgreSQL write schema')
annotation = self.connection.execute("SELECT obj_description(oid,'pg_namespace') FROM pg_namespace WHERE nspname=%s", (schema,)).fetchone()
if not annotation or annotation[0] != 'paper-atlas:text-codec=' + text.CODEC:
raise RuntimeError('Writes require a published dataset with the supported text codec')
tables = {r[0] for r in self.connection.execute("SELECT table_name FROM information_schema.tables WHERE table_schema=%s AND table_type='BASE TABLE'", (schema,))}
if not set(TABLES) <= tables:
raise RuntimeError('Published business tables are incomplete or inaccessible')
if not self.connection.execute('SELECT pg_try_advisory_lock(%s,%s)', (615174, zlib.crc32(schema.encode()) & 0x7fffffff)).fetchone()[0]:
raise RuntimeError('Another writer holds this PostgreSQL dataset; retry after it closes')
self.schema = schema
self.connection.execute('SET search_path TO ' + quote(schema) + ',pg_catalog')
if not self.connection.execute("SELECT 1 FROM schema_migrations WHERE name='submission_source_baseline_v1'").fetchone():
raise RuntimeError('Submission provenance baseline is missing')
self.connection.autocommit = False
except BaseException:
self.connection.close()
raise
def execute(self, sql, params=()):
# The shared domain uses static SQL and bound parameters. It uses no
# SQLite-specific syntax; this adapter only binds/decodes text values.
return Result(self.connection.execute(sql.replace('?', '%s'), tuple(map(text.encode, params))))
def next_id(self, table):
if table not in ('submissions', 'decisions'):
raise ValueError('Unsupported explicit identity sequence')
return self.connection.execute("SELECT nextval(pg_get_serial_sequence(%s,'id'))", (quote(self.schema) + '.' + quote(table),)).fetchone()[0]
def commit(self):
self.connection.commit()
def rollback(self):
self.connection.rollback()
def close(self):
# Ends the session and releases its advisory lock, including after an
# error/rollback. File/chunk commits deliberately retain the writer lock.
self.connection.close()
def __enter__(self):
return self
def __exit__(self, kind, error, traceback):
self.rollback() if kind else self.commit()
class PostgresStore(Store):
def __init__(self, service, schema=None):
self.conn = WriteConnection(service, schema)
+22 -8
View File
@@ -23,8 +23,11 @@ def known_acceptances(conn,paper):
def main(argv=None, *, prog=None):
parser = argparse.ArgumentParser(prog=prog)
parser.add_argument('--db', required=True)
parser.add_argument('--query', help='SQLite FTS5 query over title and abstract')
database = parser.add_mutually_exclusive_group(required=True)
database.add_argument('--db', help='SQLite file')
database.add_argument('--pg-service', help='Protected libpq service; credentials stay outside CLI arguments')
parser.add_argument('--pg-schema', help='Optional PostgreSQL schema override; otherwise use the configured search_path')
parser.add_argument('--query', help='Title/abstract search: FTS5 for SQLite, web-search syntax for PostgreSQL')
parser.add_argument('--paper',type=int,help='Paper ID; include sources, tags and submission history')
parser.add_argument('--tag', help='Filter as namespace=value, e.g. arxiv:category=cs.AI')
parser.add_argument('--venue', help='Conference acronym')
@@ -35,9 +38,15 @@ def main(argv=None, *, prog=None):
parser.add_argument('--limit', type=int, default=20)
parser.add_argument('--stats', action='store_true')
args = parser.parse_args(argv)
conn = sqlite3.connect(Path(args.db).resolve().as_uri()+'?mode=ro', uri=True)
conn.row_factory = sqlite3.Row
conn.execute('BEGIN') # One consistent read snapshot while ingestion continues.
if args.pg_schema and not args.pg_service:
parser.error('--pg-schema requires --pg-service')
if args.pg_service:
from paper_atlas.postgres.client import ReadConnection
conn = ReadConnection(args.pg_service, schema=args.pg_schema) if args.pg_schema else ReadConnection(args.pg_service)
else:
conn = sqlite3.connect(Path(args.db).resolve().as_uri()+'?mode=ro', uri=True)
conn.row_factory = sqlite3.Row
conn.execute('BEGIN') # One consistent read snapshot while ingestion continues.
if args.stats:
result = {name:conn.execute('SELECT count(*) FROM '+name).fetchone()[0] for name in ('papers','source_records','submissions','decisions','tags','match_candidates')}
result['records_by_source'] = [dict(r) for r in conn.execute('SELECT s.name,count(r.id) AS imported_records FROM sources s LEFT JOIN source_records r ON r.source_id=s.id GROUP BY s.id ORDER BY s.name')]
@@ -53,7 +62,12 @@ def main(argv=None, *, prog=None):
if args.paper is not None:
where.append('p.id=?'); params.append(args.paper)
if args.query:
where.append('p.id IN (SELECT rowid FROM papers_fts WHERE papers_fts MATCH ?)'); params.append(args.query)
if args.pg_service:
from paper_atlas.postgres.client import SEARCH_VECTOR
where.append('p.id IN (SELECT id FROM papers WHERE '+SEARCH_VECTOR+" @@ websearch_to_tsquery('english'::regconfig,?))")
else:
where.append('p.id IN (SELECT rowid FROM papers_fts WHERE papers_fts MATCH ?)')
params.append(args.query)
if args.tag:
namespace,value = args.tag.split('=',1)
where.append('EXISTS(SELECT 1 FROM paper_tags pt JOIN tags t ON t.id=pt.tag_id WHERE pt.paper_id=p.id AND t.namespace=? AND t.value=?)'); params.extend([namespace,value])
@@ -63,9 +77,9 @@ def main(argv=None, *, prog=None):
clause = ['1=1']
if args.venue:
if conn.execute("SELECT 1 FROM sqlite_master WHERE type='table' AND name='venue_aliases'").fetchone():
clause.append('(v.acronym=? COLLATE NOCASE OR EXISTS(SELECT 1 FROM venue_aliases va WHERE va.venue_id=v.id AND va.alias=? COLLATE NOCASE))'); params.extend([args.venue,args.venue])
clause.append('(lower(v.acronym)=lower(?) OR EXISTS(SELECT 1 FROM venue_aliases va WHERE va.venue_id=v.id AND lower(va.alias)=lower(?)))'); params.extend([args.venue,args.venue])
else:
clause.append('v.acronym=? COLLATE NOCASE');params.append(args.venue)
clause.append('lower(v.acronym)=lower(?)');params.append(args.venue)
if args.track:
clause.append('e.track=?');params.append(args.track)
if args.year:
+34 -1
View File
@@ -12,7 +12,9 @@
"ijcai": "https://www.ijcai.org/all_proceedings/",
"dblp": "https://dblp.org/db/conf/",
"colm": "https://proceedings.colm.cc/",
"iclr_program": "https://iclr.cc/virtual/2026/papers.html"
"iclr_program": "https://iclr.cc/virtual/2026/papers.html",
"mlsys": "https://proceedings.mlsys.org/",
"acmmm": "https://www.acmmm.org/"
},
"venues": [
{
@@ -643,6 +645,37 @@
"main"
],
"coverage": "pending"
},
{
"acronym": "MLSys",
"field": "ml_systems",
"venue_type": "conference",
"discovery_sources": [
"mlsys",
"dblp"
],
"scope": "user_confirmed_related",
"years": "all_publicly_available",
"tracks": [
"main"
],
"coverage": "pending"
},
{
"acronym": "MM",
"field": "multimodal",
"venue_type": "conference",
"discovery_sources": [
"dblp",
"acmmm",
"openreview"
],
"scope": "user_confirmed_related",
"years": "all_publicly_available",
"tracks": [
"main"
],
"coverage": "pending"
}
],
"additional_tracks": [
+3
View File
@@ -10,6 +10,9 @@ readme = "README.md"
requires-python = ">=3.12"
dependencies = ["PyYAML==6.0.3"]
[project.optional-dependencies]
postgres = ["psycopg[binary]==3.3.8"]
[project.scripts]
paper-atlas = "paper_atlas.cli:main"
+44
View File
@@ -0,0 +1,44 @@
from types import SimpleNamespace
from unittest.mock import patch
import json
from pathlib import Path
import sqlite3
from contextlib import closing
import tempfile
import unittest
import zipfile
from paper_atlas.audits.arxiv import audit,MEMBER
class ArxivSourceAuditTests(unittest.TestCase):
def setUp(self):
self.temp=tempfile.TemporaryDirectory();self.addCleanup(self.temp.cleanup);self.root=Path(self.temp.name)
self.archive=self.root/'metadata.zip';self.out=self.root/'audit.json'
disk=patch('paper_atlas.audits.arxiv.shutil.disk_usage',return_value=SimpleNamespace(free=16*1024**3));disk.start();self.addCleanup(disk.stop)
def write(self,body):
with zipfile.ZipFile(self.archive,'w',compression=zipfile.ZIP_DEFLATED) as z:z.writestr(MEMBER,body)
def test_repeated_ids_and_payload_changes_are_distinct_from_unique_papers(self):
one={'id':'2601.00001','title':'A paper','abstract':'First text'};updated={**one,'abstract':'Revised text'}
two={'id':'2601.00002','title':'Another paper','abstract':''}
self.write('\n'.join(json.dumps(row) for row in (one,updated,updated,two)))
result=audit(self.archive,self.out)
self.assertEqual((result['raw_rows'],result['unique_external_ids'],result['extra_rows_for_repeated_ids']),(4,2,2))
self.assertTrue(result['zip_eof_crc_verified']);self.assertEqual(result['missing_abstract_rows'],1)
duplicate=result['duplicate_ids'][0];self.assertEqual(duplicate['occurrences'],3)
self.assertTrue(duplicate['has_payload_variants']);self.assertEqual([v['occurrences'] for v in duplicate['variants']],[1,2])
with closing(sqlite3.connect(result['id_index'])) as c:self.assertEqual(c.execute('SELECT count(*) FROM raw_ids').fetchone()[0],2)
with self.assertRaisesRegex(ValueError,'output exists'):audit(self.archive,self.out)
def test_invalid_or_unverified_input_never_publishes_audit_outputs(self):
self.write('{"id":"2601.00001","title":"Valid"}\nnot JSON')
with self.assertRaises(json.JSONDecodeError):audit(self.archive,self.out)
self.assertFalse(self.out.exists());self.assertFalse(self.out.with_suffix('.ids.sqlite').exists())
self.write('{"id":"2601.00001","title":"Valid"}')
with self.assertRaisesRegex(ValueError,'checksum mismatch'):audit(self.archive,self.out,'0'*64)
self.assertFalse(self.out.exists())
if __name__=='__main__':unittest.main()
+138
View File
@@ -0,0 +1,138 @@
import fcntl
import json
from pathlib import Path
import tempfile
import unittest
import sqlite3
from unittest.mock import patch
from paper_atlas.audits.arxiv_tags import audit, main
from paper_atlas.db.store import Store
from paper_atlas.ingestion.arxiv import refresh_categories
class ArxivTagAuditTests(unittest.TestCase):
def setUp(self):
self.temp = tempfile.TemporaryDirectory()
self.addCleanup(self.temp.cleanup)
self.root = Path(self.temp.name)
self.db = self.root / 'papers.sqlite'
self.out = self.root / 'audit.json'
self.store = Store(self.db)
self.addCleanup(self.store.conn.close)
self.records = []
for external in ('one', 'two'):
paper, record = self.store.record('arxiv', external, 'https://arxiv.org/abs/' + external,
'Same research work', 'Abstract', [], {'doi': '10.1234/same'},
{'categories': 'cs.AI cs.LG cs.AI'})
refresh_categories(self.store, paper, record, 'cs.AI cs.LG cs.AI')
self.records.append(record)
self.paper = paper
tag = self.store.conn.execute("INSERT INTO tags(namespace,value) VALUES('custom:topic','cs.AI')").lastrowid
self.store.conn.execute("INSERT INTO paper_tags VALUES(?,?,NULL,'manual:1')", (paper, tag))
self.store.conn.commit()
def test_all_merged_records_keep_their_own_categories_and_custom_tags_are_untouched(self):
before = self.store.conn.execute('SELECT * FROM paper_tags ORDER BY evidence_key,tag_id').fetchall()
result = audit(self.db, self.out, batch_size=1)
self.assertEqual(result['status'], 'passed')
self.assertEqual(result['records_checked'], 2)
self.assertEqual(result['expected_evidence'], 4)
self.assertEqual(result['actual_evidence'], 4)
self.assertEqual(result['evidence_without_arxiv_record'], 0)
self.assertEqual(self.store.conn.execute('SELECT * FROM paper_tags ORDER BY evidence_key,tag_id').fetchall(), before)
def test_zero_legacy_keys_does_not_hide_missing_categories_and_cli_fails(self):
self.store.conn.execute("DELETE FROM paper_tags WHERE source_record_id IS NOT NULL")
self.store.conn.commit()
with self.assertRaises(SystemExit):
main(['--db', str(self.db), '--out', str(self.out)])
result = json.loads(self.out.read_text())
self.assertEqual(result['status'], 'failed')
self.assertEqual(result['legacy_evidence'], 0)
self.assertEqual(result['missing_evidence'], 4)
self.assertEqual(result['records_with_mismatches'], 2)
def test_wrong_canonical_paper_or_stale_key_is_detected(self):
other, _ = self.store.record('example', 'other', 'https://example.org', 'Different work', 'AB', [])
self.store.conn.execute("UPDATE paper_tags SET paper_id=?,evidence_key='arxiv:categories' WHERE source_record_id=?", (other, self.records[0]))
self.store.conn.commit()
result = audit(self.db, self.out)
self.assertEqual(result['status'], 'failed')
self.assertEqual(result['records_with_mismatches'], 1)
self.assertEqual(result['legacy_evidence'], 2)
self.assertEqual(result['missing_evidence'], 2)
self.assertEqual(result['unexpected_evidence'], 2)
def test_wrong_source_and_unowned_category_rows_cannot_escape_the_full_audit(self):
paper, record = self.store.record('example', 'other', 'https://example.org', 'Other work', 'AB', [])
tag = self.store.conn.execute("SELECT id FROM tags WHERE namespace='arxiv:category' AND value='cs.AI'").fetchone()[0]
self.store.conn.execute('INSERT INTO paper_tags VALUES(?,?,?,?)', (paper, tag, record, 'wrong-source'))
self.store.conn.execute('INSERT INTO paper_tags VALUES(?,?,NULL,?)', (paper, tag, 'unowned'))
self.store.conn.commit()
result = audit(self.db, self.out)
self.assertEqual(result['status'], 'failed')
self.assertEqual(result['records_with_mismatches'], 0)
self.assertEqual(result['evidence_without_arxiv_record'], 2)
self.assertEqual(len(result['unscoped_examples']), 2)
def test_active_writer_and_incomplete_repair_are_rejected_before_publishing(self):
with Path(str(self.db) + '.maintenance.lock').open('a') as lock:
fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB)
with self.assertRaises(BlockingIOError):
audit(self.db, self.out)
self.assertFalse(self.out.exists())
repair = self.root / 'repair.json'
repair.write_text(json.dumps({'status': 'running'}))
with self.assertRaisesRegex(ValueError, 'not completed'):
audit(self.db, self.out, repair)
self.assertFalse(self.out.exists())
def test_repair_report_scope_and_completed_audit_are_not_silently_reused(self):
repair = self.root / 'repair.json'
repair.write_text(json.dumps({'status': 'complete', 'records_refreshed': 2, 'db': str(self.db),
'source_id': 1, 'source_record_count': 2, 'maximum_source_record_id': 999}))
with self.assertRaisesRegex(ValueError, 'different source inventory'):
audit(self.db, self.out, repair)
result = audit(self.db, self.out)
before = self.out.read_bytes()
with self.assertRaisesRegex(ValueError, 'report exists'):
audit(self.db, self.out)
self.assertEqual(self.out.read_bytes(), before)
self.assertEqual(result['status'], 'passed')
def test_invalid_source_metadata_is_an_error_not_a_partial_pass(self):
self.store.conn.execute('UPDATE source_records SET metadata_json=? WHERE id=?',
(json.dumps({'categories': ['invalid']}), self.records[0]))
self.store.conn.commit()
with self.assertRaisesRegex(ValueError, 'categories must be text'):
audit(self.db, self.out)
self.assertEqual(json.loads(self.out.read_text())['status'], 'error')
def test_interleaved_sources_use_bounded_primary_key_batches_without_sorting(self):
self.store.record('example', 'interleaved', 'https://example.org', 'Other source', 'AB', [])
paper, record = self.store.record('arxiv', 'three', 'https://arxiv.org/abs/three',
'A third record', 'AB', [], metadata={'categories': 'cs.AI'})
refresh_categories(self.store, paper, record, 'cs.AI')
self.store.conn.commit()
queries = []
connect = sqlite3.connect
def traced(*args, **kwargs):
connection = connect(*args, **kwargs)
connection.set_trace_callback(queries.append)
return connection
with patch('paper_atlas.audits.arxiv_tags.sqlite3.connect', side_effect=traced):
result = audit(self.db, self.out, batch_size=1)
self.assertEqual(result['status'], 'passed')
self.assertEqual(result['records_checked'], 3)
self.assertEqual(result['last_record_id'], record)
batches = [sql for sql in queries if sql.startswith('SELECT id,external_id,paper_id,metadata_json')]
self.assertEqual(len(batches), 4) # Includes the bounded final empty read.
for sql in batches:
plan = ' '.join(row[3] for row in self.store.conn.execute('EXPLAIN QUERY PLAN ' + sql))
self.assertIn('INTEGER PRIMARY KEY', plan)
self.assertNotIn('TEMP B-TREE', plan)
if __name__ == '__main__':
unittest.main()
+49
View File
@@ -0,0 +1,49 @@
from contextlib import closing
import json
from pathlib import Path
import sqlite3
import tempfile
from types import SimpleNamespace
import unittest
from unittest.mock import patch
from paper_atlas.db.store import Store
from paper_atlas.ingestion.arxiv_tags import repair
class ArxivTagRepairTests(unittest.TestCase):
def setUp(self):
self.temp=tempfile.TemporaryDirectory();self.addCleanup(self.temp.cleanup);self.root=Path(self.temp.name)
self.db=self.root/'papers.sqlite';self.out=self.root/'repair.json'
disk=patch('paper_atlas.ingestion.arxiv_tags.shutil.disk_usage',return_value=SimpleNamespace(free=16*1024**3));disk.start();self.addCleanup(disk.stop)
store=Store(self.db)
for key in ('one','two'):
paper,record=store.record('arxiv',key,'https://arxiv.org/abs/'+key,'Same title','AB',[],{'doi':'10.1234/same'},{'categories':'cs.AI cs.LG'})
for category in ('cs.AI','cs.LG'):
store.conn.execute("INSERT OR IGNORE INTO tags(namespace,value) VALUES('arxiv:category',?)",(category,))
tag=store.conn.execute("SELECT id FROM tags WHERE namespace='arxiv:category' AND value=?",(category,)).fetchone()[0]
store.conn.execute("INSERT OR IGNORE INTO paper_tags VALUES(?,?,?,'arxiv:categories')",(paper,tag,record))
tag=store.conn.execute("INSERT INTO tags(namespace,value) VALUES('custom:topic','cs.AI')").lastrowid
store.conn.execute("INSERT INTO paper_tags VALUES(?,?,NULL,'manual:1')",(paper,tag));store.conn.commit();store.conn.close()
def test_restore_collided_evidence_and_preserve_custom_tags_idempotently(self):
result=repair(self.db,self.out,batch_size=1)
self.assertEqual(result['records_refreshed'],2);self.assertEqual(result['status'],'complete')
with closing(sqlite3.connect(self.db)) as c:
self.assertEqual(c.execute('SELECT count(*) FROM paper_tags').fetchone()[0],5)
self.assertEqual(c.execute('SELECT count(DISTINCT source_record_id) FROM paper_tags').fetchone()[0],2)
self.assertEqual(c.execute("SELECT count(*) FROM paper_tags WHERE evidence_key='manual:1'").fetchone()[0],1)
repair(self.db,self.root/'again.json')
with closing(sqlite3.connect(self.db)) as c:self.assertEqual(c.execute('SELECT count(*) FROM paper_tags').fetchone()[0],5)
def test_failed_batch_resumes_only_after_last_committed_record(self):
with closing(sqlite3.connect(self.db)) as c,c:c.execute("UPDATE source_records SET metadata_json=? WHERE external_id='two'",(json.dumps({'categories':['invalid']}),))
with self.assertRaisesRegex(ValueError,'categories must be text'):repair(self.db,self.out,batch_size=1)
state=json.loads(self.out.read_text());self.assertEqual(state['records_refreshed'],1);self.assertEqual(state['status'],'failed')
with closing(sqlite3.connect(self.db)) as c,c:c.execute("UPDATE source_records SET metadata_json=? WHERE external_id='two'",(json.dumps({'categories':'cs.AI cs.LG'}),))
result=repair(self.db,self.out,resume=True,batch_size=1)
self.assertEqual(result['records_refreshed'],2);self.assertEqual(result['status'],'complete')
with closing(sqlite3.connect(self.db)) as c:self.assertEqual(c.execute('SELECT count(*) FROM paper_tags').fetchone()[0],5)
if __name__=='__main__':unittest.main()
+4 -1
View File
@@ -18,7 +18,10 @@ class CliTests(unittest.TestCase):
def test_unified_import_and_query_use_shipped_schema_and_registry(self):
from paper_atlas.config import DEFAULT_REGISTRY
self.assertEqual(len(json.loads(DEFAULT_REGISTRY.read_text())['venues']),41)
venues = json.loads(DEFAULT_REGISTRY.read_text())['venues']
names = [venue['acronym'] for venue in venues]
self.assertTrue({'COLM', 'MM', 'MLSys'} <= set(names))
self.assertEqual(len(names), len(set(names)))
with tempfile.TemporaryDirectory() as tmp:
root=Path(tmp);db=root/'db.sqlite';source=root/'records.jsonl'
source.write_text(json.dumps({'source':'example','external_id':'one','url':'https://example.org','title':'CLI paper','abstract':'Abstract','authors':['Jane Doe'],'venue':'Example','year':2026,'track':'main','status':'accepted'})+'\n')
+1
View File
@@ -64,6 +64,7 @@ class ICLRTests(unittest.TestCase):
rows,_=self.parse([dict(row,paper_pdf_url=None)],year=2020)
self.assertEqual(rows[0]['metadata']['identity_state'],'program_only')
self.assertEqual(rows[0]['identifiers'],{})
self.assertEqual(rows[0]['url'],'https://iclr.cc/virtual/2020/papers.html')
def test_only_referenced_official_assets_and_real_navigation_years(self):
html='<a href="/archive/2013/">2013</a><a href="/Conferences/2026">2026</a><a href="https://other.example/2025">2025</a>'
+143
View File
@@ -0,0 +1,143 @@
import copy
import hashlib
import json
from pathlib import Path
import tempfile
import unittest
from unittest.mock import patch
from paper_atlas.audits import iclr_legacy
from paper_atlas.ingestion.backfill import backfill, queue_files
from paper_atlas.ingestion.records import ingest_file
from paper_atlas.db.store import Store
class ICLRLegacyTests(unittest.TestCase):
def program(self):
return {'source': 'iclr_program', 'external_id': '2020/program-42', 'venue': 'ICLR',
'year': 2020, 'track': 'main', 'status': 'accepted',
'url': 'https://iclr.cc/virtual/2020/papers.html', 'title': 'Historical paper title',
'abstract': 'Historical abstract', 'authors': ['Jane Doe', 'John Smith'],
'identifiers': {}, 'raw_decision': 'listed in official program',
'evidence_url': 'https://iclr.cc/virtual/2020/papers.html',
'metadata': {'program_identity_type': 'submission', 'program_source_id': 42}}
def snapshot(self):
return {'source': 'openreview_snapshot', 'external_id': '2020/realForum', 'venue': 'ICLR',
'year': 2020, 'track': 'main', 'status': 'accepted',
'url': 'https://openreview.net/forum?id=realForum', 'title': 'Historical paper title',
'abstract': 'Historical abstract', 'authors': ['Jane Doe', 'John Smith'],
'identifiers': {'openreview': 'realForum'},
'submission_identifiers': [{'scheme': 'openreview', 'value': 'realForum'},
{'scheme': 'iclr_number', 'value': '42'}],
'decision_events': [{'status': 'accepted', 'raw_value': 'Accept',
'source_decision_id': 'decision1', 'evidence_url': 'https://openreview.net/forum?id=realForum&noteId=decision1',
'authority': {'public_readers_verified': True}}],
'metadata': {'source_submission_number': 42, 'public_readers_verified': True}}
def legacy(self):
return {'id': 'realForum', 'forum': 'realForum', 'content': {
'iclr_id': 'realForum', 'title': 'Historical paper title', 'authors': ['Jane Doe', 'John Smith']}}
def test_independent_legacy_identity_preserves_existing_source_id_and_text(self):
program, submission = self.program(), self.snapshot()
submission.update(title='A later title', abstract='A later abstract', authors=['Jane Doe'])
rows, checks = iclr_legacy.reconcile([program], {'realForum': submission}, [self.legacy()])
self.assertEqual(rows[0]['external_id'], '2020/program-42')
self.assertEqual(rows[0]['url'], 'https://iclr.cc/virtual_2020/poster_realForum.html')
for field in ('title', 'abstract', 'authors'):
self.assertEqual(rows[0][field], program[field])
self.assertEqual(rows[0]['identifiers']['openreview'], 'realForum')
self.assertTrue(rows[0]['metadata']['program_submission_number_verified'])
self.assertEqual(checks['independent_legacy'], 1)
self.assertEqual(program['identifiers'], {})
def test_program_number_and_shared_authors_alone_do_not_assign_a_forum(self):
program = self.program()
program.update(title='A different paper', abstract='An unrelated abstract')
with self.assertRaisesRegex(ValueError, 'number alone'):
iclr_legacy.reconcile([program], {'realForum': self.snapshot()}, [self.legacy()])
def test_independent_snapshot_title_and_abstract_handle_legacy_name_variants(self):
legacy = self.legacy()
legacy['content']['authors'] = ['J. Doe', 'J. Smith']
rows, checks = iclr_legacy.reconcile([self.program()], {'realForum': self.snapshot()}, [legacy])
self.assertEqual(checks['independent_snapshot'], 1)
self.assertEqual(rows[0]['identifiers']['openreview'], 'realForum')
def test_reviewed_title_variant_is_exact_and_requires_public_author_corroboration(self):
variant = iclr_legacy.REVIEWED_TITLE_VARIANT
program, submission, legacy = self.program(), self.snapshot(), self.legacy()
program['title'] = variant['program']
submission.update(title=variant['snapshot'], abstract='A different revision')
submission['identifiers']['openreview'] = variant['forum']
legacy.update(id=variant['forum'], forum=variant['forum'])
legacy['content'].update(iclr_id=variant['forum'], title=variant['legacy'])
rows, checks = iclr_legacy.reconcile([program], {variant['forum']: submission}, [legacy])
self.assertEqual(checks['reviewed_title_variant'], 1)
self.assertTrue(rows[0]['metadata']['program_identity_verification']['reviewed_title_variant'])
program['authors'] = ['Jane Doe']
with self.assertRaisesRegex(ValueError, 'number alone'):
iclr_legacy.reconcile([program], {variant['forum']: submission}, [legacy])
def test_conflicting_forum_ambiguous_number_and_repeated_legacy_identity_fail(self):
p = self.program()
p['identifiers']['openreview'] = 'anotherForum'
with self.assertRaisesRegex(ValueError, 'conflicts'):
iclr_legacy.reconcile([p], {'realForum': self.snapshot()}, [self.legacy()])
duplicate = copy.deepcopy(self.snapshot())
duplicate['identifiers']['openreview'] = 'otherForum'
with self.assertRaisesRegex(ValueError, 'ambiguous'):
iclr_legacy.reconcile([self.program()], {'realForum': self.snapshot(), 'otherForum': duplicate}, [self.legacy()])
with self.assertRaisesRegex(ValueError, 'repeated'):
iclr_legacy.reconcile([self.program()], {'realForum': self.snapshot()}, [self.legacy(), self.legacy()])
def write_file(self, path, rows, source):
path.write_text(''.join(json.dumps(row) + '\n' for row in rows))
manifest = {'source': source, 'venue': 'ICLR', 'year': 2020, 'track': 'main',
'parser_version': 2, 'count': len(rows), 'missing_abstract_count': 0,
'list_url': 'https://iclr.cc/virtual/2020/papers.html', 'status': 'collected',
'submission_status_counts': {status: sum(r['status'] == status for r in rows)
for status in {r['status'] for r in rows}}}
path.with_suffix('.manifest.json').write_text(json.dumps(manifest))
def test_audited_bridge_then_snapshot_import_keeps_one_accepted_attempt(self):
with tempfile.TemporaryDirectory() as tmp:
root = Path(tmp)
program_path, snapshot_path, legacy_path = (root / name for name in ('program.jsonl', 'snapshot.jsonl', 'legacy.json'))
self.write_file(program_path, [self.program()], 'iclr_program')
self.write_file(snapshot_path, [self.snapshot()], 'openreview_snapshot')
raw = json.dumps([self.legacy()]).encode()
legacy_path.write_bytes(raw)
with patch.multiple(iclr_legacy, LEGACY_BYTES=len(raw), LEGACY_SHA256=hashlib.sha256(raw).hexdigest(), EXPECTED=1):
report = iclr_legacy.audit(program_path, snapshot_path, legacy_path, root / 'out')
db = root / 'papers.sqlite'
ingest_file(db, program_path)
queue = root / 'out/iclr-2020-backfill-queue.json'
result = backfill(db, queue_files(queue))
self.assertEqual(result['submissions_before'], result['submissions_after'])
ingest_file(db, report['backfill_queue']['files'][0])
ingest_file(db, snapshot_path)
store = Store(db)
try:
self.assertEqual(store.conn.execute('SELECT count(*) FROM papers').fetchone()[0], 1)
self.assertEqual(store.conn.execute('SELECT count(*) FROM submissions').fetchone()[0], 1)
self.assertEqual(store.conn.execute('SELECT count(*) FROM submission_sources').fetchone()[0], 2)
self.assertEqual(store.conn.execute('SELECT url FROM source_records WHERE external_id=?', ('2020/program-42',)).fetchone()[0],
'https://iclr.cc/virtual_2020/poster_realForum.html')
self.assertEqual(store.conn.execute('PRAGMA foreign_key_check').fetchall(), [])
finally:
store.conn.close()
def test_unverified_legacy_bytes_publish_no_output(self):
with tempfile.TemporaryDirectory() as tmp:
root = Path(tmp)
legacy = root / 'legacy.json'
legacy.write_text('[]')
with self.assertRaisesRegex(ValueError, 'checksum'):
iclr_legacy.audit(root / 'program', root / 'snapshot', legacy, root / 'out')
self.assertFalse((root / 'out').exists())
if __name__ == '__main__':
unittest.main()
+86
View File
@@ -0,0 +1,86 @@
import hashlib
import json
from pathlib import Path
import tempfile
import unittest
from unittest.mock import patch
from paper_atlas.collectors import icml_public_archive as archive
from paper_atlas.audits.public_openreview import audit
from paper_atlas.db.store import Store
from paper_atlas.ingestion.records import ingest_file
class ICMLPublicArchiveTests(unittest.TestCase):
def note(self, **changes):
return {'id': 'PublicRoot1', 'forum': 'PublicRoot1', 'readers': ['everyone'],
'domain': archive.DOMAIN, 'invitations': [archive.DOMAIN + '/-/Submission'],
'license': 'CC BY 4.0', 'cdate': 1769251630136,
'content': {'title': {'value': 'A public rejected submission'},
'abstract': {'value': 'Public abstract'},
'authors': {'value': ['Anonymous', 'Jane Doe']},
'authorids': {'value': ['private@example.org']},
'venue': {'value': 'Submitted to ICML 2026'},
'venueid': {'value': archive.VENUEID},
'primary_area': {'value': 'learning'},
'pdf': {'value': '/private.pdf'}},
'details': {'reviews': ['not retained']}, **changes}
def test_explicit_platform_classification_requires_public_root_and_correct_scope(self):
original = self.note()
normalized = archive.normalize(original)
self.assertEqual(normalized['status'], 'rejected')
self.assertEqual(normalized['raw_decision'], archive.VENUEID)
self.assertEqual(normalized['metadata']['license'], 'CC BY 4.0')
self.assertEqual(normalized['metadata']['evidence_kind'], 'public_submission_venueid')
self.assertFalse(normalized['metadata']['original_decision_signature_verified'])
self.assertNotIn('private@example.org', json.dumps(normalized))
self.assertNotIn('not retained', json.dumps(normalized))
for changes in ({'readers': ['authors']}, {'forum': 'AnotherRoot'}, {'ddate': 1000},
{'domain': 'ICML.cc/2026/Position_Papers'}, {'invitations': []}):
with self.subTest(changes=changes), self.assertRaises(ValueError):
archive.normalize(self.note(**changes))
for venueid in (None, 'ICML.cc/2026/Conference/Submission', 'ICML.cc/2026/Conference/Accepted_Submission'):
candidate = self.note()
candidate['content']['venueid'] = {'value': venueid}
with self.assertRaisesRegex(ValueError, 'classification'):
archive.normalize(candidate)
def collect_fixture(self, out, notes, count=None, corrupt=False):
data = json.dumps({'count': len(notes) if count is None else count, 'notes': notes}).encode()
blob = hashlib.sha1(b'blob ' + str(len(data)).encode() + b'\0' + data).hexdigest()
with patch.multiple(archive, BYTES=len(data), BLOB_SHA1=blob, EXPECTED=len(notes)), \
patch.object(archive.shutil, 'disk_usage', return_value=type('Space', (), {'free': 20 * 1024**3})()):
return archive.collect(out, fetcher=lambda url, limit: data + b'x' if corrupt else data)
def test_verified_archive_roundtrips_through_preflight_and_idempotent_import(self):
with tempfile.TemporaryDirectory() as tmp:
root = Path(tmp)
result = self.collect_fixture(root / 'source', [self.note()])
db = root / 'db.sqlite'
Store(db).conn.close()
report = audit(db, root / 'source/public-openreview-inventory.json', root / 'audit.json')
self.assertEqual(report['status'], 'ready_for_serial_import')
self.assertEqual(report['source'], archive.SOURCE)
self.assertEqual(result['files'][0]['status'], 'partial')
for _ in range(2):
ingest_file(db, report['files'][0])
store = Store(db)
try:
self.assertEqual(store.conn.execute('SELECT count(*) FROM submissions').fetchone()[0], 1)
self.assertEqual(store.conn.execute('SELECT status FROM decisions').fetchall(), [('rejected',)])
finally:
store.conn.close()
def test_bad_hash_count_or_duplicate_identity_publishes_nothing(self):
for kwargs in ({'corrupt': True}, {'count': 99}, {}):
notes = [self.note(), self.note()] if not kwargs else [self.note()]
with self.subTest(kwargs=kwargs), tempfile.TemporaryDirectory() as tmp:
with self.assertRaises(ValueError):
self.collect_fixture(tmp, notes, **kwargs)
self.assertEqual(list(Path(tmp).glob('*.jsonl')), [])
self.assertFalse((Path(tmp) / 'public-openreview-inventory.json').exists())
if __name__ == '__main__':
unittest.main()
+24
View File
@@ -7,6 +7,8 @@ import zipfile
from pathlib import Path
from paper_atlas.ingestion.arxiv import ingest
from paper_atlas.db.store import Store
from paper_atlas.ingestion.arxiv import refresh_categories
class ImportTests(unittest.TestCase):
@@ -53,6 +55,28 @@ class ImportTests(unittest.TestCase):
with closing(sqlite3.connect(self.db)) as c, c:
self.assertEqual(c.execute("SELECT count(*) FROM paper_tags pt JOIN tags t ON pt.tag_id=t.id WHERE t.value='cs.AI'").fetchone()[0],2)
def test_merged_records_retain_separate_category_evidence_across_refresh(self):
one=self.row('2601.00001','10.0000/example');two=self.row('2601.00002','10.0000/example')
self.write([one,two]);ingest(self.db,self.archive)
with closing(sqlite3.connect(self.db)) as c:
self.assertEqual(c.execute('SELECT count(*) FROM paper_tags').fetchone()[0],4)
self.assertEqual(c.execute('SELECT count(DISTINCT source_record_id) FROM paper_tags').fetchone()[0],2)
one['categories']='cs.AI';two['categories']='cs.LG';self.write([one,two]);ingest(self.db,self.archive)
with closing(sqlite3.connect(self.db)) as c:
actual=c.execute('SELECT r.external_id,t.value FROM paper_tags pt JOIN source_records r ON r.id=pt.source_record_id JOIN tags t ON t.id=pt.tag_id ORDER BY r.external_id').fetchall()
self.assertEqual(actual,[('2601.00001','cs.AI'),('2601.00002','cs.LG')])
def test_migrate_legacy_categories_without_removing_custom_evidence(self):
store=Store(self.db);self.addCleanup(store.conn.close)
paper,record=store.record('arxiv','2601.00001','https://arxiv.org/abs/2601.00001','A title','AB',[])
for namespace,key in [('arxiv:category','arxiv:categories'),('custom:topic','manual:1')]:
tag=store.conn.execute('INSERT INTO tags(namespace,value) VALUES(?,?)',(namespace,'cs.AI')).lastrowid
store.conn.execute('INSERT INTO paper_tags VALUES(?,?,?,?)',(paper,tag,record,key))
refresh_categories(store,paper,record,'cs.AI cs.LG');refresh_categories(store,paper,record,'cs.AI cs.LG')
self.assertEqual(store.conn.execute('SELECT count(*) FROM paper_tags').fetchone()[0],3)
self.assertEqual(store.conn.execute("SELECT count(*) FROM paper_tags WHERE evidence_key='arxiv:categories'").fetchone()[0],0)
self.assertEqual(store.conn.execute("SELECT count(*) FROM paper_tags WHERE evidence_key='manual:1'").fetchone()[0],1)
if __name__ == '__main__':
unittest.main()

Some files were not shown because too many files have changed in this diff Show More