fix legacy invalid turn argument logs

This commit is contained in:
2026-07-27 10:28:18 +00:00
parent 0a01ccef0a
commit 0aaf08e311
3 changed files with 36 additions and 3 deletions
@@ -884,12 +884,13 @@ export const createReservedTurnHandler = async (options: {
let blockedReason: string | undefined = undefined; let blockedReason: string | undefined = undefined;
if (parsedArgs === null) { if (parsedArgs === null) {
const failureText = `인자가 올바르지 않습니다. ${resolvedDefinition.name} 실패.`;
definition = fallbackDefinition; definition = fallbackDefinition;
actionArgs = definition.parseArgs({}) ?? {}; actionArgs = definition.parseArgs({}) ?? {};
actionKey = definition.key; actionKey = definition.key;
usedFallback = true; usedFallback = true;
blockedReason = '예약된 명령을 실행하지 못했습니다.'; blockedReason = failureText;
logs.push(createActionLog('예약된 명령을 실행하지 못했습니다.')); logs.push(createActionLog(failureText));
} }
const actionConstraintEnv = { const actionConstraintEnv = {
@@ -456,7 +456,7 @@ describe('Reserved Turn Execution Integration', () => {
const dirty = world.consumeDirtyState(); const dirty = world.consumeDirtyState();
expect(world.getGeneralById(1)!.cityId).toBe(1); expect(world.getGeneralById(1)!.cityId).toBe(1);
expect(dirty.logs.some((log) => log.text.includes('예약된 명령을 실행하지 못했습니다.'))).toBe(true); expect(dirty.logs.some((log) => log.text.includes('인자가 올바르지 않습니다. 이동 실패.'))).toBe(true);
expect(dirty.logs.some((log) => log.text.includes('아무것도 실행하지 않았습니다.'))).toBe(true); expect(dirty.logs.some((log) => log.text.includes('아무것도 실행하지 않았습니다.'))).toBe(true);
}); });
@@ -2695,6 +2695,38 @@ integration('nation command resource balance and target boundaries', () => {
); );
}); });
integration('nation command missing argument object parity', () => {
it.each(['che_포상', 'che_몰수'] as const)(
'%s falls back with the legacy invalid-argument log and no RNG',
async (action) => {
const request = buildRequest(action);
const reference = runReferenceTurnCommandTraceRequest(
workspaceRoot!,
request as unknown as Record<string, unknown>
);
const core = await runCoreTurnCommandTrace(request, reference.before);
expect(reference.execution.outcome).toMatchObject({ completed: false });
expect(core.execution.outcome).toMatchObject({
requestedAction: action,
actionKey: '휴식',
usedFallback: true,
});
expect(reference.rng).toEqual([]);
expect(core.rng).toEqual(reference.rng);
expect(
compareTurnSnapshotDeltas(reference.before, reference.after, core.before, core.after, {
ignoredPathPatterns: ignoredLifecyclePaths,
})
).toEqual([]);
expect(semanticLogSignatures(nationCommandLogs(core.after.logs))).toEqual(
semanticLogSignatures(addedReferenceLogs(reference.before, reference.after.logs))
);
},
120_000
);
});
integration('nation seizure NPC public message parity', () => { integration('nation seizure NPC public message parity', () => {
it('matches the legacy fixed-seed RNG and public message side effect', async () => { it('matches the legacy fixed-seed RNG and public message side effect', async () => {
const request = buildRequest( const request = buildRequest(