@principles/core 1.263.0 → 1.264.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/runtime-v2/__tests__/architecture-regression.test.js +8 -2
  2. package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  3. package/dist/runtime-v2/activation/__tests__/openclaw-promotion-checks.test.d.ts +2 -0
  4. package/dist/runtime-v2/activation/__tests__/openclaw-promotion-checks.test.d.ts.map +1 -0
  5. package/dist/runtime-v2/activation/__tests__/openclaw-promotion-checks.test.js +91 -0
  6. package/dist/runtime-v2/activation/__tests__/openclaw-promotion-checks.test.js.map +1 -0
  7. package/dist/runtime-v2/activation/__tests__/promotion-readiness-evaluator.test.d.ts +2 -0
  8. package/dist/runtime-v2/activation/__tests__/promotion-readiness-evaluator.test.d.ts.map +1 -0
  9. package/dist/runtime-v2/activation/__tests__/promotion-readiness-evaluator.test.js +83 -0
  10. package/dist/runtime-v2/activation/__tests__/promotion-readiness-evaluator.test.js.map +1 -0
  11. package/dist/runtime-v2/activation/__tests__/promotion-readiness-reader.test.d.ts +2 -0
  12. package/dist/runtime-v2/activation/__tests__/promotion-readiness-reader.test.d.ts.map +1 -0
  13. package/dist/runtime-v2/activation/__tests__/promotion-readiness-reader.test.js +48 -0
  14. package/dist/runtime-v2/activation/__tests__/promotion-readiness-reader.test.js.map +1 -0
  15. package/dist/runtime-v2/activation/__tests__/rulecode-owner-decision-service.test.d.ts +2 -0
  16. package/dist/runtime-v2/activation/__tests__/rulecode-owner-decision-service.test.d.ts.map +1 -0
  17. package/dist/runtime-v2/activation/__tests__/rulecode-owner-decision-service.test.js +141 -0
  18. package/dist/runtime-v2/activation/__tests__/rulecode-owner-decision-service.test.js.map +1 -0
  19. package/dist/runtime-v2/activation/__tests__/rulecode-safety-circuit-breaker.test.d.ts +2 -0
  20. package/dist/runtime-v2/activation/__tests__/rulecode-safety-circuit-breaker.test.d.ts.map +1 -0
  21. package/dist/runtime-v2/activation/__tests__/rulecode-safety-circuit-breaker.test.js +31 -0
  22. package/dist/runtime-v2/activation/__tests__/rulecode-safety-circuit-breaker.test.js.map +1 -0
  23. package/dist/runtime-v2/activation/__tests__/sqlite-activation-safety-store.test.d.ts +2 -0
  24. package/dist/runtime-v2/activation/__tests__/sqlite-activation-safety-store.test.d.ts.map +1 -0
  25. package/dist/runtime-v2/activation/__tests__/sqlite-activation-safety-store.test.js +311 -0
  26. package/dist/runtime-v2/activation/__tests__/sqlite-activation-safety-store.test.js.map +1 -0
  27. package/dist/runtime-v2/activation/activation-control-types.d.ts +61 -0
  28. package/dist/runtime-v2/activation/activation-control-types.d.ts.map +1 -0
  29. package/dist/runtime-v2/activation/activation-control-types.js +2 -0
  30. package/dist/runtime-v2/activation/activation-control-types.js.map +1 -0
  31. package/dist/runtime-v2/activation/index.d.ts +14 -0
  32. package/dist/runtime-v2/activation/index.d.ts.map +1 -1
  33. package/dist/runtime-v2/activation/index.js +7 -0
  34. package/dist/runtime-v2/activation/index.js.map +1 -1
  35. package/dist/runtime-v2/activation/openclaw-promotion-checks.d.ts +30 -0
  36. package/dist/runtime-v2/activation/openclaw-promotion-checks.d.ts.map +1 -0
  37. package/dist/runtime-v2/activation/openclaw-promotion-checks.js +124 -0
  38. package/dist/runtime-v2/activation/openclaw-promotion-checks.js.map +1 -0
  39. package/dist/runtime-v2/activation/promotion-readiness-evaluator.d.ts +17 -0
  40. package/dist/runtime-v2/activation/promotion-readiness-evaluator.d.ts.map +1 -0
  41. package/dist/runtime-v2/activation/promotion-readiness-evaluator.js +55 -0
  42. package/dist/runtime-v2/activation/promotion-readiness-evaluator.js.map +1 -0
  43. package/dist/runtime-v2/activation/promotion-readiness-reader.d.ts +21 -0
  44. package/dist/runtime-v2/activation/promotion-readiness-reader.d.ts.map +1 -0
  45. package/dist/runtime-v2/activation/promotion-readiness-reader.js +44 -0
  46. package/dist/runtime-v2/activation/promotion-readiness-reader.js.map +1 -0
  47. package/dist/runtime-v2/activation/rulecode-owner-decision-service.d.ts +104 -0
  48. package/dist/runtime-v2/activation/rulecode-owner-decision-service.d.ts.map +1 -0
  49. package/dist/runtime-v2/activation/rulecode-owner-decision-service.js +86 -0
  50. package/dist/runtime-v2/activation/rulecode-owner-decision-service.js.map +1 -0
  51. package/dist/runtime-v2/activation/rulecode-safety-circuit-breaker.d.ts +25 -0
  52. package/dist/runtime-v2/activation/rulecode-safety-circuit-breaker.d.ts.map +1 -0
  53. package/dist/runtime-v2/activation/rulecode-safety-circuit-breaker.js +23 -0
  54. package/dist/runtime-v2/activation/rulecode-safety-circuit-breaker.js.map +1 -0
  55. package/dist/runtime-v2/activation/rulecode-shadow-summary.d.ts +14 -0
  56. package/dist/runtime-v2/activation/rulecode-shadow-summary.d.ts.map +1 -0
  57. package/dist/runtime-v2/activation/rulecode-shadow-summary.js +57 -0
  58. package/dist/runtime-v2/activation/rulecode-shadow-summary.js.map +1 -0
  59. package/dist/runtime-v2/activation/sqlite-activation-safety-store.d.ts +40 -0
  60. package/dist/runtime-v2/activation/sqlite-activation-safety-store.d.ts.map +1 -0
  61. package/dist/runtime-v2/activation/sqlite-activation-safety-store.js +461 -0
  62. package/dist/runtime-v2/activation/sqlite-activation-safety-store.js.map +1 -0
  63. package/dist/runtime-v2/activation/sqlite-activation-state-store.d.ts.map +1 -1
  64. package/dist/runtime-v2/activation/sqlite-activation-state-store.js +24 -6
  65. package/dist/runtime-v2/activation/sqlite-activation-state-store.js.map +1 -1
  66. package/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js +19 -4
  67. package/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js.map +1 -1
  68. package/dist/runtime-v2/activation/writers/rule-host-writer.d.ts.map +1 -1
  69. package/dist/runtime-v2/activation/writers/rule-host-writer.js +10 -0
  70. package/dist/runtime-v2/activation/writers/rule-host-writer.js.map +1 -1
  71. package/dist/runtime-v2/adapter/__tests__/schema-json-converter.test.d.ts +2 -0
  72. package/dist/runtime-v2/adapter/__tests__/schema-json-converter.test.d.ts.map +1 -0
  73. package/dist/runtime-v2/adapter/__tests__/schema-json-converter.test.js +101 -0
  74. package/dist/runtime-v2/adapter/__tests__/schema-json-converter.test.js.map +1 -0
  75. package/dist/runtime-v2/adapter/artificer-l2-adapter.js +1 -1
  76. package/dist/runtime-v2/adapter/artificer-l2-adapter.js.map +1 -1
  77. package/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts.map +1 -1
  78. package/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js +11 -1
  79. package/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js.map +1 -1
  80. package/dist/runtime-v2/adapter/schema-json-converter.d.ts +32 -0
  81. package/dist/runtime-v2/adapter/schema-json-converter.d.ts.map +1 -0
  82. package/dist/runtime-v2/adapter/schema-json-converter.js +91 -0
  83. package/dist/runtime-v2/adapter/schema-json-converter.js.map +1 -0
  84. package/dist/runtime-v2/config/__tests__/pd-config-contract.test.js +13 -0
  85. package/dist/runtime-v2/config/__tests__/pd-config-contract.test.js.map +1 -1
  86. package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +15 -2
  87. package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
  88. package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  89. package/dist/runtime-v2/feature-flags/feature-flag-contract.js +2 -0
  90. package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  91. package/dist/runtime-v2/index.d.ts +2 -2
  92. package/dist/runtime-v2/index.d.ts.map +1 -1
  93. package/dist/runtime-v2/index.js +1 -1
  94. package/dist/runtime-v2/index.js.map +1 -1
  95. package/dist/runtime-v2/internalization/__tests__/legacy-rule-contract-scanner.test.js +20 -1
  96. package/dist/runtime-v2/internalization/__tests__/legacy-rule-contract-scanner.test.js.map +1 -1
  97. package/dist/runtime-v2/internalization/evaluator-runner.js +1 -1
  98. package/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
  99. package/dist/runtime-v2/internalization/legacy-rule-contract-scanner.d.ts +4 -4
  100. package/dist/runtime-v2/internalization/legacy-rule-contract-scanner.d.ts.map +1 -1
  101. package/dist/runtime-v2/internalization/legacy-rule-contract-scanner.js +92 -5
  102. package/dist/runtime-v2/internalization/legacy-rule-contract-scanner.js.map +1 -1
  103. package/dist/runtime-v2/internalization/split-diagnostician-runner.d.ts +1 -1
  104. package/dist/runtime-v2/internalization/split-diagnostician-runner.d.ts.map +1 -1
  105. package/dist/runtime-v2/internalization/split-diagnostician-runner.js +1 -1
  106. package/dist/runtime-v2/runner/__tests__/base-peer-runner-failure-details.test.d.ts +2 -0
  107. package/dist/runtime-v2/runner/__tests__/base-peer-runner-failure-details.test.d.ts.map +1 -0
  108. package/dist/runtime-v2/runner/__tests__/base-peer-runner-failure-details.test.js +148 -0
  109. package/dist/runtime-v2/runner/__tests__/base-peer-runner-failure-details.test.js.map +1 -0
  110. package/dist/runtime-v2/runner/base-peer-runner.d.ts +15 -1
  111. package/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -1
  112. package/dist/runtime-v2/runner/base-peer-runner.js +64 -1
  113. package/dist/runtime-v2/runner/base-peer-runner.js.map +1 -1
  114. package/dist/runtime-v2/store/sqlite-connection-schema-version.test.js +11 -11
  115. package/dist/runtime-v2/store/sqlite-connection-schema-version.test.js.map +1 -1
  116. package/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
  117. package/dist/runtime-v2/store/sqlite-connection.js +111 -0
  118. package/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
  119. package/package.json +1 -1
@@ -0,0 +1,124 @@
1
+ function isRecord(value) {
2
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
3
+ }
4
+ function isNonEmptyString(value) {
5
+ return typeof value === 'string' && value.trim().length > 0;
6
+ }
7
+ function validateHostContract(value) {
8
+ if (!isRecord(value))
9
+ return null;
10
+ const { outOfBandControls } = value;
11
+ const { protectedCapabilities } = value;
12
+ const { neutralProbes } = value;
13
+ if (value.version !== 'openclaw-legacy@1'
14
+ || value.supportsShadowEvidence !== true
15
+ || !Array.isArray(outOfBandControls)
16
+ || !Array.isArray(protectedCapabilities)
17
+ || !Array.isArray(neutralProbes))
18
+ return null;
19
+ const requiredControls = ['activation_deactivate', 'global_rulecode_pause', 'owner_review_console'];
20
+ if (!requiredControls.every(control => outOfBandControls.includes(control)))
21
+ return null;
22
+ const protectedIds = new Set();
23
+ const protectedCapabilityList = [];
24
+ for (const capability of protectedCapabilities) {
25
+ if (!isRecord(capability) || !isNonEmptyString(capability.capabilityId)
26
+ || !Array.isArray(capability.hostToolAliases)
27
+ || !capability.hostToolAliases.every(isNonEmptyString))
28
+ return null;
29
+ // RUNTIME_CONTRACT: hostToolAliases elements validated individually above.
30
+ protectedCapabilityList.push({ capabilityId: capability.capabilityId, hostToolAliases: capability.hostToolAliases });
31
+ protectedIds.add(capability.capabilityId);
32
+ }
33
+ const requiredCapabilities = ['pd_status', 'rulecode_deactivate', 'rulecode_global_pause', 'owner_review_access'];
34
+ if (!requiredCapabilities.every(capability => protectedIds.has(capability)))
35
+ return null;
36
+ const neutralProbeList = [];
37
+ for (const probe of neutralProbes) {
38
+ if (!isRecord(probe) || !isNonEmptyString(probe.probeId)
39
+ || !isNonEmptyString(probe.capabilityId) || !protectedIds.has(probe.capabilityId)
40
+ || !isNonEmptyString(probe.toolName) || !isRecord(probe.params)
41
+ || probe.expectedDecision !== 'allow')
42
+ return null;
43
+ neutralProbeList.push({
44
+ probeId: probe.probeId,
45
+ capabilityId: probe.capabilityId,
46
+ toolName: probe.toolName,
47
+ params: probe.params,
48
+ expectedDecision: 'allow',
49
+ });
50
+ }
51
+ if (!requiredCapabilities.every(capability => neutralProbeList.some(probe => probe.capabilityId === capability)))
52
+ return null;
53
+ return {
54
+ version: 'openclaw-legacy@1',
55
+ supportsShadowEvidence: true,
56
+ outOfBandControls: requiredControls,
57
+ protectedCapabilities: protectedCapabilityList,
58
+ neutralProbes: neutralProbeList,
59
+ };
60
+ }
61
+ function parseArtifactContent(artifact) {
62
+ try {
63
+ const parsed = JSON.parse(artifact.contentJson);
64
+ return isRecord(parsed) ? parsed : null;
65
+ }
66
+ catch {
67
+ return null;
68
+ }
69
+ }
70
+ function artifactWithNeutralProbes(artifact, contract) {
71
+ const content = parseArtifactContent(artifact);
72
+ if (!content || !isRecord(content.goldenTrace) || !Array.isArray(content.goldenTrace.cases))
73
+ return null;
74
+ const cases = contract.neutralProbes.map(probe => ({
75
+ caseId: `host-liveness:${probe.probeId}`,
76
+ kind: 'positive',
77
+ toolName: probe.toolName,
78
+ params: { ...probe.params },
79
+ expectedDecision: 'allow',
80
+ }));
81
+ const trace = {
82
+ traceId: `${String(content.goldenTrace.traceId)}:host-liveness`,
83
+ sourcePainId: String(content.goldenTrace.sourcePainId),
84
+ cases: [...content.goldenTrace.cases, ...cases],
85
+ createdAt: String(content.goldenTrace.createdAt),
86
+ version: 1,
87
+ };
88
+ return { ...artifact, contentJson: JSON.stringify({ ...content, goldenTrace: trace }) };
89
+ }
90
+ export async function collectOpenClawPromotionChecks(artifact, input) {
91
+ const content = parseArtifactContent(artifact);
92
+ const affectedTools = content && Array.isArray(content.affectedTools)
93
+ ? content.affectedTools.filter(isNonEmptyString)
94
+ : [];
95
+ const bounded = affectedTools.length > 0
96
+ && affectedTools.every(value => value !== '*' && value.toLowerCase() !== 'all');
97
+ const protectedCapabilityIds = new Set([
98
+ 'pd_status', 'rulecode_deactivate', 'rulecode_global_pause', 'owner_review_access',
99
+ ]);
100
+ const scopeAvoidsProtectedCapabilities = bounded
101
+ && affectedTools.every(value => !protectedCapabilityIds.has(value));
102
+ const contract = validateHostContract(input.hostContract);
103
+ let probesPassed = false;
104
+ if (contract && scopeAvoidsProtectedCapabilities) {
105
+ probesPassed = true;
106
+ for (const candidate of [artifact, ...input.existingLiveArtifacts]) {
107
+ const withProbes = artifactWithNeutralProbes(candidate, contract);
108
+ if (!withProbes || !(await input.validateProductionArtifact(withProbes)).ok) {
109
+ probesPassed = false;
110
+ break;
111
+ }
112
+ }
113
+ }
114
+ const emergencyControlsHealthy = contract !== null && input.safetyControlsEnabled;
115
+ return [
116
+ { checkId: 'bounded_scope', status: bounded ? 'passed' : 'failed', ...(!bounded ? { reasonCode: 'explicit_affected_tools_required' } : {}) },
117
+ { checkId: 'runtime_compatibility', status: contract ? 'passed' : 'failed', ...(!contract ? { reasonCode: 'host_liveness_contract_missing_invalid_or_unsupported' } : {}) },
118
+ { checkId: 'host_liveness_composition', status: probesPassed ? 'passed' : 'failed', ...(!probesPassed ? { reasonCode: 'neutral_probe_or_live_composition_failed' } : {}) },
119
+ { checkId: 'emergency_controls', status: emergencyControlsHealthy ? 'passed' : 'failed', ...(!emergencyControlsHealthy ? { reasonCode: contract ? 'safety_controls_disabled' : 'out_of_band_controls_unavailable' } : {}) },
120
+ { checkId: 'runtime_shadow_evidence', status: contract?.supportsShadowEvidence === true ? 'passed' : 'failed', ...(contract?.supportsShadowEvidence === true ? {} : { reasonCode: 'runtime_shadow_evidence_unsupported' }) },
121
+ { checkId: 'owner_identity_configuration', status: input.ownerIdentityConfigured ? 'passed' : 'failed', ...(!input.ownerIdentityConfigured ? { reasonCode: 'configured_owner_missing' } : {}) },
122
+ ];
123
+ }
124
+ //# sourceMappingURL=openclaw-promotion-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-promotion-checks.js","sourceRoot":"","sources":["../../../src/runtime-v2/activation/openclaw-promotion-checks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { PromotionEvidenceSnapshot, PromotionReadinessResult } from './rulecode-owner-decision-service.js';
2
+ export declare const REQUIRED_PROMOTION_CHECK_IDS: readonly ['activation_eligibility', 'lineage_binding', 'bounded_scope', 'production_compile_load', 'golden_trace', 'runtime_compatibility', 'host_liveness_composition', 'emergency_controls', 'runtime_shadow_evidence', 'owner_identity_configuration'];
3
+ export type PromotionCheckId = typeof REQUIRED_PROMOTION_CHECK_IDS[number];
4
+ export interface PromotionReadinessCheck {
5
+ checkId: PromotionCheckId;
6
+ status: 'passed' | 'failed';
7
+ reasonCode?: string;
8
+ }
9
+ export interface PromotionReadinessEvaluationInput {
10
+ evaluationId: string;
11
+ artifactId: string;
12
+ artifactDigest: string;
13
+ evidenceSnapshot: PromotionEvidenceSnapshot;
14
+ checks: readonly PromotionReadinessCheck[];
15
+ }
16
+ export declare function evaluateRuleCodePromotionReadiness(input: PromotionReadinessEvaluationInput): PromotionReadinessResult;
17
+ //# sourceMappingURL=promotion-readiness-evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promotion-readiness-evaluator.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/activation/promotion-readiness-evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAwB,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAEtI,eAAO,MAAM,4BAA4B,YACvC,wBAAwB,EAAE,iBAAiB,EAAE,eAAe,EAAE,yBAAyB,EACvF,cAAc,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,oBAAoB,EAC1F,yBAAyB,EAAE,8BAA8B,CACjD,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAC;AAC3E,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AACD,MAAM,WAAW,iCAAiC;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,yBAAyB,CAAC;IAC5C,MAAM,EAAE,SAAS,uBAAuB,EAAE,CAAC;CAC5C;AAED,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,iCAAiC,GAAG,wBAAwB,CA+CrH"}
@@ -0,0 +1,55 @@
1
+ export const REQUIRED_PROMOTION_CHECK_IDS = [
2
+ 'activation_eligibility', 'lineage_binding', 'bounded_scope', 'production_compile_load',
3
+ 'golden_trace', 'runtime_compatibility', 'host_liveness_composition', 'emergency_controls',
4
+ 'runtime_shadow_evidence', 'owner_identity_configuration',
5
+ ];
6
+ export function evaluateRuleCodePromotionReadiness(input) {
7
+ const byId = new Map();
8
+ const duplicateIds = new Set();
9
+ for (const check of input.checks) {
10
+ if (byId.has(check.checkId))
11
+ duplicateIds.add(check.checkId);
12
+ byId.set(check.checkId, check);
13
+ }
14
+ const unavailable = [];
15
+ for (const checkId of REQUIRED_PROMOTION_CHECK_IDS) {
16
+ if (!byId.has(checkId))
17
+ unavailable.push({ checkId, reasonCode: 'required_check_missing' });
18
+ if (duplicateIds.has(checkId))
19
+ unavailable.push({ checkId, reasonCode: 'duplicate_check_result' });
20
+ }
21
+ if (input.evidenceSnapshot.artifactDigest !== input.artifactDigest) {
22
+ unavailable.push({ checkId: 'evidence_binding', reasonCode: 'artifact_digest_mismatch' });
23
+ }
24
+ const { shadowSummary } = input.evidenceSnapshot;
25
+ const safetyGateResults = REQUIRED_PROMOTION_CHECK_IDS.flatMap(checkId => {
26
+ const check = byId.get(checkId);
27
+ if (!check)
28
+ return [];
29
+ if (checkId === 'runtime_shadow_evidence' && shadowSummary.errors !== null && shadowSummary.errors > 0) {
30
+ return [{ checkId, status: 'failed', reasonCode: 'unresolved_shadow_unhealthy_evidence' }];
31
+ }
32
+ return [{ ...check }];
33
+ });
34
+ const evidenceSnapshot = { ...input.evidenceSnapshot, safetyGateResults };
35
+ if (unavailable.length > 0) {
36
+ return { status: 'unavailable', evaluationId: input.evaluationId, artifactId: input.artifactId,
37
+ artifactDigest: input.artifactDigest, evidenceSnapshot, failedChecks: unavailable };
38
+ }
39
+ const failedChecks = safetyGateResults
40
+ .filter(check => check.status === 'failed')
41
+ .map(check => ({ checkId: check.checkId, reasonCode: check.reasonCode ?? 'hard_check_failed' }));
42
+ const summary = evidenceSnapshot.shadowSummary;
43
+ const shadowAgeMs = summary.firstObservedAt === null
44
+ ? null
45
+ : Date.parse(evidenceSnapshot.createdAt) - Date.parse(summary.firstObservedAt);
46
+ const insufficientEvidence = summary.observed === null || summary.observed < 20
47
+ || summary.matched === null || summary.matched < 3
48
+ || summary.neutralControl === null || summary.neutralControl < 1
49
+ || shadowAgeMs === null || !Number.isFinite(shadowAgeMs) || shadowAgeMs < 24 * 60 * 60 * 1000;
50
+ return {
51
+ status: failedChecks.length > 0 ? 'blocked' : insufficientEvidence ? 'evidence_insufficient' : 'ready', evaluationId: input.evaluationId,
52
+ artifactId: input.artifactId, artifactDigest: input.artifactDigest, evidenceSnapshot, failedChecks,
53
+ };
54
+ }
55
+ //# sourceMappingURL=promotion-readiness-evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promotion-readiness-evaluator.js","sourceRoot":"","sources":["../../../src/runtime-v2/activation/promotion-readiness-evaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ActivationStatusRecord, CanActivateResult, PIArtifactSnapshot } from './activation-types.js';
2
+ import type { OwnerPromotionRequest, PromotionEvidenceSnapshot, PromotionReadinessResult } from './rulecode-owner-decision-service.js';
3
+ import { type PromotionReadinessCheck } from './promotion-readiness-evaluator.js';
4
+ export interface PromotionReadinessReaderDeps {
5
+ listCodeToolHookActivations(): Promise<ActivationStatusRecord[]>;
6
+ getArtifactById(artifactId: string): Promise<PIArtifactSnapshot | null>;
7
+ computeArtifactDigest(artifact: PIArtifactSnapshot): string;
8
+ validateProductionArtifact(artifact: PIArtifactSnapshot): Promise<CanActivateResult>;
9
+ collectHostChecks(artifact: PIArtifactSnapshot): Promise<PromotionReadinessCheck[]>;
10
+ buildEvidenceSnapshot(checks: PromotionReadinessCheck[], artifact?: PIArtifactSnapshot): PromotionEvidenceSnapshot;
11
+ newEvaluationId(): string;
12
+ }
13
+ type ReadinessRequest = Pick<OwnerPromotionRequest, 'activationId' | 'expectedArtifactId' | 'expectedArtifactDigest'>;
14
+ export declare class PromotionReadinessReader {
15
+ private readonly deps;
16
+ constructor(deps: PromotionReadinessReaderDeps);
17
+ evaluate(request: ReadinessRequest): Promise<PromotionReadinessResult>;
18
+ private blocked;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=promotion-readiness-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promotion-readiness-reader.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/activation/promotion-readiness-reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3G,OAAO,KAAK,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AACvI,OAAO,EAAsC,KAAK,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAEtH,MAAM,WAAW,4BAA4B;IAC3C,2BAA2B,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;IACjE,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACxE,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAAC;IAC5D,0BAA0B,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACrF,iBAAiB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC;IACpF,qBAAqB,CAAC,MAAM,EAAE,uBAAuB,EAAE,EAAE,QAAQ,CAAC,EAAE,kBAAkB,GAAG,yBAAyB,CAAC;IACnH,eAAe,IAAI,MAAM,CAAC;CAC3B;AAED,KAAK,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,EAAE,cAAc,GAAG,oBAAoB,GAAG,wBAAwB,CAAC,CAAC;AAEtH,qBAAa,wBAAwB;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,4BAA4B,EAAI;IAE7D,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAgC3E;IAED,OAAO,CAAC,OAAO;CAQhB"}
@@ -0,0 +1,44 @@
1
+ import { evaluateRuleCodePromotionReadiness } from './promotion-readiness-evaluator.js';
2
+ export class PromotionReadinessReader {
3
+ deps;
4
+ constructor(deps) {
5
+ this.deps = deps;
6
+ }
7
+ async evaluate(request) {
8
+ const evaluationId = this.deps.newEvaluationId();
9
+ const matches = (await this.deps.listCodeToolHookActivations()).filter(record => record.activationId === request.activationId);
10
+ const activation = matches.length === 1 ? matches[0] : undefined;
11
+ if (!activation || activation.action !== 'code_tool_hook_shadow_activate' || activation.deactivatedAt !== null) {
12
+ return this.blocked(evaluationId, request, [{ checkId: 'activation_eligibility', status: 'failed', reasonCode: matches.length > 1 ? 'activation_not_unique' : 'active_shadow_activation_required' }]);
13
+ }
14
+ if (activation.artifactId !== request.expectedArtifactId) {
15
+ return this.blocked(evaluationId, request, [{ checkId: 'lineage_binding', status: 'failed', reasonCode: 'activation_artifact_mismatch' }]);
16
+ }
17
+ const artifact = await this.deps.getArtifactById(activation.artifactId);
18
+ if (!artifact) {
19
+ return this.blocked(evaluationId, request, [{ checkId: 'lineage_binding', status: 'failed', reasonCode: 'artifact_not_found' }]);
20
+ }
21
+ const artifactDigest = this.deps.computeArtifactDigest(artifact);
22
+ if (artifactDigest !== request.expectedArtifactDigest) {
23
+ return this.blocked(evaluationId, { ...request, expectedArtifactDigest: artifactDigest }, [{ checkId: 'lineage_binding', status: 'failed', reasonCode: 'artifact_digest_mismatch' }]);
24
+ }
25
+ const checks = [
26
+ { checkId: 'activation_eligibility', status: 'passed' },
27
+ { checkId: 'lineage_binding', status: artifact.sourceTaskId && artifact.lineageArtifactIds.length > 0 ? 'passed' : 'failed',
28
+ ...(artifact.sourceTaskId && artifact.lineageArtifactIds.length > 0 ? {} : { reasonCode: 'artifact_lineage_missing' }) },
29
+ ];
30
+ const gate = await this.deps.validateProductionArtifact(artifact);
31
+ checks.push({ checkId: 'production_compile_load', status: gate.ok ? 'passed' : 'failed', ...(!gate.ok ? { reasonCode: gate.reason } : {}) }, { checkId: 'golden_trace', status: gate.ok ? 'passed' : 'failed', ...(!gate.ok ? { reasonCode: gate.reason } : {}) }, ...await this.deps.collectHostChecks(artifact));
32
+ const evidenceSnapshot = this.deps.buildEvidenceSnapshot(checks, artifact);
33
+ return evaluateRuleCodePromotionReadiness({ evaluationId, artifactId: artifact.artifactId, artifactDigest, evidenceSnapshot, checks });
34
+ }
35
+ blocked(evaluationId, request, checks) {
36
+ const evidenceSnapshot = this.deps.buildEvidenceSnapshot(checks);
37
+ return {
38
+ status: 'blocked', evaluationId, artifactId: request.expectedArtifactId,
39
+ artifactDigest: request.expectedArtifactDigest, evidenceSnapshot,
40
+ failedChecks: checks.map(check => ({ checkId: check.checkId, reasonCode: check.reasonCode ?? 'hard_check_failed' })),
41
+ };
42
+ }
43
+ }
44
+ //# sourceMappingURL=promotion-readiness-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promotion-readiness-reader.js","sourceRoot":"","sources":["../../../src/runtime-v2/activation/promotion-readiness-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import type { ActivationDecisionRecord } from './activation-control-types.js';
2
+ export interface PromotionEvidenceSnapshot {
3
+ snapshotId: string;
4
+ snapshotDigest: string;
5
+ artifactDigest: string;
6
+ lineageRefs: string[];
7
+ hostRuntimeVersion: string;
8
+ safetyGateResults: {
9
+ checkId: string;
10
+ status: 'passed' | 'failed';
11
+ reasonCode?: string;
12
+ }[];
13
+ shadowSummary: {
14
+ observed: number | null;
15
+ matched: number | null;
16
+ wouldBlock: number | null;
17
+ wouldAllow: number | null;
18
+ requireApproval: number | null;
19
+ autoCorrect: number | null;
20
+ errors: number | null;
21
+ neutralControl: number | null;
22
+ firstObservedAt: string | null;
23
+ lastObservedAt: string | null;
24
+ };
25
+ configurationVersion: string;
26
+ redaction: {
27
+ version: string;
28
+ rawParametersStored: false;
29
+ };
30
+ createdAt: string;
31
+ }
32
+ export interface PromotionFailedCheck {
33
+ checkId: string;
34
+ reasonCode: string;
35
+ }
36
+ export interface PromotionReadinessResult {
37
+ status: 'ready' | 'evidence_insufficient' | 'blocked' | 'unavailable';
38
+ evaluationId: string;
39
+ artifactId: string;
40
+ artifactDigest: string;
41
+ evidenceSnapshot: PromotionEvidenceSnapshot;
42
+ failedChecks: PromotionFailedCheck[];
43
+ }
44
+ export interface OwnerPromotionActor {
45
+ principal: ActivationDecisionRecord['principal'];
46
+ authentication: ActivationDecisionRecord['authentication'];
47
+ operator?: ActivationDecisionRecord['operator'];
48
+ }
49
+ export interface OwnerPromotionRequest {
50
+ activationId: string;
51
+ expectedArtifactId: string;
52
+ expectedArtifactDigest: string;
53
+ expectedControlVersion: number;
54
+ idempotencyKey: string;
55
+ reasonCode: string;
56
+ note?: string;
57
+ confirmed: boolean;
58
+ dryRun?: boolean;
59
+ }
60
+ export interface PromotionCommitInput {
61
+ decision: ActivationDecisionRecord;
62
+ evidenceSnapshot: PromotionEvidenceSnapshot;
63
+ readinessEvaluationId: string;
64
+ evidenceSnapshotDigest: string;
65
+ expectedControlVersion: number;
66
+ idempotencyKey: string;
67
+ }
68
+ export type OwnerPromotionResult = {
69
+ ok: true;
70
+ decision: 'promoted';
71
+ activationId: string;
72
+ decisionId: string;
73
+ promotedAt: string;
74
+ } | {
75
+ ok: true;
76
+ decision: 'would_promote';
77
+ activationId: string;
78
+ readinessEvaluationId: string;
79
+ evidenceSnapshotDigest: string;
80
+ } | {
81
+ ok: false;
82
+ reasonCode: string;
83
+ summary: string;
84
+ failedChecks: PromotionFailedCheck[];
85
+ nextAction: string;
86
+ };
87
+ export interface RuleCodeOwnerDecisionServiceDeps {
88
+ ownerLiveDecisionEnabled(): boolean;
89
+ safetyControlsEnabled(): boolean;
90
+ evaluateReadiness(input: OwnerPromotionRequest): Promise<PromotionReadinessResult>;
91
+ commitPromotion(input: PromotionCommitInput): Promise<{
92
+ activationId: string;
93
+ decisionId: string;
94
+ promotedAt: string;
95
+ }>;
96
+ newDecisionId(): string;
97
+ now(): string;
98
+ }
99
+ export declare class RuleCodeOwnerDecisionService {
100
+ private readonly deps;
101
+ constructor(deps: RuleCodeOwnerDecisionServiceDeps);
102
+ promote(request: OwnerPromotionRequest, actor: OwnerPromotionActor): Promise<OwnerPromotionResult>;
103
+ }
104
+ //# sourceMappingURL=rulecode-owner-decision-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rulecode-owner-decision-service.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/activation/rulecode-owner-decision-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ function refused(input) {
2
+ return { ok: false, ...input, failedChecks: input.failedChecks ?? [] };
3
+ }
4
+ export class RuleCodeOwnerDecisionService {
5
+ deps;
6
+ constructor(deps) {
7
+ this.deps = deps;
8
+ }
9
+ async promote(request, actor) {
10
+ if (!this.deps.ownerLiveDecisionEnabled()) {
11
+ return refused({ reasonCode: 'feature_not_enabled', summary: 'Owner live decisions are disabled.', nextAction: 'Enable rulecode_owner_live_decision after completing its rollout gate.' });
12
+ }
13
+ if (!this.deps.safetyControlsEnabled()) {
14
+ return refused({ reasonCode: 'safety_controls_unavailable', summary: 'Durable RuleCode safety controls are unavailable.', nextAction: 'Restore rulecode_safety_controls or disable code_tool_hook enforcement.' });
15
+ }
16
+ const authenticatedOwner = actor.principal.kind === 'configured_owner'
17
+ && (actor.authentication.method === 'console_token' || actor.authentication.method === 'cli_owner_credential');
18
+ if (!authenticatedOwner) {
19
+ return refused({ reasonCode: 'owner_authentication_required', summary: 'Promotion requires the configured Owner credential.', nextAction: 'Authenticate as the configured Owner; local break-glass authority may only stop enforcement.' });
20
+ }
21
+ if (actor.authentication.method === 'cli_owner_credential' && (!request.note || request.note.trim().length === 0)) {
22
+ return refused({ reasonCode: 'cli_owner_note_required', summary: 'CLI promotion requires an Owner review note.', nextAction: 'Provide a concise --note explaining the live decision.' });
23
+ }
24
+ if (!request.confirmed && request.dryRun !== true) {
25
+ return refused({ reasonCode: 'confirmation_required', summary: 'Live enforcement was not confirmed.', nextAction: 'Refresh the review evidence and explicitly confirm promotion.' });
26
+ }
27
+ if (!request.activationId || !request.expectedArtifactId || !request.expectedArtifactDigest || !request.idempotencyKey || !request.reasonCode) {
28
+ return refused({ reasonCode: 'promotion_request_invalid', summary: 'Required promotion binding fields are missing.', nextAction: 'Refresh the Owner review and submit all optimistic preconditions.' });
29
+ }
30
+ const readiness = await this.deps.evaluateReadiness(request);
31
+ if (readiness.status === 'blocked' || readiness.status === 'unavailable') {
32
+ return refused({
33
+ reasonCode: readiness.status === 'blocked' ? 'promotion_safety_gate_blocked' : 'promotion_readiness_unavailable',
34
+ summary: readiness.status === 'blocked' ? 'One or more hard promotion checks failed.' : 'Promotion readiness could not be established.',
35
+ nextAction: 'Review the failed checks, repair them, and refresh the Owner review before retrying.',
36
+ failedChecks: readiness.failedChecks,
37
+ });
38
+ }
39
+ if (readiness.artifactId !== request.expectedArtifactId || readiness.artifactDigest !== request.expectedArtifactDigest
40
+ || readiness.evidenceSnapshot.artifactDigest !== readiness.artifactDigest) {
41
+ return refused({ reasonCode: 'promotion_snapshot_stale', summary: 'The activation artifact changed during review.', nextAction: 'Refresh the Owner review and evaluate the current artifact version.' });
42
+ }
43
+ if (readiness.status === 'evidence_insufficient') {
44
+ const allowedOverrideReasons = new Set(['rare_behavior', 'controlled_rollout', 'owner_accepts_limited_evidence']);
45
+ if (!allowedOverrideReasons.has(request.reasonCode)) {
46
+ return refused({ reasonCode: 'evidence_override_reason_required', summary: 'Evidence-insufficient promotion requires a predefined Owner reason.', nextAction: 'Choose rare_behavior, controlled_rollout, or owner_accepts_limited_evidence.' });
47
+ }
48
+ if (!request.note || request.note.trim().length === 0) {
49
+ return refused({ reasonCode: 'evidence_override_note_required', summary: 'Evidence-insufficient promotion requires an Owner note.', nextAction: 'Explain why promotion is acceptable despite insufficient evidence.' });
50
+ }
51
+ }
52
+ if (request.dryRun === true) {
53
+ return {
54
+ ok: true, decision: 'would_promote', activationId: request.activationId,
55
+ readinessEvaluationId: readiness.evaluationId,
56
+ evidenceSnapshotDigest: readiness.evidenceSnapshot.snapshotDigest,
57
+ };
58
+ }
59
+ const decidedAt = this.deps.now();
60
+ const decision = {
61
+ decisionId: this.deps.newDecisionId(),
62
+ subject: {
63
+ kind: 'activation', activationId: request.activationId,
64
+ artifactId: readiness.artifactId, artifactDigest: readiness.artifactDigest,
65
+ },
66
+ decision: 'promote_live',
67
+ principal: actor.principal,
68
+ authentication: actor.authentication,
69
+ operator: actor.operator,
70
+ reasonCode: request.reasonCode,
71
+ note: request.note?.trim() || null,
72
+ evidenceSnapshotId: readiness.evidenceSnapshot.snapshotId,
73
+ decidedAt,
74
+ };
75
+ const committed = await this.deps.commitPromotion({
76
+ decision,
77
+ evidenceSnapshot: readiness.evidenceSnapshot,
78
+ readinessEvaluationId: readiness.evaluationId,
79
+ evidenceSnapshotDigest: readiness.evidenceSnapshot.snapshotDigest,
80
+ expectedControlVersion: request.expectedControlVersion,
81
+ idempotencyKey: request.idempotencyKey,
82
+ });
83
+ return { ok: true, decision: 'promoted', ...committed };
84
+ }
85
+ }
86
+ //# sourceMappingURL=rulecode-owner-decision-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rulecode-owner-decision-service.js","sourceRoot":"","sources":["../../../src/runtime-v2/activation/rulecode-owner-decision-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface RuleCodeSafetySample {
2
+ toolName: string;
3
+ decision: 'allow' | 'block' | 'requireApproval' | 'auto_correct' | 'error';
4
+ outsideApprovedScope: boolean;
5
+ protectedCapabilityMatched?: boolean;
6
+ neutralProbeFailed?: boolean;
7
+ healthFailure?: 'load' | 'compatibility' | 'context' | 'invalid_result' | 'timeout' | 'exception';
8
+ }
9
+ export interface RuleCodeSafetyCircuitState {
10
+ consecutiveErrors: number;
11
+ consecutiveBlocks: {
12
+ toolName: string;
13
+ }[];
14
+ latestEligible: {
15
+ blocked: boolean;
16
+ outsideApprovedScope: boolean;
17
+ }[];
18
+ }
19
+ export type RuleCodeSafetyTripReason = 'protected_capability_matched' | 'host_liveness_probe_failed' | 'runtime_health_failure' | 'three_consecutive_errors' | 'broad_consecutive_blocking' | 'outside_scope_block_ratio';
20
+ export declare function initialRuleCodeSafetyCircuitState(): RuleCodeSafetyCircuitState;
21
+ export declare function evaluateRuleCodeSafetyCircuit(state: RuleCodeSafetyCircuitState, sample: RuleCodeSafetySample): {
22
+ state: RuleCodeSafetyCircuitState;
23
+ trip: RuleCodeSafetyTripReason | null;
24
+ };
25
+ //# sourceMappingURL=rulecode-safety-circuit-breaker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rulecode-safety-circuit-breaker.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/activation/rulecode-safety-circuit-breaker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,GAAG,OAAO,GAAG,iBAAiB,GAAG,cAAc,GAAG,OAAO,CAAC;IAC3E,oBAAoB,EAAE,OAAO,CAAC;IAC9B,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,GAAG,WAAW,CAAC;CACnG;AAED,MAAM,WAAW,0BAA0B;IACzC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,cAAc,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,oBAAoB,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;CACvE;AAED,MAAM,MAAM,wBAAwB,GAAG,8BAA8B,GAAG,4BAA4B,GAAG,wBAAwB,GAAG,0BAA0B,GAAG,4BAA4B,GAAG,2BAA2B,CAAC;AAE1N,wBAAgB,iCAAiC,IAAI,0BAA0B,CAE9E;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,0BAA0B,EAAE,MAAM,EAAE,oBAAoB,GAAG;IAAE,KAAK,EAAE,0BAA0B,CAAC;IAAC,IAAI,EAAE,wBAAwB,GAAG,IAAI,CAAA;CAAE,CAY3L"}
@@ -0,0 +1,23 @@
1
+ export function initialRuleCodeSafetyCircuitState() {
2
+ return { consecutiveErrors: 0, consecutiveBlocks: [], latestEligible: [] };
3
+ }
4
+ export function evaluateRuleCodeSafetyCircuit(state, sample) {
5
+ if (sample.protectedCapabilityMatched)
6
+ return { state, trip: 'protected_capability_matched' };
7
+ if (sample.neutralProbeFailed)
8
+ return { state, trip: 'host_liveness_probe_failed' };
9
+ if (sample.healthFailure)
10
+ return { state, trip: 'runtime_health_failure' };
11
+ const consecutiveErrors = sample.decision === 'error' ? state.consecutiveErrors + 1 : 0;
12
+ const consecutiveBlocks = sample.decision === 'block' ? [...state.consecutiveBlocks, { toolName: sample.toolName }].slice(-5) : [];
13
+ const latestEligible = [...state.latestEligible, { blocked: sample.decision === 'block', outsideApprovedScope: sample.outsideApprovedScope }].slice(-20);
14
+ const next = { consecutiveErrors, consecutiveBlocks, latestEligible };
15
+ if (consecutiveErrors >= 3)
16
+ return { state: next, trip: 'three_consecutive_errors' };
17
+ if (consecutiveBlocks.length >= 5 && new Set(consecutiveBlocks.map(value => value.toolName)).size >= 3)
18
+ return { state: next, trip: 'broad_consecutive_blocking' };
19
+ if (latestEligible.length === 20 && latestEligible.filter(value => value.blocked && value.outsideApprovedScope).length / 20 > 0.8)
20
+ return { state: next, trip: 'outside_scope_block_ratio' };
21
+ return { state: next, trip: null };
22
+ }
23
+ //# sourceMappingURL=rulecode-safety-circuit-breaker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rulecode-safety-circuit-breaker.js","sourceRoot":"","sources":["../../../src/runtime-v2/activation/rulecode-safety-circuit-breaker.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,iCAAiC;IAC/C,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAAiC,EAAE,MAA4B;IAC3G,IAAI,MAAM,CAAC,0BAA0B;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC;IAC9F,IAAI,MAAM,CAAC,kBAAkB;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;IACpF,IAAI,MAAM,CAAC,aAAa;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;IAC3E,MAAM,iBAAiB,GAAG,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,iBAAiB,GAAG,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnI,MAAM,cAAc,GAAG,CAAC,GAAG,KAAK,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACzJ,MAAM,IAAI,GAAG,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAC;IACtE,IAAI,iBAAiB,IAAI,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;IACrF,IAAI,iBAAiB,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;IACnK,IAAI,cAAc,CAAC,MAAM,KAAK,EAAE,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,MAAM,GAAG,EAAE,GAAG,GAAG;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC;IAC7L,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface RuleCodeShadowSummary {
2
+ observed: number;
3
+ matched: number;
4
+ wouldBlock: number;
5
+ wouldAllow: number;
6
+ requireApproval: number;
7
+ autoCorrect: number;
8
+ errors: number;
9
+ neutralControl: number;
10
+ firstObservedAt: string | null;
11
+ lastObservedAt: string | null;
12
+ }
13
+ export declare function summarizeRuleCodeShadowEvents(entries: readonly unknown[], activationId: string): RuleCodeShadowSummary;
14
+ //# sourceMappingURL=rulecode-shadow-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rulecode-shadow-summary.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/activation/rulecode-shadow-summary.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAGD,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,qBAAqB,CA2CtH"}