Command / Hero Equipment
Hero Equipment¶
Read recorded hero loadouts grouped into observation periods for roster accounts.
At a glance¶
Route: /workspaces/{workspace_id}/hero-equipment.
Who can open this page: Verified member and enabled entitlement with view_intelligence; sidebar additionally uses collection gate. The workspace must have enabled entitlement and an active, verified membership; ownership does not bypass verification. Sign in with Discord. Sidebar visibility is separate from endpoint permission. This documentation never submits workspace requests.
What you see¶
Accounts are ordered by roster name, with player ID displayed as #ID. Select an account group to reveal periods newest first. Every period shows Account, Period (from → to), Helmet, Body, Weapon, Utility, Boots and Horse. Known slot-aware catalog IDs render names; missing item IDs render — and unknown positive IDs render #ID. The page has no account/date filters or loadout editor.
Who fills in each field¶
| Field or data | What it means | Who fills it in | Can it be changed here? | When it updates |
|---|---|---|---|---|
| Account and equipment slots | Roster account name/player ID identify the observed target; extension supplies helmet, body, weapon, utility, boots and horse item IDs, rendered through slot-aware names. | extension-collected, roster-ingest, backend-derived |
Read-only | Roster reads and accepted equipment submissions |
| Observed from/to | Backend UTC receipt timestamps bound consecutive matching latest signatures; they do not prove continuous game equipment state. | backend-derived |
Read-only | Accepted equipment submission; reload to see changes |
Calculations¶
Equipment observation periods¶
equipment.period — Coalesce only consecutive matching latest equipment signatures.
Rule: Normalize every EQUIPMENT_SLOTS item to positive non-bool integer orNone; compare ordered tuple to latest period ordered observed_from DESC,id DESC under lock. Equal => observed_to=max(existing,observed_at); different/no latest => new period with from=to=observed_at. Historical matching earlier periods are not merged.
| Input | Who fills it in | Unit | Optional | Fallback |
|---|---|---|---|---|
| items by slot | extension-collected |
item IDs | Yes | Missing slot =>None |
| observed_at | backend-derived |
timestamp | No | Required by helper; current collection caller supplies datetime.now(UTC) |
| Latest stored period | backend-derived |
equipment period | Yes | No latest => create |
Output unit: observation interval. Precision: Stored timestamp precision. Rounding: No rounding. Clamp: No output clamp. Timezone: Timezone-aware observation timestamps; current collection uses backend UTC receipt time.
A late equal observation cannot shorten observed_to. Invalid IDs/bool raise validation error. A changed late signature still creates a separate period; not proof of continuous equip time between captures.
Canonical implementation and dependencies: reviewed source symbols. Non-canonical mirrors: none registered.
Used on: Hero Equipment
The current collection handler supplies backend receipt time in UTC as observed_at. A synthetic identical loadout received at 10:00 and 10:15 extends its recorded end to 10:15; this does not establish what was equipped throughout the gap.
Freshness and updates¶
A connected extension supplies target roster player ID and six observed item IDs. The backend authorizes collection on the server, resolves that target roster account and timestamps accepted submissions with current UTC receipt time. Account names/IDs come from the roster. Reloading reads stored periods; expanding a group only changes local visibility. An interval describes matching recorded observations and cannot establish continuous equipment use across gaps.
Actions and permissions¶
Who can perform each action / Who can take action: each actor below needs the exact grant and conditions, independently of page visibility. All writes retain workspace scoping; same-origin checks apply as listed.
| Action | Actor | Permission |
|---|---|---|
| Expand or collapse account | signed-in-member | view_intelligence; local visibility only, no history modification or account/time filters |
In Trapitan, select an account group to expand or collapse its recorded periods. This does not change stored observations. Page access is view_intelligence, while the sidebar additionally uses the alliance collection gate; lack of a sidebar link and lack of page permission are different states.
States and edge cases¶
No hero equipment reported yet is the empty screen. Accounts with no stored period are absent. Missing slots are not inferred from a previous loadout. Nonpositive, noninteger or boolean IDs are invalid at the helper boundary. Collection can reject an unrecognized target roster player or unauthorized server; this read-only screen has no ingestion-error panel. A changed late signature remains a separate observation period, and an equal late observation cannot shorten its end.
Related pages¶
Members, Reports, Troops Overview.
Source references¶
Source reviewed: 2026-10-07
Source references
Stable page ID: command.hero-equipment.
src/trapitan/api/routes/web.pysrc/trapitan/web/templates/hero_equipment.htmlsrc/trapitan/hero_equipment.pysrc/trapitan/web/static/js/hero-equipment.jssrc/trapitan/api/routes/extension_collection.pysrc/trapitan/authorization/dependencies.pysrc/trapitan/authorization/policy.py
Calculation equipment.period:
- Canonical implementation:
src/trapitan/hero_equipment.py—apply_equipment_transition. - Dependency:
src/trapitan/hero_equipment.py—equipment_signature. - Dependency:
src/trapitan/hero_equipment.py—period_signature. - Dependency:
src/trapitan/hero_equipment.py—normalize_item_id. - Dependency:
src/trapitan/hero_equipment.py—EQUIPMENT_SLOTS. - Dependency:
src/trapitan/api/routes/extension_collection.py—submit_hero_equipment.