project-tiny-context-harness 0.8.12 → 0.8.13

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 (158) hide show
  1. package/README.md +43 -19
  2. package/assets/README.md +81 -40
  3. package/assets/README.zh-CN.md +44 -22
  4. package/assets/agents/AGENTS_CORE.md +8 -4
  5. package/assets/skills/context_development_engineer/SKILL.md +9 -1
  6. package/assets/skills/design-resource-authoring/SKILL.md +7 -5
  7. package/assets/skills/design-resource-authoring/references/downstream-handoff.md +2 -2
  8. package/assets/skills/design-resource-authoring/references/open-design-provider.md +22 -2
  9. package/assets/skills/design-resource-authoring/references/recovery-and-writeback.md +199 -0
  10. package/assets/skills/design-resource-authoring/references/resource-selection.md +2 -2
  11. package/assets/skills/long-task-workflow/SKILL.md +6 -6
  12. package/assets/skills/long-task-workflow/references/contract-authoring.md +27 -22
  13. package/assets/skills/long-task-workflow/references/evidence-design.md +49 -32
  14. package/assets/skills/long-task-workflow/references/source-authoring.md +2 -2
  15. package/dist/commands/design-resource-recovery.d.ts +1 -0
  16. package/dist/commands/design-resource-recovery.js +152 -0
  17. package/dist/commands/design-resource.js +20 -1
  18. package/dist/commands/index.js +1 -1
  19. package/dist/lib/design-resource-reconciliation-codec.d.ts +2 -0
  20. package/dist/lib/design-resource-reconciliation-codec.js +174 -0
  21. package/dist/lib/design-resource-reconciliation-types.d.ts +62 -0
  22. package/dist/lib/design-resource-reconciliation-types.js +1 -0
  23. package/dist/lib/design-resource-reconciliation.d.ts +3 -0
  24. package/dist/lib/design-resource-reconciliation.js +224 -0
  25. package/dist/lib/design-resource-recovery-authority-policy.d.ts +8 -0
  26. package/dist/lib/design-resource-recovery-authority-policy.js +123 -0
  27. package/dist/lib/design-resource-recovery-catalog-resources.d.ts +6 -0
  28. package/dist/lib/design-resource-recovery-catalog-resources.js +121 -0
  29. package/dist/lib/design-resource-recovery-catalog-shape.d.ts +3 -0
  30. package/dist/lib/design-resource-recovery-catalog-shape.js +104 -0
  31. package/dist/lib/design-resource-recovery-catalog.d.ts +9 -0
  32. package/dist/lib/design-resource-recovery-catalog.js +103 -0
  33. package/dist/lib/design-resource-recovery-cleanup.d.ts +2 -0
  34. package/dist/lib/design-resource-recovery-cleanup.js +11 -0
  35. package/dist/lib/design-resource-recovery-codec-primitives.d.ts +19 -0
  36. package/dist/lib/design-resource-recovery-codec-primitives.js +92 -0
  37. package/dist/lib/design-resource-recovery-codec.d.ts +4 -0
  38. package/dist/lib/design-resource-recovery-codec.js +93 -0
  39. package/dist/lib/design-resource-recovery-current.d.ts +9 -0
  40. package/dist/lib/design-resource-recovery-current.js +41 -0
  41. package/dist/lib/design-resource-recovery-delta-policy.d.ts +5 -0
  42. package/dist/lib/design-resource-recovery-delta-policy.js +108 -0
  43. package/dist/lib/design-resource-recovery-files.d.ts +37 -0
  44. package/dist/lib/design-resource-recovery-files.js +204 -0
  45. package/dist/lib/design-resource-recovery-final-disposition-shape.d.ts +2 -0
  46. package/dist/lib/design-resource-recovery-final-disposition-shape.js +47 -0
  47. package/dist/lib/design-resource-recovery-patch-types.d.ts +54 -0
  48. package/dist/lib/design-resource-recovery-patch-types.js +1 -0
  49. package/dist/lib/design-resource-recovery-replay.d.ts +7 -0
  50. package/dist/lib/design-resource-recovery-replay.js +112 -0
  51. package/dist/lib/design-resource-recovery-repository-bindings.d.ts +9 -0
  52. package/dist/lib/design-resource-recovery-repository-bindings.js +49 -0
  53. package/dist/lib/design-resource-recovery-schema.d.ts +5 -0
  54. package/dist/lib/design-resource-recovery-schema.js +5 -0
  55. package/dist/lib/design-resource-recovery-shape.d.ts +10 -0
  56. package/dist/lib/design-resource-recovery-shape.js +184 -0
  57. package/dist/lib/design-resource-recovery-source-authority.d.ts +5 -0
  58. package/dist/lib/design-resource-recovery-source-authority.js +219 -0
  59. package/dist/lib/design-resource-recovery-text.d.ts +17 -0
  60. package/dist/lib/design-resource-recovery-text.js +186 -0
  61. package/dist/lib/design-resource-recovery-types.d.ts +197 -0
  62. package/dist/lib/design-resource-recovery-types.js +1 -0
  63. package/dist/lib/design-resource-recovery-writeback-policy.d.ts +5 -0
  64. package/dist/lib/design-resource-recovery-writeback-policy.js +326 -0
  65. package/dist/lib/design-resource-recovery-writeback-shape.d.ts +6 -0
  66. package/dist/lib/design-resource-recovery-writeback-shape.js +155 -0
  67. package/dist/lib/design-resource-recovery.d.ts +44 -0
  68. package/dist/lib/design-resource-recovery.js +216 -0
  69. package/dist/lib/long-task-acceptance-shape.js +8 -2
  70. package/dist/lib/long-task-activation-validation.js +13 -3
  71. package/dist/lib/long-task-admitted-observation-records.d.ts +25 -0
  72. package/dist/lib/long-task-admitted-observation-records.js +40 -0
  73. package/dist/lib/long-task-admitted-observation.d.ts +93 -0
  74. package/dist/lib/long-task-admitted-observation.js +201 -0
  75. package/dist/lib/long-task-artifacts.d.ts +1 -0
  76. package/dist/lib/long-task-artifacts.js +1 -0
  77. package/dist/lib/long-task-authority-material-diff.js +1 -0
  78. package/dist/lib/long-task-authority-policy.d.ts +2 -0
  79. package/dist/lib/long-task-authority-policy.js +2 -0
  80. package/dist/lib/long-task-authority-revision-details.js +3 -1
  81. package/dist/lib/long-task-authority.js +2 -1
  82. package/dist/lib/long-task-check-execution-policy.js +5 -0
  83. package/dist/lib/long-task-check-runner.d.ts +2 -2
  84. package/dist/lib/long-task-check-runner.js +440 -23
  85. package/dist/lib/long-task-claims.d.ts +18 -0
  86. package/dist/lib/long-task-claims.js +35 -0
  87. package/dist/lib/long-task-compact-structure-targets.js +1 -0
  88. package/dist/lib/long-task-conformance-policy.js +3 -1
  89. package/dist/lib/long-task-counterfactual-claim-policy.d.ts +3 -4
  90. package/dist/lib/long-task-counterfactual-claim-policy.js +11 -3
  91. package/dist/lib/long-task-counterfactual-sandbox.js +1 -0
  92. package/dist/lib/long-task-counterfactual-types.d.ts +2 -0
  93. package/dist/lib/long-task-delivery-compiler.js +2 -0
  94. package/dist/lib/long-task-evidence-capability-policy.d.ts +3 -2
  95. package/dist/lib/long-task-evidence-capability-policy.js +114 -8
  96. package/dist/lib/long-task-evidence-capability-runtime.d.ts +5 -2
  97. package/dist/lib/long-task-evidence-capability-runtime.js +149 -5
  98. package/dist/lib/long-task-evidence-sensitivity-policy.d.ts +9 -0
  99. package/dist/lib/long-task-evidence-sensitivity-policy.js +31 -1
  100. package/dist/lib/long-task-evidence-v2.d.ts +4 -4
  101. package/dist/lib/long-task-evidence-v2.js +321 -43
  102. package/dist/lib/long-task-exact-comparison.d.ts +16 -0
  103. package/dist/lib/long-task-exact-comparison.js +28 -0
  104. package/dist/lib/long-task-execution-observation.d.ts +24 -0
  105. package/dist/lib/long-task-execution-observation.js +332 -0
  106. package/dist/lib/long-task-explain-acceptance-link.d.ts +4 -0
  107. package/dist/lib/long-task-explain-acceptance-link.js +4 -0
  108. package/dist/lib/long-task-explain-claim-links.d.ts +2 -0
  109. package/dist/lib/long-task-explain-claim-links.js +2 -0
  110. package/dist/lib/long-task-explain-source-links.d.ts +6 -0
  111. package/dist/lib/long-task-final-v2.js +7 -4
  112. package/dist/lib/long-task-json-pointer-observation.d.ts +59 -0
  113. package/dist/lib/long-task-json-pointer-observation.js +184 -0
  114. package/dist/lib/long-task-observation-artifact.d.ts +8 -0
  115. package/dist/lib/long-task-observation-artifact.js +58 -0
  116. package/dist/lib/long-task-observation-authority.d.ts +17 -0
  117. package/dist/lib/long-task-observation-authority.js +348 -0
  118. package/dist/lib/long-task-paths.js +1 -1
  119. package/dist/lib/long-task-process-observation.d.ts +6 -0
  120. package/dist/lib/long-task-process-observation.js +117 -0
  121. package/dist/lib/long-task-process-runtime-closure.d.ts +13 -0
  122. package/dist/lib/long-task-process-runtime-closure.js +175 -0
  123. package/dist/lib/long-task-progress.js +2 -0
  124. package/dist/lib/long-task-protected-files.d.ts +1 -1
  125. package/dist/lib/long-task-protected-files.js +1 -30
  126. package/dist/lib/long-task-risk.js +8 -3
  127. package/dist/lib/long-task-root-shape.js +10 -1
  128. package/dist/lib/long-task-runner-environment.d.ts +1 -1
  129. package/dist/lib/long-task-runner-environment.js +4 -4
  130. package/dist/lib/long-task-runner-freeze.d.ts +4 -2
  131. package/dist/lib/long-task-runner-freeze.js +128 -28
  132. package/dist/lib/long-task-runtime-types.d.ts +111 -0
  133. package/dist/lib/long-task-scoped-binding.d.ts +13 -0
  134. package/dist/lib/long-task-scoped-binding.js +11 -0
  135. package/dist/lib/long-task-semantic-contract-types.d.ts +1 -0
  136. package/dist/lib/long-task-semantic-fact-contract-closure.js +3 -3
  137. package/dist/lib/long-task-semantic-fact-evidence.d.ts +3 -3
  138. package/dist/lib/long-task-semantic-fact-evidence.js +75 -58
  139. package/dist/lib/long-task-source-claim-validation.js +4 -1
  140. package/dist/lib/long-task-source-target-continuity.d.ts +2 -2
  141. package/dist/lib/long-task-source-target-continuity.js +35 -2
  142. package/dist/lib/long-task-source-target-index.d.ts +3 -0
  143. package/dist/lib/long-task-source-target-index.js +19 -0
  144. package/dist/lib/long-task-stage-policy.js +10 -4
  145. package/dist/lib/long-task-static-observation-freeze.d.ts +83 -0
  146. package/dist/lib/long-task-static-observation-freeze.js +428 -0
  147. package/dist/lib/long-task-status-projection.js +5 -1
  148. package/dist/lib/long-task-target-policy.d.ts +1 -1
  149. package/dist/lib/long-task-target-policy.js +3 -0
  150. package/dist/lib/long-task-verifier-dependency-closure.js +7 -3
  151. package/dist/lib/long-task-verifier-v2.js +70 -9
  152. package/dist/lib/long-task-workspace.d.ts +1 -1
  153. package/dist/lib/long-task-workspace.js +1 -12
  154. package/dist/lib/repository-path-safety.d.ts +14 -0
  155. package/dist/lib/repository-path-safety.js +126 -0
  156. package/dist/schemas/long-task-delivery-v2/long-task-delivery-v2.schema.json +53 -8
  157. package/migrations/README.md +77 -0
  158. package/package.json +1 -1
@@ -0,0 +1,184 @@
1
+ import path from "node:path";
2
+ import { canonicalValueJson, parseStrictYaml, sha256Hex, } from "./strict-codec.js";
3
+ export const JSON_POINTER_EXACT_CAPABILITY = "json-pointer-exact-v1";
4
+ export const JSON_POINTER_EXACT_ORACLE_IDENTITY = "ty-context-json-pointer-exact";
5
+ export const JSON_POINTER_EXACT_ORACLE_VERSION = "1.0.0";
6
+ export const JSON_POINTER_EXACT_METHODS = Object.freeze([
7
+ "exact_value",
8
+ "content",
9
+ "component_state",
10
+ ]);
11
+ export const JSON_POINTER_EXACT_LIMITS = Object.freeze({
12
+ max_file_bytes: 1_048_576,
13
+ max_depth: 64,
14
+ max_pointer_bytes: 4_096,
15
+ max_pointer_segments: 128,
16
+ max_canonical_value_bytes: 262_144,
17
+ max_artifacts_per_check: 256,
18
+ max_total_artifact_bytes: 16_777_216,
19
+ });
20
+ export const JSON_POINTER_EXACT_SPEC_SHA256 = sha256Hex(canonicalValueJson({
21
+ capability: JSON_POINTER_EXACT_CAPABILITY,
22
+ oracle_identity: JSON_POINTER_EXACT_ORACLE_IDENTITY,
23
+ oracle_version: JSON_POINTER_EXACT_ORACLE_VERSION,
24
+ media_type: "application/json",
25
+ encoding: "utf-8",
26
+ locator: "rfc6901-json-pointer",
27
+ canonicalization: "canonical-json-v1",
28
+ methods: JSON_POINTER_EXACT_METHODS,
29
+ comparator: "exact_value",
30
+ mode: "exact",
31
+ sensitivity: "plain",
32
+ limits: JSON_POINTER_EXACT_LIMITS,
33
+ }));
34
+ export function createJsonPointerExactBudget() {
35
+ return { seen_artifact_paths: new Set(), total_artifact_bytes: 0 };
36
+ }
37
+ export function isJsonPointerExactOracle(oracle) {
38
+ return (oracle.trust === "named_external_tcb" &&
39
+ oracle.identity === JSON_POINTER_EXACT_ORACLE_IDENTITY &&
40
+ oracle.version === JSON_POINTER_EXACT_ORACLE_VERSION &&
41
+ oracle.sha256 === null);
42
+ }
43
+ export function extractJsonPointerExactObservationFromBytes(input) {
44
+ const artifactPath = normalizeObservationArtifactPath(input.artifact_path);
45
+ if (input.sensitivity !== "plain")
46
+ throw invalidObservation("observation_protected_requires_frozen_adapter");
47
+ if (input.bytes.byteLength > JSON_POINTER_EXACT_LIMITS.max_file_bytes)
48
+ throw invalidObservation("observation_artifact_size_limit");
49
+ accountForArtifact(input.budget, artifactPath, input.bytes.byteLength);
50
+ const locator = validateJsonPointerExactLocator(input.locator);
51
+ const parsed = parseJsonWithoutDuplicateKeys(decodeUtf8Json(input.bytes));
52
+ assertJsonTree(parsed, 0);
53
+ const canonical = canonicalValueJson(resolveJsonPointer(parsed, locator.value));
54
+ const canonicalBytes = Buffer.byteLength(canonical, "utf8");
55
+ if (canonicalBytes > JSON_POINTER_EXACT_LIMITS.max_canonical_value_bytes)
56
+ throw invalidObservation("observation_canonical_value_size_limit");
57
+ return {
58
+ capability: JSON_POINTER_EXACT_CAPABILITY,
59
+ artifact_path: artifactPath,
60
+ artifact_sha256: sha256Hex(input.bytes),
61
+ locator,
62
+ value_sha256: sha256Hex(canonical),
63
+ canonical_value_bytes: canonicalBytes,
64
+ sensitivity: "plain",
65
+ };
66
+ }
67
+ export function validateJsonPointerExactLocator(locator) {
68
+ if (locator.kind !== "json_pointer" ||
69
+ typeof locator.value !== "string" ||
70
+ locator.value.startsWith("#") ||
71
+ (locator.value !== "" && !locator.value.startsWith("/")) ||
72
+ Buffer.byteLength(locator.value, "utf8") >
73
+ JSON_POINTER_EXACT_LIMITS.max_pointer_bytes)
74
+ throw invalidObservation("observation_locator_not_admitted");
75
+ const encoded = locator.value === "" ? [] : locator.value.slice(1).split("/");
76
+ if (encoded.length > JSON_POINTER_EXACT_LIMITS.max_pointer_segments)
77
+ throw invalidObservation("observation_locator_segment_limit");
78
+ for (const token of encoded)
79
+ if (/~(?:[^01]|$)/u.test(token))
80
+ throw invalidObservation("observation_locator_not_admitted");
81
+ return { kind: "json_pointer", value: locator.value };
82
+ }
83
+ export function normalizeObservationArtifactPath(value) {
84
+ if (!value ||
85
+ value.includes("\\") ||
86
+ value.includes("\0") ||
87
+ path.posix.isAbsolute(value) ||
88
+ /^[a-z]:/iu.test(value))
89
+ throw invalidObservation("observation_artifact_path_escape");
90
+ const segments = value.split("/");
91
+ if (segments.some((segment) => !segment || segment === "." || segment === ".."))
92
+ throw invalidObservation("observation_artifact_path_escape");
93
+ return segments.join("/");
94
+ }
95
+ export function invalidObservation(code) {
96
+ return new Error(code);
97
+ }
98
+ export function observationErrorMessage(error) {
99
+ return error instanceof Error ? error.message : String(error);
100
+ }
101
+ export function resolveJsonPointer(root, pointer) {
102
+ let current = root;
103
+ if (pointer === "")
104
+ return current;
105
+ for (const encoded of pointer.slice(1).split("/")) {
106
+ const token = encoded.replace(/~1/gu, "/").replace(/~0/gu, "~");
107
+ if (Array.isArray(current)) {
108
+ if (!/^(?:0|[1-9]\d*)$/u.test(token))
109
+ throw invalidObservation("observation_locator_array_index_invalid");
110
+ const index = Number(token);
111
+ if (!Number.isSafeInteger(index) || index >= current.length)
112
+ throw invalidObservation("observation_locator_not_found");
113
+ current = current[index];
114
+ continue;
115
+ }
116
+ if (!current ||
117
+ typeof current !== "object" ||
118
+ !Object.hasOwn(current, token))
119
+ throw invalidObservation("observation_locator_not_found");
120
+ current = current[token];
121
+ }
122
+ return current;
123
+ }
124
+ export function parseJsonWithoutDuplicateKeys(content) {
125
+ let parsed;
126
+ try {
127
+ parsed = JSON.parse(content);
128
+ }
129
+ catch {
130
+ throw invalidObservation("observation_json_invalid");
131
+ }
132
+ try {
133
+ const strict = parseStrictYaml(content);
134
+ if (canonicalValueJson(strict) !== canonicalValueJson(parsed))
135
+ throw invalidObservation("observation_json_canonicalization_mismatch");
136
+ }
137
+ catch (error) {
138
+ if (observationErrorMessage(error).includes("unique"))
139
+ throw invalidObservation("observation_json_duplicate_key");
140
+ if (observationErrorMessage(error).startsWith("observation_"))
141
+ throw error;
142
+ throw invalidObservation("observation_json_invalid");
143
+ }
144
+ return parsed;
145
+ }
146
+ export function decodeUtf8Json(bytes) {
147
+ if (bytes.byteLength >= 3 &&
148
+ bytes[0] === 0xef &&
149
+ bytes[1] === 0xbb &&
150
+ bytes[2] === 0xbf)
151
+ throw invalidObservation("observation_json_utf8_invalid");
152
+ try {
153
+ return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
154
+ }
155
+ catch {
156
+ throw invalidObservation("observation_json_utf8_invalid");
157
+ }
158
+ }
159
+ export function assertJsonTree(value, depth) {
160
+ if (depth > JSON_POINTER_EXACT_LIMITS.max_depth)
161
+ throw invalidObservation("observation_json_depth_limit");
162
+ if (typeof value === "number" && !Number.isFinite(value))
163
+ throw invalidObservation("observation_json_number_invalid");
164
+ if (Array.isArray(value)) {
165
+ for (const entry of value)
166
+ assertJsonTree(entry, depth + 1);
167
+ return;
168
+ }
169
+ if (value && typeof value === "object")
170
+ for (const entry of Object.values(value))
171
+ assertJsonTree(entry, depth + 1);
172
+ }
173
+ function accountForArtifact(budget, artifactPath, bytes) {
174
+ if (!budget || budget.seen_artifact_paths.has(artifactPath))
175
+ return;
176
+ if (budget.seen_artifact_paths.size >=
177
+ JSON_POINTER_EXACT_LIMITS.max_artifacts_per_check)
178
+ throw invalidObservation("observation_artifact_count_limit");
179
+ if (budget.total_artifact_bytes + bytes >
180
+ JSON_POINTER_EXACT_LIMITS.max_total_artifact_bytes)
181
+ throw invalidObservation("observation_artifact_total_size_limit");
182
+ budget.seen_artifact_paths.add(artifactPath);
183
+ budget.total_artifact_bytes += bytes;
184
+ }
@@ -0,0 +1,8 @@
1
+ import { type JsonPointerExactBudget, type JsonPointerExactLocator, type JsonPointerExactObservation } from "./long-task-json-pointer-observation.js";
2
+ export declare function extractJsonPointerExactObservation(input: {
3
+ root: string;
4
+ artifact_path: string;
5
+ locator: JsonPointerExactLocator;
6
+ sensitivity: string;
7
+ budget?: JsonPointerExactBudget;
8
+ }): Promise<JsonPointerExactObservation>;
@@ -0,0 +1,58 @@
1
+ import { lstat, open, realpath } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { JSON_POINTER_EXACT_LIMITS, extractJsonPointerExactObservationFromBytes, invalidObservation, normalizeObservationArtifactPath, } from "./long-task-json-pointer-observation.js";
4
+ export async function extractJsonPointerExactObservation(input) {
5
+ const artifactPath = normalizeObservationArtifactPath(input.artifact_path);
6
+ const root = path.resolve(input.root);
7
+ const resolved = path.resolve(root, ...artifactPath.split("/"));
8
+ assertContained(root, resolved);
9
+ await rejectSymbolicPath(root, artifactPath);
10
+ const [rootReal, fileReal] = await Promise.all([
11
+ realpath(root),
12
+ realpath(resolved),
13
+ ]);
14
+ assertContained(rootReal, fileReal);
15
+ const before = await lstat(resolved);
16
+ if (!before.isFile())
17
+ throw invalidObservation("observation_artifact_not_file");
18
+ if (before.size > JSON_POINTER_EXACT_LIMITS.max_file_bytes)
19
+ throw invalidObservation("observation_artifact_size_limit");
20
+ const handle = await open(resolved, "r");
21
+ try {
22
+ const opened = await handle.stat();
23
+ assertSameFile(before, opened);
24
+ const bytes = await handle.readFile();
25
+ const after = await handle.stat();
26
+ assertSameFile(opened, after);
27
+ return extractJsonPointerExactObservationFromBytes({
28
+ artifact_path: artifactPath,
29
+ bytes,
30
+ locator: input.locator,
31
+ sensitivity: input.sensitivity,
32
+ budget: input.budget,
33
+ });
34
+ }
35
+ finally {
36
+ await handle.close();
37
+ }
38
+ }
39
+ function assertContained(root, target) {
40
+ const relative = path.relative(root, target);
41
+ if (!relative || relative.startsWith("..") || path.isAbsolute(relative))
42
+ throw invalidObservation("observation_artifact_path_escape");
43
+ }
44
+ async function rejectSymbolicPath(root, relative) {
45
+ let current = root;
46
+ for (const segment of relative.split("/")) {
47
+ current = path.join(current, segment);
48
+ const entry = await lstat(current);
49
+ if (entry.isSymbolicLink())
50
+ throw invalidObservation("observation_artifact_symlink");
51
+ }
52
+ }
53
+ function assertSameFile(before, after) {
54
+ if (before.dev !== after.dev ||
55
+ before.ino !== after.ino ||
56
+ before.size !== after.size)
57
+ throw invalidObservation("observation_artifact_changed_during_read");
58
+ }
@@ -0,0 +1,17 @@
1
+ import type { CompiledDesignTargetV2, CompiledObservationAuthorityV2, DeliveryCheckV2, ExecutionTargetV2, FrozenRunnerV2, SemanticFactExpectationV2, SourceBackedExecutionTargetV2, WorkspaceManifestV2 } from "./long-task-delivery-types.js";
2
+ import type { ScopedDeliveryBindingV2 } from "./long-task-scoped-binding.js";
3
+ interface CompileObservationAuthorityPlanInput {
4
+ check: DeliveryCheckV2;
5
+ outcome_key: string | null;
6
+ runner: FrozenRunnerV2;
7
+ execution_target: ExecutionTargetV2;
8
+ design_targets: CompiledDesignTargetV2[];
9
+ semantic_fact_expectations: SemanticFactExpectationV2[];
10
+ production_bindings: ScopedDeliveryBindingV2[];
11
+ production_owner_paths: string[];
12
+ source_backed_execution_target: SourceBackedExecutionTargetV2 | null;
13
+ workspace_manifest: WorkspaceManifestV2;
14
+ protected_authority_paths?: readonly string[];
15
+ }
16
+ export declare function compileObservationAuthorityPlan(input: CompileObservationAuthorityPlanInput): CompiledObservationAuthorityV2[];
17
+ export {};
@@ -0,0 +1,348 @@
1
+ import { JSON_POINTER_EXACT_METHODS, isJsonPointerExactOracle, } from "./long-task-json-pointer-observation.js";
2
+ import { classifyMachineObservationCarrierRoleConflict } from "./long-task-admitted-observation.js";
3
+ import { canonicalValueJson, sha256Hex } from "./strict-codec.js";
4
+ import { classifyRepositoryPatternOverlap, normalizeRepositoryFile, } from "./long-task-paths.js";
5
+ const PROCESS_DERIVED_CAPABILITIES = new Set([
6
+ "presence",
7
+ "target_runtime",
8
+ ]);
9
+ const PROCESS_CAPABILITIES_REQUIRING_A_SEPARATE_PACKAGE_DERIVATION = new Set([
10
+ "interaction_trace",
11
+ "state_delta",
12
+ "design_conformance",
13
+ ]);
14
+ const STATIC_DERIVED_CAPABILITIES = new Set(["presence"]);
15
+ export function compileObservationAuthorityPlan(input) {
16
+ const assertions = new Map([
17
+ ...input.check.positive_assertions,
18
+ ...input.check.negative_assertions,
19
+ ].map((assertion) => [assertion.key, assertion]));
20
+ const candidates = [];
21
+ const factBoundAssertions = new Set();
22
+ for (const expectation of input.semantic_fact_expectations) {
23
+ if (expectation.observer_refs.length)
24
+ fail("semantic_fact_machine_observer_not_admitted", `${expectation.proof_ref}:observer_results_package_channel_unavailable:${expectation.observer_refs.join(",")}`);
25
+ const assertion = requiredAssertion(assertions, expectation.assertion_ref, `semantic_fact_machine_observer_not_admitted:${expectation.proof_ref}`);
26
+ factBoundAssertions.add(assertion.key);
27
+ candidates.push({
28
+ obligation_ref: expectation.proof_ref,
29
+ observation_identity: expectation.fact_ref,
30
+ fact_ref: expectation.fact_ref,
31
+ assertion,
32
+ target_ref: input.check.execution_target.target_ref,
33
+ method: expectation.method,
34
+ expected_value_sha256: expectation.expected.sha256,
35
+ actual_projection: "raw_exact",
36
+ comparison: {
37
+ comparator: expectation.comparison.comparator,
38
+ mode: expectation.comparison.mode,
39
+ parameters_sha256: expectation.comparison.parameters.sha256,
40
+ tolerance_sha256: expectation.comparison.tolerance?.sha256 ?? null,
41
+ mask_sha256: expectation.comparison.mask?.sha256 ?? null,
42
+ },
43
+ sensitivity: expectation.observation_sensitivity,
44
+ oracle: expectation.oracle,
45
+ diagnostic_scope: "semantic_fact",
46
+ });
47
+ }
48
+ for (const target of input.design_targets) {
49
+ if (target.target_ref !== input.check.execution_target.target_ref)
50
+ fail("machine_observer_not_admitted", `${target.key}:target_mismatch:${target.target_ref}:${input.check.execution_target.target_ref}`);
51
+ for (const binding of target.verification_method_bindings)
52
+ for (const artifact of binding.evidence_artifacts)
53
+ for (const expectation of artifact.fact_expectations) {
54
+ const assertion = requiredAssertion(assertions, binding.assertion_ref, `machine_observer_not_admitted:${target.key}:${binding.method}`);
55
+ factBoundAssertions.add(assertion.key);
56
+ candidates.push({
57
+ obligation_ref: designGroundObligationRef(target.key, binding.method, artifact.condition_key, expectation.fact_ref),
58
+ observation_identity: expectation.fact_ref,
59
+ fact_ref: expectation.fact_ref,
60
+ assertion,
61
+ target_ref: target.target_ref,
62
+ method: binding.method,
63
+ expected_value_sha256: expectation.expected.sha256,
64
+ actual_projection: "raw_exact",
65
+ comparison: {
66
+ comparator: expectation.comparison.comparator,
67
+ mode: expectation.comparison.mode,
68
+ parameters_sha256: expectation.comparison.parameters.sha256,
69
+ tolerance_sha256: expectation.comparison.tolerance?.sha256 ?? null,
70
+ mask_sha256: expectation.comparison.mask?.sha256 ?? null,
71
+ },
72
+ sensitivity: expectation.observation_sensitivity,
73
+ oracle: expectation.oracle,
74
+ diagnostic_scope: "design_fact",
75
+ });
76
+ }
77
+ for (const binding of target.symbolic_method_bindings ?? [])
78
+ for (const expectation of binding.rule_expectations) {
79
+ const assertion = requiredAssertion(assertions, binding.assertion_ref, `machine_observer_not_admitted:${target.key}:${binding.method}`);
80
+ factBoundAssertions.add(assertion.key);
81
+ if (expectation.proof_surface !== input.check.proof_surface)
82
+ fail("unsupported_observer_requires_external_confirmation", `${target.key}:${expectation.obligation_ref}:proof_surface_mismatch`);
83
+ candidates.push({
84
+ obligation_ref: expectation.obligation_ref,
85
+ observation_identity: expectation.obligation_ref,
86
+ fact_ref: expectation.fact_rule_ref,
87
+ assertion,
88
+ target_ref: target.target_ref,
89
+ method: binding.method,
90
+ expected_value_sha256: expectation.expected.sha256,
91
+ actual_projection: "raw_exact",
92
+ comparison: {
93
+ comparator: expectation.comparison.comparator,
94
+ mode: expectation.comparison.mode,
95
+ parameters_sha256: expectation.comparison.parameters.sha256,
96
+ tolerance_sha256: expectation.comparison.tolerance?.sha256 ?? null,
97
+ mask_sha256: expectation.comparison.mask?.sha256 ?? null,
98
+ },
99
+ sensitivity: expectation.observation_sensitivity,
100
+ oracle: expectation.oracle,
101
+ diagnostic_scope: "design_fact",
102
+ });
103
+ }
104
+ }
105
+ for (const assertion of assertions.values()) {
106
+ if (factBoundAssertions.has(assertion.key))
107
+ continue;
108
+ const expected = exactAssertionExpected(assertion);
109
+ const obligationRef = assertionObligationRef(input.outcome_key, input.check.key, assertion.key);
110
+ candidates.push({
111
+ obligation_ref: obligationRef,
112
+ observation_identity: obligationRef,
113
+ fact_ref: null,
114
+ assertion,
115
+ target_ref: input.check.execution_target.target_ref,
116
+ method: "exact_value",
117
+ expected_value_sha256: sha256Hex(canonicalValueJson(expected)),
118
+ actual_projection: assertionActualProjection(assertion),
119
+ comparison: {
120
+ comparator: "exact_value",
121
+ mode: "exact",
122
+ parameters_sha256: sha256Hex(canonicalValueJson({ comparator: "exact_value" })),
123
+ tolerance_sha256: null,
124
+ mask_sha256: null,
125
+ },
126
+ sensitivity: "plain",
127
+ diagnostic_scope: "assertion",
128
+ });
129
+ }
130
+ const rows = candidates.map((candidate) => compileCandidate(input, candidate));
131
+ assertUniqueRows(rows);
132
+ return rows.sort((left, right) => canonicalValueJson(left).localeCompare(canonicalValueJson(right)));
133
+ }
134
+ function compileCandidate(input, candidate) {
135
+ const unimplementedDerivedCapability = candidate.assertion.evidence_capabilities.find((capability) => PROCESS_CAPABILITIES_REQUIRING_A_SEPARATE_PACKAGE_DERIVATION.has(capability));
136
+ if (unimplementedDerivedCapability)
137
+ fail("unsupported_observer_requires_external_confirmation", `${candidate.obligation_ref}:${unimplementedDerivedCapability}:package_derivation_required`);
138
+ if (candidate.oracle && !isJsonPointerExactOracle(candidate.oracle))
139
+ fail("custom_oracle_machine_completion_forbidden", `${candidate.diagnostic_scope}:${candidate.obligation_ref}:${candidate.oracle.identity ?? "unknown"}`);
140
+ if (!JSON_POINTER_EXACT_METHODS.includes(candidate.method) ||
141
+ candidate.comparison.comparator !== "exact_value" ||
142
+ candidate.comparison.mode !== "exact" ||
143
+ candidate.comparison.tolerance_sha256 !== null ||
144
+ candidate.comparison.mask_sha256 !== null ||
145
+ candidate.sensitivity !== "plain")
146
+ fail(candidate.diagnostic_scope === "semantic_fact"
147
+ ? "semantic_fact_machine_observer_not_admitted"
148
+ : "unsupported_observer_requires_external_confirmation", `${candidate.diagnostic_scope}:${candidate.obligation_ref}:plain_exact_json_required`);
149
+ const authority = selectAuthority(input, candidate);
150
+ const carrierRefs = productionCarrierRefs(input);
151
+ if (authority === "package_static_json_exact") {
152
+ if (!carrierRefs.length)
153
+ fail("machine_observer_not_admitted", `${candidate.obligation_ref}:production_binding_carrier_required`);
154
+ if (carrierRefs.length !== 1)
155
+ fail("machine_observer_not_admitted", `${candidate.obligation_ref}:static_production_binding_ambiguous`);
156
+ const staticPaths = carrierRefs[0].carrier_paths;
157
+ if (staticPaths.length !== 1 || !isExactRepositoryFile(staticPaths[0]))
158
+ fail("machine_observer_not_admitted", `${candidate.obligation_ref}:static_production_carrier_exact_path_required`);
159
+ }
160
+ if (authority === "package_static_json_exact")
161
+ for (const carrierPath of carrierRefs.flatMap((carrier) => carrier.carrier_paths)) {
162
+ const carrierRoleIssue = staticObservationCarrierRoleConflict(input, carrierPath);
163
+ if (carrierRoleIssue)
164
+ fail("machine_observer_not_admitted", `${candidate.obligation_ref}:${carrierRoleIssue}`);
165
+ }
166
+ const comparison = candidate.comparison;
167
+ const expectedIdentity = sha256Hex(canonicalValueJson({
168
+ obligation_ref: candidate.obligation_ref,
169
+ fact_ref: candidate.fact_ref,
170
+ method: candidate.method,
171
+ expected_value_sha256: candidate.expected_value_sha256,
172
+ comparison,
173
+ actual_projection: candidate.actual_projection,
174
+ carrier_refs: carrierRefs,
175
+ }));
176
+ return {
177
+ obligation_ref: candidate.obligation_ref,
178
+ fact_ref: candidate.fact_ref,
179
+ assertion_ref: candidate.assertion.key,
180
+ claim_refs: [...candidate.assertion.claims].sort(),
181
+ target_ref: candidate.target_ref,
182
+ proof_surface: input.check.proof_surface,
183
+ method: candidate.method,
184
+ evidence_capabilities: [
185
+ ...candidate.assertion.evidence_capabilities,
186
+ ].sort(),
187
+ authority,
188
+ expected_identity: expectedIdentity,
189
+ expected_value_sha256: candidate.expected_value_sha256,
190
+ actual_projection: candidate.actual_projection,
191
+ observation_identity: candidate.observation_identity,
192
+ comparison,
193
+ locator_policy: {
194
+ kind: "fixed_json_pointer",
195
+ value: observationPointer(candidate.observation_identity),
196
+ },
197
+ carrier_refs: carrierRefs,
198
+ runtime_requirements: runtimeRequirements(input),
199
+ };
200
+ }
201
+ function selectAuthority(input, candidate) {
202
+ const target = input.execution_target;
203
+ if (target.role !== "product")
204
+ fail("unsupported_observer_requires_external_confirmation", `${candidate.obligation_ref}:product_target_required`);
205
+ if (input.check.proof_surface === "implementation_structure") {
206
+ if (!input.check.input_paths.length)
207
+ fail("machine_observer_not_admitted", `${candidate.obligation_ref}:static_carrier_required`);
208
+ if (!capabilitiesAdmitted(candidate.assertion.evidence_capabilities, admittedCapabilities(candidate, STATIC_DERIVED_CAPABILITIES)))
209
+ fail("unsupported_observer_requires_external_confirmation", `${candidate.obligation_ref}:static_capability_not_admitted`);
210
+ return "package_static_json_exact";
211
+ }
212
+ if (target.runtime_family !== "process" ||
213
+ input.check.proof_surface === "ui_browser" ||
214
+ input.check.proof_surface === "population_coverage")
215
+ fail("unsupported_observer_requires_external_confirmation", `${candidate.obligation_ref}:${target.runtime_family}:${input.check.proof_surface}`);
216
+ if (input.check.runner.type !== "project_binary" ||
217
+ input.check.execution_target.entrypoint !== "root" ||
218
+ input.runner.resolved_target !== target.root_entrypoint)
219
+ fail("process_observer_direct_root_required", `${candidate.obligation_ref}:${input.runner.resolved_target}:${target.root_entrypoint}`);
220
+ if (!target.root_argv)
221
+ fail("process_observer_root_invocation_required", candidate.obligation_ref);
222
+ if (!sameStringArray(input.check.runner.argv, target.root_argv))
223
+ fail("process_observer_root_argv_mismatch", `${candidate.obligation_ref}:${canonicalValueJson(input.check.runner.argv)}:${canonicalValueJson(target.root_argv)}`);
224
+ if (!capabilitiesAdmitted(candidate.assertion.evidence_capabilities, admittedCapabilities(candidate, PROCESS_DERIVED_CAPABILITIES)))
225
+ fail("unsupported_observer_requires_external_confirmation", `${candidate.obligation_ref}:process_capability_not_admitted`);
226
+ return "package_process_json_exact";
227
+ }
228
+ function runtimeRequirements(input) {
229
+ return {
230
+ runtime_family: input.execution_target.runtime_family,
231
+ target_role: input.execution_target.role,
232
+ entrypoint: input.check.execution_target.entrypoint,
233
+ runner_type: input.check.runner.type,
234
+ resolved_runner_target: input.runner.resolved_target,
235
+ declared_root_entrypoint: input.execution_target.root_entrypoint,
236
+ resolved_runner_argv: [...input.runner.argv],
237
+ declared_root_argv: input.execution_target.root_argv
238
+ ? [...input.execution_target.root_argv]
239
+ : null,
240
+ effect: input.check.runner.effect,
241
+ direct_root_match: input.check.runner.type === "project_binary" &&
242
+ input.check.execution_target.entrypoint === "root" &&
243
+ input.runner.resolved_target === input.execution_target.root_entrypoint &&
244
+ input.execution_target.root_argv !== undefined &&
245
+ sameStringArray(input.check.runner.argv, input.execution_target.root_argv),
246
+ };
247
+ }
248
+ function assertionActualProjection(assertion) {
249
+ if (assertion.operator === "equals")
250
+ return "raw_exact";
251
+ if (assertion.operator === "exists")
252
+ return "presence_boolean";
253
+ if (assertion.operator === "truthy")
254
+ return "truthy_boolean";
255
+ if (assertion.operator === "falsy")
256
+ return "falsy_boolean";
257
+ fail("machine_observer_not_admitted", `${assertion.key}:exact_equals_or_host_boolean_required`);
258
+ }
259
+ function staticObservationCarrierRoleConflict(input, carrierPath) {
260
+ const expectedAuthorityPatterns = [
261
+ ...Object.keys(input.runner.frozen_files),
262
+ ...(input.protected_authority_paths ?? []),
263
+ ];
264
+ const evidencePatterns = [
265
+ ...input.check.expected_output_paths,
266
+ ...input.check.artifact_globs,
267
+ ];
268
+ const conflict = classifyMachineObservationCarrierRoleConflict({
269
+ carrier_pattern: carrierPath,
270
+ expected_authority_patterns: expectedAuthorityPatterns,
271
+ evidence_role_patterns: evidencePatterns,
272
+ });
273
+ if (!conflict)
274
+ return null;
275
+ return `static_carrier_${conflict}_forbidden`;
276
+ }
277
+ function sameStringArray(left, right) {
278
+ return (left.length === right.length &&
279
+ left.every((value, index) => value === right[index]));
280
+ }
281
+ function capabilitiesAdmitted(capabilities, admitted) {
282
+ return capabilities.every((capability) => admitted.has(capability));
283
+ }
284
+ function admittedCapabilities(candidate, derived) {
285
+ const admitted = new Set(derived);
286
+ if (candidate.diagnostic_scope === "semantic_fact")
287
+ admitted.add("semantic_fact");
288
+ else if (candidate.diagnostic_scope === "design_fact")
289
+ admitted.add("design_method");
290
+ return admitted;
291
+ }
292
+ function productionCarrierRefs(input) {
293
+ return input.production_bindings
294
+ .map((scoped) => ({
295
+ binding_ref: scoped.binding_ref,
296
+ carrier_paths: scoped.binding.carrier_paths
297
+ .filter((carrier) => input.check.input_paths.some((inputPath) => classifyRepositoryPatternOverlap(carrier, inputPath).status ===
298
+ "proven_overlap"))
299
+ .sort(),
300
+ }))
301
+ .filter((binding) => binding.carrier_paths.length)
302
+ .sort((left, right) => left.binding_ref.localeCompare(right.binding_ref));
303
+ }
304
+ function isExactRepositoryFile(value) {
305
+ try {
306
+ normalizeRepositoryFile(value, "static_observation_carrier");
307
+ return true;
308
+ }
309
+ catch {
310
+ return false;
311
+ }
312
+ }
313
+ function exactAssertionExpected(assertion) {
314
+ if (assertion.operator === "equals")
315
+ return assertion.expected;
316
+ if (assertion.operator === "truthy" || assertion.operator === "exists")
317
+ return true;
318
+ if (assertion.operator === "falsy")
319
+ return false;
320
+ fail("machine_observer_not_admitted", `${assertion.key}:exact_equals_or_host_boolean_required`);
321
+ }
322
+ function requiredAssertion(assertions, assertionRef, diagnostic) {
323
+ const assertion = assertions.get(assertionRef);
324
+ if (!assertion)
325
+ throw new Error(diagnostic);
326
+ return assertion;
327
+ }
328
+ function assertionObligationRef(outcomeKey, checkKey, assertionKey) {
329
+ return `assertion.${outcomeKey ?? "GLOBAL"}.${checkKey}.${assertionKey}`;
330
+ }
331
+ function designGroundObligationRef(targetKey, method, conditionKey, factRef) {
332
+ return `design.${targetKey}.${method}.${conditionKey}.${factRef}`;
333
+ }
334
+ function observationPointer(identity) {
335
+ return `/observations/${identity.replace(/~/gu, "~0").replace(/\//gu, "~1")}`;
336
+ }
337
+ function assertUniqueRows(rows) {
338
+ const identities = new Set();
339
+ for (const row of rows) {
340
+ const identity = `${row.assertion_ref}\0${row.obligation_ref}\0${row.method}`;
341
+ if (identities.has(identity))
342
+ fail("machine_observer_not_admitted", `duplicate:${identity}`);
343
+ identities.add(identity);
344
+ }
345
+ }
346
+ function fail(code, detail) {
347
+ throw new Error(`${code}:${detail}`);
348
+ }
@@ -405,7 +405,7 @@ function canonicalRepositoryPath(value, label, kind) {
405
405
  throw new Error(`non_canonical_repository_path_dot_segment:${label}:${value}`);
406
406
  if (segments.includes(".."))
407
407
  throw new Error(`unsafe_path:${label}:${value}`);
408
- if (kind !== "pattern" && /[*?\[\]{}()]/u.test(normalized))
408
+ if (kind !== "pattern" && /[*?\[\]{}]/u.test(normalized))
409
409
  throw new Error(`unsupported_repository_path_syntax:${label}:${value}`);
410
410
  return normalized;
411
411
  }
@@ -0,0 +1,6 @@
1
+ import type { CompiledObservationAuthorityV2, PackageProcessObservationV1 } from "./long-task-runtime-types.js";
2
+ export declare const PRODUCT_OBSERVATION_SCHEMA_VERSION: "ty-context-product-observation-v1";
3
+ export declare function decodeProductObservationEnvelope(input: {
4
+ bytes: Uint8Array;
5
+ authorities: readonly CompiledObservationAuthorityV2[];
6
+ }): PackageProcessObservationV1;