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.
- package/README.md +53 -28
- package/assets/README.md +52 -25
- package/assets/README.zh-CN.md +55 -26
- package/assets/agents/AGENTS_CORE.md +2 -2
- package/assets/agents/long-task-implementation.toml +1 -1
- package/assets/context_templates/screen-contract.md +16 -0
- package/assets/skills/context_development_engineer/SKILL.md +16 -30
- package/assets/skills/context_development_engineer/references/engineering-design-reasoning.md +93 -0
- package/assets/skills/context_surface_contract/SKILL.md +13 -2
- package/assets/skills/context_uiux_design/SKILL.md +7 -3
- package/assets/skills/context_uiux_design/references/task-uiux-analysis.md +82 -0
- package/assets/skills/design-resource-authoring/SKILL.md +14 -8
- package/assets/skills/design-resource-authoring/references/downstream-handoff.md +18 -6
- package/assets/skills/design-resource-authoring/references/formal-selected-web-app-handoff.md +26 -8
- package/assets/skills/design-resource-authoring/references/implementation-feasibility.md +111 -0
- package/assets/skills/design-resource-authoring/references/open-design-provider.md +45 -7
- package/assets/skills/design-resource-authoring/references/recovery-and-writeback.md +7 -1
- package/assets/skills/design-resource-authoring/references/resource-selection.md +115 -3
- package/assets/skills/long-task-workflow/SKILL.md +9 -7
- package/assets/skills/long-task-workflow/agents/openai.yaml +1 -1
- package/assets/skills/long-task-workflow/references/authority-lifecycle.md +1 -1
- package/dist/commands/design-resource.js +9 -2
- package/dist/commands/long-task-revision.js +4 -4
- package/dist/index.d.ts +1 -1
- package/dist/lib/design-resource-handoff-bundle.js +5 -0
- package/dist/lib/design-resource-handoff-input-types.d.ts +1 -1
- package/dist/lib/design-resource-handoff-manifest-projection.js +1 -0
- package/dist/lib/design-resource-handoff-set-integrity.js +1 -0
- package/dist/lib/design-resource-handoff-shape.js +6 -2
- package/dist/lib/design-resource-handoff-types.d.ts +5 -0
- package/dist/lib/design-resource-handoff-validation.js +12 -0
- package/dist/lib/design-resource-implementation-feasibility-model.d.ts +35 -0
- package/dist/lib/design-resource-implementation-feasibility-model.js +62 -0
- package/dist/lib/design-resource-implementation-feasibility-shape-sections.d.ts +43 -0
- package/dist/lib/design-resource-implementation-feasibility-shape-sections.js +142 -0
- package/dist/lib/design-resource-implementation-feasibility-shape.d.ts +4 -0
- package/dist/lib/design-resource-implementation-feasibility-shape.js +154 -0
- package/dist/lib/design-resource-implementation-feasibility-source-decision-projection.d.ts +24 -0
- package/dist/lib/design-resource-implementation-feasibility-source-decision-projection.js +106 -0
- package/dist/lib/design-resource-implementation-feasibility-source-decision.d.ts +21 -0
- package/dist/lib/design-resource-implementation-feasibility-source-decision.js +75 -0
- package/dist/lib/design-resource-implementation-feasibility-types.d.ts +135 -0
- package/dist/lib/design-resource-implementation-feasibility-types.js +37 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-cells.d.ts +5 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-cells.js +125 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-document.d.ts +4 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-document.js +167 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-facts.d.ts +3 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-facts.js +76 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-realizations.d.ts +8 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-realizations.js +76 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-support.d.ts +10 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-support.js +75 -0
- package/dist/lib/design-resource-implementation-feasibility-validation.d.ts +3 -0
- package/dist/lib/design-resource-implementation-feasibility-validation.js +138 -0
- package/dist/lib/design-resource-symbolic-fact-shape.js +3 -1
- package/dist/lib/design-resource-symbolic-fact-types.d.ts +5 -0
- package/dist/lib/design-resource-symbolic-fact-validation.js +13 -0
- package/dist/lib/long-task-activation-validation.js +77 -7
- package/dist/lib/long-task-authority-revision-brief.js +3 -1
- package/dist/lib/long-task-authority-revision-summary.js +6 -2
- package/dist/lib/long-task-authority-revision-types.d.ts +2 -0
- package/dist/lib/long-task-check-runner.js +3 -296
- package/dist/lib/long-task-command-process.d.ts +9 -0
- package/dist/lib/long-task-command-process.js +175 -0
- package/dist/lib/long-task-delivery-validation.d.ts +5 -2
- package/dist/lib/long-task-delivery-validation.js +4 -4
- package/dist/lib/long-task-design-feasibility-binding-owners.d.ts +6 -0
- package/dist/lib/long-task-design-feasibility-binding-owners.js +52 -0
- package/dist/lib/long-task-design-feasibility-binding.d.ts +13 -0
- package/dist/lib/long-task-design-feasibility-binding.js +114 -0
- package/dist/lib/long-task-design-feasibility-source-closure.d.ts +11 -0
- package/dist/lib/long-task-design-feasibility-source-closure.js +78 -0
- package/dist/lib/long-task-design-resource-handoff.d.ts +3 -3
- package/dist/lib/long-task-design-resource-handoff.js +39 -3
- package/dist/lib/long-task-design-resource-method-binding.js +16 -4
- package/dist/lib/long-task-freshness.js +1 -1
- package/dist/lib/long-task-git.d.ts +26 -0
- package/dist/lib/long-task-git.js +130 -0
- package/dist/lib/long-task-paths.js +1 -1
- package/dist/lib/long-task-process-runtime-closure.js +74 -42
- package/dist/lib/long-task-process-table.d.ts +12 -0
- package/dist/lib/long-task-process-table.js +119 -0
- package/dist/lib/long-task-process-tree.d.ts +9 -0
- package/dist/lib/long-task-process-tree.js +138 -0
- package/dist/lib/long-task-protected-files.d.ts +1 -1
- package/dist/lib/long-task-protected-files.js +1 -1
- package/dist/lib/long-task-ui-surface-policy.d.ts +2 -1
- package/dist/lib/long-task-ui-surface-policy.js +7 -4
- package/dist/lib/long-task-ui-surface-validation.d.ts +3 -1
- package/dist/lib/long-task-ui-surface-validation.js +2 -2
- package/dist/lib/long-task-verifier-authority.js +2 -0
- package/dist/lib/long-task-workspace-manifest.d.ts +8 -0
- package/dist/lib/long-task-workspace-manifest.js +173 -0
- package/dist/lib/long-task-workspace-snapshot.d.ts +8 -0
- package/dist/lib/long-task-workspace-snapshot.js +176 -0
- package/dist/lib/long-task-workspace.d.ts +4 -25
- package/dist/lib/long-task-workspace.js +3 -432
- package/dist/lib/repository-path-safety.d.ts +2 -0
- package/dist/lib/repository-path-safety.js +36 -0
- package/dist/long-task-hook.js +12 -3
- package/dist/public-types.d.ts +1 -0
- 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
|
|
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
|
|
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,
|
|
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:
|
|
172
|
-
message: "Authority Lock created. End the current turn before product implementation, file edits, builds, or tests. After handling 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;
|