Skip to content

Add IMPROVEMENT-046 and IMPROVEMENT-047 for the AdminTool - #55

Open
meketreve wants to merge 2 commits into
OpenPerpetuum:developfrom
meketreve:admintool-improvements-046-047
Open

Add IMPROVEMENT-046 and IMPROVEMENT-047 for the AdminTool#55
meketreve wants to merge 2 commits into
OpenPerpetuum:developfrom
meketreve:admintool-improvements-046-047

Conversation

@meketreve

Copy link
Copy Markdown
Contributor

Two backlog entries for the AdminTool, from the direction given on 2026-08-17. No code, no design —
one file, docs/backlog/improvements.md.
Last ID used goes 045 to 047.

IMPROVEMENT-046 — UI/UX pass from a content author's point of view

Deliberately not a list of fixes. The request came with the instruction to think about what should
improve before handing the problem to Claude, and a UX judgement derived from reading XAML would be the
wrong artefact — what matters is the experience of authoring content, which is not visible in the code.
The entry records the request and gives the findings somewhere to land, with a proposed order: author
real content, write the friction down as it happens, and only then design anything.

One observation from using the tool on 2026-08-17 is recorded as a single data point rather than as the
review: DefinitionName shows its validation error inline in red, while CategoryFlags == 0 also
blocks Save but marks nothing at the field — only the italic undefined the description converter
produces, which reads as information rather than as an error.

IMPROVEMENT-047 — export a robot or item as a complete, self-contained SQL script

Measuring the current state changed the shape of this one, so the entry says what is actually true
rather than what the request assumed.

Export is not missing. ItemExporter, RobotExporter and SeasonExporter exist, and
RobotExporter calls ItemExporter for each component definition (Export/RobotExporter.cs:29), so a
robot export already carries its parts rather than just the template row.

The gap is narrower and nameable. Comparing the tables the create wizards write against the tables the
exporters read:

Table Written by the wizard Read by either exporter
aggregatemodifiers yes no
modulepropertymodifiers yes no
productionduration yes no
robottemplaterelation yes, robots only no

The first two are the entire Property Modifiers tab, the third is the Production tab. So an
item created through the wizard can hold data that re-exporting it will not reproduce. Translations are
absent from every export as well: SeedTranslations() writes to the translation store rather than into
the script, so a script applied elsewhere yields an entity whose name and description do not resolve.

Set to HIGH because the request named damage to the live database as the motivation.

Two things stated as questions rather than fixes

  1. Does productionduration belong in an item export at all? The New Item dialog states that duration
    is category-level, so writing it back on import would affect every item in that category and not
    just the exported one. That is a question about intended semantics.
  2. Do translations belong in the exported script? If they do, it has to carry the dictionary rows. If
    they do not, the export should say so, because silence reads as completeness.

One observation recorded and deliberately not filed

Nothing in the tool marks a connection as production. The apply mode already defaults to the safe one
(AppSettings.DefaultApplyMode = ApplyMode.SqlScript) and the status bar shows the current mode, so
the default is not the problem — but the tool cannot tell the operator that the server they are pointed
at is the live one. It is in IMPROVEMENT-047's notes rather than as its own entry, because it was not
asked for and it is a maintainer's call.

Measured against cfa0591.

meketreve and others added 2 commits August 17, 2026 10:44
Both were requested by the lead developer on 2026-08-17. Recorded as backlog
entries only; nothing is designed or implemented here.

046 is the UI/UX pass. It is deliberately not a list of fixes: he asked that a
human think about what should improve before the problem is handed to Claude,
and a UX judgement derived from reading XAML would be the wrong artefact. The
entry captures the request and gives the findings somewhere to land. One
observation from using the tool today is recorded as a single data point.

047 is exporting a robot or item as one self-contained script, and it carries
the reason he gave: he has already damaged the live database by accidentally
adding a robot to it. Measuring the current state first changed the shape of
the entry. Export is not missing -- three exporters exist, and RobotExporter
already calls ItemExporter per component, so a robot export does carry its
parts. The real gap is four tables the create wizards write and no exporter
reads (aggregatemodifiers, modulepropertymodifiers, productionduration,
robottemplaterelation), which is the whole Property Modifiers tab and the
Production tab, plus translations, which no export carries at all.

Two things in 047 are stated as questions rather than fixes: whether
productionduration belongs in an item export when the duration is
category-level, and whether translations belong in the script.

One observation is recorded and deliberately not filed as its own entry, since
it was not asked for: nothing marks a connection as production. The apply mode
already defaults to SqlScript and the status bar shows it, so the default is
not the problem -- the tool simply cannot tell the operator that the server
they are pointed at is the live one.

Measured against cfa0591.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The lead developer answered both on 2026-08-19: productionduration belongs
in the export when applicable, translations are not needed.

productionduration is keyed by category, not by definition, so the export
has to emit it through SqlExportBuilder.IfNotExistsInsert - the same rule
the wizard applies through ProductionPanelViewModel.ShouldWriteProductionDuration.
A target that already defines the category keeps its own value.

Translations stay out of the script, but the export has to state that names
and descriptions are not carried, because silence reads as completeness.
@meketreve

Copy link
Copy Markdown
Contributor Author

Both questions answered off the thread on 2026-08-19 — productionduration yes, if applicable; translations not needed. Recording them here so the direction sits on the public record, and folded into the entry in f0b0664.

productionduration. The table is keyed by category rather than by definition (productionduration (category, durationmodifier)), so "if applicable" has to mean guarded: the export emits it through SqlExportBuilder.IfNotExistsInsert, the same rule the wizard already applies through ProductionPanelViewModel.ShouldWriteProductionDuration. A target database that already defines the category keeps its own value; one that does not gets the exported item's. The row travels with the item without changing every other item in its category.

Translations. They stay out of the script. The work left on that point is the statement — the export says that names and descriptions are not carried, because silence reads as completeness.

Still planning only, no code in this pull request.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant