project-tiny-context-harness 0.7.3 → 0.7.4

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 (75) hide show
  1. package/README.md +2 -2
  2. package/assets/README.md +44 -11
  3. package/assets/README.zh-CN.md +21 -10
  4. package/assets/agents/AGENTS_CORE.md +2 -2
  5. package/assets/skills/long-task-workflow/SKILL.md +9 -9
  6. package/assets/skills/long-task-workflow/references/authority-lifecycle.md +7 -5
  7. package/assets/skills/long-task-workflow/references/contract-authoring.md +17 -3
  8. package/assets/skills/long-task-workflow/references/evidence-design.md +12 -1
  9. package/dist/commands/long-task-authoring.js +25 -0
  10. package/dist/commands/long-task.js +3 -0
  11. package/dist/lib/long-task-activation-validation.js +13 -2
  12. package/dist/lib/long-task-authoring-authority-preview.js +1 -0
  13. package/dist/lib/long-task-authority-material-diff.js +26 -0
  14. package/dist/lib/long-task-authority-materials.d.ts +2 -2
  15. package/dist/lib/long-task-authority-materials.js +6 -0
  16. package/dist/lib/long-task-authority-policy.d.ts +12 -0
  17. package/dist/lib/long-task-authority-policy.js +9 -0
  18. package/dist/lib/long-task-authority-revision-analysis.d.ts +33 -0
  19. package/dist/lib/long-task-authority-revision-analysis.js +91 -0
  20. package/dist/lib/long-task-authority-revision.js +93 -158
  21. package/dist/lib/long-task-authority-types.d.ts +7 -0
  22. package/dist/lib/long-task-authority.js +32 -3
  23. package/dist/lib/long-task-check-evidence-decoder.d.ts +2 -2
  24. package/dist/lib/long-task-check-evidence-decoder.js +11 -1
  25. package/dist/lib/long-task-check-execution-policy.d.ts +3 -0
  26. package/dist/lib/long-task-check-execution-policy.js +5 -0
  27. package/dist/lib/long-task-check-runner.js +2 -0
  28. package/dist/lib/long-task-check-shape.js +33 -3
  29. package/dist/lib/long-task-conformance-policy.d.ts +5 -0
  30. package/dist/lib/long-task-conformance-policy.js +35 -0
  31. package/dist/lib/long-task-contract-types.d.ts +14 -4
  32. package/dist/lib/long-task-delivery-compiler.js +1 -0
  33. package/dist/lib/long-task-delivery-parser.js +5 -2
  34. package/dist/lib/long-task-delivery-types.d.ts +2 -0
  35. package/dist/lib/long-task-delivery-types.js +2 -0
  36. package/dist/lib/long-task-delivery-validation.js +11 -0
  37. package/dist/lib/long-task-evidence-capability-codec.d.ts +2 -0
  38. package/dist/lib/long-task-evidence-capability-codec.js +231 -0
  39. package/dist/lib/long-task-evidence-capability-policy.d.ts +8 -0
  40. package/dist/lib/long-task-evidence-capability-policy.js +147 -0
  41. package/dist/lib/long-task-evidence-capability-runtime.d.ts +2 -0
  42. package/dist/lib/long-task-evidence-capability-runtime.js +86 -0
  43. package/dist/lib/long-task-evidence-capability-types.d.ts +74 -0
  44. package/dist/lib/long-task-evidence-capability-types.js +1 -0
  45. package/dist/lib/long-task-evidence-findings.js +5 -1
  46. package/dist/lib/long-task-evidence-v2.js +38 -23
  47. package/dist/lib/long-task-final-v2.js +42 -1
  48. package/dist/lib/long-task-outcome-parser.js +14 -3
  49. package/dist/lib/long-task-playwright-evidence.d.ts +2 -1
  50. package/dist/lib/long-task-playwright-evidence.js +70 -2
  51. package/dist/lib/long-task-progress.js +4 -0
  52. package/dist/lib/long-task-root-shape.d.ts +1 -0
  53. package/dist/lib/long-task-root-shape.js +84 -3
  54. package/dist/lib/long-task-runner-environment.js +1 -1
  55. package/dist/lib/long-task-runner-freeze.d.ts +2 -2
  56. package/dist/lib/long-task-runner-freeze.js +3 -1
  57. package/dist/lib/long-task-runtime-types.d.ts +13 -0
  58. package/dist/lib/long-task-semantic-contract-types.d.ts +36 -0
  59. package/dist/lib/long-task-semantic-contract-types.js +1 -0
  60. package/dist/lib/long-task-semantic-drift-migration.d.ts +3 -0
  61. package/dist/lib/long-task-semantic-drift-migration.js +68 -0
  62. package/dist/lib/long-task-shape-primitives.d.ts +3 -0
  63. package/dist/lib/long-task-shape-primitives.js +25 -0
  64. package/dist/lib/long-task-stage-policy.d.ts +4 -0
  65. package/dist/lib/long-task-stage-policy.js +120 -0
  66. package/dist/lib/long-task-status-projection.d.ts +4 -1
  67. package/dist/lib/long-task-status-projection.js +63 -3
  68. package/dist/lib/long-task-status-v2.d.ts +11 -1
  69. package/dist/lib/long-task-status-v2.js +25 -3
  70. package/dist/lib/long-task-target-policy.d.ts +6 -0
  71. package/dist/lib/long-task-target-policy.js +127 -0
  72. package/dist/lib/migrations.js +29 -0
  73. package/dist/schemas/long-task-delivery-v2/long-task-delivery-v2.schema.json +61 -7
  74. package/migrations/README.md +7 -0
  75. package/package.json +2 -2
@@ -0,0 +1,127 @@
1
+ export function validateExecutionTargets(contract, report) {
2
+ const targets = indexExecutionTargets(contract, report);
3
+ const requiredTargetRefs = contract.task.target_profile.required_target_refs;
4
+ validateRequiredTargetRefs(contract, targets, report);
5
+ for (const [outcomeKey, check] of allChecks(contract))
6
+ validateCheckTarget(outcomeKey, check, targets, report);
7
+ validateCriticalPathTargets(contract, requiredTargetRefs, report);
8
+ }
9
+ function indexExecutionTargets(contract, report) {
10
+ const targets = new Map();
11
+ for (const target of contract.task.execution_targets) {
12
+ if (targets.has(target.key))
13
+ issue(report, "execution_target_key_duplicate", target.key);
14
+ targets.set(target.key, target);
15
+ }
16
+ if (![...targets.values()].some((target) => target.role === "product"))
17
+ issue(report, "product_execution_target_required", contract.task.id);
18
+ return targets;
19
+ }
20
+ function validateRequiredTargetRefs(contract, targets, report) {
21
+ const required = contract.task.target_profile.required_target_refs;
22
+ if (!required.length)
23
+ issue(report, "target_profile_required_target_refs_required", contract.task.id);
24
+ if (new Set(required).size !== required.length)
25
+ issue(report, "target_profile_required_target_refs_duplicate", contract.task.id);
26
+ for (const targetRef of required) {
27
+ const target = targets.get(targetRef);
28
+ if (!target)
29
+ issue(report, "target_profile_required_target_ref_unknown", targetRef);
30
+ else if (target.role !== "product")
31
+ issue(report, "target_profile_required_target_must_be_product", targetRef);
32
+ }
33
+ }
34
+ function validateCheckTarget(outcomeKey, check, targets, report) {
35
+ const target = targets.get(check.execution_target.target_ref);
36
+ const label = `${outcomeKey ?? "GLOBAL"}:${check.key}`;
37
+ if (!target) {
38
+ issue(report, "check_execution_target_unknown", `${label}:${check.execution_target.target_ref}`);
39
+ return;
40
+ }
41
+ if ((check.runner.type === "playwright_test" ||
42
+ check.proof_surface === "ui_browser") &&
43
+ target.runtime_family !== "browser")
44
+ issue(report, "browser_check_target_mismatch", `${label}:${target.key}`);
45
+ if (provesTargetRuntime(check) &&
46
+ target.runtime_family === "browser" &&
47
+ check.runner.type !== "playwright_test")
48
+ issue(report, "browser_target_runtime_requires_playwright", `${label}:${target.key}`);
49
+ if (provesTargetRuntime(check) &&
50
+ ["native", "desktop"].includes(target.runtime_family) &&
51
+ check.runner.type !== "project_binary")
52
+ issue(report, "native_target_runtime_requires_project_binary", `${label}:${target.key}`);
53
+ validateStageGateTarget(label, check, target, report);
54
+ validateConformanceTarget(outcomeKey, check, target, report);
55
+ }
56
+ function validateStageGateTarget(label, check, target, report) {
57
+ if (!check.journey_roles.includes("stage_gate"))
58
+ return;
59
+ if (target.role !== "product")
60
+ issue(report, "stage_gate_product_target_required", `${label}:${target.key}`);
61
+ if (check.execution_target.entrypoint !== "root")
62
+ issue(report, "stage_gate_root_entrypoint_required", label);
63
+ }
64
+ function validateConformanceTarget(outcomeKey, check, target, report) {
65
+ if (!check.journey_roles.includes("conformance"))
66
+ return;
67
+ if (outcomeKey !== null)
68
+ issue(report, "conformance_check_must_be_global", `${outcomeKey}:${check.key}`);
69
+ if (target.role !== "product" || check.execution_target.entrypoint !== "root")
70
+ issue(report, "conformance_root_product_target_required", check.key);
71
+ }
72
+ function validateCriticalPathTargets(contract, requiredTargetRefs, report) {
73
+ for (const outcomeKey of contract.risk.facts.critical_user_path) {
74
+ const outcome = contract.outcomes.find((candidate) => candidate.key === outcomeKey);
75
+ if (!outcome)
76
+ continue;
77
+ for (const targetRef of requiredTargetRefs)
78
+ if (!outcome.acceptance.checks.some((check) => provesSuccess(check, targetRef)))
79
+ issue(report, "critical_path_required_target_proof_missing", `${outcome.key}:${targetRef}`);
80
+ }
81
+ }
82
+ function provesSuccess(check, targetRef) {
83
+ return (check.execution_target.target_ref === targetRef &&
84
+ check.journey_roles.includes("success") &&
85
+ check.execution_target.entrypoint === "root" &&
86
+ provesTargetRuntime(check));
87
+ }
88
+ function provesTargetRuntime(check) {
89
+ return [...check.positive_assertions, ...check.negative_assertions].some((assertion) => assertion.evidence_capabilities.includes("target_runtime"));
90
+ }
91
+ export function validateExternalConfirmationImpacts(contract, claims, report) {
92
+ const claimRefs = new Set();
93
+ for (const [outcomeKey, values] of Object.entries(claims.by_outcome))
94
+ for (const claim of values)
95
+ claimRefs.add(`${outcomeKey}.${claim.local_key}`);
96
+ for (const claim of claims.by_global)
97
+ claimRefs.add(`GLOBAL.${claim.local_key}`);
98
+ for (const confirmation of contract.global.acceptance
99
+ .external_confirmations) {
100
+ if (!confirmation.impact_claims.length)
101
+ issue(report, "external_confirmation_impact_required", confirmation.key);
102
+ for (const claim of confirmation.impact_claims)
103
+ if (!claimRefs.has(claim))
104
+ issue(report, "external_confirmation_impact_unknown", `${confirmation.key}:${claim}`);
105
+ if (confirmation.kind === "functional_prerequisite" &&
106
+ !confirmation.blocks_target)
107
+ issue(report, "functional_prerequisite_must_block_target", confirmation.key);
108
+ if (confirmation.kind === "production_release_gate" &&
109
+ contract.task.target_profile.required_state ===
110
+ "production_release_ready" &&
111
+ !confirmation.blocks_target)
112
+ issue(report, "production_gate_must_block_release_target", confirmation.key);
113
+ }
114
+ }
115
+ function allChecks(contract) {
116
+ return [
117
+ ...contract.global.acceptance.checks.map((check) => [null, check]),
118
+ ...contract.outcomes.flatMap((outcome) => outcome.acceptance.checks.map((check) => [outcome.key, check])),
119
+ ];
120
+ }
121
+ function issue(report, code, detail) {
122
+ const message = `delivery_contract_invalid:${code}:${detail}`;
123
+ if (report)
124
+ report(message);
125
+ else
126
+ throw new Error(message);
127
+ }
@@ -9,11 +9,22 @@ import { ensureDir, listFiles, pathExists, readText, writeTextIfChanged, } from
9
9
  import { harnessConfigPath, harnessRoot } from "./harness-root.js";
10
10
  import { legacySdlcHarnessMigration } from "./legacy-sdlc-migration.js";
11
11
  import { parseYaml, stringifyYaml } from "./yaml.js";
12
+ import { semanticDriftMigrationFields } from "./long-task-semantic-drift-migration.js";
12
13
  async function verifyNoop() {
13
14
  return;
14
15
  }
15
16
  export const migrations = [
16
17
  legacySdlcHarnessMigration,
18
+ {
19
+ id: "long-task-v2-semantic-drift-authority",
20
+ introducedIn: "0.7.2",
21
+ description: "Require explicit Stage, target profile/root runtime, journey scenario and evidence-capability authority in V2 Long-Task Contracts.",
22
+ scope: ".long-task/delivery-contract.yaml",
23
+ risk: "manual",
24
+ manualMessage: "These product and proof semantics cannot be inferred safely. Preserve Source, then explicitly author stages, vertical Outcome membership, target profile and execution targets, success/degradation requirements, Given/When scenarios, evidence capabilities and typed external-confirmation impact before recompiling. Historical Progress and Receipts remain audit-only and must not be imported as acceptance.",
25
+ detect: detectLongTaskSemanticDriftAuthority,
26
+ verify: verifyNoop,
27
+ },
17
28
  {
18
29
  id: "long-task-v1-retirement",
19
30
  introducedIn: "0.6.0",
@@ -102,6 +113,24 @@ export const migrations = [
102
113
  verify: verifyNoop,
103
114
  },
104
115
  ];
116
+ async function detectLongTaskSemanticDriftAuthority(projectRoot, _root, migration) {
117
+ const contract = path.join(projectRoot, ".long-task", "delivery-contract.yaml");
118
+ if (!(await pathExists(contract)))
119
+ return [];
120
+ let decoded;
121
+ try {
122
+ decoded = parseYaml(await readText(contract));
123
+ }
124
+ catch {
125
+ return [];
126
+ }
127
+ const fields = semanticDriftMigrationFields(decoded);
128
+ if (!fields.length)
129
+ return [];
130
+ return [
131
+ item(migration, "manual_required", ".long-task/delivery-contract.yaml", `The active/draft V2 Contract predates semantic-drift authority and is missing: ${fields.slice(0, 12).join(", ")}${fields.length > 12 ? `, +${fields.length - 12} more` : ""}. Re-author these meanings from Source; do not synthesize them from old passing evidence.`),
132
+ ];
133
+ }
105
134
  async function detectLongTaskV1Retirement(projectRoot, root, migration) {
106
135
  const items = [];
107
136
  const hook = path.join(projectRoot, root, "hooks", "long-task-hook.mjs");
@@ -4,17 +4,19 @@
4
4
  "title": "Single-Goal Delivery Contract V2",
5
5
  "type": "object",
6
6
  "additionalProperties": false,
7
- "required": ["schema_version", "task", "source_claims", "risk", "global"],
7
+ "required": ["schema_version", "task", "source_claims", "stages", "risk", "global"],
8
8
  "properties": {
9
9
  "schema_version": { "const": "long-task-delivery-v2" },
10
10
  "task": {
11
11
  "type": "object",
12
12
  "additionalProperties": false,
13
- "required": ["id", "title", "goal", "source_paths", "context_refs"],
13
+ "required": ["id", "title", "goal", "target_profile", "execution_targets", "source_paths", "context_refs"],
14
14
  "properties": {
15
15
  "id": { "$ref": "#/$defs/key" },
16
16
  "title": { "$ref": "#/$defs/nonEmpty" },
17
17
  "goal": { "$ref": "#/$defs/nonEmpty" },
18
+ "target_profile": { "$ref": "#/$defs/targetProfile" },
19
+ "execution_targets": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/executionTarget" } },
18
20
  "source_paths": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/nonEmpty" } },
19
21
  "context_refs": { "$ref": "#/$defs/nonEmptyStrings" },
20
22
  "context_snapshot_mode": { "enum": ["referenced", "full"], "default": "referenced" }
@@ -25,6 +27,7 @@
25
27
  "minItems": 1,
26
28
  "items": { "$ref": "#/$defs/sourceClaim" }
27
29
  },
30
+ "stages": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/stage" } },
28
31
  "risk": { "$ref": "#/$defs/risk" },
29
32
  "global": { "$ref": "#/$defs/global" },
30
33
  "outcomes": { "type": "array", "items": { "$ref": "#/$defs/outcome" }, "minItems": 1 },
@@ -38,6 +41,40 @@
38
41
  "key": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
39
42
  "nonEmpty": { "type": "string", "minLength": 1 },
40
43
  "nonEmptyStrings": { "type": "array", "items": { "$ref": "#/$defs/nonEmpty" } },
44
+ "targetProfile": {
45
+ "type": "object",
46
+ "additionalProperties": false,
47
+ "required": ["key", "description", "required_state", "required_target_refs"],
48
+ "properties": {
49
+ "key": { "$ref": "#/$defs/key" },
50
+ "description": { "$ref": "#/$defs/nonEmpty" },
51
+ "required_state": { "enum": ["implementation_complete", "target_profile_usable", "production_release_ready"] },
52
+ "required_target_refs": { "$ref": "#/$defs/keys" }
53
+ }
54
+ },
55
+ "executionTarget": {
56
+ "type": "object",
57
+ "additionalProperties": false,
58
+ "required": ["key", "description", "role", "runtime_family", "root_entrypoint"],
59
+ "properties": {
60
+ "key": { "$ref": "#/$defs/key" },
61
+ "description": { "$ref": "#/$defs/nonEmpty" },
62
+ "role": { "enum": ["product", "support", "observer"] },
63
+ "runtime_family": { "enum": ["browser", "native", "desktop", "service", "process", "external"] },
64
+ "root_entrypoint": { "$ref": "#/$defs/nonEmpty" }
65
+ }
66
+ },
67
+ "stage": {
68
+ "type": "object",
69
+ "additionalProperties": false,
70
+ "required": ["key", "title", "depends_on", "gate_outcome"],
71
+ "properties": {
72
+ "key": { "$ref": "#/$defs/key" },
73
+ "title": { "$ref": "#/$defs/nonEmpty" },
74
+ "depends_on": { "$ref": "#/$defs/keys" },
75
+ "gate_outcome": { "$ref": "#/$defs/key" }
76
+ }
77
+ },
41
78
  "keyedStatement": {
42
79
  "type": "object",
43
80
  "additionalProperties": false,
@@ -114,7 +151,7 @@
114
151
  "properties": {
115
152
  "checks": { "type": "array", "items": { "$ref": "#/$defs/check" }, "default": [] },
116
153
  "counterfactual_controls": { "type": "array", "items": { "$ref": "#/$defs/globalCounterfactual" }, "default": [] },
117
- "external_confirmations": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["key", "description", "owner"], "properties": { "key": { "$ref": "#/$defs/key" }, "description": { "$ref": "#/$defs/nonEmpty" }, "owner": { "$ref": "#/$defs/nonEmpty" } } }, "default": [] }
154
+ "external_confirmations": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["key", "description", "owner", "kind", "impact_claims", "blocks_target"], "properties": { "key": { "$ref": "#/$defs/key" }, "description": { "$ref": "#/$defs/nonEmpty" }, "owner": { "$ref": "#/$defs/nonEmpty" }, "kind": { "enum": ["functional_prerequisite", "field_validation", "production_release_gate", "commercial_activation", "expert_authority"] }, "impact_claims": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "$ref": "#/$defs/nonEmpty" } }, "blocks_target": { "type": "boolean" } } }, "default": [] }
118
155
  },
119
156
  "default": {}
120
157
  }
@@ -123,10 +160,11 @@
123
160
  "outcome": {
124
161
  "type": "object",
125
162
  "additionalProperties": false,
126
- "required": ["key", "title", "product", "technical", "acceptance"],
163
+ "required": ["key", "title", "stage", "product", "technical", "acceptance"],
127
164
  "properties": {
128
165
  "key": { "$ref": "#/$defs/key" },
129
166
  "title": { "$ref": "#/$defs/nonEmpty" },
167
+ "stage": { "$ref": "#/$defs/key" },
130
168
  "depends_on": { "$ref": "#/$defs/keys", "default": [] },
131
169
  "product": { "$ref": "#/$defs/product" },
132
170
  "technical": { "$ref": "#/$defs/technical" },
@@ -136,9 +174,11 @@
136
174
  "product": {
137
175
  "type": "object",
138
176
  "additionalProperties": false,
139
- "required": ["observable_result", "owner"],
177
+ "required": ["observable_result", "success_path_required", "degradation_path_required", "owner"],
140
178
  "properties": {
141
179
  "observable_result": { "$ref": "#/$defs/nonEmpty" },
180
+ "success_path_required": { "type": "boolean" },
181
+ "degradation_path_required": { "type": "boolean" },
142
182
  "owner": { "type": "object", "additionalProperties": false, "required": ["label", "context_refs", "path_globs"], "properties": { "label": { "$ref": "#/$defs/nonEmpty" }, "context_refs": { "$ref": "#/$defs/nonEmptyStrings" }, "path_globs": { "$ref": "#/$defs/nonEmptyStrings" } } },
143
183
  "requirements": { "type": "array", "items": { "$ref": "#/$defs/requirement" }, "default": [] },
144
184
  "owner_surfaces": { "$ref": "#/$defs/nonEmptyStrings", "default": [] },
@@ -204,9 +244,12 @@
204
244
  "check": {
205
245
  "type": "object",
206
246
  "additionalProperties": false,
207
- "required": ["key", "proof_surface", "runner", "verification_inputs"],
247
+ "required": ["key", "journey_roles", "execution_target", "scenario", "proof_surface", "runner", "verification_inputs"],
208
248
  "properties": {
209
249
  "key": { "$ref": "#/$defs/key" },
250
+ "journey_roles": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "enum": ["success", "degradation", "recovery", "stage_gate", "conformance"] } },
251
+ "execution_target": { "type": "object", "additionalProperties": false, "required": ["target_ref", "entrypoint"], "properties": { "target_ref": { "$ref": "#/$defs/key" }, "entrypoint": { "enum": ["root", "internal"] } } },
252
+ "scenario": { "$ref": "#/$defs/scenario" },
210
253
  "proof_surface": { "$ref": "#/$defs/proofSurface" },
211
254
  "runner": { "$ref": "#/$defs/runner" },
212
255
  "verification_inputs": { "$ref": "#/$defs/nonEmptyStrings" },
@@ -236,12 +279,13 @@
236
279
  "assertion": {
237
280
  "type": "object",
238
281
  "additionalProperties": false,
239
- "required": ["key", "claims", "observation", "operator"],
282
+ "required": ["key", "claims", "observation", "operator", "evidence_capabilities"],
240
283
  "properties": {
241
284
  "key": { "$ref": "#/$defs/key" },
242
285
  "criterion": { "$ref": "#/$defs/nonEmpty" },
243
286
  "claims": { "$ref": "#/$defs/nonEmptyStrings" },
244
287
  "observation": { "$ref": "#/$defs/nonEmpty" },
288
+ "evidence_capabilities": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "$ref": "#/$defs/evidenceCapability" } },
245
289
  "operator": { "enum": ["equals", "not_equals", "contains", "not_contains", "matches", "not_matches", "greater_than", "greater_or_equal", "less_than", "less_or_equal", "truthy", "falsy", "exists", "set_equals", "subset_of", "superset_of"] },
246
290
  "expected": true
247
291
  },
@@ -268,6 +312,16 @@
268
312
  }
269
313
  ]
270
314
  },
315
+ "scenario": {
316
+ "type": "object",
317
+ "additionalProperties": false,
318
+ "required": ["given", "when"],
319
+ "properties": {
320
+ "given": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/keyedStatement" } },
321
+ "when": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/keyedStatement" } }
322
+ }
323
+ },
324
+ "evidenceCapability": { "enum": ["presence", "interaction_trace", "state_delta", "cross_surface_consistency", "durable_readback", "boundary_invocation", "external_side_effect", "failure_injection", "visual_render", "target_runtime", "input_variation"] },
271
325
  "environment": {
272
326
  "oneOf": [
273
327
  {
@@ -6,3 +6,10 @@ Version 0.6.0 includes `long-task-v1-retirement`. It safely removes the
6
6
  retired repo-local Hook, reports a legacy active projection as
7
7
  `manual_required`, and deliberately does not import V1 progress or receipts
8
8
  into the V2 Claim/Evidence authority.
9
+
10
+ Version 0.7.2 includes `long-task-v2-semantic-drift-authority`. It reports a
11
+ conventional `.long-task/delivery-contract.yaml` as `manual_required` when the
12
+ V2 file predates explicit Stage, target-profile/root-runtime, journey-scenario,
13
+ success/degradation, evidence-capability or external-impact authority. Those
14
+ meanings must be re-authored from Source; migration never infers them from old
15
+ Progress or Receipts.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "project-tiny-context-harness",
3
- "version": "0.7.3",
3
+ "version": "0.7.4",
4
4
  "description": "Minimal project memory and validation harness for AI coding agents.",
5
5
  "license": "MIT",
6
6
  "author": "Seven128",
@@ -58,7 +58,7 @@
58
58
  "pretest": "npm run build",
59
59
  "test": "npm run test:built",
60
60
  "test:workflow-default:built": "node --test --test-concurrency=1 ../../tests/ty-context/workflow-contract-routing.test.mjs",
61
- "test:delivery-contract:built": "node --test --test-concurrency=1 ../../tests/ty-context/long-task-compact-authoring.test.mjs ../../tests/ty-context/long-task-authoring-claims.test.mjs ../../tests/ty-context/long-task-authoring-preflight.test.mjs ../../tests/ty-context/long-task-authority-authoring-fields.test.mjs ../../tests/ty-context/long-task-playwright-ac-evidence.test.mjs ../../tests/ty-context/long-task-delivery-parser.test.mjs ../../tests/ty-context/long-task-delivery-compiler.test.mjs ../../tests/ty-context/long-task-delivery-risk.test.mjs ../../tests/ty-context/long-task-claim-coverage.test.mjs ../../tests/ty-context/long-task-closure-invariants.test.mjs ../../tests/ty-context/long-task-source-authority-closure.test.mjs ../../tests/ty-context/long-task-evidence-sensitivity-policy.test.mjs ../../tests/ty-context/long-task-global-evidence-sensitivity.test.mjs ../../tests/ty-context/long-task-source-risk-binding.test.mjs ../../tests/ty-context/long-task-non-completing-source.test.mjs ../../tests/ty-context/long-task-playwright-trust-boundary.test.mjs ../../tests/ty-context/long-task-planned-counterfactual.test.mjs ../../tests/ty-context/long-task-public-contract-example.test.mjs ../../tests/ty-context/long-task-release-tarball-contract.test.mjs",
61
+ "test:delivery-contract:built": "node --test --test-concurrency=1 ../../tests/ty-context/long-task-compact-authoring.test.mjs ../../tests/ty-context/long-task-authoring-claims.test.mjs ../../tests/ty-context/long-task-authoring-preflight.test.mjs ../../tests/ty-context/long-task-authority-authoring-fields.test.mjs ../../tests/ty-context/long-task-playwright-ac-evidence.test.mjs ../../tests/ty-context/long-task-delivery-parser.test.mjs ../../tests/ty-context/long-task-delivery-compiler.test.mjs ../../tests/ty-context/long-task-delivery-risk.test.mjs ../../tests/ty-context/long-task-claim-coverage.test.mjs ../../tests/ty-context/long-task-closure-invariants.test.mjs ../../tests/ty-context/long-task-source-authority-closure.test.mjs ../../tests/ty-context/long-task-evidence-sensitivity-policy.test.mjs ../../tests/ty-context/long-task-global-evidence-sensitivity.test.mjs ../../tests/ty-context/long-task-source-risk-binding.test.mjs ../../tests/ty-context/long-task-non-completing-source.test.mjs ../../tests/ty-context/long-task-playwright-trust-boundary.test.mjs ../../tests/ty-context/long-task-planned-counterfactual.test.mjs ../../tests/ty-context/long-task-public-contract-example.test.mjs ../../tests/ty-context/long-task-release-tarball-contract.test.mjs ../../tests/ty-context/long-task-semantic-drift-closure.test.mjs ../../tests/ty-context/long-task-semantic-drift-lifecycle.test.mjs",
62
62
  "test:delivery-contract": "npm run build && npm run test:delivery-contract:built",
63
63
  "test:long-task-workflow:built": "node ../../tests/ty-context/run-package-suite.mjs long-task",
64
64
  "test:long-task-workflow": "npm run build && npm run test:long-task-workflow:built",