wip: Campaign LA LA1 fix round — INCOMPLETE, stopped mid-task
Agent was stopped for token budget partway through the LA1 review fix round. Landed here: F1 best-effort SessionStatusWriter, F2 App reader tolerance (paths/mode), F5 argument-parsing hardening, plus new tests. NOT DONE: F4 shared-fixture production shape (was the next step), F3 reconnect disconnected edge + recorded limitation, F6 exited idempotency/reasons, F7 structural redaction test, F8 platform-guard test + comment fix, optional RuntimeOptions PrintMembers redaction. Build/test state UNVERIFIED at this commit. Next session: finish the remaining findings, run the suites, then narrow re-review. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
c9fc7f4a66
commit
75a6724d5b
9 changed files with 628 additions and 52 deletions
|
|
@ -38,8 +38,22 @@ Log.Information(
|
|||
// existing one positional dat-dir argument and every ACDREAM_* env var keep
|
||||
// working exactly as before when the flag is absent. See
|
||||
// docs/plans/2026-08-14-launcher-campaign.md LA1.
|
||||
string? sessionConfigFlagPath = ExtractFlagValue(args, "--session-config");
|
||||
string[] positionalArgs = WithoutFlagAndValue(args, "--session-config");
|
||||
//
|
||||
// Review fix F5 (LA1 review round): a trailing, valueless --session-config
|
||||
// (the flag typed as the LAST argument, nothing after it) must be a hard
|
||||
// error, never a silent fall-through to the env-var path — a launcher that
|
||||
// mis-composed its argv would otherwise appear to work while quietly
|
||||
// ignoring the session-config contract entirely.
|
||||
string? sessionConfigFlagPath = SessionConfigArgumentParsing.ExtractFlagValue(
|
||||
args, "--session-config", out bool sessionConfigFlagPresent);
|
||||
if (sessionConfigFlagPath is null && sessionConfigFlagPresent)
|
||||
{
|
||||
Log.Error(
|
||||
"--session-config requires a value (a path to the session-config document).");
|
||||
return 2;
|
||||
}
|
||||
string[] positionalArgs =
|
||||
SessionConfigArgumentParsing.WithoutFlagAndValue(args, "--session-config");
|
||||
|
||||
var datDirArg = positionalArgs.FirstOrDefault();
|
||||
var envDatDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR");
|
||||
|
|
@ -240,34 +254,9 @@ finally
|
|||
|
||||
return 0;
|
||||
|
||||
// Campaign LA slice LA1: --session-config <path> parsing helpers. Kept
|
||||
// local/minimal rather than a general-purpose CLI parser — App has exactly
|
||||
// one optional flag-with-value today; the positional dat-dir argument must
|
||||
// stay untouched by its presence (see the comment above the flag parse).
|
||||
static string? ExtractFlagValue(string[] arguments, string flag)
|
||||
{
|
||||
for (int i = 0; i < arguments.Length - 1; i++)
|
||||
{
|
||||
if (string.Equals(arguments[i], flag, StringComparison.Ordinal))
|
||||
return arguments[i + 1];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static string[] WithoutFlagAndValue(string[] arguments, string flag)
|
||||
{
|
||||
var result = new List<string>(arguments.Length);
|
||||
for (int i = 0; i < arguments.Length; i++)
|
||||
{
|
||||
if (string.Equals(arguments[i], flag, StringComparison.Ordinal))
|
||||
{
|
||||
i++; // also skip the flag's value
|
||||
continue;
|
||||
}
|
||||
result.Add(arguments[i]);
|
||||
}
|
||||
return [.. result];
|
||||
}
|
||||
|
||||
// Campaign LA slice LA1: --session-config value-presence helper. The
|
||||
// flag/positional-argument extraction itself lives in
|
||||
// AcDream.App.Configuration.SessionConfigArgumentParsing (review fix F5) so
|
||||
// its trailing-flag edge case is unit testable.
|
||||
static string? NullIfEmpty(string? value) =>
|
||||
string.IsNullOrWhiteSpace(value) ? null : value;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue