diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..4b71fd7
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,73 @@
+# AGENTS.md — mgt2-compendium-amiral-denisov
+
+## First read
+
+- `.github/copilot-instructions.md` — packs, icons, module.json conventions (this file builds on it, don't repeat it)
+
+## No package manager / no build
+
+There is **no** `package.json`, no lockfile, no bundler. JavaScript is plain ESM loaded directly by FoundryVTT. Do not run `npm install` or any build command.
+
+## Commands
+
+5 chat commands registered at runtime (not declared in `module.json`):
+
+| Command | Entrypoint | Dialog |
+|---|---|---|
+| `/commerce` | `scripts/commerce.js` | `CommerceDialog` (3 tabs) |
+| `/pnj` | `scripts/npc.js` | `NpcDialog` (4 tabs) |
+| `/rencontre` | `scripts/npc.js` | same dialog (tab 2) |
+| `/mission` | `scripts/npc.js` | same dialog (tab 3) |
+| `/sector` | `scripts/sector.js` | `SectorMapApp` (IFRAME Traveller Map, clics→chat) |
+| `/subsector` | `scripts/sector.js` | `SectorMapApp` (IFRAME) |
+
+Commands are registered via `ChatLogV2.CHAT_COMMANDS` — not Hooks.on("chatMessage") as the copilot-instructions say (that file is stale). See `commerce.js:15` and `npc.js:15` for the actual pattern.
+
+## Framework quirks
+
+- **ApplicationV2** + `HandlebarsApplicationMixin` for all dialogs.
+- Foundry v13/v14 dual code paths: some hooks must handle both jQuery (v13) and DOM (v14) APIs.
+- Dice rolls: `await new Roll(formula).evaluate()` — always async.
+- Skill FQN format for `game.i18n`: e.g. `pilot.spacecraft`, `electronics.computers`, `gunner.turret`.
+
+## Runtime systems (run at `ready` hook, GM only)
+
+1. **Migration** (`mgt2eMigration.js`): converts legacy item types to mgt2e (armor→armour, equipment→item/augment, computer→hardware, etc.). Tracked via `game.settings` version flag. Forced re-run requires deleting the setting.
+
+2. **NPC RollTable sync** (`npcRollTableSync.js`): writes D66 tables from `scripts/data/npcTables.js` into the `tables-pnj` compendium pack. Checksums to avoid redundant writes.
+
+## Testing
+
+```sh
+# standalone, no npm needed — install jest globally or use npx
+npx jest scripts/tests/travellerNpcGenerator.test.js
+```
+
+- Single file, 1096 lines, hand-rolled FoundryVTT mocks.
+- Covers: utilities, lookups, validation, characteristic/skill generation, skill conversion, full NPC gen, ModuleCache, errors, config validation.
+- No CI test step — you must run manually.
+- No Jest config file — relies on defaults.
+
+## Versioning
+
+- `module.json` → `"version"` is the single source of truth.
+- Git tag format: `v1.3.0` (CI strips `v`).
+- No changelog file.
+
+## CI/CD (Gitea)
+
+- Only triggers on **`release: [published]`** — not on push/PR.
+- Builds a zip archive of `module.json + assets/ + packs/ + scripts/ + styles/ + templates/` and uploads to the release.
+- No test step in CI.
+
+## Deprecated packs (still on disk, NOT in module.json)
+
+- `packs/arme/` → superseded by `armes`
+- `packs/carriere/` → superseded by `carrieres`
+- `packs/talent-psy/` → superseded by `talents-psioniques`
+
+Do not re-add them to `module.json`. They remain for historical data recovery only.
+
+## All content is in French
+
+Labels, comments, commit messages, UI strings, icon file names, rule references — everything. Check French naming before searching/grepping.
diff --git a/module.json b/module.json
index 84c6673..7d599ae 100644
--- a/module.json
+++ b/module.json
@@ -11,6 +11,7 @@
"esmodules": [
"scripts/commerce.js",
"scripts/npc.js",
+ "scripts/sector.js",
"scripts/utils/travellerNpcUtils.js",
"scripts/data/travellerNpcGenerator.js",
"scripts/travellerNpcGenerator.js",
diff --git a/packs/armes/000086.log b/packs/armes/000101.log
similarity index 100%
rename from packs/armes/000086.log
rename to packs/armes/000101.log
diff --git a/packs/armes/CURRENT b/packs/armes/CURRENT
index bdbe58e..d7ae20e 100644
--- a/packs/armes/CURRENT
+++ b/packs/armes/CURRENT
@@ -1 +1 @@
-MANIFEST-000084
+MANIFEST-000100
diff --git a/packs/armes/LOG b/packs/armes/LOG
index a5f9a6d..04a360d 100644
--- a/packs/armes/LOG
+++ b/packs/armes/LOG
@@ -1,8 +1,3 @@
-2026/05/27-23:11:58.414164 7f3e6f7fe6c0 Recovering log #82
-2026/05/27-23:11:58.424222 7f3e6f7fe6c0 Delete type=3 #80
-2026/05/27-23:11:58.424274 7f3e6f7fe6c0 Delete type=0 #82
-2026/05/28-01:07:03.306861 7f3e6effd6c0 Level-0 table #87: started
-2026/05/28-01:07:03.306872 7f3e6effd6c0 Level-0 table #87: 0 bytes OK
-2026/05/28-01:07:03.314015 7f3e6effd6c0 Delete type=0 #85
-2026/05/28-01:07:03.314175 7f3e6effd6c0 Manual compaction at level-0 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
-2026/05/28-01:07:03.314198 7f3e6effd6c0 Manual compaction at level-1 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
+2026/06/01-22:42:05.863670 7f52c63fe6c0 Recovering log #98
+2026/06/01-22:42:05.873307 7f52c63fe6c0 Delete type=3 #96
+2026/06/01-22:42:05.873357 7f52c63fe6c0 Delete type=0 #98
diff --git a/packs/armes/LOG.old b/packs/armes/LOG.old
index f6bb342..94d90f6 100644
--- a/packs/armes/LOG.old
+++ b/packs/armes/LOG.old
@@ -1,8 +1,8 @@
-2026/05/27-14:31:25.639035 7f3e6f7fe6c0 Recovering log #77
-2026/05/27-14:31:25.648169 7f3e6f7fe6c0 Delete type=3 #75
-2026/05/27-14:31:25.648196 7f3e6f7fe6c0 Delete type=0 #77
-2026/05/27-14:33:21.786747 7f3e6effd6c0 Level-0 table #83: started
-2026/05/27-14:33:21.786766 7f3e6effd6c0 Level-0 table #83: 0 bytes OK
-2026/05/27-14:33:21.793932 7f3e6effd6c0 Delete type=0 #81
-2026/05/27-14:33:21.800554 7f3e6effd6c0 Manual compaction at level-0 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
-2026/05/27-14:33:21.800579 7f3e6effd6c0 Manual compaction at level-1 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
+2026/06/01-08:35:53.535828 7f52c6bff6c0 Recovering log #94
+2026/06/01-08:35:53.546637 7f52c6bff6c0 Delete type=3 #92
+2026/06/01-08:35:53.546677 7f52c6bff6c0 Delete type=0 #94
+2026/06/01-08:51:10.470757 7f52c4bfb6c0 Level-0 table #99: started
+2026/06/01-08:51:10.470772 7f52c4bfb6c0 Level-0 table #99: 0 bytes OK
+2026/06/01-08:51:10.476934 7f52c4bfb6c0 Delete type=0 #97
+2026/06/01-08:51:10.484526 7f52c4bfb6c0 Manual compaction at level-0 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
+2026/06/01-08:51:10.491484 7f52c4bfb6c0 Manual compaction at level-1 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
diff --git a/packs/armes/MANIFEST-000084 b/packs/armes/MANIFEST-000100
similarity index 62%
rename from packs/armes/MANIFEST-000084
rename to packs/armes/MANIFEST-000100
index 6080192..2398c38 100644
Binary files a/packs/armes/MANIFEST-000084 and b/packs/armes/MANIFEST-000100 differ
diff --git a/packs/armures/000185.log b/packs/armures/000200.log
similarity index 100%
rename from packs/armures/000185.log
rename to packs/armures/000200.log
diff --git a/packs/armures/CURRENT b/packs/armures/CURRENT
index 0a6f13a..d0dd497 100644
--- a/packs/armures/CURRENT
+++ b/packs/armures/CURRENT
@@ -1 +1 @@
-MANIFEST-000183
+MANIFEST-000199
diff --git a/packs/armures/LOG b/packs/armures/LOG
index e7b02a2..3e0f9fd 100644
--- a/packs/armures/LOG
+++ b/packs/armures/LOG
@@ -1,8 +1,3 @@
-2026/05/27-23:11:58.290859 7f3e6f7fe6c0 Recovering log #181
-2026/05/27-23:11:58.307573 7f3e6f7fe6c0 Delete type=3 #179
-2026/05/27-23:11:58.307626 7f3e6f7fe6c0 Delete type=0 #181
-2026/05/28-01:07:03.251844 7f3e6effd6c0 Level-0 table #186: started
-2026/05/28-01:07:03.251857 7f3e6effd6c0 Level-0 table #186: 0 bytes OK
-2026/05/28-01:07:03.257706 7f3e6effd6c0 Delete type=0 #184
-2026/05/28-01:07:03.263618 7f3e6effd6c0 Manual compaction at level-0 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
-2026/05/28-01:07:03.275995 7f3e6effd6c0 Manual compaction at level-1 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
+2026/06/01-22:42:05.758175 7f52c53fc6c0 Recovering log #197
+2026/06/01-22:42:05.768018 7f52c53fc6c0 Delete type=3 #195
+2026/06/01-22:42:05.768044 7f52c53fc6c0 Delete type=0 #197
diff --git a/packs/armures/LOG.old b/packs/armures/LOG.old
index 9f1055c..c2f2881 100644
--- a/packs/armures/LOG.old
+++ b/packs/armures/LOG.old
@@ -1,8 +1,8 @@
-2026/05/27-14:31:25.531736 7f3ebd7ff6c0 Recovering log #176
-2026/05/27-14:31:25.541455 7f3ebd7ff6c0 Delete type=3 #174
-2026/05/27-14:31:25.541507 7f3ebd7ff6c0 Delete type=0 #176
-2026/05/27-14:33:21.722465 7f3e6effd6c0 Level-0 table #182: started
-2026/05/27-14:33:21.722495 7f3e6effd6c0 Level-0 table #182: 0 bytes OK
-2026/05/27-14:33:21.728923 7f3e6effd6c0 Delete type=0 #180
-2026/05/27-14:33:21.735721 7f3e6effd6c0 Manual compaction at level-0 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
-2026/05/27-14:33:21.735741 7f3e6effd6c0 Manual compaction at level-1 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
+2026/06/01-08:35:53.408086 7f52c63fe6c0 Recovering log #193
+2026/06/01-08:35:53.419231 7f52c63fe6c0 Delete type=3 #191
+2026/06/01-08:35:53.419290 7f52c63fe6c0 Delete type=0 #193
+2026/06/01-08:51:10.410303 7f52c4bfb6c0 Level-0 table #198: started
+2026/06/01-08:51:10.410335 7f52c4bfb6c0 Level-0 table #198: 0 bytes OK
+2026/06/01-08:51:10.417249 7f52c4bfb6c0 Delete type=0 #196
+2026/06/01-08:51:10.423845 7f52c4bfb6c0 Manual compaction at level-0 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
+2026/06/01-08:51:10.424110 7f52c4bfb6c0 Manual compaction at level-1 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
diff --git a/packs/armures/MANIFEST-000183 b/packs/armures/MANIFEST-000199
similarity index 61%
rename from packs/armures/MANIFEST-000183
rename to packs/armures/MANIFEST-000199
index a4e7a1a..d79bd83 100644
Binary files a/packs/armures/MANIFEST-000183 and b/packs/armures/MANIFEST-000199 differ
diff --git a/packs/carrieres/000069.log b/packs/carrieres/000084.log
similarity index 100%
rename from packs/carrieres/000069.log
rename to packs/carrieres/000084.log
diff --git a/packs/carrieres/CURRENT b/packs/carrieres/CURRENT
index 0094dac..011e5ad 100644
--- a/packs/carrieres/CURRENT
+++ b/packs/carrieres/CURRENT
@@ -1 +1 @@
-MANIFEST-000067
+MANIFEST-000083
diff --git a/packs/carrieres/LOG b/packs/carrieres/LOG
index 9583f57..7289728 100644
--- a/packs/carrieres/LOG
+++ b/packs/carrieres/LOG
@@ -1,8 +1,3 @@
-2026/05/27-23:11:58.442577 7f3e6f7fe6c0 Recovering log #65
-2026/05/27-23:11:58.452097 7f3e6f7fe6c0 Delete type=3 #63
-2026/05/27-23:11:58.452144 7f3e6f7fe6c0 Delete type=0 #65
-2026/05/28-01:07:03.320241 7f3e6effd6c0 Level-0 table #70: started
-2026/05/28-01:07:03.320254 7f3e6effd6c0 Level-0 table #70: 0 bytes OK
-2026/05/28-01:07:03.326319 7f3e6effd6c0 Delete type=0 #68
-2026/05/28-01:07:03.356879 7f3e6effd6c0 Manual compaction at level-0 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
-2026/05/28-01:07:03.381785 7f3e6effd6c0 Manual compaction at level-1 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
+2026/06/01-22:42:05.887236 7f52c63fe6c0 Recovering log #81
+2026/06/01-22:42:05.897193 7f52c63fe6c0 Delete type=3 #79
+2026/06/01-22:42:05.897236 7f52c63fe6c0 Delete type=0 #81
diff --git a/packs/carrieres/LOG.old b/packs/carrieres/LOG.old
index c5af229..3779354 100644
--- a/packs/carrieres/LOG.old
+++ b/packs/carrieres/LOG.old
@@ -1,8 +1,8 @@
-2026/05/27-14:31:25.663213 7f3e6f7fe6c0 Recovering log #60
-2026/05/27-14:31:25.672282 7f3e6f7fe6c0 Delete type=3 #58
-2026/05/27-14:31:25.672315 7f3e6f7fe6c0 Delete type=0 #60
-2026/05/27-14:33:21.794049 7f3e6effd6c0 Level-0 table #66: started
-2026/05/27-14:33:21.794078 7f3e6effd6c0 Level-0 table #66: 0 bytes OK
-2026/05/27-14:33:21.800426 7f3e6effd6c0 Delete type=0 #64
-2026/05/27-14:33:21.808266 7f3e6effd6c0 Manual compaction at level-0 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
-2026/05/27-14:33:21.831733 7f3e6effd6c0 Manual compaction at level-1 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
+2026/06/01-08:35:53.563616 7f52c6bff6c0 Recovering log #77
+2026/06/01-08:35:53.575271 7f52c6bff6c0 Delete type=3 #75
+2026/06/01-08:35:53.575318 7f52c6bff6c0 Delete type=0 #77
+2026/06/01-08:51:10.477043 7f52c4bfb6c0 Level-0 table #82: started
+2026/06/01-08:51:10.477061 7f52c4bfb6c0 Level-0 table #82: 0 bytes OK
+2026/06/01-08:51:10.484427 7f52c4bfb6c0 Delete type=0 #80
+2026/06/01-08:51:10.491475 7f52c4bfb6c0 Manual compaction at level-0 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
+2026/06/01-08:51:10.498513 7f52c4bfb6c0 Manual compaction at level-1 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
diff --git a/packs/carrieres/MANIFEST-000067 b/packs/carrieres/MANIFEST-000083
similarity index 63%
rename from packs/carrieres/MANIFEST-000067
rename to packs/carrieres/MANIFEST-000083
index b2bfc30..2daf3fd 100644
Binary files a/packs/carrieres/MANIFEST-000067 and b/packs/carrieres/MANIFEST-000083 differ
diff --git a/packs/competences/000188.log b/packs/competences/000203.log
similarity index 100%
rename from packs/competences/000188.log
rename to packs/competences/000203.log
diff --git a/packs/competences/CURRENT b/packs/competences/CURRENT
index 627283a..5639343 100644
--- a/packs/competences/CURRENT
+++ b/packs/competences/CURRENT
@@ -1 +1 @@
-MANIFEST-000186
+MANIFEST-000202
diff --git a/packs/competences/LOG b/packs/competences/LOG
index a0c4193..4af6a96 100644
--- a/packs/competences/LOG
+++ b/packs/competences/LOG
@@ -1,8 +1,3 @@
-2026/05/27-23:11:58.309946 7f3ebcffe6c0 Recovering log #184
-2026/05/27-23:11:58.320486 7f3ebcffe6c0 Delete type=3 #182
-2026/05/27-23:11:58.320525 7f3ebcffe6c0 Delete type=0 #184
-2026/05/28-01:07:03.257742 7f3e6effd6c0 Level-0 table #189: started
-2026/05/28-01:07:03.257754 7f3e6effd6c0 Level-0 table #189: 0 bytes OK
-2026/05/28-01:07:03.263574 7f3e6effd6c0 Delete type=0 #187
-2026/05/28-01:07:03.263715 7f3e6effd6c0 Manual compaction at level-0 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
-2026/05/28-01:07:03.275990 7f3e6effd6c0 Manual compaction at level-1 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
+2026/06/01-22:42:05.770418 7f52c6bff6c0 Recovering log #200
+2026/06/01-22:42:05.779812 7f52c6bff6c0 Delete type=3 #198
+2026/06/01-22:42:05.779865 7f52c6bff6c0 Delete type=0 #200
diff --git a/packs/competences/LOG.old b/packs/competences/LOG.old
index 1f714f4..9bee816 100644
--- a/packs/competences/LOG.old
+++ b/packs/competences/LOG.old
@@ -1,8 +1,8 @@
-2026/05/27-14:31:25.544106 7f3ebd7ff6c0 Recovering log #179
-2026/05/27-14:31:25.554048 7f3ebd7ff6c0 Delete type=3 #177
-2026/05/27-14:31:25.554071 7f3ebd7ff6c0 Delete type=0 #179
-2026/05/27-14:33:21.729016 7f3e6effd6c0 Level-0 table #185: started
-2026/05/27-14:33:21.729040 7f3e6effd6c0 Level-0 table #185: 0 bytes OK
-2026/05/27-14:33:21.735577 7f3e6effd6c0 Delete type=0 #183
-2026/05/27-14:33:21.735798 7f3e6effd6c0 Manual compaction at level-0 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
-2026/05/27-14:33:21.735816 7f3e6effd6c0 Manual compaction at level-1 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
+2026/06/01-08:35:53.422306 7f52c53fc6c0 Recovering log #196
+2026/06/01-08:35:53.433915 7f52c53fc6c0 Delete type=3 #194
+2026/06/01-08:35:53.433952 7f52c53fc6c0 Delete type=0 #196
+2026/06/01-08:51:10.450191 7f52c4bfb6c0 Level-0 table #201: started
+2026/06/01-08:51:10.450225 7f52c4bfb6c0 Level-0 table #201: 0 bytes OK
+2026/06/01-08:51:10.456638 7f52c4bfb6c0 Delete type=0 #199
+2026/06/01-08:51:10.463422 7f52c4bfb6c0 Manual compaction at level-0 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
+2026/06/01-08:51:10.470752 7f52c4bfb6c0 Manual compaction at level-1 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
diff --git a/packs/competences/MANIFEST-000186 b/packs/competences/MANIFEST-000202
similarity index 60%
rename from packs/competences/MANIFEST-000186
rename to packs/competences/MANIFEST-000202
index 40c863a..e376d4f 100644
Binary files a/packs/competences/MANIFEST-000186 and b/packs/competences/MANIFEST-000202 differ
diff --git a/packs/contenant-sac-coffre/000122.log b/packs/contenant-sac-coffre/000137.log
similarity index 100%
rename from packs/contenant-sac-coffre/000122.log
rename to packs/contenant-sac-coffre/000137.log
diff --git a/packs/contenant-sac-coffre/CURRENT b/packs/contenant-sac-coffre/CURRENT
index 30eb131..0eb07d3 100644
--- a/packs/contenant-sac-coffre/CURRENT
+++ b/packs/contenant-sac-coffre/CURRENT
@@ -1 +1 @@
-MANIFEST-000120
+MANIFEST-000136
diff --git a/packs/contenant-sac-coffre/LOG b/packs/contenant-sac-coffre/LOG
index a12859d..cbb72e5 100644
--- a/packs/contenant-sac-coffre/LOG
+++ b/packs/contenant-sac-coffre/LOG
@@ -1,7 +1,3 @@
-2026/05/27-23:11:58.375862 7f3e6ffff6c0 Recovering log #118
-2026/05/27-23:11:58.385912 7f3e6ffff6c0 Delete type=3 #116
-2026/05/27-23:11:58.385947 7f3e6ffff6c0 Delete type=0 #118
-2026/05/28-01:07:03.287852 7f3e6effd6c0 Level-0 table #123: started
-2026/05/28-01:07:03.287863 7f3e6effd6c0 Level-0 table #123: 0 bytes OK
-2026/05/28-01:07:03.294442 7f3e6effd6c0 Delete type=0 #121
-2026/05/28-01:07:03.300889 7f3e6effd6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
+2026/06/01-22:42:05.829157 7f52c53fc6c0 Recovering log #134
+2026/06/01-22:42:05.838624 7f52c53fc6c0 Delete type=3 #132
+2026/06/01-22:42:05.838670 7f52c53fc6c0 Delete type=0 #134
diff --git a/packs/contenant-sac-coffre/LOG.old b/packs/contenant-sac-coffre/LOG.old
index c5db16c..acb33e3 100644
--- a/packs/contenant-sac-coffre/LOG.old
+++ b/packs/contenant-sac-coffre/LOG.old
@@ -1,7 +1,7 @@
-2026/05/27-14:31:25.604521 7f3ebd7ff6c0 Recovering log #114
-2026/05/27-14:31:25.613630 7f3ebd7ff6c0 Delete type=3 #112
-2026/05/27-14:31:25.613651 7f3ebd7ff6c0 Delete type=0 #114
-2026/05/27-14:33:21.767043 7f3e6effd6c0 Level-0 table #119: started
-2026/05/27-14:33:21.767067 7f3e6effd6c0 Level-0 table #119: 0 bytes OK
-2026/05/27-14:33:21.773608 7f3e6effd6c0 Delete type=0 #117
-2026/05/27-14:33:21.780095 7f3e6effd6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
+2026/06/01-08:35:53.494562 7f52c6bff6c0 Recovering log #130
+2026/06/01-08:35:53.505274 7f52c6bff6c0 Delete type=3 #128
+2026/06/01-08:35:53.505312 7f52c6bff6c0 Delete type=0 #130
+2026/06/01-08:51:10.430797 7f52c4bfb6c0 Level-0 table #135: started
+2026/06/01-08:51:10.430815 7f52c4bfb6c0 Level-0 table #135: 0 bytes OK
+2026/06/01-08:51:10.436925 7f52c4bfb6c0 Delete type=0 #133
+2026/06/01-08:51:10.449909 7f52c4bfb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
diff --git a/packs/contenant-sac-coffre/MANIFEST-000120 b/packs/contenant-sac-coffre/MANIFEST-000120
deleted file mode 100644
index 540472b..0000000
Binary files a/packs/contenant-sac-coffre/MANIFEST-000120 and /dev/null differ
diff --git a/packs/contenant-sac-coffre/MANIFEST-000136 b/packs/contenant-sac-coffre/MANIFEST-000136
new file mode 100644
index 0000000..a91cf01
Binary files /dev/null and b/packs/contenant-sac-coffre/MANIFEST-000136 differ
diff --git a/packs/equipement/000130.log b/packs/equipement/000145.log
similarity index 100%
rename from packs/equipement/000130.log
rename to packs/equipement/000145.log
diff --git a/packs/equipement/CURRENT b/packs/equipement/CURRENT
index a8d9908..3e77273 100644
--- a/packs/equipement/CURRENT
+++ b/packs/equipement/CURRENT
@@ -1 +1 @@
-MANIFEST-000128
+MANIFEST-000144
diff --git a/packs/equipement/LOG b/packs/equipement/LOG
index 592f53f..e46a6be 100644
--- a/packs/equipement/LOG
+++ b/packs/equipement/LOG
@@ -1,8 +1,3 @@
-2026/05/27-23:11:58.349736 7f3e6ffff6c0 Recovering log #126
-2026/05/27-23:11:58.359183 7f3e6ffff6c0 Delete type=3 #124
-2026/05/27-23:11:58.359211 7f3e6ffff6c0 Delete type=0 #126
-2026/05/28-01:07:03.276071 7f3e6effd6c0 Level-0 table #131: started
-2026/05/28-01:07:03.276086 7f3e6effd6c0 Level-0 table #131: 0 bytes OK
-2026/05/28-01:07:03.281962 7f3e6effd6c0 Delete type=0 #129
-2026/05/28-01:07:03.300877 7f3e6effd6c0 Manual compaction at level-0 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
-2026/05/28-01:07:03.300894 7f3e6effd6c0 Manual compaction at level-1 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
+2026/06/01-22:42:05.805356 7f52c5bfd6c0 Recovering log #142
+2026/06/01-22:42:05.815150 7f52c5bfd6c0 Delete type=3 #140
+2026/06/01-22:42:05.815203 7f52c5bfd6c0 Delete type=0 #142
diff --git a/packs/equipement/LOG.old b/packs/equipement/LOG.old
index 514f654..5f0056b 100644
--- a/packs/equipement/LOG.old
+++ b/packs/equipement/LOG.old
@@ -1,8 +1,8 @@
-2026/05/27-14:31:25.580201 7f3ebd7ff6c0 Recovering log #121
-2026/05/27-14:31:25.589450 7f3ebd7ff6c0 Delete type=3 #119
-2026/05/27-14:31:25.589494 7f3ebd7ff6c0 Delete type=0 #121
-2026/05/27-14:33:21.747566 7f3e6effd6c0 Level-0 table #127: started
-2026/05/27-14:33:21.747585 7f3e6effd6c0 Level-0 table #127: 0 bytes OK
-2026/05/27-14:33:21.754474 7f3e6effd6c0 Delete type=0 #125
-2026/05/27-14:33:21.760899 7f3e6effd6c0 Manual compaction at level-0 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
-2026/05/27-14:33:21.760915 7f3e6effd6c0 Manual compaction at level-1 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
+2026/06/01-08:35:53.466145 7f52c6bff6c0 Recovering log #138
+2026/06/01-08:35:53.477972 7f52c6bff6c0 Delete type=3 #136
+2026/06/01-08:35:53.478013 7f52c6bff6c0 Delete type=0 #138
+2026/06/01-08:51:10.424141 7f52c4bfb6c0 Level-0 table #143: started
+2026/06/01-08:51:10.424176 7f52c4bfb6c0 Level-0 table #143: 0 bytes OK
+2026/06/01-08:51:10.430711 7f52c4bfb6c0 Delete type=0 #141
+2026/06/01-08:51:10.449900 7f52c4bfb6c0 Manual compaction at level-0 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
+2026/06/01-08:51:10.456752 7f52c4bfb6c0 Manual compaction at level-1 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
diff --git a/packs/equipement/MANIFEST-000128 b/packs/equipement/MANIFEST-000144
similarity index 60%
rename from packs/equipement/MANIFEST-000128
rename to packs/equipement/MANIFEST-000144
index 79136c0..5657cad 100644
Binary files a/packs/equipement/MANIFEST-000128 and b/packs/equipement/MANIFEST-000144 differ
diff --git a/packs/espece/000122.log b/packs/espece/000137.log
similarity index 100%
rename from packs/espece/000122.log
rename to packs/espece/000137.log
diff --git a/packs/espece/CURRENT b/packs/espece/CURRENT
index 30eb131..0eb07d3 100644
--- a/packs/espece/CURRENT
+++ b/packs/espece/CURRENT
@@ -1 +1 @@
-MANIFEST-000120
+MANIFEST-000136
diff --git a/packs/espece/LOG b/packs/espece/LOG
index b3b1714..507be2a 100644
--- a/packs/espece/LOG
+++ b/packs/espece/LOG
@@ -1,7 +1,3 @@
-2026/05/27-23:11:58.388239 7f3e6f7fe6c0 Recovering log #118
-2026/05/27-23:11:58.398684 7f3e6f7fe6c0 Delete type=3 #116
-2026/05/27-23:11:58.398724 7f3e6f7fe6c0 Delete type=0 #118
-2026/05/28-01:07:03.294489 7f3e6effd6c0 Level-0 table #123: started
-2026/05/28-01:07:03.294501 7f3e6effd6c0 Level-0 table #123: 0 bytes OK
-2026/05/28-01:07:03.300827 7f3e6effd6c0 Delete type=0 #121
-2026/05/28-01:07:03.314060 7f3e6effd6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
+2026/06/01-22:42:05.840284 7f52c6bff6c0 Recovering log #134
+2026/06/01-22:42:05.850204 7f52c6bff6c0 Delete type=3 #132
+2026/06/01-22:42:05.850246 7f52c6bff6c0 Delete type=0 #134
diff --git a/packs/espece/LOG.old b/packs/espece/LOG.old
index 8a51162..9ff68eb 100644
--- a/packs/espece/LOG.old
+++ b/packs/espece/LOG.old
@@ -1,7 +1,7 @@
-2026/05/27-14:31:25.615623 7f3ebd7ff6c0 Recovering log #114
-2026/05/27-14:31:25.625348 7f3ebd7ff6c0 Delete type=3 #112
-2026/05/27-14:31:25.625369 7f3ebd7ff6c0 Delete type=0 #114
-2026/05/27-14:33:21.761003 7f3e6effd6c0 Level-0 table #119: started
-2026/05/27-14:33:21.761022 7f3e6effd6c0 Level-0 table #119: 0 bytes OK
-2026/05/27-14:33:21.766953 7f3e6effd6c0 Delete type=0 #117
-2026/05/27-14:33:21.780083 7f3e6effd6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
+2026/06/01-08:35:53.508573 7f52c53fc6c0 Recovering log #130
+2026/06/01-08:35:53.519646 7f52c53fc6c0 Delete type=3 #128
+2026/06/01-08:35:53.519709 7f52c53fc6c0 Delete type=0 #130
+2026/06/01-08:51:10.437011 7f52c4bfb6c0 Level-0 table #135: started
+2026/06/01-08:51:10.437031 7f52c4bfb6c0 Level-0 table #135: 0 bytes OK
+2026/06/01-08:51:10.443132 7f52c4bfb6c0 Delete type=0 #133
+2026/06/01-08:51:10.449915 7f52c4bfb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
diff --git a/packs/espece/MANIFEST-000120 b/packs/espece/MANIFEST-000120
deleted file mode 100644
index 540472b..0000000
Binary files a/packs/espece/MANIFEST-000120 and /dev/null differ
diff --git a/packs/espece/MANIFEST-000136 b/packs/espece/MANIFEST-000136
new file mode 100644
index 0000000..a91cf01
Binary files /dev/null and b/packs/espece/MANIFEST-000136 differ
diff --git a/packs/journal/000103.log b/packs/journal/000118.log
similarity index 100%
rename from packs/journal/000103.log
rename to packs/journal/000118.log
diff --git a/packs/journal/CURRENT b/packs/journal/CURRENT
index ed5ac88..5ff346e 100644
--- a/packs/journal/CURRENT
+++ b/packs/journal/CURRENT
@@ -1 +1 @@
-MANIFEST-000101
+MANIFEST-000117
diff --git a/packs/journal/LOG b/packs/journal/LOG
index 8459ce7..e0bb704 100644
--- a/packs/journal/LOG
+++ b/packs/journal/LOG
@@ -1,8 +1,3 @@
-2026/05/27-23:11:58.400455 7f3ebd7ff6c0 Recovering log #99
-2026/05/27-23:11:58.410587 7f3ebd7ff6c0 Delete type=3 #97
-2026/05/27-23:11:58.410645 7f3ebd7ff6c0 Delete type=0 #99
-2026/05/28-01:07:03.300932 7f3e6effd6c0 Level-0 table #104: started
-2026/05/28-01:07:03.300945 7f3e6effd6c0 Level-0 table #104: 0 bytes OK
-2026/05/28-01:07:03.306823 7f3e6effd6c0 Delete type=0 #102
-2026/05/28-01:07:03.314070 7f3e6effd6c0 Manual compaction at level-0 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
-2026/05/28-01:07:03.314229 7f3e6effd6c0 Manual compaction at level-1 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
+2026/06/01-22:42:05.852043 7f52c5bfd6c0 Recovering log #115
+2026/06/01-22:42:05.861694 7f52c5bfd6c0 Delete type=3 #113
+2026/06/01-22:42:05.861740 7f52c5bfd6c0 Delete type=0 #115
diff --git a/packs/journal/LOG.old b/packs/journal/LOG.old
index ad24c69..6fd6140 100644
--- a/packs/journal/LOG.old
+++ b/packs/journal/LOG.old
@@ -1,8 +1,8 @@
-2026/05/27-14:31:25.627132 7f3ebd7ff6c0 Recovering log #95
-2026/05/27-14:31:25.636967 7f3ebd7ff6c0 Delete type=3 #93
-2026/05/27-14:31:25.637002 7f3ebd7ff6c0 Delete type=0 #95
-2026/05/27-14:33:21.773684 7f3e6effd6c0 Level-0 table #100: started
-2026/05/27-14:33:21.773700 7f3e6effd6c0 Level-0 table #100: 0 bytes OK
-2026/05/27-14:33:21.779958 7f3e6effd6c0 Delete type=0 #98
-2026/05/27-14:33:21.786739 7f3e6effd6c0 Manual compaction at level-0 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
-2026/05/27-14:33:21.800533 7f3e6effd6c0 Manual compaction at level-1 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
+2026/06/01-08:35:53.522844 7f52c5bfd6c0 Recovering log #111
+2026/06/01-08:35:53.532856 7f52c5bfd6c0 Delete type=3 #109
+2026/06/01-08:35:53.532912 7f52c5bfd6c0 Delete type=0 #111
+2026/06/01-08:51:10.463428 7f52c4bfb6c0 Level-0 table #116: started
+2026/06/01-08:51:10.463447 7f52c4bfb6c0 Level-0 table #116: 0 bytes OK
+2026/06/01-08:51:10.470660 7f52c4bfb6c0 Delete type=0 #114
+2026/06/01-08:51:10.477037 7f52c4bfb6c0 Manual compaction at level-0 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
+2026/06/01-08:51:10.484516 7f52c4bfb6c0 Manual compaction at level-1 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
diff --git a/packs/journal/MANIFEST-000101 b/packs/journal/MANIFEST-000117
similarity index 68%
rename from packs/journal/MANIFEST-000101
rename to packs/journal/MANIFEST-000117
index 6373af9..dc0f34c 100644
Binary files a/packs/journal/MANIFEST-000101 and b/packs/journal/MANIFEST-000117 differ
diff --git a/packs/maladie-poison-and-blessure/000130.log b/packs/maladie-poison-and-blessure/000145.log
similarity index 100%
rename from packs/maladie-poison-and-blessure/000130.log
rename to packs/maladie-poison-and-blessure/000145.log
diff --git a/packs/maladie-poison-and-blessure/CURRENT b/packs/maladie-poison-and-blessure/CURRENT
index a8d9908..3e77273 100644
--- a/packs/maladie-poison-and-blessure/CURRENT
+++ b/packs/maladie-poison-and-blessure/CURRENT
@@ -1 +1 @@
-MANIFEST-000128
+MANIFEST-000144
diff --git a/packs/maladie-poison-and-blessure/LOG b/packs/maladie-poison-and-blessure/LOG
index 6d97d83..0ff057b 100644
--- a/packs/maladie-poison-and-blessure/LOG
+++ b/packs/maladie-poison-and-blessure/LOG
@@ -1,8 +1,3 @@
-2026/05/27-23:11:58.323722 7f3e6f7fe6c0 Recovering log #126
-2026/05/27-23:11:58.334612 7f3e6f7fe6c0 Delete type=3 #124
-2026/05/27-23:11:58.334668 7f3e6f7fe6c0 Delete type=0 #126
-2026/05/28-01:07:03.263720 7f3e6effd6c0 Level-0 table #131: started
-2026/05/28-01:07:03.263735 7f3e6effd6c0 Level-0 table #131: 0 bytes OK
-2026/05/28-01:07:03.269766 7f3e6effd6c0 Delete type=0 #129
-2026/05/28-01:07:03.275999 7f3e6effd6c0 Manual compaction at level-0 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
-2026/05/28-01:07:03.276022 7f3e6effd6c0 Manual compaction at level-1 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
+2026/06/01-22:42:05.782042 7f52c5bfd6c0 Recovering log #142
+2026/06/01-22:42:05.791804 7f52c5bfd6c0 Delete type=3 #140
+2026/06/01-22:42:05.791860 7f52c5bfd6c0 Delete type=0 #142
diff --git a/packs/maladie-poison-and-blessure/LOG.old b/packs/maladie-poison-and-blessure/LOG.old
index ecff47c..e184c8d 100644
--- a/packs/maladie-poison-and-blessure/LOG.old
+++ b/packs/maladie-poison-and-blessure/LOG.old
@@ -1,8 +1,8 @@
-2026/05/27-14:31:25.557570 7f3ebd7ff6c0 Recovering log #121
-2026/05/27-14:31:25.567130 7f3ebd7ff6c0 Delete type=3 #119
-2026/05/27-14:31:25.567150 7f3ebd7ff6c0 Delete type=0 #121
-2026/05/27-14:33:21.735841 7f3e6effd6c0 Level-0 table #127: started
-2026/05/27-14:33:21.735866 7f3e6effd6c0 Level-0 table #127: 0 bytes OK
-2026/05/27-14:33:21.741712 7f3e6effd6c0 Delete type=0 #125
-2026/05/27-14:33:21.760883 7f3e6effd6c0 Manual compaction at level-0 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
-2026/05/27-14:33:21.760906 7f3e6effd6c0 Manual compaction at level-1 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
+2026/06/01-08:35:53.437746 7f52c6bff6c0 Recovering log #138
+2026/06/01-08:35:53.448341 7f52c6bff6c0 Delete type=3 #136
+2026/06/01-08:35:53.448380 7f52c6bff6c0 Delete type=0 #138
+2026/06/01-08:51:10.443210 7f52c4bfb6c0 Level-0 table #143: started
+2026/06/01-08:51:10.443229 7f52c4bfb6c0 Level-0 table #143: 0 bytes OK
+2026/06/01-08:51:10.449810 7f52c4bfb6c0 Delete type=0 #141
+2026/06/01-08:51:10.450168 7f52c4bfb6c0 Manual compaction at level-0 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
+2026/06/01-08:51:10.463413 7f52c4bfb6c0 Manual compaction at level-1 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
diff --git a/packs/maladie-poison-and-blessure/MANIFEST-000128 b/packs/maladie-poison-and-blessure/MANIFEST-000144
similarity index 62%
rename from packs/maladie-poison-and-blessure/MANIFEST-000128
rename to packs/maladie-poison-and-blessure/MANIFEST-000144
index 87d6133..fcb3162 100644
Binary files a/packs/maladie-poison-and-blessure/MANIFEST-000128 and b/packs/maladie-poison-and-blessure/MANIFEST-000144 differ
diff --git a/packs/objet/000122.log b/packs/objet/000137.log
similarity index 100%
rename from packs/objet/000122.log
rename to packs/objet/000137.log
diff --git a/packs/objet/CURRENT b/packs/objet/CURRENT
index 30eb131..0eb07d3 100644
--- a/packs/objet/CURRENT
+++ b/packs/objet/CURRENT
@@ -1 +1 @@
-MANIFEST-000120
+MANIFEST-000136
diff --git a/packs/objet/LOG b/packs/objet/LOG
index b2b6df2..db37743 100644
--- a/packs/objet/LOG
+++ b/packs/objet/LOG
@@ -1,7 +1,3 @@
-2026/05/27-23:11:58.337311 7f3ebcffe6c0 Recovering log #118
-2026/05/27-23:11:58.347349 7f3ebcffe6c0 Delete type=3 #116
-2026/05/27-23:11:58.347392 7f3ebcffe6c0 Delete type=0 #118
-2026/05/28-01:07:03.269795 7f3e6effd6c0 Level-0 table #123: started
-2026/05/28-01:07:03.269808 7f3e6effd6c0 Level-0 table #123: 0 bytes OK
-2026/05/28-01:07:03.275958 7f3e6effd6c0 Delete type=0 #121
-2026/05/28-01:07:03.276003 7f3e6effd6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
+2026/06/01-22:42:05.793837 7f52c53fc6c0 Recovering log #134
+2026/06/01-22:42:05.803487 7f52c53fc6c0 Delete type=3 #132
+2026/06/01-22:42:05.803533 7f52c53fc6c0 Delete type=0 #134
diff --git a/packs/objet/LOG.old b/packs/objet/LOG.old
index 1a6ab91..e7d9279 100644
--- a/packs/objet/LOG.old
+++ b/packs/objet/LOG.old
@@ -1,7 +1,7 @@
-2026/05/27-14:31:25.569405 7f3ebd7ff6c0 Recovering log #114
-2026/05/27-14:31:25.578632 7f3ebd7ff6c0 Delete type=3 #112
-2026/05/27-14:31:25.578657 7f3ebd7ff6c0 Delete type=0 #114
-2026/05/27-14:33:21.741780 7f3e6effd6c0 Level-0 table #119: started
-2026/05/27-14:33:21.741799 7f3e6effd6c0 Level-0 table #119: 0 bytes OK
-2026/05/27-14:33:21.747507 7f3e6effd6c0 Delete type=0 #117
-2026/05/27-14:33:21.760892 7f3e6effd6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
+2026/06/01-08:35:53.451848 7f52c63fe6c0 Recovering log #130
+2026/06/01-08:35:53.463255 7f52c63fe6c0 Delete type=3 #128
+2026/06/01-08:35:53.463313 7f52c63fe6c0 Delete type=0 #130
+2026/06/01-08:51:10.417333 7f52c4bfb6c0 Level-0 table #135: started
+2026/06/01-08:51:10.417354 7f52c4bfb6c0 Level-0 table #135: 0 bytes OK
+2026/06/01-08:51:10.423737 7f52c4bfb6c0 Delete type=0 #133
+2026/06/01-08:51:10.424133 7f52c4bfb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
diff --git a/packs/objet/MANIFEST-000120 b/packs/objet/MANIFEST-000120
deleted file mode 100644
index 540472b..0000000
Binary files a/packs/objet/MANIFEST-000120 and /dev/null differ
diff --git a/packs/objet/MANIFEST-000136 b/packs/objet/MANIFEST-000136
new file mode 100644
index 0000000..a91cf01
Binary files /dev/null and b/packs/objet/MANIFEST-000136 differ
diff --git a/packs/ordinateur/000130.log b/packs/ordinateur/000145.log
similarity index 100%
rename from packs/ordinateur/000130.log
rename to packs/ordinateur/000145.log
diff --git a/packs/ordinateur/CURRENT b/packs/ordinateur/CURRENT
index a8d9908..3e77273 100644
--- a/packs/ordinateur/CURRENT
+++ b/packs/ordinateur/CURRENT
@@ -1 +1 @@
-MANIFEST-000128
+MANIFEST-000144
diff --git a/packs/ordinateur/LOG b/packs/ordinateur/LOG
index f4490e8..0fd58e7 100644
--- a/packs/ordinateur/LOG
+++ b/packs/ordinateur/LOG
@@ -1,8 +1,3 @@
-2026/05/27-23:11:58.362926 7f3ebd7ff6c0 Recovering log #126
-2026/05/27-23:11:58.372894 7f3ebd7ff6c0 Delete type=3 #124
-2026/05/27-23:11:58.372934 7f3ebd7ff6c0 Delete type=0 #126
-2026/05/28-01:07:03.281993 7f3e6effd6c0 Level-0 table #131: started
-2026/05/28-01:07:03.282003 7f3e6effd6c0 Level-0 table #131: 0 bytes OK
-2026/05/28-01:07:03.287823 7f3e6effd6c0 Delete type=0 #129
-2026/05/28-01:07:03.300883 7f3e6effd6c0 Manual compaction at level-0 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
-2026/05/28-01:07:03.314065 7f3e6effd6c0 Manual compaction at level-1 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
+2026/06/01-22:42:05.817864 7f52c6bff6c0 Recovering log #142
+2026/06/01-22:42:05.827428 7f52c6bff6c0 Delete type=3 #140
+2026/06/01-22:42:05.827476 7f52c6bff6c0 Delete type=0 #142
diff --git a/packs/ordinateur/LOG.old b/packs/ordinateur/LOG.old
index 2d2cb83..613dd21 100644
--- a/packs/ordinateur/LOG.old
+++ b/packs/ordinateur/LOG.old
@@ -1,8 +1,8 @@
-2026/05/27-14:31:25.591969 7f3ebd7ff6c0 Recovering log #121
-2026/05/27-14:31:25.601963 7f3ebd7ff6c0 Delete type=3 #119
-2026/05/27-14:31:25.601983 7f3ebd7ff6c0 Delete type=0 #121
-2026/05/27-14:33:21.754559 7f3e6effd6c0 Level-0 table #127: started
-2026/05/27-14:33:21.754583 7f3e6effd6c0 Level-0 table #127: 0 bytes OK
-2026/05/27-14:33:21.760810 7f3e6effd6c0 Delete type=0 #125
-2026/05/27-14:33:21.760994 7f3e6effd6c0 Manual compaction at level-0 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
-2026/05/27-14:33:21.773676 7f3e6effd6c0 Manual compaction at level-1 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
+2026/06/01-08:35:53.480904 7f52c63fe6c0 Recovering log #138
+2026/06/01-08:35:53.491518 7f52c63fe6c0 Delete type=3 #136
+2026/06/01-08:35:53.491573 7f52c63fe6c0 Delete type=0 #138
+2026/06/01-08:51:10.456761 7f52c4bfb6c0 Level-0 table #143: started
+2026/06/01-08:51:10.456779 7f52c4bfb6c0 Level-0 table #143: 0 bytes OK
+2026/06/01-08:51:10.463323 7f52c4bfb6c0 Delete type=0 #141
+2026/06/01-08:51:10.470745 7f52c4bfb6c0 Manual compaction at level-0 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
+2026/06/01-08:51:10.477028 7f52c4bfb6c0 Manual compaction at level-1 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
diff --git a/packs/ordinateur/MANIFEST-000128 b/packs/ordinateur/MANIFEST-000144
similarity index 61%
rename from packs/ordinateur/MANIFEST-000128
rename to packs/ordinateur/MANIFEST-000144
index e127d0d..fbdf399 100644
Binary files a/packs/ordinateur/MANIFEST-000128 and b/packs/ordinateur/MANIFEST-000144 differ
diff --git a/packs/tables-pnj/000084.ldb b/packs/tables-pnj/000084.ldb
deleted file mode 100644
index 17def9e..0000000
Binary files a/packs/tables-pnj/000084.ldb and /dev/null differ
diff --git a/packs/tables-pnj/000168.ldb b/packs/tables-pnj/000168.ldb
new file mode 100644
index 0000000..5131ae3
Binary files /dev/null and b/packs/tables-pnj/000168.ldb differ
diff --git a/packs/tables-pnj/000170.ldb b/packs/tables-pnj/000170.ldb
new file mode 100644
index 0000000..fdbebad
Binary files /dev/null and b/packs/tables-pnj/000170.ldb differ
diff --git a/packs/tables-pnj/000183.ldb b/packs/tables-pnj/000183.ldb
new file mode 100644
index 0000000..d3c88fb
Binary files /dev/null and b/packs/tables-pnj/000183.ldb differ
diff --git a/packs/tables-pnj/000184.ldb b/packs/tables-pnj/000184.ldb
new file mode 100644
index 0000000..4c01fe5
Binary files /dev/null and b/packs/tables-pnj/000184.ldb differ
diff --git a/packs/tables-pnj/000186.ldb b/packs/tables-pnj/000186.ldb
new file mode 100644
index 0000000..c4f3981
Binary files /dev/null and b/packs/tables-pnj/000186.ldb differ
diff --git a/packs/tables-pnj/000187.log b/packs/tables-pnj/000187.log
new file mode 100644
index 0000000..b820db0
Binary files /dev/null and b/packs/tables-pnj/000187.log differ
diff --git a/packs/tables-pnj/000188.ldb b/packs/tables-pnj/000188.ldb
new file mode 100644
index 0000000..ef6fdeb
Binary files /dev/null and b/packs/tables-pnj/000188.ldb differ
diff --git a/packs/tables-pnj/CURRENT b/packs/tables-pnj/CURRENT
index a9ebced..91e41f4 100644
--- a/packs/tables-pnj/CURRENT
+++ b/packs/tables-pnj/CURRENT
@@ -1 +1 @@
-MANIFEST-000048
+MANIFEST-000171
diff --git a/packs/tables-pnj/LOG b/packs/tables-pnj/LOG
index 33b8db4..6a5254f 100644
--- a/packs/tables-pnj/LOG
+++ b/packs/tables-pnj/LOG
@@ -1,92 +1,34 @@
-2026/05/27-23:11:58.454344 7f3ebcffe6c0 Recovering log #44
-2026/05/27-23:11:58.463285 7f3ebcffe6c0 Delete type=3 #40
-2026/05/27-23:11:58.463300 7f3ebcffe6c0 Delete type=0 #44
-2026/05/27-23:37:44.587645 7f3e6effd6c0 Level-0 table #51: started
-2026/05/27-23:37:44.605872 7f3e6effd6c0 Level-0 table #51: 1343154 bytes OK
-2026/05/27-23:37:44.612030 7f3e6effd6c0 Delete type=0 #49
-2026/05/28-00:04:39.168329 7f3e6effd6c0 Level-0 table #53: started
-2026/05/28-00:04:39.185209 7f3e6effd6c0 Level-0 table #53: 1393674 bytes OK
-2026/05/28-00:04:39.191603 7f3e6effd6c0 Delete type=0 #50
-2026/05/28-00:18:55.273857 7f3e6effd6c0 Level-0 table #55: started
-2026/05/28-00:18:55.294346 7f3e6effd6c0 Level-0 table #55: 1451564 bytes OK
-2026/05/28-00:18:55.300308 7f3e6effd6c0 Delete type=0 #52
-2026/05/28-00:20:15.021651 7f3e6effd6c0 Level-0 table #57: started
-2026/05/28-00:20:15.040525 7f3e6effd6c0 Level-0 table #57: 1496314 bytes OK
-2026/05/28-00:20:15.046886 7f3e6effd6c0 Delete type=0 #54
-2026/05/28-00:20:43.720521 7f3e6effd6c0 Level-0 table #59: started
-2026/05/28-00:20:43.742455 7f3e6effd6c0 Level-0 table #59: 1546947 bytes OK
-2026/05/28-00:20:43.748835 7f3e6effd6c0 Delete type=0 #56
-2026/05/28-00:20:43.749387 7f3e6effd6c0 Compacting 4@0 + 1@1 files
-2026/05/28-00:20:43.771709 7f3e6effd6c0 Generated table #60@0: 10302 keys, 1546947 bytes
-2026/05/28-00:20:43.771721 7f3e6effd6c0 Compacted 4@0 + 1@1 files => 1546947 bytes
-2026/05/28-00:20:43.777946 7f3e6effd6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
-2026/05/28-00:20:43.778171 7f3e6effd6c0 Delete type=2 #51
-2026/05/28-00:20:43.778444 7f3e6effd6c0 Delete type=2 #53
-2026/05/28-00:20:43.778777 7f3e6effd6c0 Delete type=2 #55
-2026/05/28-00:20:43.778977 7f3e6effd6c0 Delete type=2 #57
-2026/05/28-00:20:43.779160 7f3e6effd6c0 Delete type=2 #59
-2026/05/28-00:21:51.457842 7f3e6effd6c0 Level-0 table #62: started
-2026/05/28-00:21:51.479532 7f3e6effd6c0 Level-0 table #62: 1604425 bytes OK
-2026/05/28-00:21:51.485724 7f3e6effd6c0 Delete type=0 #58
-2026/05/28-00:30:27.802783 7f3e6effd6c0 Level-0 table #64: started
-2026/05/28-00:30:27.823947 7f3e6effd6c0 Level-0 table #64: 1651065 bytes OK
-2026/05/28-00:30:27.829721 7f3e6effd6c0 Delete type=0 #61
-2026/05/28-00:35:01.919877 7f3e6effd6c0 Level-0 table #66: started
-2026/05/28-00:35:01.987012 7f3e6effd6c0 Level-0 table #66: 1703060 bytes OK
-2026/05/28-00:35:02.043369 7f3e6effd6c0 Delete type=0 #63
-2026/05/28-00:37:26.052331 7f3e6effd6c0 Level-0 table #68: started
-2026/05/28-00:37:26.076959 7f3e6effd6c0 Level-0 table #68: 1753179 bytes OK
-2026/05/28-00:37:26.083119 7f3e6effd6c0 Delete type=0 #65
-2026/05/28-00:37:26.083369 7f3e6effd6c0 Compacting 4@0 + 1@1 files
-2026/05/28-00:37:26.103213 7f3e6effd6c0 Generated table #69@0: 11630 keys, 1753179 bytes
-2026/05/28-00:37:26.103227 7f3e6effd6c0 Compacted 4@0 + 1@1 files => 1753179 bytes
-2026/05/28-00:37:26.109075 7f3e6effd6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
-2026/05/28-00:37:26.109152 7f3e6effd6c0 Delete type=2 #60
-2026/05/28-00:37:26.109336 7f3e6effd6c0 Delete type=2 #62
-2026/05/28-00:37:26.109453 7f3e6effd6c0 Delete type=2 #64
-2026/05/28-00:37:26.109722 7f3e6effd6c0 Delete type=2 #66
-2026/05/28-00:37:26.109828 7f3e6effd6c0 Delete type=2 #68
-2026/05/28-00:48:03.393850 7f3e6effd6c0 Level-0 table #71: started
-2026/05/28-00:48:03.411976 7f3e6effd6c0 Level-0 table #71: 1806724 bytes OK
-2026/05/28-00:48:03.419030 7f3e6effd6c0 Delete type=0 #67
-2026/05/28-00:52:05.605289 7f3e6effd6c0 Level-0 table #73: started
-2026/05/28-00:52:05.629208 7f3e6effd6c0 Level-0 table #73: 1856591 bytes OK
-2026/05/28-00:52:05.635297 7f3e6effd6c0 Delete type=0 #70
-2026/05/28-00:53:23.184161 7f3e6effd6c0 Level-0 table #75: started
-2026/05/28-00:53:23.202618 7f3e6effd6c0 Level-0 table #75: 1901920 bytes OK
-2026/05/28-00:53:23.208730 7f3e6effd6c0 Delete type=0 #72
-2026/05/28-01:02:57.320650 7f3e6effd6c0 Level-0 table #77: started
-2026/05/28-01:02:57.341951 7f3e6effd6c0 Level-0 table #77: 1962797 bytes OK
-2026/05/28-01:02:57.347793 7f3e6effd6c0 Delete type=0 #74
-2026/05/28-01:02:57.348132 7f3e6effd6c0 Compacting 4@0 + 1@1 files
-2026/05/28-01:02:57.369982 7f3e6effd6c0 Generated table #78@0: 12958 keys, 1962797 bytes
-2026/05/28-01:02:57.370013 7f3e6effd6c0 Compacted 4@0 + 1@1 files => 1962797 bytes
-2026/05/28-01:02:57.376098 7f3e6effd6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
-2026/05/28-01:02:57.376330 7f3e6effd6c0 Delete type=2 #69
-2026/05/28-01:02:57.376716 7f3e6effd6c0 Delete type=2 #71
-2026/05/28-01:02:57.377097 7f3e6effd6c0 Delete type=2 #73
-2026/05/28-01:02:57.377594 7f3e6effd6c0 Delete type=2 #75
-2026/05/28-01:02:57.377833 7f3e6effd6c0 Delete type=2 #77
-2026/05/28-01:06:35.052396 7f3e6effd6c0 Level-0 table #80: started
-2026/05/28-01:06:35.067526 7f3e6effd6c0 Level-0 table #80: 2007084 bytes OK
-2026/05/28-01:06:35.074274 7f3e6effd6c0 Delete type=0 #76
-2026/05/28-01:07:03.326355 7f3e6effd6c0 Level-0 table #82: started
-2026/05/28-01:07:03.344521 7f3e6effd6c0 Level-0 table #82: 2055614 bytes OK
-2026/05/28-01:07:03.350350 7f3e6effd6c0 Delete type=0 #79
-2026/05/28-01:07:03.356890 7f3e6effd6c0 Manual compaction at level-0 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 261156 : 1
-2026/05/28-01:07:03.356894 7f3e6effd6c0 Compacting 2@0 + 1@1 files
-2026/05/28-01:07:03.375384 7f3e6effd6c0 Generated table #83@0: 13622 keys, 2055614 bytes
-2026/05/28-01:07:03.375400 7f3e6effd6c0 Compacted 2@0 + 1@1 files => 2055614 bytes
-2026/05/28-01:07:03.381064 7f3e6effd6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
-2026/05/28-01:07:03.381439 7f3e6effd6c0 Delete type=2 #78
-2026/05/28-01:07:03.381593 7f3e6effd6c0 Delete type=2 #80
-2026/05/28-01:07:03.381689 7f3e6effd6c0 Delete type=2 #82
-2026/05/28-01:07:03.381868 7f3e6effd6c0 Manual compaction at level-0 from '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 261156 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 0 : 0; will stop at (end)
-2026/05/28-01:07:03.416170 7f3e6effd6c0 Manual compaction at level-1 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 274490 : 1
-2026/05/28-01:07:03.416174 7f3e6effd6c0 Compacting 1@1 + 1@2 files
-2026/05/28-01:07:03.432983 7f3e6effd6c0 Generated table #84@1: 13622 keys, 2055614 bytes
-2026/05/28-01:07:03.432994 7f3e6effd6c0 Compacted 1@1 + 1@2 files => 2055614 bytes
-2026/05/28-01:07:03.438860 7f3e6effd6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
-2026/05/28-01:07:03.438913 7f3e6effd6c0 Delete type=2 #47
-2026/05/28-01:07:03.439160 7f3e6effd6c0 Delete type=2 #83
-2026/05/28-01:07:03.445861 7f3e6effd6c0 Manual compaction at level-1 from '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 274490 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 0 : 0; will stop at (end)
+2026/06/01-22:42:05.898881 7f52c6bff6c0 Recovering log #164
+2026/06/01-22:42:05.908070 7f52c6bff6c0 Delete type=3 #158
+2026/06/01-22:42:05.908116 7f52c6bff6c0 Delete type=0 #164
+2026/06/01-22:42:20.631787 7f52c4bfb6c0 Level-0 table #174: started
+2026/06/01-22:42:20.664092 7f52c4bfb6c0 Level-0 table #174: 3534281 bytes OK
+2026/06/01-22:42:20.670615 7f52c4bfb6c0 Delete type=0 #172
+2026/06/01-22:44:14.476907 7f52c4bfb6c0 Level-0 table #176: started
+2026/06/01-22:44:14.517289 7f52c4bfb6c0 Level-0 table #176: 3590317 bytes OK
+2026/06/01-22:44:14.524467 7f52c4bfb6c0 Delete type=0 #173
+2026/06/01-22:46:05.183822 7f52c4bfb6c0 Level-0 table #178: started
+2026/06/01-22:46:05.221801 7f52c4bfb6c0 Level-0 table #178: 3635543 bytes OK
+2026/06/01-22:46:05.228261 7f52c4bfb6c0 Delete type=0 #175
+2026/06/01-22:47:46.984190 7f52c4bfb6c0 Level-0 table #180: started
+2026/06/01-22:47:47.016424 7f52c4bfb6c0 Level-0 table #180: 3689250 bytes OK
+2026/06/01-22:47:47.022818 7f52c4bfb6c0 Delete type=0 #177
+2026/06/01-22:49:07.037465 7f52c4bfb6c0 Level-0 table #182: started
+2026/06/01-22:49:07.113718 7f52c4bfb6c0 Level-0 table #182: 3742709 bytes OK
+2026/06/01-22:49:07.141920 7f52c4bfb6c0 Delete type=0 #179
+2026/06/01-22:49:07.142905 7f52c4bfb6c0 Compacting 4@0 + 1@1 files
+2026/06/01-22:49:07.200300 7f52c4bfb6c0 Generated table #183@0: 12232 keys, 2147703 bytes
+2026/06/01-22:49:07.251271 7f52c4bfb6c0 Generated table #184@0: 12346 keys, 1594009 bytes
+2026/06/01-22:49:07.251297 7f52c4bfb6c0 Compacted 4@0 + 1@1 files => 3741712 bytes
+2026/06/01-22:49:07.282491 7f52c4bfb6c0 compacted to: files[ 0 2 2 0 0 0 0 ]
+2026/06/01-22:49:07.282953 7f52c4bfb6c0 Delete type=2 #174
+2026/06/01-22:49:07.283509 7f52c4bfb6c0 Delete type=2 #176
+2026/06/01-22:49:07.284069 7f52c4bfb6c0 Delete type=2 #178
+2026/06/01-22:49:07.284659 7f52c4bfb6c0 Delete type=2 #180
+2026/06/01-22:49:07.285224 7f52c4bfb6c0 Delete type=2 #182
+2026/06/01-22:50:15.076056 7f52c4bfb6c0 Level-0 table #186: started
+2026/06/01-22:50:15.139569 7f52c4bfb6c0 Level-0 table #186: 3791699 bytes OK
+2026/06/01-22:50:15.177008 7f52c4bfb6c0 Delete type=0 #181
+2026/06/01-22:51:23.050617 7f52c4bfb6c0 Level-0 table #188: started
+2026/06/01-22:51:23.083717 7f52c4bfb6c0 Level-0 table #188: 3847811 bytes OK
+2026/06/01-22:51:23.090754 7f52c4bfb6c0 Delete type=0 #185
diff --git a/packs/tables-pnj/LOG.old b/packs/tables-pnj/LOG.old
index 64207cc..6a3a4ef 100644
--- a/packs/tables-pnj/LOG.old
+++ b/packs/tables-pnj/LOG.old
@@ -1,25 +1,39 @@
-2026/05/27-14:31:25.674162 7f3e6f7fe6c0 Recovering log #36
-2026/05/27-14:31:25.684284 7f3e6f7fe6c0 Delete type=3 #21
-2026/05/27-14:31:25.684327 7f3e6f7fe6c0 Delete type=0 #36
-2026/05/27-14:32:13.276652 7f3e6effd6c0 Level-0 table #43: started
-2026/05/27-14:32:13.292995 7f3e6effd6c0 Level-0 table #43: 1244894 bytes OK
-2026/05/27-14:32:13.298790 7f3e6effd6c0 Delete type=0 #41
-2026/05/27-14:33:21.808275 7f3e6effd6c0 Level-0 table #45: started
-2026/05/27-14:33:21.824612 7f3e6effd6c0 Level-0 table #45: 1294793 bytes OK
-2026/05/27-14:33:21.831380 7f3e6effd6c0 Delete type=0 #42
-2026/05/27-14:33:21.838976 7f3e6effd6c0 Manual compaction at level-0 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 109340 : 1
-2026/05/27-14:33:21.838980 7f3e6effd6c0 Compacting 1@0 + 1@1 files
-2026/05/27-14:33:21.852317 7f3e6effd6c0 Generated table #46@0: 8642 keys, 1294793 bytes
-2026/05/27-14:33:21.852331 7f3e6effd6c0 Compacted 1@0 + 1@1 files => 1294793 bytes
-2026/05/27-14:33:21.859689 7f3e6effd6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
-2026/05/27-14:33:21.859935 7f3e6effd6c0 Delete type=2 #43
-2026/05/27-14:33:21.860058 7f3e6effd6c0 Delete type=2 #45
-2026/05/27-14:33:21.877111 7f3e6effd6c0 Manual compaction at level-0 from '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 109340 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 0 : 0; will stop at (end)
-2026/05/27-14:33:21.877144 7f3e6effd6c0 Manual compaction at level-1 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 109340 : 1
-2026/05/27-14:33:21.877150 7f3e6effd6c0 Compacting 1@1 + 1@2 files
-2026/05/27-14:33:21.895679 7f3e6effd6c0 Generated table #47@1: 8642 keys, 1294793 bytes
-2026/05/27-14:33:21.895699 7f3e6effd6c0 Compacted 1@1 + 1@2 files => 1294793 bytes
-2026/05/27-14:33:21.901922 7f3e6effd6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
-2026/05/27-14:33:21.902059 7f3e6effd6c0 Delete type=2 #39
-2026/05/27-14:33:21.902514 7f3e6effd6c0 Delete type=2 #46
-2026/05/27-14:33:21.908609 7f3e6effd6c0 Manual compaction at level-1 from '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 109340 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 0 : 0; will stop at (end)
+2026/06/01-08:35:53.577873 7f52c53fc6c0 Recovering log #151
+2026/06/01-08:35:53.588883 7f52c53fc6c0 Delete type=3 #115
+2026/06/01-08:35:53.588945 7f52c53fc6c0 Delete type=0 #151
+2026/06/01-08:47:35.073031 7f52c4bfb6c0 Level-0 table #161: started
+2026/06/01-08:47:35.109060 7f52c4bfb6c0 Level-0 table #161: 3389567 bytes OK
+2026/06/01-08:47:35.119693 7f52c4bfb6c0 Delete type=0 #159
+2026/06/01-08:49:55.679233 7f52c4bfb6c0 Level-0 table #163: started
+2026/06/01-08:49:55.721583 7f52c4bfb6c0 Level-0 table #163: 3442926 bytes OK
+2026/06/01-08:49:55.728383 7f52c4bfb6c0 Delete type=0 #160
+2026/06/01-08:51:10.512438 7f52c4bfb6c0 Level-0 table #165: started
+2026/06/01-08:51:10.552653 7f52c4bfb6c0 Level-0 table #165: 3485558 bytes OK
+2026/06/01-08:51:10.559696 7f52c4bfb6c0 Delete type=0 #162
+2026/06/01-08:51:10.560948 7f52c4bfb6c0 Manual compaction at level-0 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 761930 : 1
+2026/06/01-08:51:10.560964 7f52c4bfb6c0 Compacting 2@0 + 1@1 files
+2026/06/01-08:51:10.590673 7f52c4bfb6c0 Generated table #166@0: 12461 keys, 2148113 bytes
+2026/06/01-08:51:10.614131 7f52c4bfb6c0 Generated table #167@0: 10457 keys, 1336575 bytes
+2026/06/01-08:51:10.614152 7f52c4bfb6c0 Compacted 2@0 + 1@1 files => 3484688 bytes
+2026/06/01-08:51:10.620854 7f52c4bfb6c0 compacted to: files[ 0 2 2 0 0 0 0 ]
+2026/06/01-08:51:10.621202 7f52c4bfb6c0 Delete type=2 #161
+2026/06/01-08:51:10.621653 7f52c4bfb6c0 Delete type=2 #163
+2026/06/01-08:51:10.622090 7f52c4bfb6c0 Delete type=2 #165
+2026/06/01-08:51:10.641251 7f52c4bfb6c0 Manual compaction at level-0 from '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 761930 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at (end)
+2026/06/01-08:51:10.649348 7f52c4bfb6c0 Manual compaction at level-1 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!e9c7LNgXUFbYLZF1.0q5zLunzoX2kqo8m' @ 780825 : 1
+2026/06/01-08:51:10.649351 7f52c4bfb6c0 Compacting 1@1 + 1@2 files
+2026/06/01-08:51:10.679226 7f52c4bfb6c0 Generated table #168@1: 12461 keys, 2148113 bytes
+2026/06/01-08:51:10.684351 7f52c4bfb6c0 Generated table #169@1: 755 keys, 94591 bytes
+2026/06/01-08:51:10.684370 7f52c4bfb6c0 Compacted 1@1 + 1@2 files => 2242704 bytes
+2026/06/01-08:51:10.692020 7f52c4bfb6c0 compacted to: files[ 0 1 3 0 0 0 0 ]
+2026/06/01-08:51:10.692313 7f52c4bfb6c0 Delete type=2 #155
+2026/06/01-08:51:10.692659 7f52c4bfb6c0 Delete type=2 #166
+2026/06/01-08:51:10.711439 7f52c4bfb6c0 Manual compaction at level-1 from '!tables.results!e9c7LNgXUFbYLZF1.0q5zLunzoX2kqo8m' @ 780825 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 784560 : 1
+2026/06/01-08:51:10.711444 7f52c4bfb6c0 Compacting 1@1 + 2@2 files
+2026/06/01-08:51:10.734315 7f52c4bfb6c0 Generated table #170@1: 10457 keys, 1336575 bytes
+2026/06/01-08:51:10.734332 7f52c4bfb6c0 Compacted 1@1 + 2@2 files => 1336575 bytes
+2026/06/01-08:51:10.741118 7f52c4bfb6c0 compacted to: files[ 0 0 2 0 0 0 0 ]
+2026/06/01-08:51:10.741262 7f52c4bfb6c0 Delete type=2 #157
+2026/06/01-08:51:10.741508 7f52c4bfb6c0 Delete type=2 #167
+2026/06/01-08:51:10.741680 7f52c4bfb6c0 Delete type=2 #169
+2026/06/01-08:51:10.747933 7f52c4bfb6c0 Manual compaction at level-1 from '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 784560 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at (end)
diff --git a/packs/tables-pnj/MANIFEST-000048 b/packs/tables-pnj/MANIFEST-000048
deleted file mode 100644
index 3f2e4b2..0000000
Binary files a/packs/tables-pnj/MANIFEST-000048 and /dev/null differ
diff --git a/packs/tables-pnj/MANIFEST-000171 b/packs/tables-pnj/MANIFEST-000171
new file mode 100644
index 0000000..9323706
Binary files /dev/null and b/packs/tables-pnj/MANIFEST-000171 differ
diff --git a/packs/talents-psioniques/000076.log b/packs/talents-psioniques/000076.log
deleted file mode 100644
index e69de29..0000000
diff --git a/packs/tables-pnj/000081.log b/packs/talents-psioniques/000091.log
similarity index 100%
rename from packs/tables-pnj/000081.log
rename to packs/talents-psioniques/000091.log
diff --git a/packs/talents-psioniques/CURRENT b/packs/talents-psioniques/CURRENT
index f8d57cc..2f2c868 100644
--- a/packs/talents-psioniques/CURRENT
+++ b/packs/talents-psioniques/CURRENT
@@ -1 +1 @@
-MANIFEST-000074
+MANIFEST-000090
diff --git a/packs/talents-psioniques/LOG b/packs/talents-psioniques/LOG
index f684555..1f0fb88 100644
--- a/packs/talents-psioniques/LOG
+++ b/packs/talents-psioniques/LOG
@@ -1,8 +1,3 @@
-2026/05/27-23:11:58.427900 7f3ebd7ff6c0 Recovering log #72
-2026/05/27-23:11:58.438233 7f3ebd7ff6c0 Delete type=3 #70
-2026/05/27-23:11:58.438292 7f3ebd7ff6c0 Delete type=0 #72
-2026/05/28-01:07:03.314279 7f3e6effd6c0 Level-0 table #77: started
-2026/05/28-01:07:03.314328 7f3e6effd6c0 Level-0 table #77: 0 bytes OK
-2026/05/28-01:07:03.320204 7f3e6effd6c0 Delete type=0 #75
-2026/05/28-01:07:03.356871 7f3e6effd6c0 Manual compaction at level-0 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
-2026/05/28-01:07:03.381781 7f3e6effd6c0 Manual compaction at level-1 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
+2026/06/01-22:42:05.875087 7f52c6bff6c0 Recovering log #88
+2026/06/01-22:42:05.885101 7f52c6bff6c0 Delete type=3 #86
+2026/06/01-22:42:05.885133 7f52c6bff6c0 Delete type=0 #88
diff --git a/packs/talents-psioniques/LOG.old b/packs/talents-psioniques/LOG.old
index f104890..d49837c 100644
--- a/packs/talents-psioniques/LOG.old
+++ b/packs/talents-psioniques/LOG.old
@@ -1,8 +1,8 @@
-2026/05/27-14:31:25.650849 7f3e6f7fe6c0 Recovering log #67
-2026/05/27-14:31:25.660624 7f3e6f7fe6c0 Delete type=3 #65
-2026/05/27-14:31:25.660648 7f3e6f7fe6c0 Delete type=0 #67
-2026/05/27-14:33:21.780104 7f3e6effd6c0 Level-0 table #73: started
-2026/05/27-14:33:21.780129 7f3e6effd6c0 Level-0 table #73: 0 bytes OK
-2026/05/27-14:33:21.786659 7f3e6effd6c0 Delete type=0 #71
-2026/05/27-14:33:21.800546 7f3e6effd6c0 Manual compaction at level-0 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
-2026/05/27-14:33:21.808253 7f3e6effd6c0 Manual compaction at level-1 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
+2026/06/01-08:35:53.549764 7f52c5bfd6c0 Recovering log #84
+2026/06/01-08:35:53.560355 7f52c5bfd6c0 Delete type=3 #82
+2026/06/01-08:35:53.560413 7f52c5bfd6c0 Delete type=0 #84
+2026/06/01-08:51:10.491490 7f52c4bfb6c0 Level-0 table #89: started
+2026/06/01-08:51:10.491513 7f52c4bfb6c0 Level-0 table #89: 0 bytes OK
+2026/06/01-08:51:10.498412 7f52c4bfb6c0 Delete type=0 #87
+2026/06/01-08:51:10.505791 7f52c4bfb6c0 Manual compaction at level-0 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
+2026/06/01-08:51:10.560715 7f52c4bfb6c0 Manual compaction at level-1 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
diff --git a/packs/talents-psioniques/MANIFEST-000074 b/packs/talents-psioniques/MANIFEST-000090
similarity index 62%
rename from packs/talents-psioniques/MANIFEST-000074
rename to packs/talents-psioniques/MANIFEST-000090
index 962fbd8..6d27032 100644
Binary files a/packs/talents-psioniques/MANIFEST-000074 and b/packs/talents-psioniques/MANIFEST-000090 differ
diff --git a/scripts/SectorMapApp.js b/scripts/SectorMapApp.js
new file mode 100644
index 0000000..fe5baa4
--- /dev/null
+++ b/scripts/SectorMapApp.js
@@ -0,0 +1,496 @@
+/**
+ * MGT2 – SectorMapApp
+ *
+ * Application interactive affichant une carte Traveller Map dans un IFRAME.
+ * Les clics sur la carte affichent les détails du monde dans le chat.
+ */
+
+const { ApplicationV2 } = foundry.applications.api;
+const MODULE_ID = 'mgt2-compendium-amiral-denisov';
+
+export class SectorMapApp extends ApplicationV2 {
+ static DEFAULT_OPTIONS = {
+ id: 'mgt2-sector-map',
+ classes: ['mgt2-sector-map'],
+ position: { width: 960, height: 720 },
+ window: { icon: 'fas fa-map', resizable: true, controls: [] },
+ };
+
+ constructor(sector, subsector) {
+ super();
+ this._sector = sector;
+ this._subsector = subsector;
+ this._handler = null;
+ }
+
+ get title() {
+ return this._subsector
+ ? `Sous-secteur ${this._subsector} — ${this._sector}`
+ : `Secteur ${this._sector}`;
+ }
+
+ get _mapUrl() {
+ const base = 'https://travellermap.com';
+ if (this._subsector) {
+ return `${base}/?sector=${encodeURIComponent(this._sector)}&subsector=${encodeURIComponent(this._subsector)}&style=mongoose&hideui=1`;
+ }
+ return `${base}/go/${encodeURIComponent(this._sector)}?style=mongoose`;
+ }
+
+ /* ───── Rendu ───── */
+
+ _replaceHTML(result, config) {
+ const content = this.element?.querySelector('.window-content');
+ if (!content) return;
+ const html = typeof result === 'string' ? result : this._lastHTML;
+ content.innerHTML = typeof html === 'string' ? html : '';
+ }
+
+ _renderHTML() {
+ return `
+
+ ${this._sector}${this._subsector ? ` — sous-secteur ${this._subsector}` : ''}
+ Cliquez sur un hex pour voir les détails du monde
+
+
+
+
+
`;
+ }
+
+ async _onRender(context, options) {
+ this._listen();
+ this.element?.querySelector('.mgt2-sector-map-share')?.addEventListener('click', () => {
+ this._shareMap();
+ });
+ this.element?.querySelector('.mgt2-sector-map-sync')?.addEventListener('click', () => {
+ this._syncAll();
+ });
+ }
+
+ /* ───── Écoute des clics IFRAME ───── */
+
+ _listen() {
+ if (this._handler) return;
+ this._handler = (event) => {
+ // Accept messages from travellermap or any origin (for testing)
+ const d = event.data || {};
+ const wx = d.x ?? d.location?.x;
+ const wy = d.y ?? d.location?.y;
+ if (wx == null || wy == null) return;
+ const x = Number(wx);
+ const y = Number(wy);
+ if (isNaN(x) || isNaN(y)) return;
+ console.log('SectorMapApp | click at', x, y, 'from', event.origin);
+ this._onMapClick({x, y}).catch(err => {
+ console.error('SectorMapApp | click handler failed:', err);
+ });
+ };
+ window.addEventListener('message', this._handler);
+ }
+
+ async _onMapClick(loc) {
+ const wx = loc?.x;
+ const wy = loc?.y;
+ if (wx == null || wy == null) return;
+
+ const coordResp = await fetch(
+ `https://travellermap.com/api/coordinates?x=${wx}&y=${wy}`
+ );
+ if (!coordResp.ok) { console.error('SectorMapApp | /api/coordinates failed', coordResp.status); return; }
+ const coord = await coordResp.json();
+ const { sx, sy, hx, hy } = coord;
+ if (sx == null || hx == null || hy == null) { console.error('SectorMapApp | no sx/hx/hy in', coord); return; }
+
+ const metaResp = await fetch(
+ `https://travellermap.com/api/metadata?sx=${sx}&sy=${sy}`
+ );
+ if (!metaResp.ok) { console.error('SectorMapApp | /api/metadata failed', metaResp.status); return; }
+ const meta = await metaResp.json();
+ const sectorName = meta.Names?.[0]?.Text;
+ if (!sectorName) { console.error('SectorMapApp | no Names[0].Text in metadata', meta); return; }
+
+ const hex = String(hx).padStart(2, '0') + String(hy).padStart(2, '0');
+ const resp = await fetch(
+ `https://travellermap.com/data/${encodeURIComponent(sectorName)}/${hex}`
+ );
+ if (!resp.ok) { console.error('SectorMapApp | /data failed', resp.status, sectorName, hex); return; }
+
+ const data = await resp.json();
+ const world = data.Worlds?.[0];
+ if (!world) { console.error('SectorMapApp | no Worlds in data', data); return; }
+
+ this._postWorldCard(world);
+ }
+
+ /* ───── Carte de chat ───── */
+
+ static _STARPORT = { A:'Excellent', B:'Bon', C:'Routinier', D:'Médiocre', E:'Frontière', X:'Aucun' };
+ static _SIZE = ['Aucun (Astéroïde)','1 600 km','3 200 km','4 800 km','6 400 km','8 000 km','9 600 km','11 200 km','12 800 km','14 400 km','16 000 km']; // A=10, F=15=Gaz géant (géré à part)
+ static _ATMO = [
+ 'Aucune (vide)','Trace','Très ténue (polluée)','Très ténue','Ténue (polluée)','Ténue','Standard','Standard (polluée)','Dense','Dense (polluée)',
+ 'Exotique','Corrosive','Insidieuse','','',''];
+ static _HYDRO = [ '0–5% (désert)','6–15%','16–25%','26–35%','36–45%','46–55%','56–65%','66–75%','76–85%','86–95%','96–100%' ];
+ static _POP = ['','Dizaines','Centaines','Milliers','Dizaines de milliers','Centaines de milliers','Millions','Dizaines de millions','Centaines de millions','Milliards','Dizaines de milliards','','','','','',''];
+ static _GOV = [
+ 'Aucun','Compagnie / Corporation','Démocratie participative','Oligarchie auto-perpétuée',
+ 'Démocratie représentative','Technocratie féodale','Gouvernement captif / Colonie',
+ 'Balkanisation','Bureaucratie de service civil','Bureaucratie impersonnelle',
+ 'Dictature charismatique','Dictature non-charismatique','Oligarchie charismatique',
+ 'Dictature religieuse','Oligarchie religieuse','Gouvernement tribal'];
+ static _LAW = [
+ 'Aucune', 'Armes de poing, explosifs, poison','Armes à énergie portatives','Mitrailleuses, armes auto',
+ 'Armes d\'assaut légères, PM','Armes de poing individuelles','Toutes les armes à feu sauf neutralisateur',
+ 'Fusils, neutralisateur','Armes blanches, neutralisateur','Armes hors du domicile','Armes interdites',
+ 'Contrôle rigide','Aucune arme','Contrôle militariste sévère'];
+ static _TL = [
+ 'Âge de pierre','Âge du bronze/fer','Médiéval','Grandes découvertes','Révolution industrielle',
+ 'Production mécanisée','Ère nucléaire','Pré-stellaire (ère de l\'information)','Propulsion à saut (1re gen)',
+ 'Propulsion à saut-2','Propulsion à saut-3','Propulsion à saut-4','Propulsion à saut-5',
+ 'Propulsion à saut-6','Transporteur','Moyenne stellaire'];
+
+ static _hexVal(ch) {
+ const n = parseInt(ch, 36);
+ if (isNaN(n)) return -1;
+ return n;
+ }
+
+ static _uwpDigit(desc, val) {
+ return `${val}`;
+ }
+
+ _uwpBreakdown(uwp) {
+ if (!uwp || uwp.length < 2) return '';
+ const d = SectorMapApp._hexVal;
+ const s = d(uwp[0]), sz = d(uwp[1]), a = d(uwp[2]), h = d(uwp[3]);
+ const p = d(uwp[4]), g = d(uwp[5]), l = d(uwp[6]);
+ const t = uwp.length > 8 ? d(uwp[8]) : -1;
+
+ const lines = [];
+
+ const starport = SectorMapApp._STARPORT[uwp[0]];
+ lines.push(`| ${uwp[0]} | Starport | ${starport ?? '—'} |
`);
+
+ if (uwp[1] === 'F' || uwp[1] === 'f') {
+ lines.push(`| ${uwp[1]} | Taille | Gaz géant |
`);
+ } else if (sz >= 0 && sz <= 10) {
+ const km = SectorMapApp._SIZE[sz];
+ const grav = sz === 0 ? '0g' : (sz < 10 ? `0.${sz}g` : '1.0g+');
+ lines.push(`| ${uwp[1]} | Taille | ${km} (${grav}) |
`);
+ }
+
+ if (a >= 0 && a <= 15) {
+ const atmo = SectorMapApp._ATMO[a] ?? '—';
+ lines.push(`| ${uwp[2]} | Atmosphère | ${atmo} |
`);
+ }
+
+ if (h >= 0 && h <= 10) {
+ lines.push(`| ${uwp[3]} | Hydrosphère | ${SectorMapApp._HYDRO[h]} |
`);
+ }
+
+ if (p >= 0 && p <= 15) {
+ lines.push(`| ${uwp[4]} | Population | ${SectorMapApp._POP[p] ?? '—'} |
`);
+ }
+
+ if (g >= 0 && g <= 15) {
+ lines.push(`| ${uwp[5]} | Gouvernement | ${SectorMapApp._GOV[g] ?? '—'} |
`);
+ }
+
+ if (l >= 0 && l <= 15) {
+ lines.push(`| ${uwp[6]} | Niveau légal | ${SectorMapApp._LAW[l] ?? '—'} |
`);
+ }
+
+ if (t >= 0 && t <= 15) {
+ lines.push(`| ${uwp[8]} | Technologie | ${SectorMapApp._TL[t] ?? '—'} |
`);
+ }
+
+ return ``;
+ }
+
+ static _REMARKS_HELP = {
+ AB:'Anneau (ceinture)', AG:'Agricole', AN:'Site ancien', AS:'Astéroïde',
+ BA:'Bande astéroïdale', CP:'Sous-secteur capitale', CS:'Colonie',
+ CX:'Chasseur (Croiseur)', CY:'Colonie', DA:'Déchu', DE:'Désertique',
+ DI:'Interdit (Diebar)', FL:'Fluides Lo', FO:'Interdit (Forbidden)',
+ FR:'Gelé (Frozen)', GA:'Jardin (Garden)', HE:'Helios', HI:'Haute population',
+ HT:'Haute technologie', IC:'Mondes gelés (Ice)', IN:'Industrialisé',
+ LI:'Faible population', LO:'Faible population (Low)', LT:'Basse technologie (Low Tech)',
+ MI:'Militaire', MR:'Mine (ressources)', NA:'Non-agricole',
+ NI:'Non-industrialisé', OC:'Océanique', OX:'Oxydant',
+ PA:'Pré-agricole (Pre-Agricultural)', PH:'Phosphore',
+ PO:'Pauvre (Poor)', PR:'Pré-industriel (Pre-Industrial)',
+ PX:'Prisonnier (exil)', PZ:'Puzzle (énigmatique)',
+ RE:'Religieux (Religious)', RI:'Riche (Rich)',
+ SA:'Bande d\'astéroïdes (Satellite)', SC:'Sainte (colonie)',
+ SL:'Esclavage (Slave)', SO:'Soleil (Sol)', SP:'Désert (Despoiled)',
+ SR:'Réserve (Reserve)', ST:'Base stellaire', SU:'Secteur capitale',
+ TR:'Traces (Trace)', TU:'Tucannides', TZ:'Mondes Tz',
+ UN:'Inhabité (Uninhabited)', VA:'Vide (Vacuum)',
+ WA:'Monde aquatique (Water)', WT:'Monde d\'eau (Watery)',
+ };
+
+ static _STAR_TYPES = { O:'Bleu (hypergéante)', B:'Bleu-blanc', A:'Blanc', F:'Blanc-jaune', G:'Jaune (naine)', K:'Orange (naine)', M:'Rouge (naine)', L:'Brune', T:'Brune', Y:'Brune' };
+ static _STAR_CLASS = { 'I':'Supergéante', 'II':'Géante brillante', 'III':'Géante', 'IV':'Sous-géante', 'V':'Naine (séquence principale)', 'VI':'Sous-naine', 'VII':'Naine blanche' };
+
+
+
+ static _BASES_HELP = {
+ N:'Base navale', S:'Base scout', W:'Relais', D:'Dépôt naval',
+ T:'Base TAS', C:'Consulat', P:'Base pirate', R:'Base de réparation',
+ K:'Base navale (K.)', X:'Relais Xboat',
+ };
+
+ _tooltipHelp(map, codes) {
+ if (!codes) return '';
+ return codes.split(/[\s,;]+/).map(c => {
+ const desc = map[c.toUpperCase()];
+ return `${c}${desc ? ' — ' + desc : ''}`;
+ }).join(' | ');
+ }
+
+ static _NOBILITY = {
+ B:'Chevalier (Baronet)', C:'Baron', D:'Marquis', E:'Comte', F:'Duc', G:'Archiduc', H:'Empereur',
+ };
+
+ static _IMPORTANCE = {
+ '-5':'Très mineur', '-4':'Mineur', '-3':'Mineur', '-2':'Très secondaire', '-1':'Secondaire',
+ '0':'Ordinaire', '1':'Important', '2':'Important', '3':'Très important', '4':'Majeure',
+ '5':'Majeure', '6':'Capitale',
+ };
+
+ /* ───── Lignes dépliables (details/summary) ───── */
+
+ _foldRow(label, value, detail, titleAttr) {
+ const valAttr = titleAttr ? ` title="${titleAttr}"` : '';
+ return `
+
+ ${label}${value}
+ ${detail}
+
+ |
`;
+ }
+
+ _decodeImportance(ix) {
+ if (!ix) return '';
+ const m = String(ix).match(/\{?\s*(-?\d+)\s*\}?/);
+ if (!m) return this._foldRow('Importance', ix, '');
+ const val = m[1];
+ const desc = SectorMapApp._IMPORTANCE[val] || '—';
+ const detail = `Valeur d’importance économique et stratégique du monde.
${val} = ${desc}
`;
+ return this._foldRow('Importance', `{ ${val} } ${desc}`, detail);
+ }
+
+ _decodeEconomics(ex) {
+ if (!ex) return '';
+ let s = String(ex).replace(/[()\s]/g, '');
+ const m = s.match(/^([\dA-F])([\dA-F])([\dA-F])([+-]\d+)$/i);
+ if (!m) return this._foldRow('Économie', ex, '');
+ const res = m[1], lab = m[2], inf = m[3], eff = m[4];
+ const detail = `
+ | Ressources | ${res} |
+ | Main-d’œuvre | ${lab} |
+ | Infrastructure | ${inf} |
+ | Efficacité | ${eff} |
+
`;
+ return this._foldRow('Économie', `( ${res} ${lab} ${inf} ${eff} )`, detail);
+ }
+
+ _decodeCulture(cx) {
+ if (!cx) return '';
+ const s = String(cx).replace(/[\[\]\s]/g, '');
+ if (s.length < 4) return this._foldRow('Culture', cx, '');
+ const h = s[0].toUpperCase(), t = s[1].toUpperCase(), p = s[2].toUpperCase(), a = s[3].toUpperCase();
+ const detail = `
+ | Hétérogénéité | ${h} |
+ | Traditionalisme | ${t} |
+ | Progressisme | ${p} |
+ | Agressivité | ${a} |
+
`;
+ return this._foldRow('Culture', `[ ${h} ${t} ${p} ${a} ]`, detail);
+ }
+
+ _decodePopulation(uwp, pbg) {
+ if (!uwp || uwp.length < 5) return '';
+ const popUwp = SectorMapApp._hexVal(uwp[4]);
+ if (popUwp < 0) return '';
+ const popPbg = pbg ? parseInt(pbg[0], 10) : null;
+ const multiplier = popPbg != null && !isNaN(popPbg) ? popPbg : 1;
+ const base = Math.pow(10, popUwp);
+ const total = multiplier * base;
+ const fmtBase = `10${popUwp}`;
+ const fmtMult = multiplier;
+ const fmtTotal = total >= 1e9 ? `${(total / 1e9).toFixed(1)} milliards`
+ : total >= 1e6 ? `${(total / 1e6).toFixed(1)} millions`
+ : total >= 1e3 ? `${(total / 1e3).toFixed(0)} 000`
+ : String(total);
+ const belts = pbg ? parseInt(pbg[1], 10) : null;
+ const gas = pbg ? parseInt(pbg[2], 10) : null;
+ const detail = `Population = multiplicateur (PBG: ${popPbg}) × 10chiffre UWP (${uwp[4]})
+ Ceintures d’astéroïdes : ${belts ?? '?'} | Géantes gazeuses : ${gas ?? '?'}
`;
+ return this._foldRow('Population', `${fmtMult} × ${fmtBase} = ${fmtTotal}`, detail);
+ }
+
+ _decodeNobility(nob) {
+ if (!nob) return '';
+ const titles = [];
+ for (const ch of nob) {
+ const desc = SectorMapApp._NOBILITY[ch.toUpperCase()];
+ if (desc) titles.push(`${ch} (${desc})`);
+ }
+ if (!titles.length) return this._foldRow('Noblesse', nob, '');
+ const detail = `Titres de noblesse impériale présents sur ce monde.
`;
+ return this._foldRow('Noblesse', titles.join(', '), detail);
+ }
+
+ _postWorldCard(w) {
+ const sector = w.Sector || '';
+ const hex = w.Hex || '';
+ const name = w.Name || '—';
+ const uwp = w.UWP || '???????-?';
+ const bases = w.Bases || '';
+ const remarks = w.Remarks || '';
+ const allegiance = w.Allegiance || '';
+ const stellar = w.Stellar || '';
+ const zone = w.Zone || '';
+ const pbg = w.PBG || '';
+
+ const zoneLabel = zone === 'R' ? 'Rouge'
+ : zone === 'A' ? 'Ambre'
+ : 'Verte';
+
+ // Construction des lignes pliables
+ const lines = [];
+
+ // UWP
+ const uwpDetail = this._uwpBreakdown(uwp);
+ lines.push(this._foldRow('UWP', `${uwp}`, uwpDetail));
+
+ // Champs étendus
+ const ixRow = this._decodeImportance(w.Ix);
+ if (ixRow) lines.push(ixRow);
+ const exRow = this._decodeEconomics(w.Ex);
+ if (exRow) lines.push(exRow);
+ const cxRow = this._decodeCulture(w.Cx);
+ if (cxRow) lines.push(cxRow);
+ const popRow = this._decodePopulation(uwp, pbg);
+ if (popRow) lines.push(popRow);
+ const nobRow = this._decodeNobility(w.Nobility);
+ if (nobRow) lines.push(nobRow);
+
+ // Bases
+ if (bases) {
+ const bCodes = bases.split(/[\s,;]+/);
+ const bList = bCodes.map(c => {
+ const desc = SectorMapApp._BASES_HELP[c.toUpperCase()];
+ return `| ${c} | ${desc || '—'} |
`;
+ }).join('');
+ const bDetail = ``;
+ lines.push(this._foldRow('Bases', bases, bDetail));
+ }
+
+ // Remarques
+ if (remarks) {
+ const rCodes = remarks.split(/[\s,;]+/);
+ const rList = rCodes.map(c => {
+ const desc = SectorMapApp._REMARKS_HELP[c.toUpperCase()];
+ return `| ${c} | ${desc || '—'} |
`;
+ }).join('');
+ const rDetail = ``;
+ lines.push(this._foldRow('Remarques', remarks, rDetail));
+ }
+
+ // Allégeance
+ if (allegiance) {
+ const allegFull = w.AllegianceName || '';
+ const aDetail = `${allegFull || allegiance}
`;
+ lines.push(this._foldRow('Allégeance', allegFull ? `${allegiance} (${allegFull})` : allegiance, aDetail));
+ }
+
+ // Étoile (les notations comme "G3 V" contiennent un espace entre sous-classe et luminosité)
+ if (stellar) {
+ const sList = [];
+ let remaining = stellar.trim();
+ const reStar = /^([OBAFGKMLTY])(\d)\s*(VII|VI|V|IV|III|II|I)\s*/i;
+ while (remaining) {
+ const m = remaining.match(reStar);
+ if (m) {
+ const type = SectorMapApp._STAR_TYPES[m[1].toUpperCase()] || m[1];
+ const cls = SectorMapApp._STAR_CLASS[m[3]] || m[3];
+ sList.push(`| ${m[1]}${m[2]} ${m[3]} | ${type} · ${cls} |
`);
+ remaining = remaining.slice(m[0].length).trimStart();
+ } else {
+ // Saute les tokens non reconnus (BD, compagnon, etc.)
+ const next = remaining.indexOf(' ');
+ if (next < 0) break;
+ remaining = remaining.slice(next + 1).trimStart();
+ }
+ }
+ const sDetail = sList.length ? `` : `${stellar}
`;
+ lines.push(this._foldRow('Étoile', `${stellar}`, sDetail));
+ }
+
+ const html = ``;
+
+ ChatMessage.create({
+ content: html,
+ whisper: [game.user.id],
+ });
+ }
+
+ /* ───── Partage ───── */
+
+ _shareMap() {
+ const posterUrl = `https://travellermap.com/api/poster?sector=${encodeURIComponent(this._sector)}${this._subsector ? `&subsector=${encodeURIComponent(this._subsector)}` : ''}&style=mongoose&scale=128&dpr=2`;
+ const label = this._subsector
+ ? `Sous-secteur ${this._subsector} — ${this._sector}`
+ : `Secteur ${this._sector}`;
+
+ const html = `
+
+
+

+
+
+ `;
+
+ ChatMessage.create({ content: html, rollMode: 'public' });
+ ui.notifications.info(`Carte partagée avec les joueurs`);
+ }
+
+ _syncAll() {
+ game.socket.emit(`module.${MODULE_ID}`, {
+ type: 'sectorMapSync',
+ sector: this._sector,
+ subsector: this._subsector,
+ });
+ ui.notifications.info(`Carte synchronisée chez tous les joueurs`);
+ }
+
+ /* ───── Nettoyage ───── */
+
+ close() {
+ if (this._handler) {
+ window.removeEventListener('message', this._handler);
+ this._handler = null;
+ }
+ return super.close();
+ }
+}
diff --git a/scripts/sector.js b/scripts/sector.js
new file mode 100644
index 0000000..f250579
--- /dev/null
+++ b/scripts/sector.js
@@ -0,0 +1,146 @@
+/**
+ * MGT2 – Commandes /sector et /subsector
+ *
+ * Ouvre l'application interactive SectorMapApp (IFRAME Traveller Map).
+ * Compatible Foundry VTT v13 et v14
+ */
+
+import { SectorMapApp } from './SectorMapApp.js';
+
+const MODULE_ID = 'mgt2-compendium-amiral-denisov';
+const ChatLogV2 = foundry.applications?.sidebar?.tabs?.ChatLog;
+
+let _pendingHandle = false;
+
+/* ───── Fonctions partagées ───── */
+
+async function openMap(sector, subsector) {
+ const app = new SectorMapApp(sector, subsector);
+ await app.render({ force: true });
+}
+
+async function handleSectorCommand(sector, subsector) {
+ if (_pendingHandle) return;
+ _pendingHandle = true;
+ try {
+ if (!sector?.trim()) {
+ ui.notifications.warn('Usage : /sector (ex: /sector "Spinward Marches")');
+ return;
+ }
+ if (!game.user?.isGM) {
+ ui.notifications.error('Seul le MJ peut utiliser cette commande');
+ return;
+ }
+ await openMap(sector.trim());
+ } catch (err) {
+ console.error(`${MODULE_ID} | Erreur /sector :`, err);
+ ui.notifications.error(`Erreur : ${err.message}`);
+ } finally {
+ _pendingHandle = false;
+ }
+}
+
+async function handleSubsectorCommand(raw) {
+ if (_pendingHandle) return;
+ _pendingHandle = true;
+ try {
+ const parts = raw?.trim().split(/\s+/);
+ if (!parts || parts.length < 2) {
+ ui.notifications.warn('Usage : /subsector (ex: /subsector "Spinward Marches" C)');
+ return;
+ }
+ const sub = parts.pop();
+ const sector = parts.join(' ');
+ if (!sector || !sub) {
+ ui.notifications.warn('Usage : /subsector ');
+ return;
+ }
+ if (!game.user?.isGM) {
+ ui.notifications.error('Seul le MJ peut utiliser cette commande');
+ return;
+ }
+ await openMap(sector.trim(), sub.trim());
+ } catch (err) {
+ console.error(`${MODULE_ID} | Erreur /subsector :`, err);
+ ui.notifications.error(`Erreur : ${err.message}`);
+ } finally {
+ _pendingHandle = false;
+ }
+}
+
+/* ───── Commande /sector ───── */
+
+if (ChatLogV2?.CHAT_COMMANDS) {
+ ChatLogV2.CHAT_COMMANDS['sector'] = {
+ rgx: /^\/sector(?:\s+(.*))?$/i,
+ fn: function() {
+ const raw = arguments[1]?.[1]?.trim?.();
+ if (raw) {
+ handleSectorCommand(raw);
+ return false;
+ }
+ return true;
+ },
+ };
+ console.log(`${MODULE_ID} | Commande /sector enregistrée`);
+
+ ChatLogV2.CHAT_COMMANDS['subsector'] = {
+ rgx: /^\/subsector(?:\s+(.*))?$/i,
+ fn: function() {
+ const raw = arguments[1]?.[1]?.trim?.();
+ if (raw) {
+ handleSubsectorCommand(raw);
+ return false;
+ }
+ return true;
+ },
+ };
+ console.log(`${MODULE_ID} | Commande /subsector enregistrée`);
+}
+
+/* ───── Hooks de secours (v13 / fallback v14) ───── */
+
+Hooks.on('preCreateChatMessage', (message, data, options) => {
+ const c = message.content?.trim();
+
+ let m = c?.match(/^\/sector(?:\s+(.*))?$/i);
+ if (m) {
+ handleSectorCommand(m[1]?.trim());
+ return false;
+ }
+
+ m = c?.match(/^\/subsector(?:\s+(.*))?$/i);
+ if (m) {
+ handleSubsectorCommand(m[1]?.trim());
+ return false;
+ }
+});
+
+/* ───── Socket (synchronisation MJ → joueurs) ───── */
+
+Hooks.once('ready', () => {
+ game.socket.on(`module.${MODULE_ID}`, (data) => {
+ if (data?.type !== 'sectorMapSync') return;
+ if (game.user?.isGM) return;
+ openMap(data.sector, data.subsector);
+ });
+});
+
+Hooks.on('chatMessage', (...args) => {
+ let msg;
+ if (args[0]?.content !== undefined) msg = args[0].content;
+ else if (typeof args[1] === 'string') msg = args[1];
+ else return;
+
+ let m = msg?.trim()?.match(/^\/sector(?:\s+(.*))?$/i);
+ if (m) {
+ handleSectorCommand(m[1]?.trim());
+ return false;
+ }
+
+ m = msg?.trim()?.match(/^\/subsector(?:\s+(.*))?$/i);
+ if (m) {
+ handleSubsectorCommand(m[1]?.trim());
+ return false;
+ }
+});
diff --git a/styles/npc.css b/styles/npc.css
index 51fd6d8..6d120e7 100644
--- a/styles/npc.css
+++ b/styles/npc.css
@@ -329,3 +329,278 @@ button.btn-calculate:hover,
border-color: #a9d0a9;
background: #eef8ee;
}
+
+/* === MGT2 Sector Map ====================================================== */
+
+#mgt2-sector-map .window-content {
+ padding: 0;
+ overflow: hidden;
+ background: #1a1a2e;
+}
+
+.mgt2-sector-map-outer {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ height: 100%;
+}
+
+.mgt2-sector-map-toolbar {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 6px 12px;
+ background: #2c2c3e;
+ border-bottom: 1px solid #c9a227;
+ flex-shrink: 0;
+}
+
+.mgt2-sector-map-label {
+ color: #d9b24c;
+ font-weight: bold;
+ font-size: 0.85em;
+}
+
+.mgt2-sector-map-hint {
+ color: #a99c7a;
+ font-size: 0.78em;
+}
+
+.mgt2-sector-map-share {
+ background: #c9a227;
+ color: #1a1a2e;
+ border: none;
+ border-radius: 3px;
+ padding: 4px 12px;
+ font-size: 0.8em;
+ font-weight: bold;
+ cursor: pointer;
+ flex-shrink: 0;
+}
+
+.mgt2-sector-map-share:hover {
+ background: #d9b24c;
+}
+
+.mgt2-sector-map-frame {
+ width: 100%;
+ flex: 1;
+ border: none;
+}
+
+/* === MGT2 World Card (chat) ============================================== */
+
+.mgt2-world-card {
+ background: #f5f0e8;
+ border: 1px solid #c9a227;
+ border-radius: 5px;
+ overflow: hidden;
+ font-family: 'Signika', sans-serif;
+ color: #222;
+}
+
+.mgt2-world-card-header {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 8px 12px;
+ background: #2c2c3e;
+ border-bottom: 2px solid #c9a227;
+}
+
+.mgt2-world-name {
+ font-size: 1.1em;
+ font-weight: bold;
+ color: #d9b24c;
+}
+
+.mgt2-world-hex {
+ font-size: 0.78em;
+ color: #a99c7a;
+ font-weight: normal;
+}
+
+.mgt2-world-zone {
+ margin-left: auto;
+ font-size: 0.75em;
+ font-weight: bold;
+ padding: 2px 8px;
+ border-radius: 999px;
+ text-transform: uppercase;
+}
+
+.mgt2-world-zone.zone-g {
+ background: #2a6a2a;
+ color: #fff;
+}
+
+.mgt2-world-zone.zone-a {
+ background: #b8860b;
+ color: #fff;
+}
+
+.mgt2-world-zone.zone-r {
+ background: #8b0000;
+ color: #fff;
+}
+
+.mgt2-world-card-body {
+ width: 100%;
+ border-collapse: collapse;
+}
+
+.mgt2-world-card-body td {
+ padding: 0;
+ border-bottom: 1px solid #e0d8c8;
+}
+
+.mgt2-world-card-body .mono {
+ font-family: 'Courier New', monospace;
+ letter-spacing: 0.1em;
+}
+
+/* === Fold rows (details/summary) ========================================= */
+
+.mgt2-world-card-body details {
+ display: block;
+}
+
+.mgt2-world-card-body summary {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 4px 12px;
+ cursor: pointer;
+ list-style: none;
+ user-select: none;
+}
+
+.mgt2-world-card-body summary::-webkit-details-marker {
+ display: none;
+}
+
+.mgt2-world-card-body summary::before {
+ content: '▸';
+ color: #c9a227;
+ font-size: 0.75em;
+ flex-shrink: 0;
+ transition: transform 0.15s;
+}
+
+.mgt2-world-card-body details[open] summary::before {
+ transform: rotate(90deg);
+}
+
+.mgt2-world-card-body summary:hover {
+ background: rgba(201, 162, 39, 0.08);
+}
+
+.fold-label {
+ width: 100px;
+ flex-shrink: 0;
+ font-weight: bold;
+ color: #5f4300;
+ font-size: 0.83em;
+}
+
+.fold-value {
+ font-size: 0.83em;
+ color: #222;
+}
+
+.fold-content {
+ padding: 4px 12px 8px 28px;
+ font-size: 0.78em;
+ color: #555;
+ background: rgba(201, 162, 39, 0.04);
+ border-top: 1px solid #ece6da;
+}
+
+.fold-desc {
+ line-height: 1.5;
+}
+
+.fold-subtable {
+ width: 100%;
+ border-collapse: collapse;
+}
+
+.fold-subtable td {
+ padding: 2px 8px;
+ font-size: 0.95em;
+ border: none;
+}
+
+.fold-subtable td:first-child {
+ width: 120px;
+ font-weight: 600;
+ color: #5f4300;
+}
+
+.fold-subtable td:nth-child(2) {
+ font-family: 'Courier New', monospace;
+ color: #7a5c00;
+ letter-spacing: 0.1em;
+}
+
+/* === UWP breakdown inside fold =========================================== */
+
+.uwp-breakdown {
+ width: 100%;
+ border-collapse: collapse;
+}
+
+.uwp-breakdown td {
+ padding: 2px 8px;
+ font-size: 0.95em;
+ border-bottom: 1px solid #ece6da;
+ border-top: none;
+ color: #555;
+}
+
+.uwp-breakdown td:first-child {
+ width: 24px;
+ font-family: 'Courier New', monospace;
+ font-weight: bold;
+ color: #7a5c00;
+ letter-spacing: 0.05em;
+}
+
+.uwp-breakdown td:nth-child(2) {
+ width: 110px;
+ font-weight: 600;
+ color: #5f4300;
+}
+
+.uwp-breakdown td:nth-child(3) {
+ color: #666;
+}
+
+.uwp-breakdown tr:last-child td {
+ border-bottom: none;
+}
+
+/* === MGT2 Shared Map (chat) ============================================== */
+
+.mgt2-shared-map {
+ background: #f5f0e8;
+ border: 1px solid #c9a227;
+ border-radius: 5px;
+ overflow: hidden;
+ font-family: 'Signika', sans-serif;
+ color: #222;
+}
+
+.mgt2-shared-map .mgt2-sector-map-share {
+ display: none;
+}
+
+.mgt2-shared-map-image {
+ line-height: 0;
+}
+
+.mgt2-shared-map-image img {
+ display: block;
+ max-width: 100%;
+ height: auto;
+}