HLO Importer - Changelog Alpha
Per-wave release history for the HLO Importer Foundry module (Powered by Abyssal Engine). The canonical CHANGELOG with full per-file detail lives in the GitHub repository at CHANGELOG.md; this page is a rolling summary tied to commit hashes.
v1.0.0 Alpha
Phases 0 through 5 of the project plan plus seven polish and infrastructure waves are coded and pushed to main. The module has not been published to the Foundry package registry yet. Live in-Foundry verification per the test plan is the remaining gate before the first public release.
Commit-by-commit summary
| Commit | Wave | Summary |
|---|---|---|
| 2c0335b | Phase 0 | Initial repo scaffolding and Foundry module skeleton. Project files (README, LICENSE, .gitignore, CHANGELOG), HANDOFF doc, module manifest, source tree skeleton, brand art. |
| 5110ddd | Phase 1 | End-to-end pipeline from pasted HLO JSON to a Foundry-shaped actor skeleton. Parser walks portfolio shape and dispatches per compset. Matcher uses hybrid slug-first + fuzzy-name + curated overrides with a pluggable resolver pattern. Builder produces a PF2e actor with abilities (modifiers), saves, skills, languages, attributes, details, and embedded compendium references. ApplicationV2 dialog renders the paste textarea and conversion log. |
| f117446 | Phase 2 + 4 | Dedicated handlers for every HLO compset Noxora carries (Feat, Action, Ability, Spell, Weapon, NaturalWep, WeaponTrait, Ammunition, Armor, ArmorTrait, Upgrade, GearBasic, Trait, Augmentation). HLO Public API client with acquireAccessToken and getCharacter wait-cycle handling. 50-minute TTL access-token cache. Settings registration. Element Token tab in the dialog. |
| 9a3d1d3 | Phase 5 | File-picker third input tab. Test plan document covering paste, token, and upload modes. |
| 3ac0a8d | Docs | HANDOFF open question 1 resolved: SF2e Foundry system package id is confirmed sf2e. |
| f1d5ff5 | Phase 3 | Dedicated SF2e actor builder composing the PF2e shared core. Attachment plan for nested items (ammo wired via system.selectedAmmoId, redundant traits dropped with metadata preserved, upgrades stay with attachedTo flags). Lore subskills routed to embedded lore items instead of invalid skill entries. Singular and plural slug fallback. Token-overlap fuzzy matching. |
| 8c68866 | Wave 5 | HP lookup tables for every published PF2e and SF2e class and ancestry, fed into system.attributes.hp at create time. Re-import detection via flags.hloCharId + hloKey with non-destructive in-place update. Synthetic PF2e Dwarf Fighter fixture so the pf2e branch is exercised in CI alongside the SF2e Noxora fixture. |
| 76b4d74 | Wave 6 | Conversion log saved as a JournalEntry (opt-in setting, default on). Heuristic actor-type detection with confidence and reasons. Sanity-check harness validating compset registry coverage, override well-formedness, and slug derivation invariants (~100 checks). |
| ec43a16 | Wave 7 | Contributor guide. Log header shows info/warn/error counts. Test API Connection button on the Element Token tab. |
| 9864f19 | Docs | Fix CONTRIBUTING.md self-violation of the no-em-dash rule. |
| 96e82f0 | Wave 8 | Manifest validator with 23 checks. npm run release packages a .zip ready for upload to shinra.cc. README gains a quickstart section and npm script table. |
| baf3001 | Wave 9 | Minion-aware actor-type detection (familiar, animal-companion, eidolon, drone). JournalEntry override extractor (Node CLI plus in-dialog clipboard button). shinra.cc project subpages (index, readme, changelog, license, legal) bundled in the repo at shinra-cc-site/projects/hlo-importer-abyssal-engine/. |
| 0295e94 | Wave 10 | Two production-blocking bugs fixed: module.json compat now declares V13 (was V14, but PF2e 7.12.2 and SF2e 0.0.11 cap at V13); COMPSET_TO_PACKS is now per-system (PF2e uses legacy logical names like feats-srd, actionspf2e, spells-srd, classfeatures, while SF2e uses kebab-case throughout). Verified against a live Foundry V13.351 portable install. |
| 9d3bcf0 | Docs | Schema verification doc captures actor field paths (abilities., attributes.hp.{value,max}, saves., skills.) and the cross-version stability of PF2e and SF2e against grep evidence in pf2e.mjs and sf2e.mjs. |
| 15ad888 | Wave 11 | V14 compat added (PF2e 8.1.2, SF2e 1.1.2) verified at V14.361. COMPSET_TO_PACKS gains Anachronism cross-system fallback packs (pf2e-anachronism. and sf2e-anachronism.). qualifyPackId helper detects already-namespaced pack ids. |
| 29330dc | Wave 12 | tools/deploy-shinra.sh orchestrates the Bluehost deploy: gates on npm test, stages module.json and optional release zip, then either rsyncs (when SHINRA_DEPLOY_TARGET is set) or prints upload-command options. Wired into npm as deploy, deploy:full, deploy:rsync. |
| 2782d0f | Polish | .env.local auto-source for persistent SHINRA_DEPLOY_TARGET across sessions. .env.example committed as template. |
| b5a48b3 | Fix | URL scheme corrected to match the shinra.cc convention (folders directly at document root, no /projects/ prefix). Verified against backup of public_html/ from the abyssalEngineContainerized repo. |
| db0e3c6 | Fix | release.mjs upload hints use the ${id} template variable to match module.json URLs. |
| 80f9640 | Fix | legal.html display URL drops the /projects/ prefix to match the corrected scheme. |
| 2082375 | Brand | Scrub the legal/personal name from public-facing files. Only Shinra CC (the registered business) appears in module.json, LICENSE, README, version headers, dev docs, and the shinra.cc subpages. Manifest validator updated to enforce the brand. |
| v0.6.13 | Audit | Twenty-agent launch-prep matcher audit (6 SF2e + 14 PF2e + 1 cross-system) against the 2026-05-16 V14 pack-index dumps for PF2e 8.1.2 and SF2e 1.1.2. Fixes a critical paren-collision bug in ancestry-feat routing (23 heritage variants like Tusks (Orc) / Tusks (Half-Orc) were silently resolving to the wrong feat), registers the HLO FocSpell compset to the existing Spell handler so focus spells stop degrading to raw data, adds the PRECIOUS_MATERIALS slug-candidate fallback so Cold Iron Longsword resolves to longsword, lands the PF2e Remaster identity renames (Aasimar/Tiefling to nephilim, Half-Elf to aiuvarin, Half-Orc to dromaar, Gnoll to kholo), and lands 22 PF2e Remaster spell renames. Plus SF2e-native cross-system routing fix for four parenthetical ancestry feats, Hellknight chain Remaster cleanup, slug-candidate step 3.5 (parens-tier folding), and 20 mock-resolver sync entries. Most substantial single release in the v0.6.x cycle. |
| v0.7.0 | Parser Extension | Four-agent fan-out landing 8 unhandled HLO compsets that silently dropped 28 items per PFS-character import in v0.6.13. New compendium-routed handlers: MagicItem (handwraps, mantles, belts, aeon stones, healing potions, spacious pouches), CustomArmor (lore-named armor like Numerian Steel Breastplate), Wand (Wand of cozy cabin, etc.), GearItem (catch-all gear). New non-compendium handlers: Spellbook as SKIP_BY_DESIGN (PF2e auto-provisions the spellcastingEntry via Wizard class GrantItem rules), Faction routes to system.pfs.reputation via _actorMetadata discriminator, CustomReward and CustomBoon embed as campaignFeature items with category=pfsboon. New shared util-rune-parser cog extracts PF2e/SF2e rune prefixes (+N potency, striking tiers, 19 property runes); wired into the Weapon and MagicItem normalizers so "+1 striking wounding bastard sword" no longer drops the magical properties. Plus slugCandidates step 3.7 baseName fallback for both CustomArmor.baseName and runes.baseName paths. Verified against Berial Jeggare (PF2e Wizard 8 PFS test fixture): all 28 previously-dropped items now reach their proper destinations. |
| v1.0.0 | Alpha Launch | Public alpha-1.0.0 launch milestone. Final fix before launch: PFS chronicle boons silently vanishing from the actor despite import-log success. Root cause was sparse source emission: v0.7.1 emitted only category/slug/description/traits/level on the boon IR-patch and relied on PF2e's DataModel defaults to fill the rest. PF2e's createDocuments override constructs each item via new CONFIG.Item.documentClass inside an inner pipeline; when one item in a batch fails (Devil's Keep with HLO's PFS-native frequency.per: "scenario"), the bulk path throws and the dialog falls back to per-item. PF2e's per-item path has spots that return [] or splice without rethrowing, so the dialog's "succeeded += 1" over-reports. Fix: parser-compset-customreward 0.3.0 emits a fully-mapped boon shape (new mapHloPeriodToFrequencyPer helper translates HLO Period values like "Scenario" / "Session" to PF2e's CONFIG.PF2E.frequencies enum keys; "Scenario" maps to "day" since a PFS scenario is a single session). builder-actor-pf2e 0.4.2 rewrites buildPfsBoonItems to emit a FULLY-SHAPED FeatPF2e source with every field PF2e's FeatSystemData.defineSchema requires. Design context: PF2e/SF2e compendiums cover maybe 20 boons total while Paizo's published catalog has hundreds, so boons are character data not compendium content; the homebrew shape is the right architecture. Berial Jeggare's 9 boons (8 CustomReward + 1 CustomBoon) all reach the IR with complete shape; PF2e sheet's prepareFeats buckets them into actor.pfsBoons for the PFS tab render. All known SF2e and PF2e import paths verified clean against 6 test characters (Noxora L2/L4 SF2e Operative, Berial PFS Wizard 8, Berial ETT Magus, Bhel'thal Champion 6, Bhelroth EC Fighter 20, Revascis Drow Champion 13, Revascis Virholt Vampire Magus 20). 49 functional cogs. |
| v0.7.1 | Patch | Five-agent fan-out addressing every issue surfaced by the V14 verification run of v0.7.0 against 5 PF2e test characters. (A) Rune triad fix: parser-compset-armor and parser-compset-customarmor now call util-rune-parser (v0.7.0 had Weapon coverage only), and a new applyRunesToItem helper in ui-import-dialog writes the parsed runes block to system.runes on Foundry weapon/armor items. Armor with "+N" prefix no longer silently dropped. (B) New Rune and Material compset handlers emit _runeApplyTo / _materialApplyTo discriminators that builder-items merges into the parent weapon/armor IR (Berial's Numerian Steel Breastplate now gets its fire-resistant property rune which v0.7.0 dropped). (C) PFS chronicle boons: changed from campaignFeature (which is the Kingmaker item type) to feat with category=pfsboon, the actual schema the PF2e PFS tab filter expects (verified against pf2e.mjs line 38946). (D) Spell _id collision on re-import: PF2e's createDocuments override flips keepId=true for the entire batch when any item carries grants; v0.7.1 strips _id from regular items before bulk-create. (E) MagicItem and Wand silent-drop: ui-import-dialog COMPENDIUM_COMPSETS was missing v0.7.0 compsets so unmatched items vanished without any observability; added MagicItem, CustomArmor, Wand, GearItem, FocSpell so misses now produce debug/warn/modal entries. (F) Override batch: 11 new SKIP_BY_DESIGN entries (vampire/undead trait blocks delivered by Vampire Dedication, magic-item activation echoes, Arcane Cascade auto-installed by Magus class, Fangs auto-granted by Vampire Dedication) plus 2 OVERRIDES (Scorching Ray to Remaster scorching-rays plural). Critical correction from agent verification: PF2e rune slugs are camelCase (ghostTouch, fireResistant) not kebab-case; util-rune-parser updated to match the rule-element pipeline. |
What is left before public release
- Live in-Foundry verification of paste mode, token mode, and upload mode on both V13 (PF2e 7.12.2, SF2e 0.0.11) and V14 (PF2e 8.1.2, SF2e 1.1.2).
- Real-world overrides as testing surfaces specific HLO-to-Foundry name drift (SF2e operative specializations, technomancer paradigms, mystic connections, etc.).
- First public release tag once the above land.
- Submission to the Foundry package registry.
Phases 6 and 7 (polish, public release, SignalR live sync, bulk import, differential re-import, custom HLO content) follow.
The HLO Importer (Powered by Abyssal Engine) is a from-scratch reimplementation of zarmstrong/hlo-importer (MIT) and its companion conversion service. The original served the Pathfinder 2e Foundry community from 2020 through 2022 and is now dormant. No source code is redistributed from those projects.
Hero Lab and the Hero Lab logo are registered trademarks of LWD Technology, Inc. Pathfinder, Starfinder, and associated trademarks are property of Paizo Inc. Foundry Virtual Tabletop is a trademark of Foundry Gaming, LLC. This project is not affiliated with, endorsed by, or sponsored by any of these companies.