관리 daemon의 실행 commit SHA를 NPC 감사 결정에 기록
This commit is contained in:
@@ -32,3 +32,9 @@ export interface PendingAuditDecision {
|
||||
|
||||
export const auditDecisionIdentity = (serverId: string, generalId: number, tick: number, revision: number) =>
|
||||
auditPolicyHash([serverId, generalId, tick, revision]);
|
||||
|
||||
// 확정된 전체 SHA만 받는다. branch/tag/축약 SHA나 미상 값을 현재 checkout에서 추정하지 않는다.
|
||||
export const normalizeAuditCodeVersion = (value: string | undefined): string | undefined => {
|
||||
const sha = value?.trim().toLowerCase();
|
||||
return sha && /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(sha) && !/^0+$/.test(sha) ? sha : undefined;
|
||||
};
|
||||
|
||||
@@ -12,6 +12,7 @@ import { TurnDaemonLeaseUnavailableError } from '../lifecycle/databaseTurnDaemon
|
||||
export interface TurnDaemonCliOptions {
|
||||
profile?: string;
|
||||
profileName?: string;
|
||||
auditCodeVersion?: string;
|
||||
scenario?: string;
|
||||
databaseUrl?: string;
|
||||
gatewayDatabaseUrl?: string;
|
||||
@@ -84,6 +85,7 @@ export const runTurnDaemonCli = async (options: TurnDaemonCliOptions = {}): Prom
|
||||
createTurnDaemonRuntime({
|
||||
profile,
|
||||
profileName,
|
||||
auditCodeVersion: options.auditCodeVersion ?? env.TURN_BUILD_COMMIT_SHA,
|
||||
databaseUrl,
|
||||
gatewayDatabaseUrl,
|
||||
defaultBudget: budget,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { auditDecisionIdentity, type PendingAuditDecision } from '../playAudit/decision.js';
|
||||
import { auditDecisionIdentity, normalizeAuditCodeVersion, type PendingAuditDecision } from '../playAudit/decision.js';
|
||||
import { auditPolicyHash, AUDIT_POLICY_AREAS } from '../playAudit/policy.js';
|
||||
import type { AiDecisionTraceEvent } from './ai/generalAi/trace.js';
|
||||
import type { AiDecisionTraceObserver } from './ai/generalAi/trace.js';
|
||||
@@ -934,6 +934,7 @@ export const createReservedTurnHandler = async (options: {
|
||||
actionDurationNs: bigint;
|
||||
}) => void;
|
||||
}): Promise<GeneralTurnHandler> => {
|
||||
const auditCodeVersion = normalizeAuditCodeVersion(options.auditCodeVersion);
|
||||
const env = options.commandEnv ?? buildCommandEnv(options.scenarioConfig, options.unitSet);
|
||||
const itemRegistry = createItemModuleRegistry(await loadItemModules([...ITEM_KEYS]));
|
||||
const uniqueConfig = resolveUniqueConfig(asRecord(options.scenarioConfig.const));
|
||||
@@ -1143,7 +1144,7 @@ export const createReservedTurnHandler = async (options: {
|
||||
schemaVersion: 1,
|
||||
coverage: 'PROCEDURES',
|
||||
clockRevision: revision,
|
||||
codeVersion: options.auditCodeVersion ?? null,
|
||||
codeVersion: auditCodeVersion ?? null,
|
||||
policyRefs: decisionPolicyRefs.get(phase) ?? {},
|
||||
requestedAction: first.reservedAction,
|
||||
selectedAction: last.action,
|
||||
|
||||
@@ -106,6 +106,7 @@ import { applyRuntimeGameSettings } from './runtimeGameSettings.js';
|
||||
export interface TurnDaemonRuntimeOptions {
|
||||
profile: string;
|
||||
profileName?: string;
|
||||
auditCodeVersion?: string;
|
||||
databaseUrl: string;
|
||||
gatewayDatabaseUrl?: string;
|
||||
defaultBudget?: TurnRunBudget;
|
||||
@@ -779,6 +780,7 @@ const createTurnDaemonRuntimeWithLease = async (
|
||||
options.generalTurnHandler ??
|
||||
(await createReservedTurnHandler({
|
||||
reservedTurns: reservedTurnStoreHandle!.store,
|
||||
auditCodeVersion: options.auditCodeVersion,
|
||||
scenarioConfig: snapshot.scenarioConfig,
|
||||
scenarioMeta: snapshot.scenarioMeta,
|
||||
map: snapshot.map,
|
||||
|
||||
Reference in New Issue
Block a user