CoolFace
Datasetpublic

v13s/golden-fto-layer-a

Layer A — Office Action Triples for FTO Evaluation A public dataset of (invention → cited prior art → outcome) triples spanning three patent offices: US slice — the USPTO Office Action Research Dataset (OARD) Open Data Portal (ODP) API EP slice — the EPO Open Patent Services (OPS) Register service (WIPO ST.14 search-report citations) JP slice — the JPO 整理標準化 (seiri-hyōjunka) ISO bulk data for 拒絶理由通知 (rejection notices), filing years 2002–2019, published labels only per JPO… See the full description on the dataset page: https://huggingface.co/datasets/v13s/golden-fto-layer-a.

sourceHugging Facecc-by-4.0updated 1mo agoView on Hugging Face
0likes226downloads
Dataset Card

Layer A — Office Action Triples for FTO Evaluation

A public dataset of (invention → cited prior art → outcome) triples spanning three patent offices:

  • US slice — the USPTO Office Action Research Dataset (OARD)
  • Open Data Portal (ODP) API
  • EP slice — the EPO Open Patent Services (OPS) Register service (WIPO ST.14 search-report citations)
  • JP slice — the JPO 整理標準化 (seiri-hyōjunka) ISO bulk data for 拒絶理由通知 (rejection notices), filing years 2002–2019, published labels only per JPO 利用規約 第4条 (the prose body is withheld; only derived severity + legal-grounds labels ship — see License)

Built as the agent-evaluation substrate for Parallax, an AI-native Freedom-to- Operate (FTO) and defensive-publication platform for individual inventors and small teams.

Curated by [Vox](https://vox.delivery) (org: v13s). Parallax is a Vox product; the curation layer (annotations, severity tagging, schema, manifest) is © Vox 2026 under CC-BY-4.0. The underlying US (USPTO) and EP (EPO) patent data is public domain; the JP slice is derived from JPO 整理標準化 bulk data and published labels-only under JPO 利用規約 第4条, attributing 特許庁 (JPO) as the upstream source.

TL;DR

  • 5,807,285 rows (v1.3.2): 5,000 US Office Actions (filing years 2011–2017) + 850 EP search reports (filing years 2014–2022, IPC-stratified across 23 buckets) + 5,801,435 JP rejection-notice triples (filing years 2002–2019, labels only)
  • 531 Parquet shards in the cases partition (US 8 + EP 10 + JP 513), partitioned by jurisdiction × filing_year, plus a prior_art_index/<jurisdiction>/ sibling partition (v1.2+, US + EP + JP) aggregating cross-citations
  • Schema: (case_id, invention, examination, prior_art[], outcome, provenance) — see Schema below
  • v1.2 additions: prior_art[].categories[] for multi-category ST.14 splits (XY["X","Y"]) + prior_art_index sibling partition for cross-citation aggregation
  • v1.3 additions: examination.legal_articles[] carrying normalised legal grounds, plus prior_art[].severity_st14 / severity_source providing per-reference WIPO ST.14 truth labels extracted from JPO 拒絶理由通知書 prose (JP slice only)
  • Three jurisdictions live (US, EP, JP). JP is the full 整理標準化 ISO lowering (filing years 2002–2019), 5,801,435 rejection-notice triples. Per JPO 利用規約 第4条, JP rows publish labels only: examination.rejection_basis_text is withheld (null), and only the derived severity_st14 + legal_articles are released. severity_st14 is present on the η-10-enriched apps; the rest carry the v1.2 severity proxy (severity_source="cited_type_proxy").
  • License: CC-BY-4.0 on the curation; underlying patent documents remain in the public domain — see the License section below
  • SHA-256 manifest at MANIFEST.json for byte-level reproducibility

Quick start

python
from datasets import load_dataset

# Default config returns all three jurisdictions (5,807,285 rows).
ds = load_dataset("v13s/golden-fto-layer-a", split="train")
print(len(ds))                           # 5807285

# Per-jurisdiction configs are also available.
ds_us = load_dataset("v13s/golden-fto-layer-a", "us", split="train")
ds_ep = load_dataset("v13s/golden-fto-layer-a", "ep", split="train")
ds_jp = load_dataset("v13s/golden-fto-layer-a", "jp", split="train")
print(len(ds_us), len(ds_ep), len(ds_jp))  # 5000, 850, 5801435

row = ds[0]
print(row["case_id"])                    # e.g. "US-13004847-0"
print(row["invention"]["title"])         # "SYSTEM AND METHOD FOR ..."
print(row["examination"]["oa_type"])     # "rejection" | "search_report"
print(row["examination"]["rejection_reasons"])  # ["obviousness_103"]
for ref in row["prior_art"]:
    print(ref["ref_id"], ref["severity"])
    # US: "US9123456B2", "obviousness"
    # EP: "US6825941",   "novelty_destroying"

Schema

Each row is a single Office Action event linked to its prior-art citations. The full schema lives at `data-pipeline/src/layer_a/schema.py` in the source repo.

FieldTypeDescription
case_idstringStable id: <jurisdiction>-<application_number>-<oa_seq>
schema_versionstringPer-row schema version (1.0 legacy / 1.2 post-2026-05-07 / 1.3 post-2026-06-04 with JP prose enrichment)
jurisdictionstringUS, EP, or JP (v1.3+)
source_datasetstringuspto_oard (US rows), epo_ops (EP rows), or jpo_bulk_iso_<YYYY> (JP rows, v1.3+)
extracted_attimestamp[s, UTC]When this row was emitted
inventionstructApplication metadata — title, abstract, IPC/CPC codes, claims, applicant
examinationstructOA event — oa_date, oa_type ∈ {rejection, allowance, searchreport}, `rejectionreasons[], examinerid`, `rejectionbasistext` (v1.3+, JP only), `legalarticles[]` (v1.3+, JP only)
prior_artlist<struct>Cited references — ref_id, ref_type, source (examiner/applicant), rejection_basis, claims_blocked[], severity, categories[] (v1.2+), severity_st14 (v1.3+), severity_source (v1.3+), metadata
outcomestructFinal disposition — final_disposition, disposition_date, granted_claims[], amendments_made, decision_source (v1.1+)
provenancestructAudit trail — parser_version, source_file, manifest_sha256, validation_status, validation_notes[]

Severity enum (prior_art[].severity)

A 3-value severity enum that downstream consumers can join across jurisdictions. Each jurisdiction has its own source signal:

SeverityUS (OARD signal)EP (WIPO ST.14 search-report category)JP (整理標準化 cited_type proxy / prose ST.14)
novelty_destroyingrejection_102=1 AND citation_in_oa=1X or E (incl. multi-char XY, XYI)cited_type novelty / prose X, E
obviousnessrejection_103=1 AND citation_in_oa=1Ycited_type obviousness / prose Y
backgroundotherwise (PTO-892, PTO-1449 IDS)A, P, D, T, L, O, Icited_type background / prose A, O, P, T, L

The EP search-report category sometimes concatenates multiple codes (e.g. "XY" means the citation is BOTH novelty-relevant AND obviousness-relevant). The lowering preserves the raw string and the extractor maps the most-severe component to severity.

prior_art[].categories (v1.2+)

The single-string severity collapses multi-character ST.14 codes to one band (e.g. XYnovelty_destroying, dropping the inventive-step signal). To preserve the full set, v1.2 adds a categories: list<string> field with each code as its own alphabetically-sorted entry:

Source category`severity``categories`
Xnovelty_destroying["X"]
Yobviousness["Y"]
XYnovelty_destroying["X", "Y"]
XYInovelty_destroying["I", "X", "Y"]
Abackground["A"]

Legacy v1.0 / v1.1 rows have categories = [] (empty). Jurisdictions whose source data doesn't expose ST.14 codes (US OARD uses 35 USC § sections, not ST.14) also leave the field empty. Filter for len(categories) > 0 to query only ST.14- exposed rows.

Query example — find multi-category citations (citations where the examiner cited the same document under both novelty AND inventive-step grounds):

python
from datasets import load_dataset

ds_ep = load_dataset("v13s/golden-fto-layer-a", "ep", split="train")

multi_cat_rows = []
for row in ds_ep:
    for ref in row["prior_art"]:
        cats = set(ref["categories"])
        if {"X", "Y"}.issubset(cats):
            multi_cat_rows.append(
                (row["case_id"], ref["ref_id"], ref["categories"])
            )
print(f"{len(multi_cat_rows)} XY-cited references in EP slice")
# e.g. ("EP-3290023A1-0", "US10721059", ["X", "Y"])

Without categories[] (v1.0.x consumers) you'd see severity = "novelty_destroying" for every XY citation, indistinguishable from a pure-X citation.

Cross-citation index (v1.2+)

A sibling partition prior_art_index/<jurisdiction>/index.parquet aggregates the cases partition by (ref_id, citing_jurisdiction) so consumers can ask "how often has document X been cited" without walking the cases data row-by-row.

python
from datasets import load_dataset

idx = load_dataset(
    "v13s/golden-fto-layer-a", "prior_art_index", split="train",
)
# Top-cited refs in EP search reports
top = sorted(
    [r for r in idx if r["citing_jurisdiction"] == "EP"],
    key=lambda r: r["citation_count"], reverse=True,
)[:10]
for r in top:
    print(r["ref_id"], r["citation_count"], r["citing_case_ids"])

Index schema:

FieldTypeDescription
ref_idstringCited document id (e.g. US10721059)
citing_jurisdictionstringWhere the citing examiner sits (US, EP, JP)
citation_countint32Total times this ref appears in prior_art[] across cases
citing_case_idslist<string>Sorted set of case_id values that cite this ref
severity_distributionstructCount by severity band (novelty_destroying, obviousness, background)
first_cited_datedateEarliest examination.oa_date across citing cases
last_cited_datedateLatest examination.oa_date across citing cases

Per-jurisdiction subdirs (prior_art_index/US/, prior_art_index/EP/, prior_art_index/JP/) keep the index sharded by which extractor produced it. To get a cross-jurisdiction view, union the partition or use the default config above which includes all three.

The JP index has 1,745,577 entries (top reference cited 3,658 times, mean 46.8). Note citation_count counts raw prior_art[] occurrences: the 整理標準化 citation lists repeat a reference per claim / per rejection ground, so a single application can contribute many occurrences. Use len(citing_case_ids) for the count of distinct citing applications.

JP prose enrichment (v1.3+)

JP rows carry two examination-side and two prior-art-side fields the US and EP slices don't have, sourced from the JPO 特許情報取得API's 拒絶理由通知書 endpoint and labelled by Claude Haiku 4.5:

FieldTypeDescription
examination.rejection_basis_textstring \nullProse body of the OA notice verbatim from <jp:drafting-body> (typically 1-3 KB). null for non-JP rows and for JP rows the enrichment pipeline hasn't reached yet
examination.legal_articleslist<string>Article numbers cited as grounds for the rejection, normalised to halfwidth ("第29条第1項", "第29条の2"). Empty for non-JP rows
prior_art[].severity_st14string \nullPer-reference WIPO ST.14 category (X, Y, A, E, O, P, T, L) extracted from the prose. null when prose enrichment isn't available — consumers should fall back to the v1.2 severity proxy
prior_art[].severity_sourcestring"cited_type_proxy" (v1.2 derivation from citedtype, the default) or `"proseextracted" (Haiku 4.5 over the drafting-body prose). Lets consumers distinguish enriched rows from proxy rows even when severity_st14` happens to be null

The proxy severity field stays populated on enriched rows for backward compat. Query pattern:

python
ds_jp = load_dataset("v13s/golden-fto-layer-a", "jp", split="train")
for row in ds_jp:
    for ref in row["prior_art"]:
        truth = ref["severity_st14"]   # WIPO ST.14, ground truth if present
        if truth is None:
            truth = ref["severity"]    # v1.2 proxy fallback

The enrichment pipeline runs against the JP slice incrementally (JPO API quota gates the rate), so severity_st14 rolls in progressively across v1.3.x patch releases.

Rejection reason codes

Canonical 3-letter codes consistent across jurisdictions:

CodeUSC §Description
anticipation_10235 USC §102Lack of novelty (single-reference)
obviousness_10335 USC §103Obviousness (multi-reference combination)
subject_matter_10135 USC §101Patent-eligible subject matter (Alice/Mayo/Bilski)
indefiniteness_11235 USC §112Written description / definiteness
double_patentingnon-statutorySame invention claimed twice

Future EP/JP releases add their statute-equivalent codes (novelty_epc_54, inventive_step_epc_56, novelty_jp_29_1, etc.) without breaking the schema.

How was this built?

US slice (5 000 rows)

  1. 1.OARD bulk download (the 4M-row USPTO Office Action Research Dataset, frozen at the 2017 release): manually browser-downloaded from research.uspto.gov, mirrored to v13s/oard-2017-mirror for repeatable fetches
  2. 2.office_actions.csv scan for the first 5 000 unique application IDs in chronological order
  3. 3.citations.csv filter pass to keep only those 5 000 apps' citation rows (~50 MB filtered from a 4 M-row, 5 GB unfiltered source)
  4. 4.USPTO ODP API enrichment per app (60 RPM rate limit; ~85 minutes wall-clock for the full pass)
  5. 5.Triple construction — the OARD's pre-classified rejection_* boolean columns + the citation rows + the ODP metadata combine into a LayerATriple per OA event

EP slice (850 rows, v1.0.2 → v1.3 expansion)

  1. 1.EP publications list auto-curated via IPC-stratified OPS published-data/search queries across 23 (IPC, year-range) buckets covering G06F (16/17/21/40), H04L67, H04W4, G06Q30, G06N (3/20), G06V20, A61K (9/39/47), B60W30, B60K35, G05D1, G01S17, C07K16, C12N15 — filing years 2014–2020. Quality gate keeps only candidates with ≥ 1 search-phase reg:citation and ≥ 3 claim-text entries
  2. 2.OPS published-data full-cycle for biblio + claims (epodoc/docdb format, kind-suffix fallback for older publications)
  3. 3.OPS Register service (/rest-services/register/publication/ epodoc/{pub}/biblio) for search-report citations — these carry the WIPO ST.14 category codes, mapped to severity via the table above and the full multi-character string split into categories[] (v1.2)
  4. 4.Two-endpoint merge per publication: full-cycle gives the bibliographic context; the Register service gives the prior_art[] list. Filtered to @cited-phase == "search" to keep the high-signal X/Y/A subset
  5. 5.Triple construction — same LayerATriple shape as the US slice; oa_type = "search_report", outcome.final_disposition = "pending" for EP rows (a separate legal-status enrichment path resolves to granted / lapsed_fee / withdrawn in the live Parallax agent's priorArtReferences table; the Layer A public dataset keeps the conservative default)
  6. 6.Index reduction (v1.2) — after the cases shards land, a build_index_for_staging pass walks them once and writes the prior_art_index/EP/index.parquet sibling partition with per-(refid, citingjurisdiction) citation_count + severity_distribution aggregates

JP slice (5,801,435 rows, v1.3, labels only)

  1. 1.JPO 整理標準化 ISO bulk corpus — the full 2002–2019 整理標準化 (standardised bibliographic + examination) ISO 9660 masters obtained from INPIT (1.7 TB), lowered to LayerATriple rows by per-year XML / SGML parsers (the η-9 lowering). 5,801,435 triples — roughly ×1,160 the US slice's citation density.
  2. 2.cited_type → severity proxy — the 整理標準化 citation graph records each reference's cited_type, mapped to the severity proxy (severity_source="cited_type_proxy"). JP severity is citation-graph- derived, not rejection-derived, so a novelty-relevant reference can co-occur with an unamended grant; this is expected, not a data error (see Known limitations).
  3. 3.η-10 prose enrichment (incremental) — for apps the JPO 特許情報取得API has reached, the 拒絶理由通知書 prose is labelled by Claude Haiku 4.5 into per-reference WIPO ST.14 categories (severity_st14, severity_source="prose_extracted") and legal_articles. Per JPO 利用規約 第4条 the prose body (rejection_basis_text) is withheld from the public release — only the derived labels ship.
  4. 4.Per-year Parquet build — each filing-ISO year is converted and uploaded independently (build_jp_parquet), keeping every build short enough to finish in one compute window, then assembled with the US + EP slices into the coordinated atomic release.

Common steps (all slices)

  1. 1.Validation: every row passes a linking validator that checks temporal sanity (cited prior art filed before the invention), severity coherence (novelty-destroying citations on a granted+unamended application would be an inconsistency), and schema round-trip
  2. 2.Parquet emit partitioned by jurisdiction × filing_year, with a SHA-256 manifest for byte-level reproducibility
  3. 3.HuggingFace push under v13s/golden-fto-layer-a

The full pipeline source lives in the public repo at parallax/data-pipeline. The release runner is `bin/local-extract-v1.sh`.

Known limitations

  • Sample size: 5,807,285 rows. The full OARD has 4 M+ Office Actions; ramp-up to 50 K+ US rows is planned. The EP slice grew 11 → 850 (v1.0.2 → v1.3) via IPC-stratified auto-curation; further expansion gated on OPS /claims 413 attrition handling for long-claim publications.
  • OPS `/claims` 413 attrition (EP curation): G06F16 / H04L67 publications with very long claim lists exceed OPS's /claims payload size limit. The curation quality gate currently drops these candidates rather than partial-fetching, biasing the EP slice toward pharma/mechanical/control IPCs.
  • Sparse claim text: The ODP search endpoint returns bibliographic metadata (title, applicant, IPC) but not full claim text. Some rows have invention.claims = [] or placeholder markers; full claim extraction needs a separate ODP call (planned).
  • JP labels only: Per JPO 利用規約 第4条, examination.rejection_basis_text is withheld (null) in the public release. Only the derived severity_st14 + legal_articles fields are published. severity_st14 rolls in progressively as the η-10 enrichment pipeline processes apps; remaining rows carry the v1.2 severity proxy (severity_source="cited_type_proxy").
  • EP claim ranges: The Register service embeds claim ranges in the citation's bibliographic text annotation ([Y] 5,12). v1.0.3+ extracts these into prior_art[].claims_blocked; legacy v1.0.2 rows leave the list empty.
  • Mixed schema_version partition: rows from v1.0 / v1.1 cron cycles carry schema_version="1.0" and an empty categories[], while v1.2+ rows carry schema_version="1.2" and populated categories[] (when the source supports ST.14). Filter on schema_version if you need a single-version partition.
  • JP `prior_art_index` counts raw occurrences: the JP cross-citation index now ships (1,745,577 entries), but citation_count includes within-application repeats from the 整理標準化 citation lists (a ref repeated per claim / per ground). Use len(citing_case_ids) for the count of distinct citing applications.
  • EP outcome field is conservative: Without joining the OPS legal-status endpoint, outcome.final_disposition defaults to pending for EP rows. The live Parallax agent resolves these via a separate legal-status enrichment path; the public Layer A dataset keeps the conservative default.
  • US outcome field is conservative: HUPD-derived outcome enrichment provides granted / rejected / pending for ~99 % of US rows (filing 2011-2017); rows beyond HUPD coverage default to pending.

Versioning

Semantic versioning per golden-dataset-plan.md:

  • MAJOR — schema-incompatible (field removed, type changed)
  • MINOR — new fields, new jurisdictions, ≥10 % data growth
  • PATCH — parser bugfix, individual case re-validation

The HuggingFace dataset repo's git history is the canonical release ledger. To pin a specific version in your code:

python
ds = load_dataset("v13s/golden-fto-layer-a", revision="v1.3.2")

Citation

If you use this dataset in academic work, please cite:

bibtex
@dataset{vox_layer_a_2026,
  author       = {Hara, Yoichiro and {Vox}},
  title        = {Layer A — Office Action Triples for
                  Freedom-to-Operate Evaluation},
  year         = 2026,
  publisher    = {Hugging Face},
  version      = {{1.3.2}},
  url          = {https://huggingface.co/datasets/v13s/golden-fto-layer-a},
  note         = {Curated under CC-BY-4.0; underlying patent
                  data in the public domain}
}

License

  • Curation layer (this dataset): CC-BY-4.0 — the schema, severity tagging, and triple construction are © Vox 2026 and may be used / redistributed with attribution.
  • Underlying patent documents: public domain (USPTO).
  • OARD source data: public domain (USPTO Office of the Chief Economist).
  • JP slice (labels only): The JP corpus is derived from the JPO 整理標準化 ISO bulk data. Per JPO 利用規約 第4条, examination.rejection_basis_text is withheld (null) in this public release. Only derived labels (severity_st14, legal_articles) are distributed. Consumers redistributing JP rows MUST attribute "特許庁" as the upstream source and link this dataset's card.

Contact

  • Curator: Yoichiro Hara (Co-Founder & CEO, Vox Technologies / Vox Japan株式会社) — yo@vox.delivery
  • Org: Vox (HF: v13s)
  • Source repo: <https://github.com/masterleopold/parallax>
  • Issues: <https://github.com/masterleopold/parallax/issues>
  • Product surface: <https://parallax.modelina.ai>

For takedown requests on specific patent applications, file an issue or email the curator. Public-domain patent data is included in good faith; the curation layer can be redacted on request.