diff --git a/.github/workflows/darwin-semantic-backlog.yml b/.github/workflows/darwin-semantic-backlog.yml
new file mode 100644
index 00000000..f1cf16ec
--- /dev/null
+++ b/.github/workflows/darwin-semantic-backlog.yml
@@ -0,0 +1,84 @@
+name: Darwin/Rachinsky 1864 semantic backlog
+
+on:
+ pull_request:
+ paths:
+ - ".github/workflows/darwin-semantic-backlog.yml"
+ - "scriptorium/darwin_semantic_backlog.py"
+ - "scriptorium/darwin_render_profile.py"
+ - "tests/test_darwin_semantic_backlog.py"
+ - "corpus/candidates/darwin-origin-species-rachinsky-1864-ru.md"
+ - "corpus/candidates/source-edition-traces/darwin-origin-species-rachinsky-1864-ru.render-surface.json"
+ - "corpus/candidates/source-edition-traces/darwin-origin-species-rachinsky-1864-ru.render-profile.json"
+ - "corpus/candidates/source-edition-traces/darwin-origin-species-rachinsky-1864-ru.semantic-backlog.json"
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+jobs:
+ verify:
+ name: Verify source-free unresolved-semantic backlog
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ steps:
+ - name: Checkout pull-request head
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ with:
+ ref: ${{ github.event.pull_request.head.sha || github.sha }}
+ persist-credentials: false
+
+ - name: Set up Python 3.13
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
+ with:
+ python-version: "3.13"
+
+ - name: Run semantic backlog and render-profile regression tests
+ run: |
+ python -m unittest tests.test_darwin_semantic_backlog -v
+ python -m unittest tests.test_darwin_render_profile -v
+
+ - name: Deterministically rebuild and compare backlog
+ run: |
+ set -euo pipefail
+ mkdir -p build/repro
+ python -m scriptorium.darwin_semantic_backlog \
+ --profile corpus/candidates/source-edition-traces/darwin-origin-species-rachinsky-1864-ru.render-profile.json \
+ --surface corpus/candidates/source-edition-traces/darwin-origin-species-rachinsky-1864-ru.render-surface.json \
+ --output build/repro/darwin-origin-species-rachinsky-1864-ru.semantic-backlog.json
+ python - <<'PY'
+ import json
+ from pathlib import Path
+ expected = json.loads(Path("corpus/candidates/source-edition-traces/darwin-origin-species-rachinsky-1864-ru.semantic-backlog.json").read_text(encoding="utf-8"))
+ rebuilt = json.loads(Path("build/repro/darwin-origin-species-rachinsky-1864-ru.semantic-backlog.json").read_text(encoding="utf-8"))
+ assert rebuilt == expected
+ assert rebuilt["backlog_sha256"] == "4ec4f84566f5f3f8dccd1945906d1a782f4532547a13cadc8570cb5b682bdcb2"
+ assert rebuilt["unresolved_totals"] == {
+ "tag_shape_count": 5,
+ "tag_token_count": 518,
+ "template_shape_count": 38,
+ "template_invocation_count": 4583,
+ }
+ assert len(rebuilt["prioritized_items"]) == 43
+ assert rebuilt["next_research_slice"]["name"] == "ё"
+ assert rebuilt["next_research_slice"]["count"] == 2227
+ assert rebuilt["next_research_slice"]["semantic_status"] == "unresolved"
+ assert rebuilt["renderer_semantics_complete"] is False
+ assert rebuilt["renderer_implementation_ready"] is False
+ assert rebuilt["inter_page_composition_frozen"] is False
+ assert rebuilt["literary_body_count_and_digests_frozen"] is False
+ assert rebuilt["minimum_300k_proved"] is False
+ assert rebuilt["admitted_for_calibration"] is False
+ assert rebuilt["fantlab_source_edition_match"] == "unknown"
+ assert rebuilt["diagnostic_ready"] is False
+ assert rebuilt["m2_parity_admissible"] is False
+ print("SCRIPTORIUM_DARWIN_SEMANTIC_BACKLOG_SHA256=" + rebuilt["backlog_sha256"])
+ PY
+
+ - name: Upload source-free semantic backlog evidence
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+ with:
+ name: darwin-rachinsky-1864-semantic-backlog
+ path: build/repro/darwin-origin-species-rachinsky-1864-ru.semantic-backlog.json
+ if-no-files-found: error
+ retention-days: 7
diff --git a/corpus/candidates/darwin-origin-species-rachinsky-1864-ru-semantic-backlog.md b/corpus/candidates/darwin-origin-species-rachinsky-1864-ru-semantic-backlog.md
new file mode 100644
index 00000000..e6b1cc37
--- /dev/null
+++ b/corpus/candidates/darwin-origin-species-rachinsky-1864-ru-semantic-backlog.md
@@ -0,0 +1,41 @@
+# Darwin/Rachinsky 1864 — unresolved rendering semantics
+
+This public source-free companion to `darwin-origin-species-rachinsky-1864-ru` exposes the remaining rendering-semantic work after the reviewed exact-388 Page surface and fail-closed render profile were frozen.
+
+No literary source text, Page wikitext, template argument values, rendered prose, OCR or scan bytes are stored here. Counts come only from the already frozen render profile SHA-256 `2ebcfea51282505c28824f54f6a1795bd7e87e2f958ac59f5c843e68c2066f3d`.
+
+## Remaining surface
+
+The profile still has **43 unresolved shapes**:
+
+| Research track | Shapes | Observed occurrences |
+| --- | ---: | ---: |
+| provider-template semantics | 37 | 4,579 |
+| provider-reference semantics | 3 | 466 |
+| provider-math semantics | 2 | 52 |
+| inter-page semantics | 1 | 4 |
+
+Those totals exactly preserve the reviewed boundary: **5 unresolved tag shapes / 518 tag tokens** and **38 unresolved template shapes / 4,583 invocations**.
+
+## Mechanical next target
+
+The deterministic backlog ranks unresolved items by descending observed occurrence count with stable tie-breaking. The first research target is template **`ё`**, arity **0 positional / 0 named**, observed **2,227 times** (2,227 / 4,583 unresolved template invocations).
+
+This ranking is **not a semantics claim**. `ё` remains `semantic_status=unresolved`; a separate bounded unit must establish its provider behavior with independent evidence before the renderer profile may change.
+
+The next two rows are self-closing `` (**388**) and template `ВАР` with arity 2/0 (**388**). Reference/math behavior and the inter-page-sensitive `nop` track remain independently reviewable rather than being folded into one guessed renderer policy.
+
+## Frozen artifact
+
+Canonical source-free artifact:
+
+- [`source-edition-traces/darwin-origin-species-rachinsky-1864-ru.semantic-backlog.json`](source-edition-traces/darwin-origin-species-rachinsky-1864-ru.semantic-backlog.json)
+- schema: `scriptorium-darwin-render-semantic-backlog-v1`
+- backlog SHA-256: `4ec4f84566f5f3f8dccd1945906d1a782f4532547a13cadc8570cb5b682bdcb2`
+- builder/validator: [`../../scriptorium/darwin_semantic_backlog.py`](../../scriptorium/darwin_semantic_backlog.py)
+
+The artifact is derived only after the existing render profile validates against its frozen source surface. Any profile/surface drift fails before backlog derivation.
+
+## Gates unchanged
+
+This slice does not implement rendering and does not advance corpus or FantLab parity gates. The following remain false/unknown: `renderer_semantics_complete`, `renderer_implementation_ready`, `inter_page_composition_frozen`, `literary_body_count_and_digests_frozen`, `minimum_300k_proved`, `admitted_for_calibration`, `diagnostic_ready`, `m2_parity_admissible`; `fantlab_source_edition_match=unknown`. M2 remains **0/5**.
diff --git a/corpus/candidates/darwin-origin-species-rachinsky-1864-ru.md b/corpus/candidates/darwin-origin-species-rachinsky-1864-ru.md
index 42ef51be..a1bb754f 100644
--- a/corpus/candidates/darwin-origin-species-rachinsky-1864-ru.md
+++ b/corpus/candidates/darwin-origin-species-rachinsky-1864-ru.md
@@ -81,12 +81,22 @@ Independent exact-head review re-read all settled CI on `ee97e29af7225131002b6e0
## Fail-closed rendering decision profile
-**SCRIP-CORPUS-045 / Draft PR #178** adds `scriptorium-darwin-page-render-profile-v1`, bound cryptographically to the reviewed exact-388 source-free surface freeze before any shape classification is accepted. The profile covers all **18 tag shapes / 5,164 tag tokens** and all **38 template shapes / 4,583 template invocations**. Its canonical profile SHA-256 is **`2ebcfea51282505c28824f54f6a1795bd7e87e2f958ac59f5c843e68c2066f3d`**.
+**SCRIP-CORPUS-045 / merged PR #178** adds `scriptorium-darwin-page-render-profile-v1`, bound cryptographically to the reviewed exact-388 source-free surface freeze before any shape classification is accepted. The profile covers all **18 tag shapes / 5,164 tag tokens** and all **38 template shapes / 4,583 template invocations**. Its canonical profile SHA-256 is **`2ebcfea51282505c28824f54f6a1795bd7e87e2f958ac59f5c843e68c2066f3d`**.
The decision table defines only conservative local markup handling: ordinary `big`, `div`, `small`, `sub` and `sup` wrappers preserve inner text; `` is excluded from transcluded content; ProofreadPage `pagequality` metadata is dropped. It intentionally leaves **5 tag shapes / 518 tokens** unresolved for provider semantics: `