NPC 명령의 실제 검사와 준비 및 대체 실행 순서를 감사 기록에 연결

This commit is contained in:
2026-09-16 08:46:56 +00:00
parent eb680121c3
commit 028f985e7a
15 changed files with 391 additions and 24 deletions
@@ -11,6 +11,8 @@ const zTick = z
const zSummary = z.object({
schemaVersion: z.literal(1),
coverage: z.literal('PROCEDURES'),
executionCoverage: z.literal('ATTEMPTS').optional(),
executionStatus: z.enum(['PREPARING', 'BLOCKED', 'RESOLVED']).optional(),
clockRevision: z.number().int(),
codeVersion: z.string().nullable(),
policyRefs: z.object({
@@ -48,6 +50,27 @@ const zStep = z.intersection(
tick: z.number().nullable(),
}),
z.discriminatedUnion('kind', [
z.object({
kind: z.literal('EXECUTION_ATTEMPT'),
attempt: z.number().int().min(0).max(5),
requestedAction: z.string(),
resolvedAction: z.string(),
executedAction: z.string().nullable(),
completed: z.boolean(),
usedFallback: z.boolean(),
alternativeAction: z.string().nullable(),
preparation: z.object({ term: z.number().int().positive(), total: z.number().int().positive() }).nullable(),
checks: z
.array(
z.object({
stage: z.enum(['ARGS', 'CONSTRAINT', 'COOLDOWN', 'CONTEXT', 'BLOCK']),
action: z.string(),
result: z.enum(['allow', 'deny', 'unknown']),
reason: z.string().nullable(),
})
)
.max(5),
}),
z.object({ kind: z.literal('DECISION_START'), reservedAction: z.string() }),
z.object({ kind: z.literal('DECISION_END'), action: z.string().nullable(), reason: z.string().nullable() }),
z.object({ kind: z.literal('DECISION_ERROR') }),