Skip to content
Skip to documentation content

Command / Members

Members

Review account-level troop and roster summaries and maintain classification or notes when your grants allow it.

At a glance

Product route: /workspaces/{workspace_id}/members.

Who can open this page: collection. Opening collection pages requires enabled entitlement and verified membership, including for the owner. A non-owner needs active membership and the collection grant; the owner bypasses grant checks only after verification.

Primary data owners: backend-derived, extension-collected, not-implemented, roster-ingest, signed-in-member, workspace-manager. Values reflect recorded data at page load; they are not a live view of Travian.

What you see

Reading left to right, Members shows Tribe, Account, Push, Off, Deff, Sent deffs, Population, Villages, Last update, Classification and optionally Note. Account opens Account Villages. Push totals attributed recorded resource contributions; Off/Deff show crop upkeep. Sent deffs is fixed at zero because account-level sent-defense tracking is not implemented. Population and village count come from roster import, not captured troop sums. Last update is the newest troop observation across the account; missing data displays an em dash. Unknown tribe uses a text fallback. There are no Rams/Catas or combat-point columns.

In Trapitan, search by account or captured village name; set Min off power or Min deff power (whole nonnegative crop-upkeep thresholds despite their labels), and choose All, Unclassified, off, deff or hybrid. Select changes apply immediately; text inputs wait 300 ms. The visible toolbar has no tribe, freshness or missing-data selector, although the handler accepts those query filters. Header links toggle ascending/descending for every displayed column. Default is Last update descending; ties use account names. Previous/Next and the range/page footer use 50 rows by default. Generated sort/paging links preserve visible toolbar filters; handler-only tribe/freshness/missing-data filters are not preserved by those links.

Classification is a button only with its grant. Note is entirely absent without its view grant; with view but no edit it is text, and with both it is a one-row textarea that saves on change/blur. Permissions appears as the primary page link when permission management is allowed. The current table has no combined Edit button.

Who fills in each field

Field or data What it means Who fills it in Can it be changed here? When it updates
Account, tribe, population and villages Workspace game account name plus roster-supplied tribe, population and village count; missing roster values use zero/unknown. No identity editing on this screen. signed-in-member, roster-ingest Read-only Page load from latest recorded values
Off/Deff crop upkeep Aggregate troop counts weighted by configured roles and base crop upkeep; UI properties named strength hold grain totals. extension-collected, backend-derived Read-only Page load from latest recorded values
Push resources Sum of member-linked recorded push contributions, rather than collected game shipments. signed-in-member, backend-derived Read-only Page load from latest recorded values
Sent deffs Currently fixed at zero in member read model; does not represent tracked defense shipments. not-implemented Read-only Page load from latest recorded values
Last update Latest recorded troop observation for account; empty means no recorded snapshot. extension-collected, backend-derived Read-only Page load from latest recorded values
Classification Off/deff classification cycled separately under manage_classification. workspace-manager manage_classification Classification edit
Manager note Account manager note redacted on page reads without view_manager_notes; visible editing needs both view_manager_notes and edit_manager_notes. workspace-manager edit_manager_notes Note edit

Calculations

Off and Deff in this table are crop upkeep per hour. Combat strength is a separate measure calculated from the same counts; the combat cards below explain the distinction, not additional visible columns. The active coefficient dataset defaults to tl-base-v1; the configured version can change. No hero bonuses, smithy upgrades or crop-upkeep reductions are included. Classification never changes the coefficient role flags.

Base offensive combat strength

Calculation ID: combat.offense. Attack coefficient total for combat-class troops; excludes smithy/hero upgrades.

Rule: Sum count*attack only for coefficient slots whose unit_class equals combat. Siege/admin/expansion do not contribute. Current Members/Villages Off columns show grain instead; this entry explains the distinct combat measure used by intelligence read models, not a second visible grain column.

Input Who fills it in Unit Required or optional Fallback
counts by slot extension-collected troops Optional Missing slot =>0; counts<=0 contribute nothing
Versioned tribe coefficients backend-derived attack/defense points, crop per troop and role flags Optional Missing/unseeded tribe coefficient mapping => all-zero numeric result; active version configuration selects dataset

Output unit: base attack points. Precision: Exact integer. Rounding: No rounding. Clamping: No output clamp. Time zone: not-applicable.

Edge cases: Unknown/Nature/Natars/unseeded tribes produce zero. Nonpositive counts ignored. The current Account Villages screen shows counts, not combat columns.

Canonical implementation: compute_strength. Non-canonical mirrors: None registered.

Used on: Villages, Members

Calculation source references

Base defensive combat strength

Calculation ID: combat.defense. Sum of infantry and cavalry defense components from every coefficient slot.

Rule: Sum countdef_infantry and countdef_cavalry for every positive coefficient slot, then def_total=def_infantry+def_cavalry; includes all classes and excludes smithy/hero upgrades. Current Off/Deff columns use grain totals rather than these points.

Input Who fills it in Unit Required or optional Fallback
counts by slot extension-collected troops Optional Missing slot =>0; counts<=0 contribute nothing
Versioned tribe coefficients backend-derived attack/defense points, crop per troop and role flags Optional Missing/unseeded tribe coefficient mapping => all-zero numeric result; active version configuration selects dataset

Output unit: base defense points. Precision: Exact integer. Rounding: No rounding. Clamping: No output clamp. Time zone: not-applicable.

Edge cases: This is the sum of components, not their average or opponent-dependent weighted defense. Unknown tribe and missing slots contribute zero.

Canonical implementation: compute_strength. Non-canonical mirrors: None registered.

Used on: Villages, Members

Calculation source references

Off/Deff crop upkeep

Calculation ID: grain.offense-defense. Separate configured role-weighted crop totals.

Rule: For each positive count, add count*grain_upkeep to offensive_grain if counts_as_off and to defensive_grain if counts_as_deff. Flags are independent: a slot may contribute to both or neither. Members/Villages DTO strength properties carry these grain totals. Base upkeep excludes reductions.

Input Who fills it in Unit Required or optional Fallback
counts by slot extension-collected troops Optional Missing slot =>0; counts<=0 contribute nothing
Versioned tribe coefficients backend-derived attack/defense points, crop per troop and role flags Optional Missing/unseeded tribe coefficient mapping => all-zero numeric result; active version configuration selects dataset

Output unit: crop upkeep per hour. Precision: Exact integer. Rounding: No rounding. Clamping: No output clamp. Time zone: not-applicable.

Edge cases: Does not use attack/defense combat coefficients. No artifact/trough/upkeep reductions are applied. Role flags come from the active coefficient dataset, not member classification. Compact UI formatting: abs>=1million =>one decimal M, abs>=1000 =>one decimal K; trim .0; below1000 truncate to integer. Numeric derivation remains exact. None formats0.

Canonical implementation: compute_strength. Non-canonical mirrors: None registered.

Used on: Villages, Members, Artifacts Registry

Calculation source references

Rams and catapults

Calculation ID: siege.split. Separate raw siege unit counts from combat strength.

Rule: For positive counts where unit_class==siege, a seeded unit_name containing ram case-insensitively increments rams; every other siege unit increments catapults. These raw counts are used in derived intelligence/planning and auto tags, not added to offensive strength.

Input Who fills it in Unit Required or optional Fallback
counts by slot extension-collected troops Optional Missing slot =>0; counts<=0 contribute nothing
Versioned tribe coefficients backend-derived attack/defense points, crop per troop and role flags Optional Missing/unseeded tribe coefficient mapping => all-zero numeric result; active version configuration selects dataset

Output unit: siege units. Precision: Exact integer. Rounding: No rounding. Clamping: No output clamp. Time zone: not-applicable.

Edge cases: Translated UI labels are not used to detect rams. Unknown coefficients yield zero. Off/Deff crop flags can independently include siege upkeep. Compact UI formatting: abs>=1million =>one decimal M, abs>=1000 =>one decimal K; trim .0; below1000 truncate to integer. Numeric derivation remains exact. None formats0.

Canonical implementation: compute_strength. Non-canonical mirrors: None registered.

Used on: Villages, Members, Artifacts Registry

Calculation source references

Freshness and updates

Roster import supplies tribe, population and village count. The member-selected linked account identifies the workspace game account. The extension supplies per-village troop captures, aggregated into account counts and latest Last update. History keeps the newest valid village snapshot per day; a recent account timestamp can coexist with older village observations. Push changes follow attributed member contributions, not captured game shipments. Classification and note changes update their stored account fields without changing capture time. Reload/read requests recompute sums under the active coefficient version. Timestamps print stored minute values without a personal-clock conversion.

Actions and permissions

Who can take action / Who can perform each action: the following gates are separate from page visibility. Hidden navigation alone never authorizes a request.

Action Actor Permission
Cycle classification workspace-manager Verified manage_classification and enabled entitlement
Edit note workspace-manager Verified edit_manager_notes and enabled entitlement for endpoint; visible textarea also requires view_manager_notes; same-origin write
Combined edit workspace-manager Both manage_classification and edit_manager_notes, enabled entitlement and verification; same-origin endpoint exists but current table has no combined Edit trigger
Open Permissions workspace-manager manage_permissions; Members action, not profile menu
Open account villages signed-in-member Verified collection; account scoped to workspace

In Trapitan, select Classification to cycle Unclassified → off → deff → hybrid → Unclassified. Empty classification is stored as no value. The endpoint requires manage_classification; it does not require note grants. With view_manager_notes and edit_manager_notes, type in Note and let change/blur save it; empty text clears it. The note write endpoint checks edit_manager_notes independently of the read visibility gate. A view-only grant never allows editing; an edit-only grant does not render the textarea in the normal page.

The existing combined-edit endpoint requires both manage_classification and edit_manager_notes, validates classification before writing either field and commits both together. The present page has no combined Edit trigger; no UI journey to that endpoint is implied. Values must be exactly off, deff, hybrid or empty; unknown nonempty values produce the existing inline 422 error response and neither field is changed. Single-field/combined writes enforce same origin and workspace scoping. No trimming or case conversion is applied to classification; note text is stored verbatim, with empty clearing and HTML escaping on rendering. These handlers declare no extra note-length rule. Permissions opens only with manage_permissions, independently of manage_members or classification/note grants.

States and edge cases

The no-row message is No members collected yet when unfiltered, or No members match your filters when filtered. A roster-associated account can still appear before any troop capture, with zero derived counts and no Last update. Missing roster metadata also falls back to zero/unknown. Blank power fields omit the threshold; malformed or negative values return validation errors. Unknown classification filters mean no classification constraint. Unknown sort keys, or note sort without note-view permission, fall back to Last update. Sent deffs sorting uses account name because every value is zero. Handler-only freshness filtering uses a configured three-day default: fresh is at or newer than the UTC cutoff; stale includes no capture. It is not a visible freshness badge. Lower/upper paging limits are bounded 1–50 and negative offset is clamped to zero. Permissions/verification/entitlement failures reject protected direct URLs and writes. No account identity/tribe/population editing is provided here.

Source references

Source reviewed: 2026-10-05

Source references

Stable page ID: command.members.

  • src/trapitan/api/routes/web.py
  • src/trapitan/web/templates/members.html
  • src/trapitan/web/templates/partials/members_table.html
  • src/trapitan/web/templates/partials/member_row.html
  • src/trapitan/web/formatting.py
  • src/trapitan/intelligence/repository.py
  • src/trapitan/intelligence/service.py
  • src/trapitan/intelligence/classification.py
  • src/trapitan/web/templates/partials/member_note_cell.html
  • src/trapitan/web/templates/partials/member_classification_cell.html
  • src/trapitan/authorization/dependencies.py
  • src/trapitan/authorization/policy.py
  • src/trapitan/api/routes/intelligence.py
  • src/trapitan/api/routes/guards.py
  • src/trapitan/api/routes/permissions.py