尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證ETL and analytical data pipeline for extraction, normalization, provenance, validation, and versioned datasets.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
A reproducible ETL and analytical data pipeline that extracts, normalizes, validates, and packages structured game datasets from OpenMW and Morrowind for Silt Strider Tools.
This repository is the data-engineering and analytical modeling engine behind Silt Strider Tools.
It ingests heterogeneous, 20-year-old binary game and plugin files (.esm, .esp) from Morrowind, OpenMW, Tamriel Rebuilt, Project Tamriel, and related community mods, transforming them into a normalized, profile-specific SQLite foundation.
The pipeline goes far beyond raw decompilation:檢視完整 README ↗Independent technical project · AI-assisted development
openmw-decompiler is the ETL and analytical data-processing project behind
Silt Strider Tools. It extracts game and mod records,
normalizes them into SQLite, applies validation and authored policies, and packages
structured catalogs with explicit provenance for the web application.
Despite the repository name, its role is game-data extraction and transformation, not decompilation of the OpenMW engine or reconstruction of its source code.
lowgraph/siltstrider.toolsGame records are spread across binary plugins, ordered overrides and runtime metadata. The pipeline turns those inputs into consistent, profile-specific records that the application can query without reading game files or extraction databases.
Inputs include Morrowind, Tribunal and Bloodmoon .esm files, official and mod
.esm / .esp plugins, configured load orders, authored JSON policies, and
OpenMW Lua runtime dumps. The configured mod profiles include Tamriel Rebuilt,
Project Tamriel and ARCE. Local paths and approved plugins are defined in
export_config.json and
foundation_config.json.
The workflow:
vanilla, tr, tr_arce).Outputs include normalized SQLite databases for local analysis, typed JSON catalogs, acquisition evidence, policy-based equipment recommendations, and a versioned application bundle. Only the bundle is consumed by the site.
TES3 chunk-based streams) and OpenMW runtime state into clean, relational, normalized SQLite schemas.unknown status rather than falsely asserting negative evidence.tr_arce delta over tr), ensuring downstream consumers receive deterministic inputs.INTV to its contents' condition) that pass syntactic validation.flowchart TD
subgraph Ingestion["1. Ingestion & Foundation"]
A[Game and Plugin Files<br/>.esm / .esp] --> B[extract_foundation.py]
B --> C[(Normalized SQLite<br/>Foundation)]
end
subgraph Modeling["2. World Modeling & Domain Catalogs"]
C --> D[Typed Catalogs<br/>build_catalogs.py]
C --> E[World Model<br/>build_world_catalog.py]
E --> F[Acquisition Evidence<br/>build_acquisition_index.py]
E --> G[Services, Places & Travel<br/>build_services_catalog.py]
E --> H[Journals & Quests<br/>build_journal_catalog.py]
end
subgraph Verification["3. Engine Rules & Policy Evaluation"]
I[OpenMW Lua Effect Dump<br/>dump_profiles.py] --> J[Rules Derivation<br/>build_rules_library.py]
F & G & H & J --> K[Analytical Policies<br/>early-game / late-game.json]
K --> L[Derived Recommendations<br/>build_gear_rows.py]
end
subgraph Packaging["4. Release Contract & Publication"]
D & G & H & J & L --> M[App Bundle Builder<br/>build_app_bundle.py]
M --> N[Versioned App Bundle<br/>Manifest + SHA-256 + Deltas]
N --> O[Silt Strider Tools<br/>lowgraph/siltstrider.tools]
end
The data pipeline and web application repositories communicate through exactly one interface: the versioned, content-addressed application bundle. The web browser reads published JSON catalogs and never connects to raw SQLite extraction databases.
The foundation preserves original record bytes, plugin hashes, source-plugin
references and load-order precedence. Derived outputs carry an extraction
snapshotId and profile; policy-based results and engine rules also record their
policy or runtime-dump basis. These identifiers support tracing a result back to
its inputs without confusing authored recommendations with extracted observations.
Raw extracted observations and authored analytical policies live in separate layers:
| Layer | Examples | Responsibility |
|---|---|---|
| Evidence | Item value, coordinates, container ownership, hostile spawns, lock levels | Extracted facts and physical relationships |
| Policy | Max price ceiling (e.g. 500g), theft allowance, acceptable danger ratings | Authored criteria for recommendation scenarios |
| Derived Result | Early-game equipment eligibility, best-in-slot ranking | Calculated projections under a specific policy |
Altering a recommendation rule requires changing an isolated JSON policy file—never altering or faking the underlying game observations.
Failure to find evidence is not converted into evidence of absence. Bounded or truncated searches return an explicit unknown state rather than an unjustified negative conclusion.
Known failure conditions stop publication immediately rather than remaining warnings that developers must remember to check manually.
Catalogs and bundles carry their extraction snapshot and schema versions. Builders reject mismatched snapshots, while manifests record file hashes and sizes for downstream integrity checks. Extraction snapshots derive from plugin fingerprints, profile definitions and extraction settings. Rebuilding unchanged inputs reproduces the data, but timestamped outputs can have different file hashes; this is not a promise of byte-identical rebuilds.
The full rebuild workflow executes in dependency order across the following major stages:
extract_foundation.pyvanilla, tr, and tr_arce.build_catalogs.pybuild_world_catalog.pybuild_journal_catalog.py · build_quest_catalog.py · build_script_evidence.pybuild_acquisition_index.py · query_item_sources.pybuild_services_catalog.py · build_merchant_catalog.py · build_places_catalog.py · build_faction_catalog.py · build_travel_catalog.py · build_intervention_catalog.py · build_access_catalog.py · build_teleport_catalog.py · build_ingredient_sources.pydump_profiles.py · build_rules_library.pydump_profiles.py launches OpenMW with a Lua dumper to record runtime metadata. The rules library joins engine observations with content usage, categorizing behaviors as confirmed, corrected, or unresolved rather than substituting unverified defaults.build_gear_rows.py · build_best_in_slot_catalog.pypolicy/early-game.json, policy/late-game.json) to produce recommendations ranked by effective defense, damage, or enchantment capacity.A central priority of the pipeline is migrating known operational failure modes from human documentation into executable release guards.
Checks across extraction, bundle generation and downstream staging reject:
These checks catch known failure modes before a release is staged; they do not replace review of data semantics or new failure cases. See REBUILD.md for the guards and recovery commands.
A concrete example of why end-to-end data lineage matters occurred with the INTV field on placed world references.
In TES3 binary records, placed references include an optional integer field (INTV):
INTV represents the item's current condition (durability).FLTV.Treating both cases identically caused a severe semantic defect:
Container with INTV = 0
│
▼
Applied erroneously to all items inside container
│
▼
Contained equipment marked as completely broken (Condition = 0)
│
▼
Effective item value recalculated to 0 gold
│
▼
Flawed early-game recommendation (high-end gear recommended as free / cheap)
Policy evaluation now uses condition only from the item's own reference, with automated regression tests covering both loose-item and container references. This illustrates a recurring data-validation problem: syntactically valid data can still produce corrupted downstream domain results without end-to-end invariant validation.
build_app_bundle.py packages pipeline outputs into the versioned contract consumed by Silt Strider Tools:
tr_arce profile inherits base catalogs from tr and ships only record-level deltas, minimizing payload size.See BUNDLE.md for the manifest schema.
The workflow uses Python, SQLite and JSON, with Python's standard-library binary
parsing and hashing utilities. jsonschema validates item schemas; TypeScript
interfaces in contracts/ document catalog shapes. OpenMW and Lua provide runtime
metadata that plugin records do not expose. Node.js and npm are needed for the
site's bundle-staging and consumer-test steps in a full rebuild.
Install Python dependencies:
python -m pip install -r requirements.txt
Run the complete test suite:
# For Windows workflows with restricted temp storage:
$env:TEMP='A:\Cache'; $env:TMP='A:\Cache'; python -B -m unittest discover -s . -p "test_*.py"
The test suite relies heavily on synthetic fixtures, validating binary parsing, override logic, policy enforcement, graph traversal, and bundle packaging in seconds without requiring full game installations.
Coverage spans:
Downstream consumer tests in the web application repository provide an additional independent layer of contract verification.
When upstream game plugins or policies change, the pipeline orchestrates a complete rebuild:
python rebuild.py
The rebuild runner:
Inspect available stages:
python rebuild.py --list
Resume execution from a specific stage after addressing an issue:
python rebuild.py --from rules
Inspect export_config.json and foundation_config.json for local game, engine, cache and profile paths before running a rebuild on another machine. Full extraction requires separately installed game/mod files and OpenMW; synthetic tests do not. See REBUILD.md before executing a full rebuild against real game files.
This is independent project work developed with AI assistance. I define the data workflow, expected outputs, analytical policies, provenance requirements, validation rules, test cases and acceptance criteria. My work includes reviewing generated implementations, debugging and refining transformations, validating outputs, and documenting behavior and release checks.
AI coding tools, including Claude, Codex and Antigravity, assist with implementation
and iteration. Extraction and transformation belong in this repository; interfaces
and application data consumption belong in
lowgraph/siltstrider.tools.
The versioned JSON bundle is their data interface. Agent specialties and handoffs
are documented in the coordination files, rather than enforced as exclusive
editing roles.
See:
openmw-decompiler/
├── docs/
│ ├── AGENT_PATH_MIGRATION.md # Canonical paths and migration history
│ └── stages/ # Detailed documentation for each pipeline stage
│ ├── FOUNDATION.md # Binary extraction and SQLite normalization
│ ├── CATALOGS.md # Typed catalog definitions
│ ├── WORLD_CATALOG.md # Spatial, cell, and reference modeling
│ ├── ACQUISITION_INDEX.md # Item placement and reverse-index queries
│ ├── RULES.md # OpenMW Lua effect dump and rules derivation
│ ├── POLICY.md # Authored analytical recommendation policies
│ ├── ROWS.md # Derived equipment recommendations
│ └── BUNDLE.md # App bundle manifest specification
├── policy/ # Independently versioned analytical policies (JSON)
├── schemas/ # SQLite relational schemas for extraction stages
├── contracts/ # Shared TypeScript catalog type definitions
├── extract_foundation.py # Binary record extraction entry point
├── build_catalogs.py # Typed catalog generator
├── build_world_catalog.py # World and spatial relationship builder
├── build_acquisition_index.py # Item acquisition index builder
├── build_services_catalog.py # Actor services and transport relationships
├── dump_profiles.py # OpenMW Lua runtime effect dumper
├── build_rules_library.py # Engine mechanics derivation library
├── build_gear_rows.py # Analytical gear recommendation builder
├── build_app_bundle.py # Browser application bundle packager
├── rebuild.py # Orchestrated rebuild runner
├── AGENTS.md # Agent guardrails and operational rules
├── COORDINATION.md # Cross-repo contract and ownership protocol
├── REBUILD.md # Operational guidelines for pipeline execution
└── HANDOFF.md # Context and state transfer guide
The web application consuming this pipeline's published output:
lowgraph/siltstrider.toolsCopyright (C) 2026 lowgraph.
This pipeline is free software: you can redistribute it and/or modify it under the terms
of the GNU General Public License as published by the Free Software Foundation, either
version 3 of the License, or (at your option) any later version (GPL-3.0-or-later),
like OpenMW itself. See LICENSE.
Not covered by that licence:
items/examples/, excerpts of Morrowind's data kept to
document the output format.