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
@@ -1,6 +1,8 @@
1
1
  import type { DeliveryCheckV2, DeliveryContractV2, DeliveryOutcomeV2, DeliveryRunnerV2, ProofSurface } from "./long-task-contract-types.js";
2
+ import type { EvidenceCapabilityV2, ExecutionTargetV2 } from "./long-task-semantic-contract-types.js";
2
3
  import type { AuthorityHashesV2, ContextAuthoritySnapshotV2, InitialTaskBaseV2, NextAuthorityMaterialsV2, VerifierIdentityV2 } from "./long-task-authority-types.js";
3
4
  import type { EvidenceAdapter } from "./long-task-evidence-adapter-types.js";
5
+ import type { EvidenceCapabilityRecordV2 } from "./long-task-evidence-capability-types.js";
4
6
  import type { EffectiveRiskLevel, RiskFactName } from "./long-task-risk-types.js";
5
7
  import type { CompiledSourceItemV2 } from "./long-task-source-authority-types.js";
6
8
  import type { WorkspaceManifestV2 } from "./long-task-workspace-runtime-types.js";
@@ -21,6 +23,8 @@ export interface CompiledCheckV2 extends Omit<DeliveryCheckV2, "runner"> {
21
23
  evidence_adapter: EvidenceAdapter;
22
24
  verification_input_hashes: Record<string, string>;
23
25
  raw_execution_identity: string;
26
+ execution_target_definition: ExecutionTargetV2;
27
+ known_execution_targets: ExecutionTargetV2[];
24
28
  }
25
29
  export interface ProductClaimV2 {
26
30
  id: string;
@@ -88,6 +92,7 @@ export interface CompiledDeliveryContractV2 {
88
92
  task: DeliveryContractV2["task"];
89
93
  risk: DeliveryContractV2["risk"];
90
94
  source_claims: DeliveryContractV2["source_claims"];
95
+ stages: DeliveryContractV2["stages"];
91
96
  global: Omit<DeliveryContractV2["global"], "acceptance"> & {
92
97
  acceptance: {
93
98
  checks: CompiledCheckV2[];
@@ -123,6 +128,8 @@ export interface AssertionResultV2 {
123
128
  passed: boolean;
124
129
  claims: string[];
125
130
  observation: string;
131
+ evidence_capabilities: EvidenceCapabilityV2[];
132
+ evidence_complete: boolean;
126
133
  status: "passed" | "observation_missing" | "observation_type_mismatch" | "assertion_value_mismatch";
127
134
  expected?: unknown;
128
135
  actual?: unknown;
@@ -133,6 +140,7 @@ export interface RawCommandExecutionV2 {
133
140
  execution_status: "completed" | "blocked_external" | "infrastructure_error" | "invalid_evidence";
134
141
  exit_code: number;
135
142
  observations: Record<string, unknown>;
143
+ evidence_records: EvidenceCapabilityRecordV2[];
136
144
  stdout_sha256: string;
137
145
  stderr_sha256: string;
138
146
  attempts: number;
@@ -148,6 +156,7 @@ export interface CheckExecutionResultV2 {
148
156
  execution_identity: string;
149
157
  assertion_results: AssertionResultV2[];
150
158
  observations: Record<string, unknown>;
159
+ evidence_records: EvidenceCapabilityRecordV2[];
151
160
  artifact_hashes: Record<string, string>;
152
161
  claim_proofs: ClaimProofV2[];
153
162
  findings: LongTaskFindingV2[];
@@ -185,12 +194,16 @@ export interface TargetedVerificationResultV2 {
185
194
  completed_at: string;
186
195
  }
187
196
  export type OutcomeStatusV2 = "unverified" | "progress_passing" | "progress_failing" | "progress_stale" | "blocked_external";
197
+ export type StageStatusV2 = "locked" | "ready" | "unverified" | "progress_passing" | "progress_failing" | "progress_stale" | "blocked_external";
188
198
  export interface FinalReceiptV2 {
189
199
  schema_version: "long-task-final-receipt-v2";
190
200
  receipt_sha256: string;
191
201
  authority_scope: "audit_only";
192
202
  reusable_for_acceptance: false;
193
203
  workflow_status: "machine_accepted" | "machine_accepted_external_pending" | "needs_work" | "blocked_external";
204
+ target_profile: DeliveryContractV2["task"]["target_profile"];
205
+ target_state: DeliveryContractV2["task"]["target_profile"]["required_state"] | "not_accepted" | "blocked_external";
206
+ stage_results: Record<string, "passed" | "failed" | "blocked_external" | "blocked_dependency">;
194
207
  compiled_identity: string;
195
208
  contract_sha256: string;
196
209
  snapshot_sha256: string;
@@ -0,0 +1,36 @@
1
+ export interface KeyedStatementV2 {
2
+ key: string;
3
+ statement: string;
4
+ }
5
+ export type ExternalConfirmationKindV2 = "functional_prerequisite" | "field_validation" | "production_release_gate" | "commercial_activation" | "expert_authority";
6
+ export type TargetCompletionStateV2 = "implementation_complete" | "target_profile_usable" | "production_release_ready";
7
+ export type ExecutionTargetRuntimeFamilyV2 = "browser" | "native" | "desktop" | "service" | "process" | "external";
8
+ export interface TargetProfileV2 {
9
+ key: string;
10
+ description: string;
11
+ required_state: TargetCompletionStateV2;
12
+ required_target_refs: string[];
13
+ }
14
+ export interface ExecutionTargetV2 {
15
+ key: string;
16
+ description: string;
17
+ role: "product" | "support" | "observer";
18
+ runtime_family: ExecutionTargetRuntimeFamilyV2;
19
+ root_entrypoint: string;
20
+ }
21
+ export interface DeliveryStageV2 {
22
+ key: string;
23
+ title: string;
24
+ depends_on: string[];
25
+ gate_outcome: string;
26
+ }
27
+ export type DeliveryJourneyRoleV2 = "success" | "degradation" | "recovery" | "stage_gate" | "conformance";
28
+ export type EvidenceCapabilityV2 = "presence" | "interaction_trace" | "state_delta" | "cross_surface_consistency" | "durable_readback" | "boundary_invocation" | "external_side_effect" | "failure_injection" | "visual_render" | "target_runtime" | "input_variation";
29
+ export interface CheckExecutionTargetV2 {
30
+ target_ref: string;
31
+ entrypoint: "root" | "internal";
32
+ }
33
+ export interface DeliveryScenarioV2 {
34
+ given: KeyedStatementV2[];
35
+ when: KeyedStatementV2[];
36
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export declare function semanticDriftMigrationFields(value: unknown): string[];
2
+ export declare function semanticDriftOutcomeMigrationFields(value: unknown, label: string): string[];
3
+ export declare function assertNoSemanticDriftMigration(fields: string[]): void;
@@ -0,0 +1,68 @@
1
+ export function semanticDriftMigrationFields(value) {
2
+ const root = row(value);
3
+ if (!root || root.schema_version !== "long-task-delivery-v2")
4
+ return [];
5
+ const missing = [];
6
+ required(root, "$", ["stages"], missing);
7
+ const task = row(root.task);
8
+ if (task) {
9
+ required(task, "task", ["target_profile", "execution_targets"], missing);
10
+ const profile = row(task.target_profile);
11
+ if (profile)
12
+ required(profile, "task.target_profile", ["required_target_refs"], missing);
13
+ }
14
+ for (const [index, outcome] of rows(root.outcomes).entries())
15
+ collectOutcome(outcome, `outcomes[${index}]`, missing);
16
+ const global = row(root.global);
17
+ const globalAcceptance = row(global?.acceptance);
18
+ collectChecks(globalAcceptance?.checks, "global.acceptance.checks", missing);
19
+ for (const [index, confirmation] of rows(globalAcceptance?.external_confirmations).entries())
20
+ required(confirmation, `global.acceptance.external_confirmations[${index}]`, ["kind", "impact_claims", "blocks_target"], missing);
21
+ return [...new Set(missing)].sort();
22
+ }
23
+ export function semanticDriftOutcomeMigrationFields(value, label) {
24
+ const missing = [];
25
+ const outcome = row(value);
26
+ if (outcome)
27
+ collectOutcome(outcome, label, missing);
28
+ return [...new Set(missing)].sort();
29
+ }
30
+ export function assertNoSemanticDriftMigration(fields) {
31
+ if (!fields.length)
32
+ return;
33
+ const detail = fields.slice(0, 24).join(",");
34
+ const suffix = fields.length > 24 ? `,+${fields.length - 24}-more` : "";
35
+ throw new Error(`long_task_delivery_v2_semantic_drift_migration_required:${detail}${suffix}`);
36
+ }
37
+ function collectOutcome(outcome, label, missing) {
38
+ required(outcome, label, ["stage"], missing);
39
+ const product = row(outcome.product);
40
+ if (product)
41
+ required(product, `${label}.product`, ["success_path_required", "degradation_path_required"], missing);
42
+ const acceptance = row(outcome.acceptance);
43
+ collectChecks(acceptance?.checks, `${label}.acceptance.checks`, missing);
44
+ }
45
+ function collectChecks(value, label, missing) {
46
+ for (const [index, check] of rows(value).entries()) {
47
+ const checkLabel = `${label}[${index}]`;
48
+ required(check, checkLabel, ["journey_roles", "execution_target", "scenario"], missing);
49
+ for (const polarity of ["positive_assertions", "negative_assertions"])
50
+ for (const [assertionIndex, assertion] of rows(check[polarity]).entries())
51
+ required(assertion, `${checkLabel}.${polarity}[${assertionIndex}]`, ["evidence_capabilities"], missing);
52
+ }
53
+ }
54
+ function required(value, label, keys, missing) {
55
+ for (const key of keys)
56
+ if (!Object.hasOwn(value, key))
57
+ missing.push(`${label}.${key}`);
58
+ }
59
+ function rows(value) {
60
+ return Array.isArray(value)
61
+ ? value.map(row).filter((item) => item !== null)
62
+ : [];
63
+ }
64
+ function row(value) {
65
+ return value && typeof value === "object" && !Array.isArray(value)
66
+ ? value
67
+ : null;
68
+ }
@@ -3,6 +3,7 @@ export declare function object(value: unknown, label: string, required: string[]
3
3
  export declare function array(value: unknown, label: string): unknown[];
4
4
  export declare function string(value: unknown, label: string): string;
5
5
  export declare function text(value: unknown, label: string): string;
6
+ export declare function boolean(value: unknown, label: string): boolean;
6
7
  export declare function strings(value: unknown, label: string): string[];
7
8
  export declare function repositoryFile(value: unknown, label: string): string;
8
9
  export declare function repositoryFiles(value: unknown, label: string): string[];
@@ -14,4 +15,6 @@ export declare function literal<T extends string>(value: unknown, allowed: reado
14
15
  export declare function key(value: unknown, label: string): string;
15
16
  export declare function nullable<T>(value: unknown, parser: (value: unknown) => T): T | null;
16
17
  export declare const PROOF_SURFACES: readonly ["ui_browser", "runtime_behavior", "api_contract", "data_state", "security_boundary", "population_coverage", "implementation_structure"];
18
+ export declare const JOURNEY_ROLES: readonly ["success", "degradation", "recovery", "stage_gate", "conformance"];
19
+ export declare const EVIDENCE_CAPABILITIES: readonly ["presence", "interaction_trace", "state_delta", "cross_surface_consistency", "durable_readback", "boundary_invocation", "external_side_effect", "failure_injection", "visual_render", "target_runtime", "input_variation"];
17
20
  export declare function fail(label: string, message: string): never;
@@ -27,6 +27,11 @@ export function text(value, label) {
27
27
  fail(label, "must be a string");
28
28
  return value;
29
29
  }
30
+ export function boolean(value, label) {
31
+ if (typeof value !== "boolean")
32
+ fail(label, "must be a boolean");
33
+ return value;
34
+ }
30
35
  export function strings(value, label) {
31
36
  return array(value, label).map((item, index) => string(item, `${label}[${index}]`));
32
37
  }
@@ -76,6 +81,26 @@ export const PROOF_SURFACES = [
76
81
  "population_coverage",
77
82
  "implementation_structure",
78
83
  ];
84
+ export const JOURNEY_ROLES = [
85
+ "success",
86
+ "degradation",
87
+ "recovery",
88
+ "stage_gate",
89
+ "conformance",
90
+ ];
91
+ export const EVIDENCE_CAPABILITIES = [
92
+ "presence",
93
+ "interaction_trace",
94
+ "state_delta",
95
+ "cross_surface_consistency",
96
+ "durable_readback",
97
+ "boundary_invocation",
98
+ "external_side_effect",
99
+ "failure_injection",
100
+ "visual_render",
101
+ "target_runtime",
102
+ "input_variation",
103
+ ];
79
104
  export function fail(label, message) {
80
105
  throw new Error(`delivery_contract_invalid:${label}:${message}`);
81
106
  }
@@ -0,0 +1,4 @@
1
+ import type { DeliveryContractV2 } from "./long-task-delivery-types.js";
2
+ type Reporter = (message: string) => void;
3
+ export declare function validateDeliveryStages(contract: DeliveryContractV2, report?: Reporter): void;
4
+ export {};
@@ -0,0 +1,120 @@
1
+ export function validateDeliveryStages(contract, report) {
2
+ unique(contract.stages.map((stage) => stage.key), "stage_key_duplicate", report);
3
+ const stages = new Map(contract.stages.map((stage) => [stage.key, stage]));
4
+ const outcomes = new Map(contract.outcomes.map((outcome) => [outcome.key, outcome]));
5
+ for (const stage of contract.stages) {
6
+ for (const dependency of stage.depends_on) {
7
+ if (dependency === stage.key)
8
+ issue(report, "stage_dependency_self", stage.key);
9
+ else if (!stages.has(dependency))
10
+ issue(report, "stage_dependency_unknown", `${stage.key}:${dependency}`);
11
+ }
12
+ const gate = outcomes.get(stage.gate_outcome);
13
+ if (!gate)
14
+ issue(report, "stage_gate_outcome_unknown", `${stage.key}:${stage.gate_outcome}`);
15
+ else if (gate.stage !== stage.key)
16
+ issue(report, "stage_gate_outcome_mismatch", `${stage.key}:${gate.key}`);
17
+ }
18
+ for (const outcome of contract.outcomes)
19
+ if (!stages.has(outcome.stage))
20
+ issue(report, "outcome_stage_unknown", `${outcome.key}:${outcome.stage}`);
21
+ validateStageCycles(contract, report);
22
+ validateStageGateClosure(contract, report);
23
+ }
24
+ function validateStageCycles(contract, report) {
25
+ const stages = new Map(contract.stages.map((stage) => [stage.key, stage]));
26
+ const visiting = new Set();
27
+ const visited = new Set();
28
+ const visit = (key) => {
29
+ if (visiting.has(key)) {
30
+ issue(report, "stage_dependency_cycle", key);
31
+ return;
32
+ }
33
+ if (visited.has(key))
34
+ return;
35
+ visiting.add(key);
36
+ for (const dependency of stages.get(key)?.depends_on ?? [])
37
+ if (stages.has(dependency))
38
+ visit(dependency);
39
+ visiting.delete(key);
40
+ visited.add(key);
41
+ };
42
+ for (const stage of stages.keys())
43
+ visit(stage);
44
+ }
45
+ function validateStageGateClosure(contract, report) {
46
+ const outcomes = new Map(contract.outcomes.map((outcome) => [outcome.key, outcome]));
47
+ for (const stage of contract.stages) {
48
+ const gate = outcomes.get(stage.gate_outcome);
49
+ if (!gate || gate.stage !== stage.key)
50
+ continue;
51
+ for (const outcome of contract.outcomes.filter((candidate) => candidate.stage === stage.key && candidate.key !== gate.key))
52
+ if (!outcomeDependsOn(gate.key, outcome.key, outcomes))
53
+ issue(report, "stage_gate_missing_outcome_dependency", `${stage.key}:${gate.key}:${outcome.key}`);
54
+ for (const dependency of stage.depends_on) {
55
+ const dependencyGate = contract.stages.find((candidate) => candidate.key === dependency)?.gate_outcome;
56
+ if (!dependencyGate)
57
+ continue;
58
+ for (const outcome of contract.outcomes.filter((candidate) => candidate.stage === stage.key))
59
+ if (!outcomeDependsOn(outcome.key, dependencyGate, outcomes))
60
+ issue(report, "stage_outcome_missing_gate_dependency", `${stage.key}:${outcome.key}:${dependencyGate}`);
61
+ }
62
+ const stageGateChecks = gate.acceptance.checks.filter((check) => check.journey_roles.includes("stage_gate"));
63
+ if (!stageGateChecks.length)
64
+ issue(report, "stage_gate_check_required", `${stage.key}:${gate.key}`);
65
+ else if (!stageGateChecks.some((check) => provesGate(check, gate)))
66
+ issue(report, "stage_gate_target_runtime_result_required", `${stage.key}:${gate.key}`);
67
+ for (const targetRef of contract.task.target_profile.required_target_refs)
68
+ if (!stageGateChecks.some((check) => check.execution_target.target_ref === targetRef &&
69
+ check.execution_target.entrypoint === "root" &&
70
+ provesGate(check, gate)))
71
+ issue(report, "stage_gate_required_target_proof_missing", `${stage.key}:${targetRef}`);
72
+ const stageOutcomes = contract.outcomes.filter((candidate) => candidate.stage === stage.key);
73
+ if (stageOutcomes.length > 1 &&
74
+ !stageGateChecks.some((check) => [...check.positive_assertions, ...check.negative_assertions].some((assertion) => assertion.evidence_capabilities.includes("cross_surface_consistency"))))
75
+ issue(report, "stage_gate_cross_surface_consistency_required", `${stage.key}:${stageOutcomes.map((outcome) => outcome.key).join(",")}`);
76
+ }
77
+ for (const outcome of contract.outcomes)
78
+ for (const check of outcome.acceptance.checks)
79
+ if (check.journey_roles.includes("stage_gate") &&
80
+ !contract.stages.some((stage) => stage.gate_outcome === outcome.key))
81
+ issue(report, "stage_gate_role_on_non_gate", `${outcome.key}:${check.key}`);
82
+ }
83
+ function provesGate(check, gate) {
84
+ const assertions = [
85
+ ...check.positive_assertions,
86
+ ...check.negative_assertions,
87
+ ];
88
+ const provesResult = assertions.some((assertion) => assertion.claims.includes("result")) ||
89
+ (gate.acceptance.population?.check_key === check.key &&
90
+ gate.acceptance.population.claims.includes("result"));
91
+ return (provesResult &&
92
+ assertions.some((assertion) => assertion.evidence_capabilities.includes("target_runtime")));
93
+ }
94
+ function outcomeDependsOn(start, target, outcomes) {
95
+ const seen = new Set();
96
+ const visit = (key) => {
97
+ if (key === target)
98
+ return true;
99
+ if (seen.has(key))
100
+ return false;
101
+ seen.add(key);
102
+ return (outcomes.get(key)?.depends_on ?? []).some(visit);
103
+ };
104
+ return visit(start);
105
+ }
106
+ function unique(values, code, report) {
107
+ const seen = new Set();
108
+ for (const value of values) {
109
+ if (seen.has(value))
110
+ issue(report, code, value);
111
+ seen.add(value);
112
+ }
113
+ }
114
+ function issue(report, code, detail) {
115
+ const message = `delivery_contract_invalid:${code}:${detail}`;
116
+ if (report)
117
+ report(message);
118
+ else
119
+ throw new Error(message);
120
+ }
@@ -1,4 +1,4 @@
1
- import type { CompiledDeliveryContractV2, FinalReceiptV2, LongTaskFindingV2, OutcomeStatusV2, ProgressRecordV2, WorkspaceManifestV2 } from "./long-task-delivery-types.js";
1
+ import type { CompiledDeliveryContractV2, FinalReceiptV2, LongTaskFindingV2, OutcomeStatusV2, ProgressRecordV2, StageStatusV2, WorkspaceManifestV2 } from "./long-task-delivery-types.js";
2
2
  interface StatusProjectionInputV2 {
3
3
  compiled: CompiledDeliveryContractV2;
4
4
  manifest: WorkspaceManifestV2;
@@ -11,7 +11,10 @@ export type AuditGateStatusV2 = "no_final_gate" | "last_gate_passed" | "last_gat
11
11
  export declare function projectDeliveryStatus(input: StatusProjectionInputV2): {
12
12
  finalResult: AuditGateStatusV2;
13
13
  finalWorkflowStatus: FinalReceiptV2["workflow_status"] | null;
14
+ targetState: FinalReceiptV2["target_state"];
14
15
  outcomes: Record<string, OutcomeStatusV2>;
16
+ stages: Record<string, StageStatusV2>;
17
+ readyStages: string[];
15
18
  readyOutcomes: string[];
16
19
  needsReverify: string[];
17
20
  progressPassing: string[];
@@ -1,13 +1,21 @@
1
1
  import { progressRecordFresh } from "./long-task-progress.js";
2
2
  export function projectDeliveryStatus(input) {
3
3
  const outcomes = projectOutcomes(input);
4
+ const stages = projectStages(input.compiled, outcomes);
4
5
  return {
5
6
  finalResult: projectFinalResult(input),
6
7
  finalWorkflowStatus: receiptFresh(input)
7
8
  ? input.receipt.workflow_status
8
9
  : null,
10
+ targetState: receiptFresh(input)
11
+ ? (input.receipt.target_state ?? legacyTargetState(input.receipt))
12
+ : "not_accepted",
9
13
  outcomes,
10
- readyOutcomes: readyOutcomes(input.compiled, outcomes),
14
+ stages,
15
+ readyStages: Object.entries(stages)
16
+ .filter(([, status]) => status === "ready")
17
+ .map(([key]) => key),
18
+ readyOutcomes: readyOutcomes(input.compiled, outcomes, stages),
11
19
  needsReverify: Object.entries(outcomes)
12
20
  .filter(([, status]) => ["unverified", "progress_stale", "progress_failing"].includes(status))
13
21
  .map(([key]) => key),
@@ -88,12 +96,64 @@ function projectFindings(input) {
88
96
  }
89
97
  return findings;
90
98
  }
91
- function readyOutcomes(compiled, outcomes) {
99
+ function readyOutcomes(compiled, outcomes, stages) {
92
100
  return compiled.outcomes
93
- .filter((outcome) => outcomes[outcome.key] !== "progress_passing" &&
101
+ .filter((outcome) => stages[outcome.stage] !== "locked" &&
102
+ stages[outcome.stage] !== "progress_passing" &&
103
+ outcomes[outcome.key] !== "progress_passing" &&
94
104
  outcome.depends_on.every((dependency) => outcomes[dependency] === "progress_passing"))
95
105
  .map((outcome) => outcome.key);
96
106
  }
107
+ function legacyTargetState(receipt) {
108
+ if (receipt.workflow_status === "machine_accepted" ||
109
+ receipt.workflow_status === "machine_accepted_external_pending")
110
+ return receipt.target_profile.required_state;
111
+ return receipt.workflow_status === "blocked_external"
112
+ ? "blocked_external"
113
+ : "not_accepted";
114
+ }
115
+ function projectStages(compiled, outcomes) {
116
+ const result = {};
117
+ const remaining = new Set(compiled.stages.map((stage) => stage.key));
118
+ while (remaining.size) {
119
+ let advanced = false;
120
+ for (const stage of compiled.stages) {
121
+ if (!remaining.has(stage.key))
122
+ continue;
123
+ if (stage.depends_on.some((dependency) => remaining.has(dependency)))
124
+ continue;
125
+ const prerequisitesPassing = stage.depends_on.every((dependency) => result[dependency] === "progress_passing");
126
+ if (!prerequisitesPassing)
127
+ result[stage.key] = "locked";
128
+ else {
129
+ const owned = compiled.outcomes
130
+ .filter((outcome) => outcome.stage === stage.key)
131
+ .map((outcome) => outcomes[outcome.key]);
132
+ const gate = outcomes[stage.gate_outcome];
133
+ result[stage.key] = owned.includes("progress_failing")
134
+ ? "progress_failing"
135
+ : owned.includes("blocked_external")
136
+ ? "blocked_external"
137
+ : owned.includes("progress_stale")
138
+ ? "progress_stale"
139
+ : gate === "progress_passing" &&
140
+ owned.every((status) => status === "progress_passing")
141
+ ? "progress_passing"
142
+ : owned.every((status) => status === "unverified")
143
+ ? "ready"
144
+ : "unverified";
145
+ }
146
+ remaining.delete(stage.key);
147
+ advanced = true;
148
+ }
149
+ if (!advanced) {
150
+ for (const stage of remaining)
151
+ result[stage] = "locked";
152
+ break;
153
+ }
154
+ }
155
+ return result;
156
+ }
97
157
  function projectFinalResult(input) {
98
158
  if (!input.receipt)
99
159
  return "no_final_gate";
@@ -1,5 +1,5 @@
1
1
  import type { AuthorityRevisionDecisionV2 } from "./long-task-authority-revision-types.js";
2
- import type { ExternalConfirmationV2, FinalReceiptV2, LongTaskFindingV2, OutcomeStatusV2 } from "./long-task-delivery-types.js";
2
+ import type { ExternalConfirmationV2, FinalReceiptV2, LongTaskFindingV2, OutcomeStatusV2, StageStatusV2, TargetProfileV2 } from "./long-task-delivery-types.js";
3
3
  import { type AuditGateStatusV2 } from "./long-task-status-projection.js";
4
4
  export interface DeliveryStatusV2 {
5
5
  schema_version: "long-task-status-v2";
@@ -13,7 +13,11 @@ export interface DeliveryStatusV2 {
13
13
  final_result: AuditGateStatusV2;
14
14
  final_workflow_status: FinalReceiptV2["workflow_status"] | null;
15
15
  external_confirmations: ExternalConfirmationV2[];
16
+ target_profile: TargetProfileV2;
17
+ target_state: FinalReceiptV2["target_state"];
16
18
  outcomes: Record<string, OutcomeStatusV2>;
19
+ stages: Record<string, StageStatusV2>;
20
+ ready_stages: string[];
17
21
  ready_outcomes: string[];
18
22
  ready_for_implementation: string[];
19
23
  needs_reverify: string[];
@@ -31,6 +35,9 @@ export interface StopCheckDeliveryResultV2 {
31
35
  reason: string;
32
36
  workflow_status?: FinalReceiptV2["workflow_status"];
33
37
  external_confirmations?: ExternalConfirmationV2[];
38
+ target_profile?: TargetProfileV2;
39
+ target_state?: FinalReceiptV2["target_state"];
40
+ stage_results?: FinalReceiptV2["stage_results"];
34
41
  acceptance_scope?: "declared_machine_authority";
35
42
  native_goal_effect?: "none";
36
43
  message?: string;
@@ -39,6 +46,9 @@ export interface CloseDeliveryResultV2 {
39
46
  status: "closed";
40
47
  workflow_status: Extract<FinalReceiptV2["workflow_status"], "machine_accepted" | "machine_accepted_external_pending">;
41
48
  external_confirmations: ExternalConfirmationV2[];
49
+ target_profile: TargetProfileV2;
50
+ target_state: FinalReceiptV2["target_state"];
51
+ stage_results: FinalReceiptV2["stage_results"];
42
52
  acceptance_scope: "declared_machine_authority";
43
53
  closed_scope: "machine_authority";
44
54
  native_goal_effect: "none";
@@ -53,7 +53,11 @@ async function readDeliveryStatusForAuthority(active) {
53
53
  final_result: projection.finalResult,
54
54
  final_workflow_status: projection.finalWorkflowStatus,
55
55
  external_confirmations: compiled.global.acceptance.external_confirmations,
56
+ target_profile: compiled.task.target_profile,
57
+ target_state: projection.targetState,
56
58
  outcomes: projection.outcomes,
59
+ stages: projection.stages,
60
+ ready_stages: projection.readyStages,
57
61
  ready_outcomes: projection.readyOutcomes,
58
62
  ready_for_implementation: projection.readyOutcomes,
59
63
  needs_reverify: projection.needsReverify,
@@ -89,6 +93,8 @@ export async function resumeDeliveryTask(workdir) {
89
93
  id: compiled.task.id,
90
94
  title: compiled.task.title,
91
95
  goal: compiled.task.goal,
96
+ target_profile: compiled.task.target_profile,
97
+ execution_targets: compiled.task.execution_targets,
92
98
  },
93
99
  contract_identity: compiled.compiled_identity,
94
100
  authority_revision: compiled.authority_revision,
@@ -101,7 +107,11 @@ export async function resumeDeliveryTask(workdir) {
101
107
  last_gate: status.final_result,
102
108
  final_workflow_status: status.final_workflow_status,
103
109
  external_confirmations: status.external_confirmations,
110
+ target_profile: status.target_profile,
111
+ target_state: status.target_state,
104
112
  outcomes: status.outcomes,
113
+ stages: status.stages,
114
+ ready_stages: status.ready_stages,
105
115
  ready_outcomes: status.ready_outcomes,
106
116
  ready_for_implementation: status.ready_for_implementation,
107
117
  needs_reverify: status.needs_reverify,
@@ -216,6 +226,9 @@ export async function stopCheckDeliveryTask(workdirInput, messageText = "") {
216
226
  reason: "active_authority_changed_after_final_gate",
217
227
  workflow_status: result.workflow_status,
218
228
  external_confirmations: result.external_confirmations,
229
+ target_profile: result.target_profile,
230
+ target_state: result.target_state,
231
+ stage_results: result.stage_results,
219
232
  message: "Active Authority changed after the Live Final Gate; the accepted identity was not cleared.",
220
233
  };
221
234
  throw error;
@@ -225,9 +238,12 @@ export async function stopCheckDeliveryTask(workdirInput, messageText = "") {
225
238
  reason: result.workflow_status,
226
239
  workflow_status: result.workflow_status,
227
240
  external_confirmations: result.external_confirmations,
241
+ target_profile: result.target_profile,
242
+ target_state: result.target_state,
243
+ stage_results: result.stage_results,
228
244
  acceptance_scope: "declared_machine_authority",
229
245
  native_goal_effect: "none",
230
- message: acceptedScopeMessage(result.workflow_status, result.external_confirmations),
246
+ message: acceptedScopeMessage(result.workflow_status, result.external_confirmations, result.target_profile),
231
247
  };
232
248
  }
233
249
  return {
@@ -235,6 +251,9 @@ export async function stopCheckDeliveryTask(workdirInput, messageText = "") {
235
251
  reason: `live_final_gate_${result.workflow_status}`,
236
252
  workflow_status: result.workflow_status,
237
253
  external_confirmations: result.external_confirmations,
254
+ target_profile: result.target_profile,
255
+ target_state: result.target_state,
256
+ stage_results: result.stage_results,
238
257
  message: messageText ||
239
258
  result.findings.at(-1)?.next_action ||
240
259
  "Repair the failing Check and rerun Stop.",
@@ -274,13 +293,16 @@ export async function closeDeliveryTask(workdir) {
274
293
  status: "closed",
275
294
  workflow_status: result.workflow_status,
276
295
  external_confirmations: result.external_confirmations,
296
+ target_profile: result.target_profile,
297
+ target_state: result.target_state,
298
+ stage_results: result.stage_results,
277
299
  acceptance_scope: "declared_machine_authority",
278
300
  closed_scope: "machine_authority",
279
301
  native_goal_effect: "none",
280
302
  };
281
303
  }
282
- function acceptedScopeMessage(workflowStatus, confirmations) {
283
- const scope = "Declared machine Authority accepted and cleared. This result has no direct effect on the platform-native Goal; before completing it, confirm current Goal/user meaning is fully represented by accepted Source and no revision, blocker, or omitted requirement remains.";
304
+ function acceptedScopeMessage(workflowStatus, confirmations, targetProfile) {
305
+ const scope = `Declared machine Authority accepted for target ${targetProfile.key}:${targetProfile.required_state} and cleared. This result has no direct effect on the platform-native Goal; before completing it, confirm current Goal/user meaning is fully represented by accepted Source and no revision, blocker, or omitted requirement remains.`;
284
306
  if (workflowStatus === "machine_accepted")
285
307
  return scope;
286
308
  const pending = confirmations
@@ -0,0 +1,6 @@
1
+ import type { CompiledClaimsV2 } from "./long-task-claims.js";
2
+ import type { DeliveryContractV2 } from "./long-task-delivery-types.js";
3
+ type Reporter = (message: string) => void;
4
+ export declare function validateExecutionTargets(contract: DeliveryContractV2, report?: Reporter): void;
5
+ export declare function validateExternalConfirmationImpacts(contract: DeliveryContractV2, claims: CompiledClaimsV2, report?: Reporter): void;
6
+ export {};