F1: the crash reporter comment claimed the launcher never holds a password
in any field - false (ProfileEditorDialogViewModel, AccountProfile.Password,
StartRequest.Password). Reworded to the true, narrower invariant (no throw
site interpolates a credential VALUE into an exception message) and pinned
it with CrashReportNeverContainsAStoredPassword: a real STJ failure over a
profiles document containing a known password, corrupted after the
credential, must yield a crash file with the stack and without the value.
F2: the co-deploy Inputs covered only Bake own sources; a Content edit
never refreshed the 83 MB exe. Now the full reference closure. Fixing it
surfaced two more incrementality traps, both fixed and comment-documented:
SkipUnchangedFiles left the output older than the triggering input (target
re-ran forever - added an explicit Touch), and %(Item.Metadata) in a plain
Include does not batch (the literal percent-text became a permanently
out-of-date phantom input - globs are now spelled per project). Verified:
Core edit retriggers, then two consecutive clean incremental builds.
F3: RID publishes ran BOTH co-deploy paths (two self-contained bake
publishes). Build-time target now guarded on _IsPublishing; verified a
real win-x64 publish runs zero build-target co-deploys and still ships
both exes.
F4: comment misattributed PublishBakeTool=false to CI lanes; it is
target-local recursion guarding. F5: the x:Name reflection sweep now walks
the markup as XML and tolerates template-scoped names (no generated field
exists for those). F6: dead using removed. Hardening: the crash reporter
positional --data-dir fallback requires a fully-qualified path so a
relative or flag-shaped value cannot create ./crash-reports at an
arbitrary CWD.
Launcher 67/67, Launcher.Core 317/317.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two gaps found launching the launcher for the LA11 gate.
1. acdream-bake was co-deployed only AfterTargets=Publish with a RID, so a
plain `dotnet build` left the launcher with no bake tool beside it while
App.OnFrameworkInitializationCompleted resolves it at
AppContext.BaseDirectory/acdream-bake[.exe]. A developer-built launcher
therefore reached the first-run wizard with an installer it could never
run. CoDeployBakeToolToBuildOutput does for Build what the publish target
does for Publish: still NO Launcher -> Bake project reference, still a
self-contained single file so exactly one file lands beside the launcher
rather than scattering Content/Chorizite assemblies into its output.
Staged through obj/ because publishing straight into the launcher output
makes the inner publish delete what the outer build just wrote.
Inputs/Outputs keep it incremental - verified: 79.6 MB bake exe present,
--help exits 0, and a second build skips the republish in ~1 s.
2. #398: the top-level guard printed only ex.Message, so the crash that
preceded this commit surfaced with no file, line, or frame. The full
exception now goes to a crash-reports file under the resolved data root
and stderr names the path. The first implementation wrote to the machine
real data root when option parsing itself failed, which broke LA11 process
local roots during an isolated run; the reporter now reads --data-dir
positionally for that fallback. Verified: report lands inside the isolated
root and the real root stays empty.
The redaction comment states exactly what is guaranteed - args/environment
are never serialized, while exception text may quote an option name or path,
which is safe only because credentials never enter launcher state.
Launcher.Core 317/317 green.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Every click in the launcher exited the process. MainWindow ctor called
AvaloniaXamlLoader.Load(this), which loads the XAML tree but never assigns
the generated x:Name backing fields, so ProfilesTree, ServerNameTextBox,
AccountNameTextBox, CharacterNameTextBox, EditorSubmitButton,
FirstRunDatDirectoryTextBox and UpdateCloseButton were all null. Opening or
closing any modal calls Focus() on one of them via
OnViewModelPropertyChanged, so the NullReferenceException escaped the
dispatcher and Program's top-level guard exited 74. A fresh isolated-root
start auto-opens the first-run wizard and hit the same line with no click
at all.
App.axaml.cs keeps AvaloniaXamlLoader.Load - that is the correct idiom for
Application.Initialize(), which has no named controls.
Verified live: the isolated-root launch that died instantly now stays up
with the first-run wizard open and the window responding.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>