Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 13 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ OmniDocBench is used as one document-parsing evaluation protocol. The methods
and infrastructure in this repository are designed around the broader research
problem of table structure recognition.

## Research snapshot 2026.08.12.2
## Research snapshot 2026.08.12.4

The `2026.08.12.2` snapshot establishes the shared representation, evaluation,
The `2026.08.12.4` snapshot establishes the shared representation, evaluation,
and synthetic-corpus specification for two independent modeling tracks. It
includes Canonical Table normalization, order-invariant topology targets,
candidate-integrity checks, table-only model interfaces, a frozen 256-record
Expand All @@ -38,7 +38,8 @@ dataset payloads are maintained outside this repository.
Project-authored releases follow calendar versioning:

- research snapshots: `2026.08.12`, `2026.09.03`, and so on;
- same-day revisions: `2026.08.12.1`, `2026.08.12.2`, and so on;
- same-day revisions: `2026.08.12.1`, `2026.08.12.2`, `2026.08.12.3`,
`2026.08.12.4`, and so on;
- model artifacts: `explicit-2026.08.12` and `lora-2026.08.12`.

External software and benchmark releases retain their original upstream names.
Expand Down Expand Up @@ -103,6 +104,7 @@ borderless-table-structuring-lab/
│ └── REPRODUCIBILITY_2026.08.12.1.md
├── configs/ # Calendar-versioned generation parameters
├── schemas/ # Calendar-versioned record schemas
├── scripts/ # Calendar-versioned corpus entry points
├── src/borderless_table_structuring/
│ ├── canonical.py # Canonical table normalization
│ ├── explicit.py # Public Explicit-route interface
Expand Down Expand Up @@ -143,7 +145,7 @@ compression, blur, background, and scanning artifacts.
Dataset roles are assigned by document, template, content, renderer, and seed
families before rendering. Exact and near-duplicate audits operate on images,
text, normalized structure, geometry, and provenance. See the
[synthetic data specification](docs/corpus/SYNTHETIC_DATA_SPECIFICATION_2026.08.12.2.md)
[synthetic data specification](docs/corpus/SYNTHETIC_DATA_SPECIFICATION_2026.08.12.4.md)
and [data governance guide](docs/corpus/DATA_GOVERNANCE_2026.08.12.1.md).

## Installation
Expand All @@ -165,6 +167,13 @@ Run the data-free test suite:
pytest
```

Generate the bounded synthetic-data smoke into a new external payload path:

```bash
python scripts/generate_data_smoke_2026.08.12.4.py \
--output /absolute/path/to/data-smoke-2026.08.12.4
```

## Reproducible research

Experiments record the code revision, schema release, immutable data revision,
Expand Down
77 changes: 77 additions & 0 deletions configs/generation_parameters_2026.08.12.3.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
{
"configuration_release": "2026.08.12.3",
"dataset_release": "data-smoke-2026.08.12.3",
"schema_release": "synthetic-table-record-2026.08.12.3",
"seed_namespace": "borderless-table-structuring-data-smoke-2026.08.12.3",
"seed_start": 202608120300000,
"requested_records": 256,
"allow_failed_seed_replacement": false,
"gate_costs": {
"false_edit": 4.0,
"missed_edit": 1.0,
"uncertain_action": "KEEP"
},
"categories": {
"exact_keep": {"count": 64, "gate_label": "KEEP"},
"hard_keep": {"count": 64, "gate_label": "KEEP"},
"single_minimal_edit": {"count": 64, "gate_label": "EDIT"},
"complex_correction": {"count": 64, "gate_label": "EDIT"}
},
"roles_per_category": {
"train": 44,
"development": 12,
"holdout": 8
},
"counterfactual_pairs": {
"minimum_pairs": 64,
"same_role_required": true,
"shared_fields": [
"content_family_id",
"template_family_id",
"font_family_id",
"renderer_family_id",
"base_degradation"
]
},
"structure": {
"rows": {"minimum": 2, "maximum": 28},
"columns": {"minimum": 2, "maximum": 14},
"header_depth": {"minimum": 0, "maximum": 4},
"span_fraction": {"minimum": 0.0, "maximum": 0.45},
"empty_cell_fraction": {"minimum": 0.0, "maximum": 0.35},
"maximum_cells": 240
},
"rendering": {
"canvas_width_px": [960, 1280, 1600, 2048],
"dpi": [96, 150, 200, 300],
"font_size_px": {"minimum": 12, "maximum": 32},
"cell_padding_px": {"minimum": 4, "maximum": 18},
"rotation_degrees": {"minimum": -4.0, "maximum": 4.0},
"border_alpha": {"minimum": 0.0, "maximum": 1.0},
"jpeg_quality": {"minimum": 55, "maximum": 100},
"gaussian_blur_radius": {"minimum": 0.0, "maximum": 1.8},
"noise_sigma": {"minimum": 0.0, "maximum": 12.0}
},
"corruptions": {
"single_minimal_edit_exactly_one": true,
"complex_correction_minimum_operations": 2,
"complex_correction_maximum_operations": 4,
"accepted_prior_must_remain_canonical_legal": true,
"invalid_grid_fixtures_are_test_only": true,
"allowed": [
"extra_split",
"missing_split",
"incorrect_merge",
"missing_merge",
"span_extent_error",
"token_ownership_error",
"geometry_inconsistency",
"row_or_column_assignment_error"
]
},
"determinism": {
"semantic_replay_runs": 2,
"normalized_pixel_replay_runs": 2,
"sha256_algorithm": "sha256"
}
}
77 changes: 77 additions & 0 deletions configs/generation_parameters_2026.08.12.4.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
{
"configuration_release": "2026.08.12.4",
"dataset_release": "data-smoke-2026.08.12.4",
"schema_release": "synthetic-table-record-2026.08.12.4",
"seed_namespace": "borderless-table-structuring-data-smoke-2026.08.12.4",
"seed_start": 202608120400000,
"requested_records": 256,
"allow_failed_seed_replacement": false,
"gate_costs": {
"false_edit": 4.0,
"missed_edit": 1.0,
"uncertain_action": "KEEP"
},
"categories": {
"exact_keep": {"count": 64, "gate_label": "KEEP"},
"hard_keep": {"count": 64, "gate_label": "KEEP"},
"single_minimal_edit": {"count": 64, "gate_label": "EDIT"},
"complex_correction": {"count": 64, "gate_label": "EDIT"}
},
"roles_per_category": {
"train": 44,
"development": 12,
"holdout": 8
},
"counterfactual_pairs": {
"minimum_pairs": 64,
"same_role_required": true,
"shared_fields": [
"content_family_id",
"template_family_id",
"font_family_id",
"renderer_family_id",
"base_degradation"
]
},
"structure": {
"rows": {"minimum": 2, "maximum": 28},
"columns": {"minimum": 2, "maximum": 14},
"header_depth": {"minimum": 0, "maximum": 4},
"span_fraction": {"minimum": 0.0, "maximum": 0.45},
"empty_cell_fraction": {"minimum": 0.0, "maximum": 0.35},
"maximum_cells": 240
},
"rendering": {
"canvas_width_px": [960, 1280, 1600, 2048],
"dpi": [96, 150, 200, 300],
"font_size_px": {"minimum": 12, "maximum": 32},
"cell_padding_px": {"minimum": 4, "maximum": 18},
"rotation_degrees": {"minimum": -4.0, "maximum": 4.0},
"border_alpha": {"minimum": 0.0, "maximum": 1.0},
"jpeg_quality": {"minimum": 55, "maximum": 100},
"gaussian_blur_radius": {"minimum": 0.0, "maximum": 1.8},
"noise_sigma": {"minimum": 0.0, "maximum": 12.0}
},
"corruptions": {
"single_minimal_edit_exactly_one": true,
"complex_correction_minimum_operations": 2,
"complex_correction_maximum_operations": 4,
"accepted_prior_must_remain_canonical_legal": true,
"invalid_grid_fixtures_are_test_only": true,
"allowed": [
"extra_split",
"missing_split",
"incorrect_merge",
"missing_merge",
"span_extent_error",
"token_ownership_error",
"geometry_inconsistency",
"row_or_column_assignment_error"
]
},
"determinism": {
"semantic_replay_runs": 2,
"normalized_pixel_replay_runs": 2,
"sha256_algorithm": "sha256"
}
}
65 changes: 65 additions & 0 deletions docs/corpus/ACCEPTANCE_CRITERIA_2026.08.12.3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# Acceptance Criteria 2026.08.12.3

Status: `FROZEN_FOR_GENERATOR_SMOKE`

## Preregistered smoke gate

`data-smoke-2026.08.12.3` passes only when all criteria below pass. No failed
seed may be silently replaced, no category quota may be rebalanced after
generation, and no model performance metric may be used to select records.

| Criterion | Required result | Failure action |
|---|---:|---|
| Requested records | 256 | Stop |
| Generated records | 256 | Stop |
| Accepted records | 256 | Stop |
| Exact KEEP / Hard KEEP / Single / Complex | 64 / 64 / 64 / 64 | Stop |
| Counterfactual pairs | at least 64 complete same-role pairs | Stop |
| Schema validation | 256/256 | Stop |
| Canonical legality of Gold and prior | 256/256 | Stop |
| Complete grid coverage of Gold and prior | 256/256 | Stop |
| Gold recompilation | 256/256 semantic identity | Stop |
| Unique OCR-token ownership | 100% of owned tokens | Stop |
| Finite complete geometry | 256/256 | Stop |
| KEEP semantic identity | 128/128 | Stop |
| EDIT replay to Gold | 128/128 | Stop |
| Explicit KEEP empty diff | 128/128 | Stop |
| LoRA target completeness | 256/256 | Stop |
| Semantic replay | identical across 2 runs | Stop |
| Normalized-pixel replay | identical across 2 runs | Stop |
| Source and license inventory | complete and approved | Stop |
| Cross-role exact overlap | 0 | Stop |
| Cross-role unresolved near overlap | 0 | Stop |
| Terminal-input usage | false for every record | Stop |
| Incomplete-grid rejection fixture | rejected as `GRID_INCOMPLETE` | Stop |
| Complete count accounting | requested/generated/accepted/quarantined/failed | Stop |

## Validation reason codes

Every failure uses a stable reason code, including:

- `SCHEMA_INVALID`;
- `CANONICAL_ILLEGAL`;
- `GRID_INCOMPLETE`;
- `GOLD_RECOMPILE_MISMATCH`;
- `TOKEN_OWNERSHIP_INVALID`;
- `GEOMETRY_INVALID`;
- `KEEP_NOT_IDENTITY`;
- `EDIT_NOT_REPLAYABLE`;
- `NONDETERMINISTIC_SEMANTICS`;
- `NONDETERMINISTIC_PIXELS`;
- `SOURCE_OR_LICENSE_INCOMPLETE`;
- `CROSS_ROLE_EXACT_OVERLAP`;
- `CROSS_ROLE_NEAR_OVERLAP`;
- `TERMINAL_DERIVATION_RISK`.

Quarantine manifests preserve every failed record identifier, frozen seed,
reason code, and diagnostic hash. The intentionally incomplete-grid fixture is
test evidence and is not part of the 256-record corpus manifest.

## Post-pass boundary

A sealed pass authorizes a new non-overwriting shared-corpus build with frozen
distributions. It does not authorize Explicit or LoRA training. Corpus scale is
chosen from measured generation cost, coverage, and quarantine rate, not from
current official benchmark scores.
65 changes: 65 additions & 0 deletions docs/corpus/ACCEPTANCE_CRITERIA_2026.08.12.4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# Acceptance Criteria 2026.08.12.4

Status: `FROZEN_FOR_GENERATOR_SMOKE`

## Preregistered smoke gate

`data-smoke-2026.08.12.4` passes only when all criteria below pass. No failed
seed may be silently replaced, no category quota may be rebalanced after
generation, and no model performance metric may be used to select records.

| Criterion | Required result | Failure action |
|---|---:|---|
| Requested records | 256 | Stop |
| Generated records | 256 | Stop |
| Accepted records | 256 | Stop |
| Exact KEEP / Hard KEEP / Single / Complex | 64 / 64 / 64 / 64 | Stop |
| Counterfactual pairs | at least 64 complete same-role pairs | Stop |
| Schema validation | 256/256 | Stop |
| Canonical legality of Gold and prior | 256/256 | Stop |
| Complete grid coverage of Gold and prior | 256/256 | Stop |
| Gold recompilation | 256/256 semantic identity | Stop |
| Unique OCR-token ownership | 100% of owned tokens | Stop |
| Finite complete geometry | 256/256 | Stop |
| KEEP semantic identity | 128/128 | Stop |
| EDIT replay to Gold | 128/128 | Stop |
| Explicit KEEP empty diff | 128/128 | Stop |
| LoRA target completeness | 256/256 | Stop |
| Semantic replay | identical across 2 runs | Stop |
| Normalized-pixel replay | identical across 2 runs | Stop |
| Source and license inventory | complete and approved | Stop |
| Cross-role exact overlap | 0 | Stop |
| Cross-role unresolved near overlap | 0 | Stop |
| Terminal-input usage | false for every record | Stop |
| Incomplete-grid rejection fixture | rejected as `GRID_INCOMPLETE` | Stop |
| Complete count accounting | requested/generated/accepted/quarantined/failed | Stop |

## Validation reason codes

Every failure uses a stable reason code, including:

- `SCHEMA_INVALID`;
- `CANONICAL_ILLEGAL`;
- `GRID_INCOMPLETE`;
- `GOLD_RECOMPILE_MISMATCH`;
- `TOKEN_OWNERSHIP_INVALID`;
- `GEOMETRY_INVALID`;
- `KEEP_NOT_IDENTITY`;
- `EDIT_NOT_REPLAYABLE`;
- `NONDETERMINISTIC_SEMANTICS`;
- `NONDETERMINISTIC_PIXELS`;
- `SOURCE_OR_LICENSE_INCOMPLETE`;
- `CROSS_ROLE_EXACT_OVERLAP`;
- `CROSS_ROLE_NEAR_OVERLAP`;
- `TERMINAL_DERIVATION_RISK`.

Quarantine manifests preserve every failed record identifier, frozen seed,
reason code, and diagnostic hash. The intentionally incomplete-grid fixture is
test evidence and is not part of the 256-record corpus manifest.

## Post-pass boundary

A sealed pass authorizes a new non-overwriting shared-corpus build with frozen
distributions. It does not authorize Explicit or LoRA training. Corpus scale is
chosen from measured generation cost, coverage, and quarantine rate, not from
current official benchmark scores.
30 changes: 30 additions & 0 deletions docs/corpus/COVERAGE_MATRIX_2026.08.12.3.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
category,gate_label,phenomenon,requested_count,train_count,development_count,holdout_count,counterfactual_pair_required,primary_risk
exact_keep,KEEP,simple_regular,12,8,2,2,false,false_edit
exact_keep,KEEP,hierarchical_header,12,8,2,2,false,false_edit
exact_keep,KEEP,row_or_column_span,12,8,2,2,false,false_edit
exact_keep,KEEP,empty_or_sparse_cells,8,6,2,0,false,false_edit
exact_keep,KEEP,dense_or_multiline_text,8,6,2,0,false,text_loss
exact_keep,KEEP,mixed_script_or_formula,6,4,2,0,false,text_loss
exact_keep,KEEP,clean_high_resolution_control,6,4,0,2,false,false_edit
hard_keep,KEEP,multilevel_irregular_header,12,8,2,2,true,false_edit
hard_keep,KEEP,mixed_two_dimensional_spans,12,8,2,2,true,false_edit
hard_keep,KEEP,weak_missing_or_partial_borders,12,8,2,2,true,false_edit
hard_keep,KEEP,empty_near_empty_or_sparse,8,6,2,0,true,false_edit
hard_keep,KEEP,dense_small_long_or_multiline_text,8,6,2,0,true,text_loss
hard_keep,KEEP,rotation_blur_compression_or_noise,8,4,2,2,true,false_edit
hard_keep,KEEP,color_background_or_alignment_trap,4,4,0,0,true,false_edit
single_minimal_edit,EDIT,extra_split,12,8,2,2,true,cell_inflation
single_minimal_edit,EDIT,missing_split,10,6,2,2,true,under_segmentation
single_minimal_edit,EDIT,incorrect_merge,10,6,2,2,true,content_reassignment
single_minimal_edit,EDIT,missing_merge,10,6,2,2,true,over_segmentation
single_minimal_edit,EDIT,span_extent_error,8,6,2,0,true,topology_error
single_minimal_edit,EDIT,token_ownership_error,6,4,2,0,true,text_loss
single_minimal_edit,EDIT,geometry_inconsistency,4,4,0,0,true,location_error
single_minimal_edit,EDIT,row_or_column_assignment_error,4,4,0,0,true,topology_error
complex_correction,EDIT,multilevel_header_with_spans,12,8,2,2,false,topology_error
complex_correction,EDIT,joint_split_and_merge,12,8,2,2,false,cell_inflation
complex_correction,EDIT,weak_border_with_topology_error,10,6,2,2,false,missed_edit
complex_correction,EDIT,empty_cells_with_spans,8,6,2,0,false,ownership_error
complex_correction,EDIT,dense_multiline_with_topology_error,8,6,2,0,false,text_loss
complex_correction,EDIT,mixed_script_formula_with_topology_error,6,4,2,0,false,text_loss
complex_correction,EDIT,rotation_noise_with_topology_error,8,6,0,2,false,geometry_error
Loading
Loading