project-tiny-context-harness 0.8.13 → 0.8.17

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 (103) hide show
  1. package/README.md +53 -28
  2. package/assets/README.md +52 -25
  3. package/assets/README.zh-CN.md +55 -26
  4. package/assets/agents/AGENTS_CORE.md +2 -2
  5. package/assets/agents/long-task-implementation.toml +1 -1
  6. package/assets/context_templates/screen-contract.md +16 -0
  7. package/assets/skills/context_development_engineer/SKILL.md +16 -30
  8. package/assets/skills/context_development_engineer/references/engineering-design-reasoning.md +93 -0
  9. package/assets/skills/context_surface_contract/SKILL.md +13 -2
  10. package/assets/skills/context_uiux_design/SKILL.md +7 -3
  11. package/assets/skills/context_uiux_design/references/task-uiux-analysis.md +82 -0
  12. package/assets/skills/design-resource-authoring/SKILL.md +14 -8
  13. package/assets/skills/design-resource-authoring/references/downstream-handoff.md +18 -6
  14. package/assets/skills/design-resource-authoring/references/formal-selected-web-app-handoff.md +26 -8
  15. package/assets/skills/design-resource-authoring/references/implementation-feasibility.md +111 -0
  16. package/assets/skills/design-resource-authoring/references/open-design-provider.md +45 -7
  17. package/assets/skills/design-resource-authoring/references/recovery-and-writeback.md +7 -1
  18. package/assets/skills/design-resource-authoring/references/resource-selection.md +115 -3
  19. package/assets/skills/long-task-workflow/SKILL.md +9 -7
  20. package/assets/skills/long-task-workflow/agents/openai.yaml +1 -1
  21. package/assets/skills/long-task-workflow/references/authority-lifecycle.md +1 -1
  22. package/dist/commands/design-resource.js +9 -2
  23. package/dist/commands/long-task-revision.js +4 -4
  24. package/dist/index.d.ts +1 -1
  25. package/dist/lib/design-resource-handoff-bundle.js +5 -0
  26. package/dist/lib/design-resource-handoff-input-types.d.ts +1 -1
  27. package/dist/lib/design-resource-handoff-manifest-projection.js +1 -0
  28. package/dist/lib/design-resource-handoff-set-integrity.js +1 -0
  29. package/dist/lib/design-resource-handoff-shape.js +6 -2
  30. package/dist/lib/design-resource-handoff-types.d.ts +5 -0
  31. package/dist/lib/design-resource-handoff-validation.js +12 -0
  32. package/dist/lib/design-resource-implementation-feasibility-model.d.ts +35 -0
  33. package/dist/lib/design-resource-implementation-feasibility-model.js +62 -0
  34. package/dist/lib/design-resource-implementation-feasibility-shape-sections.d.ts +43 -0
  35. package/dist/lib/design-resource-implementation-feasibility-shape-sections.js +142 -0
  36. package/dist/lib/design-resource-implementation-feasibility-shape.d.ts +4 -0
  37. package/dist/lib/design-resource-implementation-feasibility-shape.js +154 -0
  38. package/dist/lib/design-resource-implementation-feasibility-source-decision-projection.d.ts +24 -0
  39. package/dist/lib/design-resource-implementation-feasibility-source-decision-projection.js +106 -0
  40. package/dist/lib/design-resource-implementation-feasibility-source-decision.d.ts +21 -0
  41. package/dist/lib/design-resource-implementation-feasibility-source-decision.js +75 -0
  42. package/dist/lib/design-resource-implementation-feasibility-types.d.ts +135 -0
  43. package/dist/lib/design-resource-implementation-feasibility-types.js +37 -0
  44. package/dist/lib/design-resource-implementation-feasibility-validation-cells.d.ts +5 -0
  45. package/dist/lib/design-resource-implementation-feasibility-validation-cells.js +125 -0
  46. package/dist/lib/design-resource-implementation-feasibility-validation-document.d.ts +4 -0
  47. package/dist/lib/design-resource-implementation-feasibility-validation-document.js +167 -0
  48. package/dist/lib/design-resource-implementation-feasibility-validation-facts.d.ts +3 -0
  49. package/dist/lib/design-resource-implementation-feasibility-validation-facts.js +76 -0
  50. package/dist/lib/design-resource-implementation-feasibility-validation-realizations.d.ts +8 -0
  51. package/dist/lib/design-resource-implementation-feasibility-validation-realizations.js +76 -0
  52. package/dist/lib/design-resource-implementation-feasibility-validation-support.d.ts +10 -0
  53. package/dist/lib/design-resource-implementation-feasibility-validation-support.js +75 -0
  54. package/dist/lib/design-resource-implementation-feasibility-validation.d.ts +3 -0
  55. package/dist/lib/design-resource-implementation-feasibility-validation.js +138 -0
  56. package/dist/lib/design-resource-symbolic-fact-shape.js +3 -1
  57. package/dist/lib/design-resource-symbolic-fact-types.d.ts +5 -0
  58. package/dist/lib/design-resource-symbolic-fact-validation.js +13 -0
  59. package/dist/lib/long-task-activation-validation.js +77 -7
  60. package/dist/lib/long-task-authority-revision-brief.js +3 -1
  61. package/dist/lib/long-task-authority-revision-summary.js +6 -2
  62. package/dist/lib/long-task-authority-revision-types.d.ts +2 -0
  63. package/dist/lib/long-task-check-runner.js +3 -296
  64. package/dist/lib/long-task-command-process.d.ts +9 -0
  65. package/dist/lib/long-task-command-process.js +175 -0
  66. package/dist/lib/long-task-delivery-validation.d.ts +5 -2
  67. package/dist/lib/long-task-delivery-validation.js +4 -4
  68. package/dist/lib/long-task-design-feasibility-binding-owners.d.ts +6 -0
  69. package/dist/lib/long-task-design-feasibility-binding-owners.js +52 -0
  70. package/dist/lib/long-task-design-feasibility-binding.d.ts +13 -0
  71. package/dist/lib/long-task-design-feasibility-binding.js +114 -0
  72. package/dist/lib/long-task-design-feasibility-source-closure.d.ts +11 -0
  73. package/dist/lib/long-task-design-feasibility-source-closure.js +78 -0
  74. package/dist/lib/long-task-design-resource-handoff.d.ts +3 -3
  75. package/dist/lib/long-task-design-resource-handoff.js +39 -3
  76. package/dist/lib/long-task-design-resource-method-binding.js +16 -4
  77. package/dist/lib/long-task-freshness.js +1 -1
  78. package/dist/lib/long-task-git.d.ts +26 -0
  79. package/dist/lib/long-task-git.js +130 -0
  80. package/dist/lib/long-task-paths.js +1 -1
  81. package/dist/lib/long-task-process-runtime-closure.js +74 -42
  82. package/dist/lib/long-task-process-table.d.ts +12 -0
  83. package/dist/lib/long-task-process-table.js +119 -0
  84. package/dist/lib/long-task-process-tree.d.ts +9 -0
  85. package/dist/lib/long-task-process-tree.js +138 -0
  86. package/dist/lib/long-task-protected-files.d.ts +1 -1
  87. package/dist/lib/long-task-protected-files.js +1 -1
  88. package/dist/lib/long-task-ui-surface-policy.d.ts +2 -1
  89. package/dist/lib/long-task-ui-surface-policy.js +7 -4
  90. package/dist/lib/long-task-ui-surface-validation.d.ts +3 -1
  91. package/dist/lib/long-task-ui-surface-validation.js +2 -2
  92. package/dist/lib/long-task-verifier-authority.js +2 -0
  93. package/dist/lib/long-task-workspace-manifest.d.ts +8 -0
  94. package/dist/lib/long-task-workspace-manifest.js +173 -0
  95. package/dist/lib/long-task-workspace-snapshot.d.ts +8 -0
  96. package/dist/lib/long-task-workspace-snapshot.js +176 -0
  97. package/dist/lib/long-task-workspace.d.ts +4 -25
  98. package/dist/lib/long-task-workspace.js +3 -432
  99. package/dist/lib/repository-path-safety.d.ts +2 -0
  100. package/dist/lib/repository-path-safety.js +36 -0
  101. package/dist/long-task-hook.js +12 -3
  102. package/dist/public-types.d.ts +1 -0
  103. package/package.json +1 -1
@@ -29,9 +29,15 @@ export async function designResource(args) {
29
29
  process.stdout.write(canonicalJson(result));
30
30
  return;
31
31
  }
32
- console.log(`Design resource handoff ready: ${result.handoff_path}`);
32
+ console.log(`Design resource handoff preflight valid: ${result.handoff_path}`);
33
+ console.log("Input closure: valid");
33
34
  console.log(`Scope: ${result.handoff.scope.key}`);
34
35
  console.log(`Targets: ${result.handoff.targets.map((item) => item.key).join(", ")}`);
36
+ console.log(`Technical feasibility inputs: ${result.technical_feasibility_identities.length}`);
37
+ console.log(`Technical feasibility cells: ${result.technical_feasibility_identities.reduce((total, item) => total + item.component_family_cells, 0)}`);
38
+ console.log(`Technical feasibility blockers: ${result.technical_feasibility_identities.reduce((total, item) => total + item.blockers, 0)}`);
39
+ console.log(`Limitations: ${result.limitations.length ? result.limitations.join("; ") : "none"}`);
40
+ console.log("Production conformance: not evaluated");
35
41
  if ("metrics" in result) {
36
42
  console.log(`Coverage: ${result.manifest.subjects.length} subjects x ${result.manifest.properties.length} atomic properties (${result.rule_projections.length} symbolic Rules)`);
37
43
  console.log(`Symbolic: ${result.metrics.semantic_obligations} semantic obligations, ${result.metrics.certificate_obligations} certificates, ${result.metrics.canonical_dag_nodes} DAG nodes, ${result.metrics.canonical_bytes} bytes`);
@@ -88,7 +94,8 @@ async function bundle(args) {
88
94
  process.stdout.write(canonicalJson(result));
89
95
  return;
90
96
  }
91
- console.log(`Design resource handoff bundle published: ${result.output_directory}`);
97
+ console.log(`Design resource Source bundle published: ${result.output_directory}`);
98
+ console.log("Production readiness: not evaluated");
92
99
  console.log(`Handoffs: ${result.handoffs.length}`);
93
100
  console.log(`Targets: ${result.handoffs.map((item) => item.target_key).join(", ")}`);
94
101
  }
@@ -90,7 +90,7 @@ function printCompileResult(compiled, previous, preserveProgress, revisionPropos
90
90
  ? projectAuthorityRevisionDecision(revisionProposal)
91
91
  : null,
92
92
  next_action: firstAuthorityLock
93
- ? "End this turn now. Do not implement, edit files, build, or test. After the user handles the model change in the host, wait for [continue]. Harness cannot observe or verify the model change."
93
+ ? "End this turn now. Do not implement, edit files, build, or test. After the user handles the model change in the host, ask them to reply exactly: model checkpoint cleared, continue. This is package-managed prompt guidance; Harness cannot observe the next host message or verify the model change."
94
94
  : authorityChanged
95
95
  ? "Run status or resume, then continue rolling implementation or repair under the adopted Authority Revision."
96
96
  : "Continue rolling implementation or repair under the active Authority.",
@@ -158,7 +158,7 @@ function executionModelCheckpoint(firstAuthorityLock) {
158
158
  required: true,
159
159
  phase: "post_authority_lock_pre_implementation",
160
160
  action: "change_model_in_host_then_continue",
161
- resume_token: "continue",
161
+ resume_token: "model checkpoint cleared, continue",
162
162
  turn_boundary: "end_current_turn",
163
163
  blocked_until_resume: [
164
164
  "product_implementation",
@@ -168,8 +168,8 @@ function executionModelCheckpoint(firstAuthorityLock) {
168
168
  ],
169
169
  model_change_owner: "host_or_user",
170
170
  model_change_observable_by_harness: false,
171
- generic_continue_satisfies: true,
172
- message: "Authority Lock created. End the current turn before product implementation, file edits, builds, or tests. After handling the model change, send [continue]. Harness cannot observe or verify the model change.",
171
+ generic_continue_satisfies: false,
172
+ message: "Authority Lock created. End the current turn before product implementation, file edits, builds, or tests. After handling the model change, reply exactly: model checkpoint cleared, continue. This is package-managed prompt guidance; Harness cannot observe the next host message or verify the model change.",
173
173
  };
174
174
  }
175
175
  function message(error) {
package/dist/index.d.ts CHANGED
@@ -10,4 +10,4 @@ export { verifyDeliveryContract } from "./lib/long-task-verifier-v2.js";
10
10
  export { runDeliveryFinalGate } from "./lib/long-task-final-v2.js";
11
11
  export { closeDeliveryTask, type DeliveryStatusV2, doctorDeliveryTask, readDeliveryStatus, resumeDeliveryTask, stopCheckDeliveryTask, } from "./lib/long-task-status-v2.js";
12
12
  export { readActiveLongTaskBinding, readCompiledDeliveryContract, readFinalReceipt, } from "./lib/long-task-state.js";
13
- export type { BoundaryCheckDecisionV2, BoundaryCheckInputV2, CheckExecutionResultV2, CompiledDeliveryContractV2, DesignResourceHandoffBundleOptions, DesignResourceHandoffBundleResult, DesignResourceHandoffPreflightV1, DesignResourceHandoffPreflightV2, DesignResourceHandoffV1, DesignResourceHandoffV2, DesignResourceObservableRuleManifestV2, DesignResourceSymbolicFactRuleV2, DesignResourceSymbolicNoninterferenceArtifactV2, DesignResourceSymbolicNoninterferenceCertificateV2, DesignResourceSymbolicNoninterferenceDerivedResultV2, DesignResourceSymbolicNoninterferenceFailureWitnessV1, DesignResourceSymbolicNoninterferenceInputBindingV2, DesignResourceSymbolicNoninterferenceProofV2, DesignResourceSymbolicProofObligationV2, DesignResourceSymbolicSourceIrCertificateScopeV1, DesignResourceSymbolicSourceIrRegionV1, DesignResourceSymbolicSourceIrV1, CompiledSymbolicDenotationV1, SymbolicDenotationAxisDomain, SymbolicDenotationComplexityLimits, SymbolicDenotationPredicate, SymbolicExtensionalPointV1, SymbolicPointDenotationV1, DeliveryAssertionV2, DeliveryCheckV2, DeliveryContractV2, DeliveryOutcomeV2, EffectiveRiskLevel, ExternalConfirmationV2, FinalReceiptV2, LongTaskFindingV2, LongTaskRiskFacts, ProofSurface, ProgressRecordV2, RequestedRiskLevel, RunnerType, SourceClaimV2, TargetedVerificationResultV2, HarnessConfig, HarnessProfile, ManagedFile, SourceMapping, } from "./public-types.js";
13
+ export type { BoundaryCheckDecisionV2, BoundaryCheckInputV2, CheckExecutionResultV2, CompiledDeliveryContractV2, DesignResourceHandoffBundleOptions, DesignResourceHandoffBundleResult, DesignResourceHandoffPreflightV1, DesignResourceHandoffPreflightV2, DesignResourceHandoffV1, DesignResourceHandoffV2, DesignResourceImplementationFeasibilityIdentityV1, DesignResourceImplementationFeasibilityV1, DesignResourceTechnicalFeasibilityInputV1, DesignResourceObservableRuleManifestV2, DesignResourceSymbolicFactRuleV2, DesignResourceSymbolicNoninterferenceArtifactV2, DesignResourceSymbolicNoninterferenceCertificateV2, DesignResourceSymbolicNoninterferenceDerivedResultV2, DesignResourceSymbolicNoninterferenceFailureWitnessV1, DesignResourceSymbolicNoninterferenceInputBindingV2, DesignResourceSymbolicNoninterferenceProofV2, DesignResourceSymbolicProofObligationV2, DesignResourceSymbolicSourceIrCertificateScopeV1, DesignResourceSymbolicSourceIrRegionV1, DesignResourceSymbolicSourceIrV1, CompiledSymbolicDenotationV1, SymbolicDenotationAxisDomain, SymbolicDenotationComplexityLimits, SymbolicDenotationPredicate, SymbolicExtensionalPointV1, SymbolicPointDenotationV1, DeliveryAssertionV2, DeliveryCheckV2, DeliveryContractV2, DeliveryOutcomeV2, EffectiveRiskLevel, ExternalConfirmationV2, FinalReceiptV2, LongTaskFindingV2, LongTaskRiskFacts, ProofSurface, ProgressRecordV2, RequestedRiskLevel, RunnerType, SourceClaimV2, TargetedVerificationResultV2, HarnessConfig, HarnessProfile, ManagedFile, SourceMapping, } from "./public-types.js";
@@ -43,6 +43,11 @@ export async function publishDesignResourceHandoffBundle(options) {
43
43
  if (!declaredManifestPaths.has(manifestResource.path))
44
44
  invalid("target_manifest_not_declared", `${declaredTarget.key}:${manifestResource.path}`);
45
45
  const preflight = await preflightParsedDesignResourceHandoff(repository, parsed);
46
+ const publishedTarget = preflight.handoff.targets[0];
47
+ if ((publishedTarget.source_profile.kind === "implementation_web" ||
48
+ publishedTarget.source_profile.kind === "implementation_app") &&
49
+ preflight.technical_feasibility_identities.length !== 1)
50
+ invalid("implementation_feasibility_input_required", `${publishedTarget.key}:${preflight.technical_feasibility_identities.length}`);
46
51
  handoffSetIntegrity.consume(preflight);
47
52
  const targetKey = preflight.handoff.targets[0].key;
48
53
  if (seenTargets.has(targetKey))
@@ -1,6 +1,6 @@
1
1
  import type { DesignResourceHandoffV1 } from "./design-resource-handoff-types.js";
2
2
  import type { DesignResourceHandoffV2, ParsedDesignResourceHandoffV2 } from "./design-resource-symbolic-fact-types.js";
3
- export type DesignResourceHandoffManifestBackedV1 = Pick<DesignResourceHandoffV1, "schema_version" | "intent" | "scope" | "provenance" | "resources" | "targets" | "resource_fact_closure" | "coverage" | "proposal"> & {
3
+ export type DesignResourceHandoffManifestBackedV1 = Pick<DesignResourceHandoffV1, "schema_version" | "intent" | "scope" | "provenance" | "technical_feasibility_inputs" | "resources" | "targets" | "resource_fact_closure" | "coverage" | "proposal"> & {
4
4
  representation: "manifest_backed";
5
5
  };
6
6
  export type DesignResourceHandoffInputV1 = DesignResourceHandoffV1 | DesignResourceHandoffManifestBackedV1;
@@ -11,6 +11,7 @@ export function hydrateManifestBackedDesignResourceHandoff(descriptor, manifests
11
11
  intent: descriptor.intent,
12
12
  scope: descriptor.scope,
13
13
  provenance: descriptor.provenance,
14
+ technical_feasibility_inputs: descriptor.technical_feasibility_inputs,
14
15
  resources: descriptor.resources,
15
16
  axis_dispositions: manifest.axis_dispositions,
16
17
  condition_exclusions: manifest.condition_exclusions,
@@ -35,6 +35,7 @@ export function createDesignResourceHandoffSetIntegrity(fail) {
35
35
  sharedHeader(scope, "provenance", handoff.provenance);
36
36
  sharedHeader(scope, "proposal", handoff.proposal);
37
37
  sharedCollection(scope, "resources", handoff.resources);
38
+ sharedCollection(scope, "technical_feasibility_inputs", handoff.technical_feasibility_inputs);
38
39
  sharedCollection(scope, "conditions", handoff.conditions);
39
40
  sharedCollection(scope, "properties", handoff.properties);
40
41
  sharedCollection(scope, "resource_fact_closure", handoff.resource_fact_closure);
@@ -1,4 +1,5 @@
1
1
  import { parseDesignResourceSymbolicHandoffShape } from "./design-resource-symbolic-fact-shape.js";
2
+ import { parseDesignResourceTechnicalFeasibilityInputs } from "./design-resource-implementation-feasibility-shape.js";
2
3
  import { parseDesignResourceAssetBindings, parseDesignResourceAxisDispositions, parseDesignResourceConditionExclusions, parseDesignResourceEnvironments, parseDesignResourceFactCells, parseDesignResourceLineageNodes, parseDesignResourceOracles, parseDesignResourceProofObligations, parseDesignResourceProperties, parseDesignResourceVariationAxisDispositions, parseDesignResourceVariationExclusions, parseDesignResourceVariations, } from "./design-resource-fact-manifest-shape.js";
3
4
  import { parseDesignResourceHandoffBlockers, parseDesignResourceHandoffCoverage, parseDesignResourceHandoffEvidence, parseDesignResourceHandoffFacts, parseDesignResourceHandoffResourceFactClosure, } from "./design-resource-handoff-shape-evidence.js";
4
5
  import { contractKey, stableKeys, } from "./design-resource-handoff-shape-primitives.js";
@@ -49,7 +50,7 @@ export function parseDesignResourceHandoffShape(value) {
49
50
  "coverage",
50
51
  "acceptance_blockers",
51
52
  "proposal",
52
- ]);
53
+ ], ["technical_feasibility_inputs"]);
53
54
  const scope = object(root.scope, "design_resource_handoff.scope", [
54
55
  "key",
55
56
  "style_dependency",
@@ -92,6 +93,7 @@ export function parseDesignResourceHandoffShape(value) {
92
93
  model: string(provenance.model, "design_resource_handoff.provenance.model"),
93
94
  design_system_id: string(provenance.design_system_id, "design_resource_handoff.provenance.design_system_id"),
94
95
  },
96
+ technical_feasibility_inputs: parseDesignResourceTechnicalFeasibilityInputs(root.technical_feasibility_inputs ?? []),
95
97
  resources: parseDesignResourceHandoffResources(root.resources),
96
98
  axis_dispositions: parseDesignResourceAxisDispositions(root.axis_dispositions),
97
99
  condition_exclusions: parseDesignResourceConditionExclusions(root.condition_exclusions),
@@ -132,12 +134,13 @@ function parseManifestBackedDesignResourceHandoffShape(value) {
132
134
  "resource_fact_closure",
133
135
  "coverage",
134
136
  "proposal",
135
- ]);
137
+ ], ["technical_feasibility_inputs"]);
136
138
  const parsed = parseDesignResourceHandoffShape({
137
139
  schema_version: root.schema_version,
138
140
  intent: root.intent,
139
141
  scope: root.scope,
140
142
  provenance: root.provenance,
143
+ technical_feasibility_inputs: root.technical_feasibility_inputs ?? [],
141
144
  resources: root.resources,
142
145
  axis_dispositions: [],
143
146
  condition_exclusions: [],
@@ -167,6 +170,7 @@ function parseManifestBackedDesignResourceHandoffShape(value) {
167
170
  intent: parsed.intent,
168
171
  scope: parsed.scope,
169
172
  provenance: parsed.provenance,
173
+ technical_feasibility_inputs: parsed.technical_feasibility_inputs,
170
174
  resources: parsed.resources,
171
175
  targets: parsed.targets,
172
176
  resource_fact_closure: parsed.resource_fact_closure,
@@ -1,5 +1,6 @@
1
1
  import type { ExecutionTargetCapabilityV2 } from "./execution-target-capabilities.js";
2
2
  import type { DesignResourceAssetBindingV1, DesignResourceAxisDispositionV1, DesignResourceConditionCombinationDispositionV1, DesignResourceEnvironmentV1, DesignResourceFactCellV1, DesignResourceFactV1, DesignResourceLineageNodeV1, DesignResourceManifestCollectionName, DesignResourceOracleV1, DesignResourcePropertyDefinitionV1, DesignResourceProofObligationV1, DesignResourceRelationEndpointV1, DesignResourceSubjectKind, DesignResourceSubjectPresenceKind, DesignResourceSubjectVariationV1, DesignResourceVariationAxisDispositionV1, DesignResourceVariationCombinationDispositionV1 } from "./design-resource-fact-manifest-types.js";
3
+ import type { DesignResourceImplementationFeasibilityIdentityV1, DesignResourceImplementationFeasibilityV1, DesignResourceTechnicalFeasibilityInputV1 } from "./design-resource-implementation-feasibility-types.js";
3
4
  export declare const DESIGN_RESOURCE_DIMENSIONS: readonly ["surface_flow", "visual_content", "component_control", "state_interaction", "motion", "adaptation_input", "accessibility", "assets"];
4
5
  export type DesignResourceDimension = (typeof DESIGN_RESOURCE_DIMENSIONS)[number];
5
6
  export declare const DESIGN_RESOURCE_EVIDENCE_KINDS: readonly ["frame", "component_variant", "prototype_state", "prototype_transition", "motion_spec", "motion_capture", "responsive_spec", "input_spec", "accessibility_spec", "semantic_tree", "token_spec", "asset", "annotation", "localization_spec", "system_ui_spec", "haptic_spec", "sound_spec", "sound_capture", "render_environment", "relation_spec"];
@@ -30,6 +31,7 @@ export interface DesignResourceHandoffV1 {
30
31
  model: string;
31
32
  design_system_id: string;
32
33
  };
34
+ technical_feasibility_inputs: DesignResourceTechnicalFeasibilityInputV1[];
33
35
  resources: DesignResourceHandoffResourceV1[];
34
36
  axis_dispositions: DesignResourceAxisDispositionV1[];
35
37
  condition_exclusions: DesignResourceConditionCombinationDispositionV1[];
@@ -220,6 +222,9 @@ export interface DesignResourceHandoffPreflightV1 extends ParsedDesignResourceHa
220
222
  schema_version: "design-resource-handoff-preflight-v1";
221
223
  status: "ready";
222
224
  resource_hashes: Record<string, string>;
225
+ technical_feasibility_documents: DesignResourceImplementationFeasibilityV1[];
226
+ technical_feasibility_identities: DesignResourceImplementationFeasibilityIdentityV1[];
227
+ limitations: string[];
223
228
  manifest_identities: Array<{
224
229
  resource_ref: string;
225
230
  path: string;
@@ -12,6 +12,8 @@ import { indexDesignResourceItems, invalidDesignResourceHandoff, requireNonempty
12
12
  import { validateDesignResourceConditions, validateDesignResourceEvidence, validateDesignResourceScope, validateDesignResourceSubjects, validateDesignResourceTargets, } from "./design-resource-handoff-validation-structure.js";
13
13
  import { assertProtectedRepositoryFile } from "./long-task-protected-files.js";
14
14
  import { assertDesignResourceV1HandoffCapacity } from "./design-resource-v1-capacity.js";
15
+ import { createV1ImplementationFeasibilityTargetModel } from "./design-resource-implementation-feasibility-model.js";
16
+ import { readAndValidateDesignResourceImplementationFeasibility } from "./design-resource-implementation-feasibility-validation.js";
15
17
  export async function preflightDesignResourceHandoff(repository, handoffPath) {
16
18
  const handoffFile = await assertProtectedRepositoryFile(repository, path.resolve(repository, ...handoffPath.split("/")), "design_resource_handoff");
17
19
  await assertDesignResourceV1HandoffCapacity(handoffFile);
@@ -46,11 +48,21 @@ export async function preflightParsedDesignResourceHandoff(repository, parsed) {
46
48
  validateDesignResourceFiles(normalized, snapshot.contents);
47
49
  validateDesignResourceFactManifests(normalized, snapshot.contents, manifests, !isManifestBacked(inputHandoff));
48
50
  const resources = new Map(handoff.resources.map((resource) => [resource.key, resource]));
51
+ const feasibility = await readAndValidateDesignResourceImplementationFeasibility(repository, parsed.handoff_path, handoff.technical_feasibility_inputs, new Map(handoff.targets.map((target) => [
52
+ target.key,
53
+ createV1ImplementationFeasibilityTargetModel(handoff, target),
54
+ ])), new Set(handoff.resources.map((resource) => resource.path)));
49
55
  return {
50
56
  schema_version: "design-resource-handoff-preflight-v1",
51
57
  status: "ready",
52
58
  ...normalized,
53
59
  resource_hashes: snapshot.hashes,
60
+ technical_feasibility_documents: feasibility.map((item) => item.document),
61
+ technical_feasibility_identities: feasibility.map((item) => item.identity),
62
+ limitations: handoff.targets.some((target) => target.source_profile.kind !== "reference" &&
63
+ !feasibility.some((item) => item.index.target_ref === target.key))
64
+ ? ["technical feasibility not declared"]
65
+ : [],
54
66
  manifest_identities: handoff.targets.map((target) => {
55
67
  const resourceRef = target.source_profile.fact_manifest_resource_ref;
56
68
  const resource = resources.get(resourceRef);
@@ -0,0 +1,35 @@
1
+ import type { DesignResourceHandoffV1 } from "./design-resource-handoff-types.js";
2
+ import type { DesignResourceObservableRuleManifestV2, DesignResourceSymbolicFactRuleV2, DesignResourceSymbolicHandoffTargetV2 } from "./design-resource-symbolic-fact-types.js";
3
+ import type { SymbolicDenotationAxisDomain, SymbolicDenotationPredicate } from "./symbolic-denotation-types.js";
4
+ interface FeasibilityTargetModelBase {
5
+ target_ref: string;
6
+ source_profile_kind: "implementation_web" | "implementation_app" | "reference";
7
+ component_family_refs: string[];
8
+ component_family_subject_refs: Map<string, Set<string>>;
9
+ }
10
+ export interface DesignResourceImplementationFeasibilityV1TargetModel extends FeasibilityTargetModelBase {
11
+ representation: "fact_cells_v1";
12
+ condition_refs: string[];
13
+ facts: Map<string, {
14
+ target_ref: string;
15
+ subject_ref: string;
16
+ condition_ref: string;
17
+ }>;
18
+ }
19
+ export interface DesignResourceImplementationFeasibilityV2TargetModel extends FeasibilityTargetModelBase {
20
+ representation: "symbolic_rules_v2";
21
+ axis_domains: SymbolicDenotationAxisDomain[];
22
+ reachable_region: SymbolicDenotationPredicate;
23
+ fact_rules: Map<string, DesignResourceSymbolicFactRuleV2>;
24
+ }
25
+ export type DesignResourceImplementationFeasibilityTargetModel = DesignResourceImplementationFeasibilityV1TargetModel | DesignResourceImplementationFeasibilityV2TargetModel;
26
+ export declare function createV1ImplementationFeasibilityTargetModel(handoff: DesignResourceHandoffV1, target: DesignResourceHandoffV1["targets"][number]): DesignResourceImplementationFeasibilityV1TargetModel;
27
+ export declare function createV2ImplementationFeasibilityTargetModel(target: DesignResourceSymbolicHandoffTargetV2, manifest: DesignResourceObservableRuleManifestV2): DesignResourceImplementationFeasibilityV2TargetModel;
28
+ export declare function deriveComponentFamilySubjectClosure(familyRefs: string[], subjects: Array<{
29
+ key: string;
30
+ family_ref: string | null;
31
+ parent_ref: string | null;
32
+ instance_of_ref: string | null;
33
+ override_of_ref: string | null;
34
+ }>): Map<string, Set<string>>;
35
+ export {};
@@ -0,0 +1,62 @@
1
+ export function createV1ImplementationFeasibilityTargetModel(handoff, target) {
2
+ const componentFamilies = handoff.subjects.filter((subject) => subject.kind === "component_family" &&
3
+ subject.target_refs.includes(target.key));
4
+ return {
5
+ representation: "fact_cells_v1",
6
+ target_ref: target.key,
7
+ source_profile_kind: target.source_profile.kind,
8
+ component_family_refs: componentFamilies.map((subject) => subject.key),
9
+ component_family_subject_refs: deriveComponentFamilySubjectClosure(componentFamilies.map((subject) => subject.key), handoff.subjects),
10
+ condition_refs: [...target.condition_refs],
11
+ facts: new Map(handoff.facts.map((fact) => [
12
+ fact.key,
13
+ {
14
+ target_ref: fact.target_ref,
15
+ subject_ref: fact.subject_ref,
16
+ condition_ref: fact.condition_ref,
17
+ },
18
+ ])),
19
+ };
20
+ }
21
+ export function createV2ImplementationFeasibilityTargetModel(target, manifest) {
22
+ const componentFamilies = manifest.subjects.filter((subject) => subject.kind === "component_family" &&
23
+ subject.target_refs.includes(target.key));
24
+ return {
25
+ representation: "symbolic_rules_v2",
26
+ target_ref: target.key,
27
+ source_profile_kind: target.source_profile.kind,
28
+ component_family_refs: componentFamilies.map((subject) => subject.key),
29
+ component_family_subject_refs: deriveComponentFamilySubjectClosure(componentFamilies.map((subject) => subject.key), manifest.subjects),
30
+ axis_domains: manifest.axis_domains,
31
+ reachable_region: manifest.reachable_region,
32
+ fact_rules: new Map(manifest.fact_rules.map((rule) => [rule.key, rule])),
33
+ };
34
+ }
35
+ export function deriveComponentFamilySubjectClosure(familyRefs, subjects) {
36
+ const result = new Map();
37
+ for (const familyRef of familyRefs) {
38
+ const closure = new Set(subjects
39
+ .filter((subject) => subject.key === familyRef ||
40
+ subject.family_ref === familyRef ||
41
+ subject.instance_of_ref === familyRef)
42
+ .map((subject) => subject.key));
43
+ let changed = true;
44
+ while (changed) {
45
+ changed = false;
46
+ for (const subject of subjects) {
47
+ if (closure.has(subject.key))
48
+ continue;
49
+ if ((subject.parent_ref !== null && closure.has(subject.parent_ref)) ||
50
+ (subject.instance_of_ref !== null &&
51
+ closure.has(subject.instance_of_ref)) ||
52
+ (subject.override_of_ref !== null &&
53
+ closure.has(subject.override_of_ref))) {
54
+ closure.add(subject.key);
55
+ changed = true;
56
+ }
57
+ }
58
+ }
59
+ result.set(familyRef, closure);
60
+ }
61
+ return result;
62
+ }
@@ -0,0 +1,43 @@
1
+ import { type DesignResourceImplementationConditionModelV1 } from "./design-resource-implementation-feasibility-types.js";
2
+ export declare function parseConditionModel(value: unknown, label: string): DesignResourceImplementationConditionModelV1;
3
+ export declare function parseComponentFamilyCells(value: unknown, label: string): {
4
+ key: string;
5
+ component_family_ref: string;
6
+ target_ref: string;
7
+ condition_profile_ref: string;
8
+ design_fact_refs: string[];
9
+ feasible_realizations: {
10
+ key: string;
11
+ strategy_steps: ("compose_existing" | "create_shared_component" | "extend_shared_component" | "reuse_existing" | "theme_with_tokens")[];
12
+ primitive_refs: string[];
13
+ owner_candidates: ({
14
+ kind: "existing_path";
15
+ locator: string;
16
+ existence: "existing";
17
+ authorization_source_refs?: undefined;
18
+ } | {
19
+ kind: "planned_logical_owner";
20
+ locator: string;
21
+ existence: "planned";
22
+ authorization_source_refs: string[];
23
+ })[];
24
+ supported_customization_surfaces: ("behavior_slot" | "component_variant" | "composition" | "content_slot" | "icon_slot" | "primitive_props" | "style_api" | "theme_tokens")[];
25
+ feasibility_basis_refs: string[];
26
+ observed_costs: string[];
27
+ observed_risks: string[];
28
+ }[];
29
+ required_realization: {
30
+ realization_ref: string | null;
31
+ technical_authority_source_refs: string[];
32
+ };
33
+ blocker_refs: string[];
34
+ }[];
35
+ export declare function parseBlockers(value: unknown, label: string): {
36
+ key: string;
37
+ component_family_ref: string;
38
+ target_ref: string;
39
+ condition_profile_ref: string;
40
+ source_record_refs: string[];
41
+ substrate_observation_refs: ("component_owner_roots" | "framework_runtime" | "platform" | "route_owner_roots" | "token_theming_adapter" | "ui_system")[];
42
+ description: string;
43
+ }[];
@@ -0,0 +1,142 @@
1
+ import { DESIGN_RESOURCE_CUSTOMIZATION_SURFACES, DESIGN_RESOURCE_IMPLEMENTATION_STRATEGY_STEPS, DESIGN_RESOURCE_SUBSTRATE_OBSERVATION_KINDS, } from "./design-resource-implementation-feasibility-types.js";
2
+ import { parseSymbolicPredicate } from "./design-resource-symbolic-predicate-shape.js";
3
+ import { contractKey, stableKey, stableKeys, } from "./design-resource-handoff-shape-primitives.js";
4
+ import { array, literal, nullable, object, repositoryFile, string, strings, } from "./long-task-shape-primitives.js";
5
+ export function parseConditionModel(value, label) {
6
+ const itemLabel = `${label}.condition_model`;
7
+ const kind = object(value, itemLabel, ["kind", "profiles"]).kind;
8
+ if (kind === "explicit_conditions_v1") {
9
+ const row = object(value, itemLabel, ["kind", "profiles"]);
10
+ return {
11
+ kind: literal(row.kind, ["explicit_conditions_v1"], `${itemLabel}.kind`),
12
+ profiles: array(row.profiles, `${itemLabel}.profiles`).map((profile, index) => {
13
+ const profileLabel = `${itemLabel}.profiles[${index}]`;
14
+ const profileRow = object(profile, profileLabel, [
15
+ "key",
16
+ "condition_refs",
17
+ ]);
18
+ return {
19
+ key: stableKey(profileRow.key, `${profileLabel}.key`),
20
+ condition_refs: stableKeys(profileRow.condition_refs, `${profileLabel}.condition_refs`),
21
+ };
22
+ }),
23
+ };
24
+ }
25
+ const row = object(value, itemLabel, ["kind", "profiles"]);
26
+ return {
27
+ kind: literal(row.kind, ["symbolic_regions_v2"], `${itemLabel}.kind`),
28
+ profiles: array(row.profiles, `${itemLabel}.profiles`).map((profile, index) => {
29
+ const profileLabel = `${itemLabel}.profiles[${index}]`;
30
+ const profileRow = object(profile, profileLabel, ["key", "region"]);
31
+ return {
32
+ key: stableKey(profileRow.key, `${profileLabel}.key`),
33
+ region: parseSymbolicPredicate(profileRow.region, `${profileLabel}.region`),
34
+ };
35
+ }),
36
+ };
37
+ }
38
+ export function parseComponentFamilyCells(value, label) {
39
+ return array(value, `${label}.component_family_cells`).map((item, index) => {
40
+ const itemLabel = `${label}.component_family_cells[${index}]`;
41
+ const row = object(item, itemLabel, [
42
+ "key",
43
+ "component_family_ref",
44
+ "target_ref",
45
+ "condition_profile_ref",
46
+ "design_fact_refs",
47
+ "feasible_realizations",
48
+ "required_realization",
49
+ "blocker_refs",
50
+ ]);
51
+ const required = object(row.required_realization, `${itemLabel}.required_realization`, ["realization_ref", "technical_authority_source_refs"]);
52
+ return {
53
+ key: stableKey(row.key, `${itemLabel}.key`),
54
+ component_family_ref: stableKey(row.component_family_ref, `${itemLabel}.component_family_ref`),
55
+ target_ref: contractKey(row.target_ref, `${itemLabel}.target_ref`),
56
+ condition_profile_ref: stableKey(row.condition_profile_ref, `${itemLabel}.condition_profile_ref`),
57
+ design_fact_refs: stableKeys(row.design_fact_refs, `${itemLabel}.design_fact_refs`),
58
+ feasible_realizations: parseRealizations(row.feasible_realizations, itemLabel),
59
+ required_realization: {
60
+ realization_ref: nullable(required.realization_ref, (entry) => stableKey(entry, `${itemLabel}.required_realization.realization_ref`)),
61
+ technical_authority_source_refs: stableKeys(required.technical_authority_source_refs, `${itemLabel}.required_realization.technical_authority_source_refs`),
62
+ },
63
+ blocker_refs: stableKeys(row.blocker_refs, `${itemLabel}.blocker_refs`),
64
+ };
65
+ });
66
+ }
67
+ function parseRealizations(value, label) {
68
+ return array(value, `${label}.feasible_realizations`).map((item, index) => {
69
+ const itemLabel = `${label}.feasible_realizations[${index}]`;
70
+ const row = object(item, itemLabel, [
71
+ "key",
72
+ "strategy_steps",
73
+ "primitive_refs",
74
+ "owner_candidates",
75
+ "supported_customization_surfaces",
76
+ "feasibility_basis_refs",
77
+ "observed_costs",
78
+ "observed_risks",
79
+ ]);
80
+ return {
81
+ key: stableKey(row.key, `${itemLabel}.key`),
82
+ strategy_steps: array(row.strategy_steps, `${itemLabel}.strategy_steps`).map((step, stepIndex) => literal(step, DESIGN_RESOURCE_IMPLEMENTATION_STRATEGY_STEPS, `${itemLabel}.strategy_steps[${stepIndex}]`)),
83
+ primitive_refs: stableKeys(row.primitive_refs, `${itemLabel}.primitive_refs`),
84
+ owner_candidates: parseOwnerCandidates(row.owner_candidates, itemLabel),
85
+ supported_customization_surfaces: array(row.supported_customization_surfaces, `${itemLabel}.supported_customization_surfaces`).map((surface, surfaceIndex) => literal(surface, DESIGN_RESOURCE_CUSTOMIZATION_SURFACES, `${itemLabel}.supported_customization_surfaces[${surfaceIndex}]`)),
86
+ feasibility_basis_refs: stableKeys(row.feasibility_basis_refs, `${itemLabel}.feasibility_basis_refs`),
87
+ observed_costs: strings(row.observed_costs, `${itemLabel}.observed_costs`),
88
+ observed_risks: strings(row.observed_risks, `${itemLabel}.observed_risks`),
89
+ };
90
+ });
91
+ }
92
+ function parseOwnerCandidates(value, label) {
93
+ return array(value, `${label}.owner_candidates`).map((item, index) => {
94
+ const itemLabel = `${label}.owner_candidates[${index}]`;
95
+ const kind = object(item, itemLabel, ["kind", "locator", "existence"], ["authorization_source_refs"]).kind;
96
+ if (kind === "existing_path") {
97
+ const row = object(item, itemLabel, ["kind", "locator", "existence"]);
98
+ return {
99
+ kind: literal(row.kind, ["existing_path"], `${itemLabel}.kind`),
100
+ locator: repositoryFile(row.locator, `${itemLabel}.locator`),
101
+ existence: literal(row.existence, ["existing"], `${itemLabel}.existence`),
102
+ };
103
+ }
104
+ const row = object(item, itemLabel, [
105
+ "kind",
106
+ "locator",
107
+ "existence",
108
+ "authorization_source_refs",
109
+ ]);
110
+ return {
111
+ kind: literal(row.kind, ["planned_logical_owner"], `${itemLabel}.kind`),
112
+ locator: stableKey(row.locator, `${itemLabel}.locator`),
113
+ existence: literal(row.existence, ["planned"], `${itemLabel}.existence`),
114
+ authorization_source_refs: stableKeys(row.authorization_source_refs, `${itemLabel}.authorization_source_refs`),
115
+ };
116
+ });
117
+ }
118
+ export function parseBlockers(value, label) {
119
+ return array(value, `${label}.blockers`).map((item, index) => {
120
+ const itemLabel = `${label}.blockers[${index}]`;
121
+ const row = object(item, itemLabel, [
122
+ "key",
123
+ "component_family_ref",
124
+ "target_ref",
125
+ "condition_profile_ref",
126
+ "source_record_refs",
127
+ "substrate_observation_refs",
128
+ "description",
129
+ ]);
130
+ return {
131
+ key: stableKey(row.key, `${itemLabel}.key`),
132
+ component_family_ref: stableKey(row.component_family_ref, `${itemLabel}.component_family_ref`),
133
+ target_ref: contractKey(row.target_ref, `${itemLabel}.target_ref`),
134
+ condition_profile_ref: stableKey(row.condition_profile_ref, `${itemLabel}.condition_profile_ref`),
135
+ source_record_refs: stableKeys(row.source_record_refs, `${itemLabel}.source_record_refs`),
136
+ substrate_observation_refs: array(row.substrate_observation_refs, `${itemLabel}.substrate_observation_refs`)
137
+ .map((observationRef, observationIndex) => literal(observationRef, DESIGN_RESOURCE_SUBSTRATE_OBSERVATION_KINDS, `${itemLabel}.substrate_observation_refs[${observationIndex}]`))
138
+ .sort(),
139
+ description: string(row.description, `${itemLabel}.description`),
140
+ };
141
+ });
142
+ }
@@ -0,0 +1,4 @@
1
+ import { type DesignResourceImplementationFeasibilityV1, type DesignResourceTechnicalFeasibilityInputV1 } from "./design-resource-implementation-feasibility-types.js";
2
+ export declare function parseDesignResourceTechnicalFeasibilityInputs(value: unknown, label?: string): DesignResourceTechnicalFeasibilityInputV1[];
3
+ export declare function parseDesignResourceImplementationFeasibilityJson(content: string): DesignResourceImplementationFeasibilityV1;
4
+ export declare function parseDesignResourceImplementationFeasibilityShape(value: unknown): DesignResourceImplementationFeasibilityV1;