Initial SQL-only 1C adapter baseline
This commit is contained in:
@@ -0,0 +1,337 @@
|
||||
# 1C MOXCEL Discovery
|
||||
|
||||
This runbook describes the read-only discovery loop for tabular document
|
||||
MOXCEL payloads.
|
||||
|
||||
## Current Artifacts
|
||||
|
||||
- `reports/1c-template-baselines/Primer3_moxel_schema_discovery.json`
|
||||
contains inferred decoder rules from marker matrices and history diffs.
|
||||
- `reports/1c-template-baselines/Primer3_moxel_property_experiments.json`
|
||||
contains one-property experiment analysis and the next probe plan.
|
||||
- `reports/1c-template-baselines/Primer3_moxel_property_experiments.manifest.json`
|
||||
maps existing before/after summaries to property experiment labels.
|
||||
|
||||
## Schema Discovery
|
||||
|
||||
Run marker/history discovery:
|
||||
|
||||
```powershell
|
||||
python scripts/discover_1c_moxel_schema.py `
|
||||
--marker-matrix reports/1c-template-baselines/Primer3_marker_matrix_2026-06-27_latest.json `
|
||||
--history-matrix reports/1c-template-baselines/Primer3_history_matrix.json `
|
||||
--property-candidates reports/1c-template-baselines/Primer3_property_candidates.json `
|
||||
--output-json reports/1c-template-baselines/Primer3_moxel_schema_discovery.json `
|
||||
--output-markdown reports/1c-template-baselines/Primer3_moxel_schema_discovery.md
|
||||
```
|
||||
|
||||
The current strongest rule is:
|
||||
|
||||
```text
|
||||
moxel.inline_text_cell.column:
|
||||
one_based_column = int(last_numeric(preceding_scalars)) + 1
|
||||
```
|
||||
|
||||
Named range coordinates are partially proven from controlled moves:
|
||||
|
||||
```text
|
||||
left/right: raw scalar indexes 2 and 4
|
||||
top/bottom: raw scalar indexes 3 and 5
|
||||
one_based = raw + 1
|
||||
```
|
||||
|
||||
Use multi-cell and rectangular named ranges to split `left` from `right` and
|
||||
`top` from `bottom`.
|
||||
|
||||
Build the stable registry after discovery:
|
||||
|
||||
```powershell
|
||||
python scripts/build_1c_moxel_schema_registry.py `
|
||||
--discovery reports/1c-template-probes/upo_test_auto_moxel_schema_discovery.json `
|
||||
--discovery reports/1c-template-baselines/Primer3_moxel_schema_discovery.json `
|
||||
--output-json plugins/1c/metadata/moxel-schema-registry.json `
|
||||
--output-markdown reports/1c-template-baselines/moxel-schema-registry.md
|
||||
```
|
||||
|
||||
Validate the registry safety contract:
|
||||
|
||||
```powershell
|
||||
python scripts/check_1c_moxel_schema_registry.py `
|
||||
--registry plugins/1c/metadata/moxel-schema-registry.json `
|
||||
--output reports/1c-template-baselines/moxel-schema-registry-check.json
|
||||
```
|
||||
|
||||
The registry allows read-side decoder rules only. Write-side MOXCEL mutation is
|
||||
kept blocked until a disposable-base round-trip proves the exact scalar path.
|
||||
|
||||
Verify registry rules against concrete probe snapshots:
|
||||
|
||||
```powershell
|
||||
python scripts/verify_1c_moxel_schema_registry.py `
|
||||
--registry plugins/1c/metadata/moxel-schema-registry.json `
|
||||
--probe reports/1c-template-probes/upo_test_auto_20260627T142419Z_670780b4.json `
|
||||
--output reports/1c-template-baselines/moxel-schema-registry-verification.json
|
||||
```
|
||||
|
||||
This check is data-backed: `verified_read` rules must pass on the supplied
|
||||
probe snapshots, while `candidate_read` rules are reported as diagnostic
|
||||
evidence and are not promoted automatically.
|
||||
|
||||
## Full Pipeline
|
||||
|
||||
After a new probe or one-property experiment has been captured, refresh all
|
||||
MOXCEL discovery artifacts with one command:
|
||||
|
||||
```powershell
|
||||
python scripts/run_1c_moxel_discovery_pipeline.py
|
||||
```
|
||||
|
||||
To capture the latest live MOXCEL probe first and then refresh all artifacts:
|
||||
|
||||
```powershell
|
||||
python scripts/run_1c_moxel_discovery_pipeline.py --capture-live --label pipeline-live
|
||||
```
|
||||
|
||||
The pipeline runs schema discovery, named-range rule analysis, property
|
||||
experiment analysis, registry build, registry safety check, registry
|
||||
verification, and the next experiment plan. It writes:
|
||||
|
||||
- `reports/1c-template-baselines/moxel-discovery-pipeline.json`
|
||||
- `reports/1c-template-baselines/moxel-discovery-pipeline.md`
|
||||
- `reports/1c-template-probes/latest-live-probe.json` when `--capture-live` is used
|
||||
- `reports/1c-template-baselines/moxel-named-range-rules.md`
|
||||
- `reports/1c-template-baselines/moxel-next-experiments.md`
|
||||
- `reports/1c-template-baselines/moxel-next-action.json`
|
||||
- `reports/1c-template-baselines/moxel-next-action.md`
|
||||
- `reports/1c-template-baselines/moxel-next-action-check.json`
|
||||
- `reports/1c-template-baselines/moxel-status.md`
|
||||
|
||||
When `moxel-named-range-rules.json` contains high-confidence rectangular range
|
||||
evidence, the registry build step automatically promotes the corresponding
|
||||
named-range read rules from `candidate_read` to `verified_read`. Write status
|
||||
still remains blocked until a separate round-trip proof exists.
|
||||
|
||||
## Property Experiments
|
||||
|
||||
Generate or refresh the property probe plan:
|
||||
|
||||
```powershell
|
||||
python scripts/analyze_1c_moxel_property_experiments.py `
|
||||
--emit-default-plan `
|
||||
--output-json reports/1c-template-baselines/Primer3_moxel_property_experiments.json `
|
||||
--output-markdown reports/1c-template-baselines/Primer3_moxel_property_experiments.md
|
||||
```
|
||||
|
||||
Analyze existing before/after experiments:
|
||||
|
||||
```powershell
|
||||
python scripts/analyze_1c_moxel_property_experiments.py `
|
||||
--manifest reports/1c-template-baselines/Primer3_moxel_property_experiments.manifest.json `
|
||||
--emit-default-plan `
|
||||
--output-json reports/1c-template-baselines/Primer3_moxel_property_experiments.json `
|
||||
--output-markdown reports/1c-template-baselines/Primer3_moxel_property_experiments.md
|
||||
```
|
||||
|
||||
Each new experiment should change exactly one property on the same tracked cell
|
||||
or range, then capture a fresh `templates.map`/summary snapshot.
|
||||
|
||||
To capture the next manual one-property save automatically, start the watcher
|
||||
before changing and saving the template in 1C:
|
||||
|
||||
```powershell
|
||||
python scripts/watch_1c_moxel_property_experiment.py `
|
||||
--property ВертикальноеПоложение `
|
||||
--target-text "Ячейка 7 - 2" `
|
||||
--target-name R7C2_TEST `
|
||||
--timeout-seconds 600 `
|
||||
--run-pipeline-after
|
||||
```
|
||||
|
||||
The watcher captures a `before` snapshot, waits for a new latest MOXCEL payload,
|
||||
captures `after`, writes Markdown/JSON snapshots to
|
||||
`reports/1c-template-probes`, and appends the experiment to
|
||||
`reports/1c-template-baselines/Primer3_moxel_property_experiments.manifest.json`.
|
||||
With `--run-pipeline-after`, it also refreshes schema discovery, property
|
||||
analysis, registry build/check/verify, and the next experiment plan.
|
||||
|
||||
Prioritize:
|
||||
|
||||
- `ГоризонтальноеПоложение`
|
||||
- `ВертикальноеПоложение`
|
||||
- `ЦветТекста`
|
||||
- `ЦветФона`
|
||||
- `Шрифт.Имя`
|
||||
- `Шрифт.Размер`
|
||||
- borders
|
||||
- `Защита`
|
||||
- `Гиперссылка`
|
||||
- wrapping
|
||||
- column width
|
||||
- row height
|
||||
- merge ranges
|
||||
|
||||
Only promote a property path into write support after a disposable-base
|
||||
round-trip proves that changing that scalar affects only the intended property.
|
||||
|
||||
## XML-Assisted Fixture Plan
|
||||
|
||||
Use XML exports only as analysis fixtures. The adapter runtime stays SQL-only:
|
||||
it reads `Config`/`ConfigCAS` payloads, while exported `Ext/Template.xml`
|
||||
files are used to label and verify decoder hypotheses.
|
||||
|
||||
Create a small extension with controlled templates and export it to XML after
|
||||
each controlled save:
|
||||
|
||||
- one tabular document with sparse text cells, direct parameters, placeholders,
|
||||
and empty formatted cells;
|
||||
- one tabular document with horizontal, vertical, and rectangular merged cells;
|
||||
- one tabular document with named areas and named ranges, including duplicate
|
||||
names in different positions;
|
||||
- one tabular document dedicated to format changes: column width, row height,
|
||||
horizontal/vertical alignment, border, font, text color, background color,
|
||||
protection, wrapping;
|
||||
- one fixture per non-tabular template type where possible: text document,
|
||||
binary data, HTML document, graphical/geographical schema, data composition
|
||||
schema, data composition appearance template, external component.
|
||||
|
||||
The concrete merge fixture checklist is stored in:
|
||||
|
||||
- `reports/1c-template-baselines/moxel-controlled-merge-fixtures.json`
|
||||
- `reports/1c-template-baselines/moxel-controlled-merge-fixtures.md`
|
||||
|
||||
Start with the merge fixtures `MOXEL_Merge_None_Grid`,
|
||||
`MOXEL_Merge_H_R5C18_W3`, `MOXEL_Merge_H_R6C2_W15`,
|
||||
`MOXEL_Merge_V_R5C2_H3`, `MOXEL_Merge_Rect_R5C2_R7C4`, and
|
||||
`MOXEL_Merge_Mixed_4Ranges`. They are designed to split column edges, row
|
||||
edges, width/height, and merge-record ordering without relying on the large
|
||||
production print forms.
|
||||
|
||||
For MOXCEL discovery, change exactly one property per save, capture the SQL
|
||||
payload, then compare it with the exported XML shape. Promote read rules only
|
||||
when the SQL decoder can reproduce XML-visible facts from SQL bytes alone.
|
||||
|
||||
Use `scripts/analyze_1c_template_xml_profiles.py` to build XML fixture
|
||||
profiles without feeding XML into the adapter runtime. Example:
|
||||
|
||||
```powershell
|
||||
python scripts\analyze_1c_template_xml_profiles.py `
|
||||
--root "Z:\codex\1C\XML\UPO\Структура базы 1с\Конфигурация\Documents\АвансовыйОтчет" `
|
||||
--output-json reports\1c-template-baselines\xml-template-profiles-avansovy-otchet.json `
|
||||
--output-markdown reports\1c-template-baselines\xml-template-profiles-avansovy-otchet.md
|
||||
```
|
||||
|
||||
Current `АвансовыйОтчет` XML fixture facts:
|
||||
|
||||
- `ПФ_MXL_АвансовыйОтчет`: capacity/used `75x26`, `961` cells,
|
||||
`196` text values, `77` parameters, `108` merges, `233` distinct format
|
||||
indexes.
|
||||
- `ПФ_MXL_АвансовыйОтчетВВалюте`: capacity/used `72x26`, `938` cells,
|
||||
`188` text values, `75` parameters, `101` merges, `233` distinct format
|
||||
indexes.
|
||||
|
||||
The SQL decoder should eventually reproduce these facts from SQL payloads:
|
||||
`capacity_dimensions`/`used_dimensions`, coordinate-bound cell text and
|
||||
parameters, authoritative `merged_ranges`, and format indexes/styles. XML
|
||||
profiles are evidence for decoder hypotheses, not an input source for adapter
|
||||
answers.
|
||||
|
||||
Compare the SQL-decoded baseline with the XML fixture profile after decoder
|
||||
changes:
|
||||
|
||||
```powershell
|
||||
python scripts\profile_1c_tabular_templates.py `
|
||||
--adapter-url http://docker-gpu.cin.su:8011 `
|
||||
--base-id upo_test `
|
||||
--inventory-json reports\1c-template-baselines\upo_test_configuration_tabular_templates.json `
|
||||
--output-json reports\1c-template-baselines\upo_test_tabular_template_profiles.json `
|
||||
--output-markdown reports\1c-template-baselines\upo_test_tabular_template_profiles.md
|
||||
```
|
||||
|
||||
```powershell
|
||||
python scripts\compare_1c_template_sql_xml_profiles.py `
|
||||
--sql-profile reports\1c-template-baselines\upo_test_tabular_template_profiles.json `
|
||||
--xml-profile reports\1c-template-baselines\xml-template-profiles-avansovy-otchet.json `
|
||||
--output-json reports\1c-template-baselines\sql-xml-template-profile-compare-avansovy-otchet.json `
|
||||
--output-markdown reports\1c-template-baselines\sql-xml-template-profile-compare-avansovy-otchet.md
|
||||
```
|
||||
|
||||
The current comparison intentionally reports gaps for both `АвансовыйОтчет`
|
||||
templates. SQL capacity still reports the MOXCEL allocation `128x72`, while XML
|
||||
spreadsheet dimensions are `75x26`/`72x26`. With `template_part_moxel_v8`,
|
||||
hint-aware SQL `used_dimensions` improved to `74x25` and `71x25`; the remaining
|
||||
edge likely depends on merge/format records. Limited cell/parameter counts,
|
||||
missing authoritative `merged_ranges`, and missing format index coverage remain
|
||||
open. Use these gaps as the next decoder scorecard; a gap should only disappear
|
||||
when SQL bytes alone reproduce the XML-visible fact.
|
||||
The compare report also shows `Progress signals`. A non-zero
|
||||
`cell_coordinate_hints_available` signal means the SQL decoder recovered
|
||||
coordinate evidence from hints, but the `cells_missing_or_limited` gap stays
|
||||
open until authoritative cell rows/columns are decoded.
|
||||
|
||||
For merge-block row/size reverse engineering, regenerate the row-band report:
|
||||
|
||||
```powershell
|
||||
python scripts\analyze_1c_moxel_merge_row_bands.py `
|
||||
--template ПФ_MXL_АвансовыйОтчет `
|
||||
--template ПФ_MXL_АвансовыйОтчетВВалюте `
|
||||
--output-json reports\1c-template-baselines\moxel-merge-row-band-analysis-avansovy-otchet.json `
|
||||
--output-markdown reports\1c-template-baselines\moxel-merge-row-band-analysis-avansovy-otchet.md
|
||||
```
|
||||
|
||||
This report compares XML merge rows with SQL MOXCEL small-scalar bands and
|
||||
packed `scalar/32` column-edge evidence. Treat `row_or_size_hints` as low
|
||||
confidence until a controlled merge fixture proves which scalar positions are
|
||||
row indexes versus widths, heights, or flags.
|
||||
|
||||
`merge_record_block_candidates[].evidence.record_analysis` exposes a normalized
|
||||
SQL-only view of the candidate block: per-record shape/head, packed
|
||||
`scalar/32` values, small scalars, scalar slot summaries, value-to-record runs,
|
||||
and sample records. Use it for slot-formula discovery; it is diagnostic
|
||||
evidence and does not make `merged_ranges` authoritative by itself.
|
||||
|
||||
To score candidate numeric slots against XML-visible merge fields, run:
|
||||
|
||||
```powershell
|
||||
python scripts\analyze_1c_moxel_merge_slot_candidates.py `
|
||||
--template ПФ_MXL_АвансовыйОтчет `
|
||||
--template ПФ_MXL_АвансовыйОтчетВВалюте `
|
||||
--output-json reports\1c-template-baselines\moxel-merge-slot-candidates-avansovy-otchet.json `
|
||||
--output-markdown reports\1c-template-baselines\moxel-merge-slot-candidates-avansovy-otchet.md
|
||||
```
|
||||
|
||||
The current large-form slot report is intentionally hypothesis-only. It shows
|
||||
that simple value-set and ordered-offset matching are dominated by low-entropy
|
||||
height/flag values and do not prove a top/left/bottom/right formula. Use the
|
||||
controlled merge fixtures before promoting any SQL rule into authoritative
|
||||
`merged_ranges`.
|
||||
|
||||
Inline text style candidates expose `coordinate_hints` for the column using the
|
||||
discovered rule
|
||||
`inline_text_column_from_last_preceding_scalar_plus_one`. Treat this as a
|
||||
high-confidence hint for analysis and controlled experiments, not as an
|
||||
authoritative cell coordinate until row and merge rules are proven by SQL/XML
|
||||
round trips.
|
||||
|
||||
The adapter and SQL profile reports include `cell_style_coordinate_hints` in
|
||||
counts. Track this count separately from `cells`: it measures how much
|
||||
coordinate evidence was recovered from inline style records, while `cells`
|
||||
remains reserved for decoded row/cell runs with authoritative coordinates.
|
||||
|
||||
`cell_coordinate_hints` combines the style-derived column hint with a matched
|
||||
decoded cell row when the text/cell id can be linked. Use it to inspect
|
||||
text-to-coordinate evidence during decoder discovery. Do not count it as
|
||||
authoritative `cells` coverage until the row rule and merge interactions are
|
||||
validated against SQL/XML fixtures.
|
||||
|
||||
For compact inspection, request only coordinate evidence from `templates.map`
|
||||
or `templates.analyze` with `sections=coordinate_hints`. This returns
|
||||
`cell_coordinate_hints` and `cell_style_coordinate_hints` from both the
|
||||
structure and analysis layers without dumping all cells/styles.
|
||||
|
||||
Coordinate hints, hint-aware `used_dimensions`, merge-record block candidates,
|
||||
SQL-only merge-block column-edge hints, low-confidence row/size scalar hints,
|
||||
and merge-block `record_analysis` changed the decoded artifact schema, so
|
||||
MOXCEL template cache uses `template_part_moxel_v9`. Refresh SQL baselines after
|
||||
deploying the new adapter; old `v2`/`v3`/`v4` decoded artifacts will not contain
|
||||
the current `cell_coordinate_hints`, merge-block evidence, and used-dimension
|
||||
semantics.
|
||||
Reference in New Issue
Block a user