Commit graph

2,790 commits

Author SHA1 Message Date
Meta Vens
80d2c7f305 Tests: TurnRateIsTheActuatorsTurn idles the drives before it checks a Direction write
The backfilled Large Drives differ in quality, so a held forward thrust is a net torque and TurnRate never settled to zero. Release the movement demand with the turn demand.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 03:35:13 +02:00
Meta Vens
0c944a5a51 Catalog: replay roles-backfill apply on master's catalog
AetherDb roles-backfill apply on master's blob 32a2e401: 12 designs and 6 products authored; a second apply is a no-op.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 03:23:55 +02:00
Meta Vens
e915f95244 Merge eureka/aetheria-release-roles-backfill: roles backfill command and its tests (catalog blob stays master's; regenerated on the next commit)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 03:21:01 +02:00
Meta Vens
f28d4b4b12 Merge eureka/aetheria-release-sim-speed: one SimClock steps the zone, presenters draw ahead by Lead
AetherDrive.cs: master deleted the behaviour (2cfdc728); the branch only added a
TurnRate line to it. Deletion kept. Thruster remains the one rotation actuator
and feeds Entity.TurnRate. No sim stepping outside the clock on master
(mines presenter, Pirates AI, lot-product all step through Zone.Update).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 02:29:37 +02:00
Meta Vens
450e371f74 Tests: the exponent pin reads the shipped designs through the catalog opener
AetherDb.Open refuses a catalog without the test global record the scoped copies lack.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 02:14:54 +02:00
Meta Vens
a91bd1f7cf Tests: the replay resets the drives to unnamed terms, not stripped ones, as they shipped
Large Drive and Small Drive shipped with unnamed Quality terms on their flat stats; the command keeps those exponents. The reset stripped them, so the new exponent check read the Thruster precedent instead.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 02:13:15 +02:00
Meta Vens
ba382a6d5c Merge eureka/aetheria-release-modifier-subtypes: modifiers reach a behaviour type and its subtypes 2026-10-09 02:12:41 +02:00
Meta Vens
651f5cdc4f Tests: CB-R1 counts every Quality term on a non-flat stat and rejects a role named on a flat one
A non-flat stat must carry exactly one Quality term, named, declared, with a positive exponent; a flat stat may not name a role. The check is one function with its own synthetic-stat test.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 01:59:26 +02:00
Meta Vens
9744d3969f Roles backfill: the exponent precedent is read before any target changes; the replay sees exponents and a one-of-two-roles seller
ExponentFor drew its pool from items.Except(targets), so growing the targets from six to twelve changed the exponents a rerun on master's catalog writes. The pool is now snapshotted once, from every design that declares roles and names a Quality term, before the loop mutates anything. Describe prints each named term's exponent, one test pins Autocannon's and LRMM72's exponents against the shipped blob, and one clears a single role of a two-role seller and expects only that role re-authored.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 01:59:25 +02:00
Meta Vens
d7ee26d389 Tests: the replay reads the shipped designs and resets through the scoped registry before the catalog gains the sibling record
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 00:36:45 +02:00
Meta Vens
2843358430 Tests: a names-only replay, so apply still lands designs when no seller changes
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 00:24:58 +02:00
Meta Vens
94f4a9872c Roles backfill: separate the null and map checks (definite assignment survives mutation)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 00:11:04 +02:00
Meta Vens
e97968e271 Roles backfill: read each stat with as, so Stryker can mutate the command
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 00:02:46 +02:00
Meta Vens
80b51d63ea Catalog: roles-backfill apply re-run (6 designs name their unnamed Quality terms)
Produced by `AetherDb roles-backfill apply` on Yggdrasil over the previous catalog blob (3d531aff). Dry run:

  DeathCluster  (Weapon/Ballistic)  roles [barrel, feed mechanism]
      AutoWeaponData.Count            12 -> 12..15  feed mechanism ^1
  Flak Gun  (Weapon/Ballistic)  roles [barrel, feed mechanism]
      AutoWeaponData.Count            6 -> 6..8  feed mechanism ^1
  GT 3K  (Weapon/Launcher)  roles [guidance system, thruster, warhead]
      LauncherData.MinRange         500 -> 500..50  guidance system ^1.75
  plight  (Weapon/Energy)  roles [focusing array, power coupling]
      ChargedWeaponData.DamageSpread     1 -> 1..3.3  focusing array ^1.25
  MoveOnPro  (Reactor)  roles [core, regulator]
      StatModifierData.Modifier         1.1 -> 1.1..1.25  core ^1
  MoveOnPro Station Reactor  (Reactor)  roles [core, regulator]
      StatModifierData.Modifier         1.1 -> 1.1..1.25  core ^1

6 design(s) and 0 product(s) to author.
Dry run. Pass "apply" to land them.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 23:50:35 +02:00
Meta Vens
c5ce2b6409 Tests: the replay leaves Small Drive's sellers as they shipped
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 23:50:14 +02:00
Meta Vens
d2f4061769 Tests: fix the broken join string in the catalog roles test
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 23:48:23 +02:00
Meta Vens
6218f9fdc1 Roles backfill: Count and MinRange take a role but are never ranged; fix a broken string in the catalog test
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 23:47:54 +02:00
Meta Vens
2e1c2c439b Tests: CB-R1 enforced whole, backfill replay on a scratch catalog, envelope and operability read the catalog
ShippedCatalogRolesAreLive checks every design of every kind: each non-flat stat reads one declared role,
declared roles are read, sellers author each once, role-mapped designs are not all flat (the tool answers
which, via Program.HasRoleMap). RolesBackfillIsAuthored pins ratios and roles, with the Autocannon
Penetration, Mine Range and LRMM72 LockAngle asserts. RolesBackfillCommandTests resets the backfilled designs
on a scratch catalog, applies, and expects the shipped catalog back, then replays as a no-op.
EveryShippedProductHasAMaker. TheEnvelopeComesFromTheGear bounds each drive by the catalog's Large Drive
Thrust range; ShippedWeaponOperabilityTests reads the catalog's DefaultEntitySettings.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 23:46:28 +02:00
Meta Vens
6a1eb68ddb Roles backfill: one role map per design, the six unnamed non-flat stats named, RolesBackfill takes a root
RoleMapFor answers for the Mine Launcher (MineLayerRoles) so roles-migrate and roles-backfill no longer
disagree on it; BackfillMapFor is deleted. Count, MinRange, DamageSpread and the reactor Modifier join their
kind maps, and the backfill points a varying stat's unnamed Quality term at its role without touching its
range. DeathCluster, Flak Gun, GT 3K, plight and both MoveOnPros join the backfill set (CB-R1 forces them).
RolesBackfill(apply, root) mirrors PiratesFaction so tests can replay it on a scratch catalog.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 23:46:26 +02:00
Meta Vens
257a8a4795 Sim speed fix: scripted poses are not drawn ahead; a step cannot reset its clock; DrawAhead.Time deleted
DrawAhead leaves a ship in a wormhole animation where the step put it. The clock is
one static instance; a zone entered inside a step ends that frame's stepping and the
clock resets between frames (SimClock.Reset throws inside Advance). DrawAhead.Time had
no consumer.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 23:39:30 +02:00
Meta Vens
56f7162923 Merge emoji-font into master 2026-10-08 23:37:09 +02:00
Meta Vens
a7f801c4b9 Subtype modifier tests: deactivate the ship before equipping the guns
TryEquip refuses on a deployed ship.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 22:54:11 +02:00
Meta Vens
544807bb85 PiratesRecordTests: a Pirates rebrand unit titles and brands as its own product through the merged lot-product code
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 22:50:12 +02:00
Meta Vens
162e60889d Merge lot-product: a lot records its product 2026-10-08 22:49:08 +02:00
Meta Vens
37f40dfdd7 Emoji routing: the global fallback is the only route; the check observes it
EmojiFont.Build leaves TMP's emoji fallback list empty. EmojiCheck fails when that list is non-empty,
when the global fallback lacks Emoji.asset, or when a glyph is served by a font other than Emoji.asset
or the body font; reads the Pirates product names from the shipped catalog; renders the
emoji-test.txt corpus and reports what Twemoji lacks; counts only used atlas pages (TMP doubles the
array capacity, so trailing slots are null by design).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 22:45:51 +02:00
Meta Vens
8d2b18bb17 Emoji corpus from Unicode's emoji-test.txt; lock records interpreter and container
1400 single code points (the 2 and 3 digit ones included), Twemoji lacks none; font sha256
unchanged (reproduced in python:3.13-slim on Yggdrasil).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 22:45:48 +02:00
Meta Vens
8e73b54271 README: Twemoji CC BY 4.0 attribution
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 22:45:46 +02:00
Meta Vens
303f73e19f Tests: the Longinus envelope's flank sides are each Talaria's own thrust
Each fitted Talaria has its own lot's thrust, so Left and Right are the two flanks'
accelerations, not both the larger one.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 22:39:21 +02:00
Meta Vens
f3550b67a4 Tests: roles-backfill fallout (Tractor Beam has no stat, Longinus fitted by name)
ShippedCatalogRolesAreLive skips gear with no PerformanceStat at all (Tractor Beam is a
thruster kind with none). TheEnvelopeComesFromTheGear fits the Longinus by name: the
generator's picks follow the item stream and every authored ProductRole draws from it, so
the generated hull stopped carrying Large Drives (Medium Drive and RevvITup instead). Its
forward bound is the drives' own thrust, since a Large Drive now rolls 0.8x to 1.2x.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 22:26:34 +02:00
Meta Vens
b5ff1ae260 Map: ships add-on frame r5, authoring without the repo
Probes B1-B9, the owner answer (published AetherDb), the r5 authority map
and rationale from the imagination-addon-frame pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 22:25:34 +02:00
Meta Vens
017da88334 Catalog: roles-backfill apply (6 designs, 6 products)
Output of `AetherDb roles-backfill apply` on origin/master 325ef4bc's catalog, run on
Yggdrasil at 54999a64. Dry run: Autocannon, LRMM72, SRMM72, Mine Launcher, Large Drive
and Small Drive gain roles and quality ranges; Autocannon (Zhestokost, Pirates),
LRMM72 (R&D), SRMM72 (DME), Mine Launcher (DME) and True North (Lightsail) author their
ProductRoles. A replay prints "already authored". At merge, take master's catalog and
rerun `AetherDb roles-backfill apply`.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 22:11:52 +02:00
Meta Vens
54999a642b Roles backfill: AetherDb command and catalog role tests (CB-R1)
AetherDb roles-backfill gives Autocannon, LRMM72, SRMM72, Mine Launcher, Large Drive
(and Small Drive, which declared roles no stat read) live roles: each mapped flat
stat becomes a 0.8x..1.2x range read through a Quality term naming its role, and
every seller authors a ProductRole per role from its maker profile. MineLayerRoles
is new; the maker profile table is hoisted so pd-gear and this command share it.
ShippedCatalogRolesAreLive and RolesBackfillIsAuthored read the shipped catalog.
The catalog blob lands in its own commit.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 22:09:18 +02:00
Meta Vens
e7375d54a1 Map: consumables (host fix, supply, throttle lock, vapour cloud)
Body facts CC1-CC12, rules CS-R1..CS-R4 and rationale from the
imagination-consumables pass; specs and questions are in the mind.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 22:06:21 +02:00
Meta Vens
851476bc23 Emoji font script: pin Unicode emoji-test.txt, refuse outside the pinned container
The corpus now derives from emoji-test.txt (sha256 pinned), keeps single code points of any digit
count, and lists the emoji Twemoji lacks. The script runs only on linux, Python 3.13, image
python:3.13-slim and records those in the lock; identical pins with a different font exit 1 and
leave the committed font and lock untouched.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 22:05:09 +02:00
Meta Vens
99f0005c8a Merge origin/master (325ef4bc, pirates-record) into the emoji-font branch
Mechanical merge; this cut changes no catalog.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 22:03:04 +02:00
Meta Vens
7ee40255ca Modifiers reach a behaviour type and its subtypes: TargetsOf matches assignable types
A StatReference naming WeaponData.Damage validated and attached to nothing,
because TargetsOf compared exact types. All three filters now use
targetType.IsAssignableFrom; no exact-match path remains.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 22:01:47 +02:00
Meta Vens
e389e3972c Map: catalog breadth (weapon matrix, roles backfill, stat-boosting gear)
Body facts CB1-CB12, rules CB-R1..CB-R5 and rationale from the
imagination-catalog-breadth pass; specs and questions are in the mind.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 21:57:21 +02:00
Meta Vens
325ef4bc1a Catalog: replay pirates-faction apply on master's catalog
Master's catalog (LFS 5ecf375f: PD gear, Mine Launcher, retirements) differs from this
branch's base, so the branch's blob was not taken. AetherDb pirates-faction apply was rerun
on master's catalog (merged tool, Yggdrasil container): the Pirates faction and eight
emoji-named products authored; catalog 5ecf375f -> 32a2e401 (12712398 bytes); a second run
reports the faction already exists and the blob is byte-identical.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 21:41:45 +02:00
Meta Vens
2c065937ee Merge origin/eureka/aetheria-release-pirates-record (8e51016f) into master
AetherDb Program.cs: both sides appended a command (pd-gear/mine-launcher, pirates-faction);
kept all, one usage line. GameData/Aetheria.cc: master's blob kept here, pirates-faction
apply replayed on it in the next commit (follow-up catalog-blob-merge-order).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 21:37:22 +02:00
Meta Vens
cff4e0ffa7 Sim speed: the exact-step frame stays under the hitch clamp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 21:01:27 +02:00
Meta Vens
090b6d18dc Sim speed: tests for the survivors Stryker found (thruster turn, tilted draw, exact step)
DrawAhead.Rotation delegates to Turned(pose, angle) so the turn is testable on a tilted pose, where the flat Duel poses make the quaternion product's off-axis terms vanish. Unverified at this commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 21:00:16 +02:00
Meta Vens
a8f71d463b Catalog: replay pd-gear apply on master's catalog
Master's catalog (LFS adba0389: Mine Launcher present, LonginusX and Traction retired)
differs from this branch's base, so the branch's catalog was not picked. AetherDb
pd-gear apply was rerun on master's catalog (merged tool): 3 designs and 11 products
authored, a second run reports it already authored, dangling reports 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 19:56:56 +02:00
Meta Vens
d17fe3a410 Merge origin/master (13a6b4f5, gear-without-presence and retire-longinusx) into eureka/aetheria-release-pd-gear
The catalog is regenerated from master's catalog with pd-gear apply (next commit).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

# Conflicts:
#	GameData/Aetheria.cc
#	tools/AetherDb/Program.cs
2026-10-08 19:51:53 +02:00
Meta Vens
8e51016f23 PiratesFactionCommandTests: flush the name-file removal; tolerate a null empty role list
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 19:39:54 +02:00
Meta Vens
13a6b4f5b8 Catalog: replay retire-longinusx apply on master's catalog
Master's catalog (LFS 9e75d9a4, carrying the Mine Launcher and the gear-without-presence
merge base) differed from this branch's base, so the branch's catalog was not picked.
AetherDb retire-longinusx apply was rerun on master's catalog (tool as of 8038b46a plus
origin/master): the dry run listed the same four records (HullData LonginusX, GearData
Traction, their two FactionProductData), a second apply is refused, dangling reports 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 19:38:33 +02:00
Meta Vens
1c549325f9 Generate the Twemoji colour font, build Emoji.asset and route TMP's emoji fallback to it
Assets/Fonts/Emoji/Twemoji.ttf is fetch_emoji_font.py's output for jdecked/twemoji
v17.0.3 (nanoemoji 0.16.0, glyf_colr_0), reproduced bit-identically by two
independent runs on Yggdrasil; the lock pins source and font sha256. EmojiFont.Build
wrote Emoji.asset (dynamic, COLOR, multi-atlas) and TMP Settings' emoji fallback list,
global fallback entry and empty default sprite asset. EmojiCheck.Run: 1425 single
code points and the eight Pirates names render with no missing code point. CC BY 4.0
attribution ships in Assets/Fonts/Emoji/LICENSE.txt. Builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 19:34:49 +02:00
Meta Vens
38f7d73823 Sim speed: Entity.TurnRate's comment names no presenter
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 19:16:10 +02:00
Meta Vens
b385c65194 PiratesFactionCommandTests: pin the faction's fields, the eight products' designs, descriptions and roles, and the missing name file
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 19:15:37 +02:00
Meta Vens
ec081b9b6d Brand: ItemData.Get already refuses an unset ref; drop the duplicate IsSet guard
Stryker's one survivor in the first sweep was the guard's `true ?` mutant: the
cache's Get(ref) extension already returns null for an unset reference, so the
guard was a second path. Adds the removed-product fact the spec names.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 19:04:09 +02:00
Meta Vens
284231f4c1 Merge origin/master (2403a5f3, gear-without-presence) into eureka/aetheria-release-retire-longinusx
Lands retire-longinusx on master after gear-without-presence. The catalog
is regenerated from master's catalog with retire-longinusx apply (next commit).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

# Conflicts:
#	GameData/Aetheria.cc
2026-10-08 18:59:38 +02:00