project-tiny-context-harness 0.7.8 → 0.8.0

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 (150) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +393 -375
  3. package/assets/README.md +567 -552
  4. package/assets/README.zh-CN.md +339 -321
  5. package/assets/agents/.gitkeep +1 -1
  6. package/assets/agents/AGENTS_CORE.md +66 -58
  7. package/assets/context_templates/architecture.md +33 -33
  8. package/assets/context_templates/area.md +39 -39
  9. package/assets/context_templates/context.toml +30 -30
  10. package/assets/context_templates/deployment.md +35 -35
  11. package/assets/context_templates/global.md +52 -51
  12. package/assets/context_templates/product-surface-contract.md +70 -70
  13. package/assets/context_templates/screen-contract.md +186 -177
  14. package/assets/context_templates/verification.md +32 -32
  15. package/assets/github/.gitkeep +1 -1
  16. package/assets/github/harness.yml +41 -41
  17. package/assets/make/.gitkeep +1 -1
  18. package/assets/make/ty-context.mk +48 -48
  19. package/assets/skills/context_development_engineer/SKILL.md +135 -112
  20. package/assets/skills/context_full_project_export/SKILL.md +70 -70
  21. package/assets/skills/context_harness_upgrade/SKILL.md +60 -60
  22. package/assets/skills/context_product_plan/SKILL.md +88 -87
  23. package/assets/skills/context_surface_contract/SKILL.md +191 -191
  24. package/assets/skills/context_uiux_design/SKILL.md +158 -154
  25. package/assets/skills/design-resource-authoring/SKILL.md +84 -79
  26. package/assets/skills/design-resource-authoring/references/downstream-handoff.md +136 -108
  27. package/assets/skills/design-resource-authoring/references/open-design-provider.md +133 -127
  28. package/assets/skills/design-resource-authoring/references/resource-selection.md +173 -173
  29. package/assets/skills/design-system-authoring/SKILL.md +57 -57
  30. package/assets/skills/design-system-authoring/agents/openai.yaml +6 -6
  31. package/assets/skills/design-system-authoring/references/authority-adoption.md +48 -47
  32. package/assets/skills/design-system-authoring/references/open-design-design-system-provider.md +110 -110
  33. package/assets/skills/long-task-workflow/SKILL.md +100 -87
  34. package/assets/skills/long-task-workflow/agents/openai.yaml +4 -4
  35. package/assets/skills/long-task-workflow/references/authority-lifecycle.md +76 -59
  36. package/assets/skills/long-task-workflow/references/contract-authoring.md +116 -103
  37. package/assets/skills/long-task-workflow/references/evidence-design.md +78 -75
  38. package/assets/skills/long-task-workflow/references/source-authoring.md +101 -98
  39. package/assets/skills/normal-long-task/SKILL.md +12 -12
  40. package/assets/skills/source-plan-authoring/SKILL.md +14 -14
  41. package/assets/tools/validate_context.py +442 -442
  42. package/dist/commands/design-resource.d.ts +1 -0
  43. package/dist/commands/design-resource.js +32 -0
  44. package/dist/commands/index.js +4 -0
  45. package/dist/commands/long-task-command-args.d.ts +1 -0
  46. package/dist/commands/long-task-command-args.js +6 -0
  47. package/dist/commands/long-task-revision.js +16 -4
  48. package/dist/commands/long-task.js +12 -5
  49. package/dist/index.d.ts +1 -0
  50. package/dist/index.js +1 -0
  51. package/dist/lib/design-md.js +3 -1
  52. package/dist/lib/design-resource-handoff-file-primitives.d.ts +4 -0
  53. package/dist/lib/design-resource-handoff-file-primitives.js +14 -0
  54. package/dist/lib/design-resource-handoff-file-validation.d.ts +2 -0
  55. package/dist/lib/design-resource-handoff-file-validation.js +142 -0
  56. package/dist/lib/design-resource-handoff-parser.d.ts +3 -0
  57. package/dist/lib/design-resource-handoff-parser.js +29 -0
  58. package/dist/lib/design-resource-handoff-policy.d.ts +3 -0
  59. package/dist/lib/design-resource-handoff-policy.js +36 -0
  60. package/dist/lib/design-resource-handoff-shape-evidence.d.ts +4 -0
  61. package/dist/lib/design-resource-handoff-shape-evidence.js +84 -0
  62. package/dist/lib/design-resource-handoff-shape-primitives.d.ts +9 -0
  63. package/dist/lib/design-resource-handoff-shape-primitives.js +44 -0
  64. package/dist/lib/design-resource-handoff-shape-structure.d.ts +5 -0
  65. package/dist/lib/design-resource-handoff-shape-structure.js +118 -0
  66. package/dist/lib/design-resource-handoff-shape.d.ts +2 -0
  67. package/dist/lib/design-resource-handoff-shape.js +75 -0
  68. package/dist/lib/design-resource-handoff-types.d.ts +139 -0
  69. package/dist/lib/design-resource-handoff-types.js +46 -0
  70. package/dist/lib/design-resource-handoff-validation-coverage.d.ts +4 -0
  71. package/dist/lib/design-resource-handoff-validation-coverage.js +168 -0
  72. package/dist/lib/design-resource-handoff-validation-primitives.d.ts +11 -0
  73. package/dist/lib/design-resource-handoff-validation-primitives.js +26 -0
  74. package/dist/lib/design-resource-handoff-validation-structure.d.ts +6 -0
  75. package/dist/lib/design-resource-handoff-validation-structure.js +93 -0
  76. package/dist/lib/design-resource-handoff-validation.d.ts +3 -0
  77. package/dist/lib/design-resource-handoff-validation.js +78 -0
  78. package/dist/lib/design-resource-handoff-web-dependency-validation.d.ts +3 -0
  79. package/dist/lib/design-resource-handoff-web-dependency-validation.js +70 -0
  80. package/dist/lib/long-task-activation-validation.js +14 -2
  81. package/dist/lib/long-task-authoring-preflight-diagnostics.js +7 -0
  82. package/dist/lib/long-task-authoring-preflight.js +39 -1
  83. package/dist/lib/long-task-authority-material-diff.js +14 -0
  84. package/dist/lib/long-task-authority-materials.js +21 -0
  85. package/dist/lib/long-task-authority-policy.d.ts +33 -0
  86. package/dist/lib/long-task-authority-policy.js +36 -0
  87. package/dist/lib/long-task-authority-revision-analysis.d.ts +1 -0
  88. package/dist/lib/long-task-authority-revision-analysis.js +30 -0
  89. package/dist/lib/long-task-authority-revision-brief.d.ts +3 -0
  90. package/dist/lib/long-task-authority-revision-brief.js +74 -0
  91. package/dist/lib/long-task-authority-revision-details.js +16 -16
  92. package/dist/lib/long-task-authority-revision-diagnosis.d.ts +1 -1
  93. package/dist/lib/long-task-authority-revision-diagnosis.js +8 -0
  94. package/dist/lib/long-task-authority-revision-enforcement.js +7 -3
  95. package/dist/lib/long-task-authority-revision-summary.d.ts +3 -0
  96. package/dist/lib/long-task-authority-revision-summary.js +133 -21
  97. package/dist/lib/long-task-authority-revision-types.d.ts +19 -1
  98. package/dist/lib/long-task-authority-revision.js +5 -0
  99. package/dist/lib/long-task-authority-types.d.ts +2 -0
  100. package/dist/lib/long-task-authority.js +10 -2
  101. package/dist/lib/long-task-check-execution-policy.js +2 -0
  102. package/dist/lib/long-task-claim-definitions.js +1 -5
  103. package/dist/lib/long-task-contract-types.d.ts +2 -0
  104. package/dist/lib/long-task-counterfactual-sandbox.d.ts +7 -0
  105. package/dist/lib/long-task-counterfactual-sandbox.js +27 -1
  106. package/dist/lib/long-task-delivery-compiler.js +26 -8
  107. package/dist/lib/long-task-delivery-types.d.ts +1 -0
  108. package/dist/lib/long-task-delivery-types.js +1 -0
  109. package/dist/lib/long-task-delivery-validation.js +3 -0
  110. package/dist/lib/long-task-design-resource-handoff.d.ts +2 -0
  111. package/dist/lib/long-task-design-resource-handoff.js +177 -0
  112. package/dist/lib/long-task-evidence-capability-codec.js +19 -0
  113. package/dist/lib/long-task-evidence-capability-policy.js +4 -0
  114. package/dist/lib/long-task-evidence-capability-runtime.js +25 -0
  115. package/dist/lib/long-task-evidence-capability-types.d.ts +9 -1
  116. package/dist/lib/long-task-outcome-parser.js +11 -1
  117. package/dist/lib/long-task-paths.d.ts +0 -1
  118. package/dist/lib/long-task-paths.js +0 -4
  119. package/dist/lib/long-task-playwright-case-evidence.d.ts +43 -0
  120. package/dist/lib/long-task-playwright-case-evidence.js +152 -0
  121. package/dist/lib/long-task-playwright-evidence.js +19 -152
  122. package/dist/lib/long-task-runner-freeze.d.ts +2 -2
  123. package/dist/lib/long-task-runner-freeze.js +2 -1
  124. package/dist/lib/long-task-runtime-types.d.ts +2 -0
  125. package/dist/lib/long-task-semantic-contract-types.d.ts +1 -1
  126. package/dist/lib/long-task-semantic-drift-migration.js +6 -1
  127. package/dist/lib/long-task-shape-primitives.d.ts +1 -1
  128. package/dist/lib/long-task-shape-primitives.js +1 -0
  129. package/dist/lib/long-task-status-v2.js +12 -7
  130. package/dist/lib/long-task-ui-design-policy.d.ts +17 -0
  131. package/dist/lib/long-task-ui-design-policy.js +128 -0
  132. package/dist/lib/long-task-ui-surface-policy.d.ts +4 -0
  133. package/dist/lib/long-task-ui-surface-policy.js +109 -0
  134. package/dist/lib/long-task-ui-surface-shape.d.ts +2 -0
  135. package/dist/lib/long-task-ui-surface-shape.js +94 -0
  136. package/dist/lib/long-task-ui-surface-types.d.ts +44 -0
  137. package/dist/lib/long-task-ui-surface-types.js +1 -0
  138. package/dist/lib/long-task-ui-surface-validation.d.ts +11 -0
  139. package/dist/lib/long-task-ui-surface-validation.js +62 -0
  140. package/dist/lib/long-task-verification-preview.d.ts +55 -0
  141. package/dist/lib/long-task-verification-preview.js +120 -0
  142. package/dist/lib/long-task-verifier-v2.js +11 -18
  143. package/dist/lib/long-task-workspace-scope.d.ts +38 -0
  144. package/dist/lib/long-task-workspace-scope.js +121 -0
  145. package/dist/lib/long-task-workspace.d.ts +1 -0
  146. package/dist/lib/long-task-workspace.js +73 -9
  147. package/dist/schemas/long-task-delivery-v2/long-task-delivery-v2.schema.json +84 -2
  148. package/migrations/README.md +7 -7
  149. package/package.json +3 -3
  150. package/source-mappings.yaml +25 -25
@@ -0,0 +1,118 @@
1
+ import { contractKey, contractKeys, designResourceShapeFail, positiveInteger, stableKey, stableKeys, } from "./design-resource-handoff-shape-primitives.js";
2
+ import { array, literal, object, repositoryFile, string, strings, } from "./long-task-shape-primitives.js";
3
+ const SHA256 = /^[a-f0-9]{64}$/u;
4
+ export function parseDesignResourceHandoffResources(value) {
5
+ return array(value, "design_resource_handoff.resources").map((item, index) => {
6
+ const label = `design_resource_handoff.resources[${index}]`;
7
+ const row = object(item, label, [
8
+ "key",
9
+ "role",
10
+ "path",
11
+ "media_type",
12
+ "sha256",
13
+ "editable_upstream",
14
+ ]);
15
+ const upstream = object(row.editable_upstream, `${label}.editable_upstream`, ["owner", "locator", "update_route"]);
16
+ const digest = string(row.sha256, `${label}.sha256`);
17
+ if (!SHA256.test(digest))
18
+ designResourceShapeFail(`${label}.sha256`, "must be a lowercase SHA-256");
19
+ return {
20
+ key: stableKey(row.key, `${label}.key`),
21
+ role: literal(row.role, ["exact_target", "constraint", "supporting"], `${label}.role`),
22
+ path: repositoryFile(row.path, `${label}.path`),
23
+ media_type: string(row.media_type, `${label}.media_type`),
24
+ sha256: digest,
25
+ editable_upstream: {
26
+ owner: string(upstream.owner, `${label}.editable_upstream.owner`),
27
+ locator: string(upstream.locator, `${label}.editable_upstream.locator`),
28
+ update_route: string(upstream.update_route, `${label}.editable_upstream.update_route`),
29
+ },
30
+ };
31
+ });
32
+ }
33
+ export function parseDesignResourceHandoffConditions(value) {
34
+ return array(value, "design_resource_handoff.conditions").map((item, index) => {
35
+ const label = `design_resource_handoff.conditions[${index}]`;
36
+ const row = object(item, label, [
37
+ "key",
38
+ "platform",
39
+ "viewport",
40
+ "modes",
41
+ "states",
42
+ "content_cases",
43
+ "input_methods",
44
+ "motion",
45
+ ]);
46
+ const viewport = object(row.viewport, `${label}.viewport`, [
47
+ "width",
48
+ "height",
49
+ "unit",
50
+ ]);
51
+ return {
52
+ key: contractKey(row.key, `${label}.key`),
53
+ platform: string(row.platform, `${label}.platform`),
54
+ viewport: {
55
+ width: positiveInteger(viewport.width, `${label}.viewport.width`),
56
+ height: positiveInteger(viewport.height, `${label}.viewport.height`),
57
+ unit: literal(viewport.unit, ["px"], `${label}.viewport.unit`),
58
+ },
59
+ modes: strings(row.modes, `${label}.modes`),
60
+ states: strings(row.states, `${label}.states`),
61
+ content_cases: strings(row.content_cases, `${label}.content_cases`),
62
+ input_methods: strings(row.input_methods, `${label}.input_methods`),
63
+ motion: literal(row.motion, ["full", "reduced", "not_applicable"], `${label}.motion`),
64
+ };
65
+ });
66
+ }
67
+ export function parseDesignResourceHandoffSubjects(value) {
68
+ return array(value, "design_resource_handoff.subjects").map((item, index) => {
69
+ const label = `design_resource_handoff.subjects[${index}]`;
70
+ const row = object(item, label, [
71
+ "key",
72
+ "kind",
73
+ "stable_keys",
74
+ "target_refs",
75
+ ]);
76
+ return {
77
+ key: stableKey(row.key, `${label}.key`),
78
+ kind: literal(row.kind, [
79
+ "surface",
80
+ "flow",
81
+ "region",
82
+ "component_family",
83
+ "control",
84
+ "state",
85
+ "asset",
86
+ ], `${label}.kind`),
87
+ stable_keys: stableKeys(row.stable_keys, `${label}.stable_keys`),
88
+ target_refs: contractKeys(row.target_refs, `${label}.target_refs`),
89
+ };
90
+ });
91
+ }
92
+ export function parseDesignResourceHandoffTargets(value) {
93
+ return array(value, "design_resource_handoff.targets").map((item, index) => {
94
+ const label = `design_resource_handoff.targets[${index}]`;
95
+ const row = object(item, label, [
96
+ "key",
97
+ "interpretation",
98
+ "resource_refs",
99
+ "condition_refs",
100
+ "source_profile",
101
+ "selection_basis",
102
+ ]);
103
+ const sourceProfile = object(row.source_profile, `${label}.source_profile`, ["kind", "entry_resource_ref", "dependency_resource_refs", "acquisition"]);
104
+ return {
105
+ key: contractKey(row.key, `${label}.key`),
106
+ interpretation: literal(row.interpretation, ["exact_target", "constraint"], `${label}.interpretation`),
107
+ resource_refs: stableKeys(row.resource_refs, `${label}.resource_refs`),
108
+ condition_refs: contractKeys(row.condition_refs, `${label}.condition_refs`),
109
+ source_profile: {
110
+ kind: literal(sourceProfile.kind, ["implementation_web", "implementation_app", "reference"], `${label}.source_profile.kind`),
111
+ entry_resource_ref: stableKey(sourceProfile.entry_resource_ref, `${label}.source_profile.entry_resource_ref`),
112
+ dependency_resource_refs: stableKeys(sourceProfile.dependency_resource_refs, `${label}.source_profile.dependency_resource_refs`),
113
+ acquisition: literal(sourceProfile.acquisition, ["complete"], `${label}.source_profile.acquisition`),
114
+ },
115
+ selection_basis: string(row.selection_basis, `${label}.selection_basis`),
116
+ };
117
+ });
118
+ }
@@ -0,0 +1,2 @@
1
+ import type { DesignResourceHandoffV1 } from "./design-resource-handoff-types.js";
2
+ export declare function parseDesignResourceHandoffShape(value: unknown): DesignResourceHandoffV1;
@@ -0,0 +1,75 @@
1
+ import { parseDesignResourceHandoffBlockers, parseDesignResourceHandoffCoverage, parseDesignResourceHandoffEvidence, } from "./design-resource-handoff-shape-evidence.js";
2
+ import { contractKey, stableKeys, } from "./design-resource-handoff-shape-primitives.js";
3
+ import { parseDesignResourceHandoffConditions, parseDesignResourceHandoffResources, parseDesignResourceHandoffSubjects, parseDesignResourceHandoffTargets, } from "./design-resource-handoff-shape-structure.js";
4
+ import { literal, object, repositoryFile, string, strings, } from "./long-task-shape-primitives.js";
5
+ export function parseDesignResourceHandoffShape(value) {
6
+ const root = object(value, "design_resource_handoff", [
7
+ "schema_version",
8
+ "intent",
9
+ "scope",
10
+ "provenance",
11
+ "resources",
12
+ "conditions",
13
+ "subjects",
14
+ "targets",
15
+ "evidence",
16
+ "coverage",
17
+ "acceptance_blockers",
18
+ "proposal",
19
+ ]);
20
+ const scope = object(root.scope, "design_resource_handoff.scope", [
21
+ "key",
22
+ "style_dependency",
23
+ "surface_keys",
24
+ "necessary_context",
25
+ "exclusions",
26
+ ]);
27
+ const provenance = object(root.provenance, "design_resource_handoff.provenance", [
28
+ "provider",
29
+ "provider_version",
30
+ "project",
31
+ "run",
32
+ "capability",
33
+ "agent",
34
+ "model",
35
+ "design_system_id",
36
+ ]);
37
+ const proposal = object(root.proposal, "design_resource_handoff.proposal", [
38
+ "reconciliation_status",
39
+ "path",
40
+ "revision",
41
+ ]);
42
+ return {
43
+ schema_version: literal(root.schema_version, ["design-resource-handoff-v1"], "design_resource_handoff.schema_version"),
44
+ intent: literal(root.intent, ["implementation_handoff"], "design_resource_handoff.intent"),
45
+ scope: {
46
+ key: contractKey(scope.key, "design_resource_handoff.scope.key"),
47
+ style_dependency: literal(scope.style_dependency, ["style-bearing", "non-fidelity", "mixed"], "design_resource_handoff.scope.style_dependency"),
48
+ surface_keys: stableKeys(scope.surface_keys, "design_resource_handoff.scope.surface_keys"),
49
+ necessary_context: strings(scope.necessary_context, "design_resource_handoff.scope.necessary_context"),
50
+ exclusions: strings(scope.exclusions, "design_resource_handoff.scope.exclusions"),
51
+ },
52
+ provenance: {
53
+ provider: string(provenance.provider, "design_resource_handoff.provenance.provider"),
54
+ provider_version: string(provenance.provider_version, "design_resource_handoff.provenance.provider_version"),
55
+ project: string(provenance.project, "design_resource_handoff.provenance.project"),
56
+ run: string(provenance.run, "design_resource_handoff.provenance.run"),
57
+ capability: string(provenance.capability, "design_resource_handoff.provenance.capability"),
58
+ agent: string(provenance.agent, "design_resource_handoff.provenance.agent"),
59
+ model: string(provenance.model, "design_resource_handoff.provenance.model"),
60
+ design_system_id: string(provenance.design_system_id, "design_resource_handoff.provenance.design_system_id"),
61
+ },
62
+ resources: parseDesignResourceHandoffResources(root.resources),
63
+ conditions: parseDesignResourceHandoffConditions(root.conditions),
64
+ subjects: parseDesignResourceHandoffSubjects(root.subjects),
65
+ targets: parseDesignResourceHandoffTargets(root.targets),
66
+ evidence: parseDesignResourceHandoffEvidence(root.evidence),
67
+ coverage: parseDesignResourceHandoffCoverage(root.coverage),
68
+ acceptance_blockers: parseDesignResourceHandoffBlockers(root.acceptance_blockers),
69
+ proposal: {
70
+ reconciliation_status: literal(proposal.reconciliation_status, ["applied", "returned", "not_applicable"], "design_resource_handoff.proposal.reconciliation_status"),
71
+ path: repositoryFile(proposal.path, "design_resource_handoff.proposal.path"),
72
+ revision: string(proposal.revision, "design_resource_handoff.proposal.revision"),
73
+ },
74
+ };
75
+ }
@@ -0,0 +1,139 @@
1
+ export declare const DESIGN_RESOURCE_DIMENSIONS: readonly ["surface_flow", "visual_content", "component_control", "state_interaction", "motion", "adaptation_input", "accessibility", "assets"];
2
+ export type DesignResourceDimension = (typeof DESIGN_RESOURCE_DIMENSIONS)[number];
3
+ 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"];
4
+ export type DesignResourceEvidenceKind = (typeof DESIGN_RESOURCE_EVIDENCE_KINDS)[number];
5
+ export declare const DESIGN_RESOURCE_VERIFICATION_METHODS: readonly ["layout_geometry", "visual_pixel", "design_token", "content", "component_state", "interaction_trace", "motion_timeline", "responsive_reflow", "input_method", "accessibility_semantics", "asset_integrity"];
6
+ export type DesignResourceVerificationMethod = (typeof DESIGN_RESOURCE_VERIFICATION_METHODS)[number];
7
+ export declare const DESIGN_RESOURCE_LOCATOR_KINDS: readonly ["html_selector", "markdown_anchor", "json_pointer", "css_selector", "css_custom_property", "whole_resource"];
8
+ export type DesignResourceLocatorKind = (typeof DESIGN_RESOURCE_LOCATOR_KINDS)[number];
9
+ export type DesignResourceSourceProfileKind = "implementation_web" | "implementation_app" | "reference";
10
+ export type DesignResourceCoverageDisposition = "covered" | "not_applicable" | "excluded_by_scope" | "decision_required" | "unavailable";
11
+ export interface DesignResourceHandoffV1 {
12
+ schema_version: "design-resource-handoff-v1";
13
+ intent: "implementation_handoff";
14
+ scope: {
15
+ key: string;
16
+ style_dependency: "style-bearing" | "non-fidelity" | "mixed";
17
+ surface_keys: string[];
18
+ necessary_context: string[];
19
+ exclusions: string[];
20
+ };
21
+ provenance: {
22
+ provider: string;
23
+ provider_version: string;
24
+ project: string;
25
+ run: string;
26
+ capability: string;
27
+ agent: string;
28
+ model: string;
29
+ design_system_id: string;
30
+ };
31
+ resources: DesignResourceHandoffResourceV1[];
32
+ conditions: DesignResourceHandoffConditionV1[];
33
+ subjects: DesignResourceHandoffSubjectV1[];
34
+ targets: DesignResourceHandoffTargetV1[];
35
+ evidence: DesignResourceHandoffEvidenceV1[];
36
+ coverage: DesignResourceHandoffCoverageV1[];
37
+ acceptance_blockers: DesignResourceHandoffBlockerV1[];
38
+ proposal: {
39
+ reconciliation_status: "applied" | "returned" | "not_applicable";
40
+ path: string;
41
+ revision: string;
42
+ };
43
+ }
44
+ export interface DesignResourceHandoffResourceV1 {
45
+ key: string;
46
+ role: "exact_target" | "constraint" | "supporting";
47
+ path: string;
48
+ media_type: string;
49
+ sha256: string;
50
+ editable_upstream: {
51
+ owner: string;
52
+ locator: string;
53
+ update_route: string;
54
+ };
55
+ }
56
+ export interface DesignResourceHandoffConditionV1 {
57
+ key: string;
58
+ platform: string;
59
+ viewport: {
60
+ width: number;
61
+ height: number;
62
+ unit: "px";
63
+ };
64
+ modes: string[];
65
+ states: string[];
66
+ content_cases: string[];
67
+ input_methods: string[];
68
+ motion: "full" | "reduced" | "not_applicable";
69
+ }
70
+ export interface DesignResourceHandoffSubjectV1 {
71
+ key: string;
72
+ kind: "surface" | "flow" | "region" | "component_family" | "control" | "state" | "asset";
73
+ stable_keys: string[];
74
+ target_refs: string[];
75
+ }
76
+ export interface DesignResourceHandoffTargetV1 {
77
+ key: string;
78
+ interpretation: "exact_target" | "constraint";
79
+ resource_refs: string[];
80
+ condition_refs: string[];
81
+ source_profile: {
82
+ kind: DesignResourceSourceProfileKind;
83
+ entry_resource_ref: string;
84
+ dependency_resource_refs: string[];
85
+ acquisition: "complete";
86
+ };
87
+ selection_basis: string;
88
+ }
89
+ export interface DesignResourceHandoffEvidenceV1 {
90
+ key: string;
91
+ resource_ref: string;
92
+ kind: DesignResourceEvidenceKind;
93
+ locator: {
94
+ kind: DesignResourceLocatorKind;
95
+ value: string;
96
+ };
97
+ condition_refs: string[];
98
+ }
99
+ export interface DesignResourceHandoffCoverageV1 {
100
+ key: string;
101
+ subject_refs: string[];
102
+ dimension: DesignResourceDimension;
103
+ disposition: DesignResourceCoverageDisposition;
104
+ target_refs: string[];
105
+ condition_refs: string[];
106
+ evidence_refs: string[];
107
+ source_item_refs: string[];
108
+ verification_methods: DesignResourceVerificationMethod[];
109
+ rationale: string;
110
+ }
111
+ export interface DesignResourceHandoffBlockerV1 {
112
+ key: string;
113
+ target_refs: string[];
114
+ subject_refs: string[];
115
+ dimensions: DesignResourceDimension[];
116
+ source_item_refs: string[];
117
+ verification_methods: DesignResourceVerificationMethod[];
118
+ description: string;
119
+ }
120
+ export interface ParsedDesignResourceHandoffV1 {
121
+ handoff_path: string;
122
+ handoff: DesignResourceHandoffV1;
123
+ source_item_keys: string[];
124
+ source_item_kinds: Record<string, string>;
125
+ }
126
+ export interface DesignResourceHandoffPreflightV1 extends ParsedDesignResourceHandoffV1 {
127
+ schema_version: "design-resource-handoff-preflight-v1";
128
+ status: "ready";
129
+ resource_hashes: Record<string, string>;
130
+ counts: {
131
+ resources: number;
132
+ conditions: number;
133
+ subjects: number;
134
+ targets: number;
135
+ evidence: number;
136
+ coverage: number;
137
+ acceptance_blockers: number;
138
+ };
139
+ }
@@ -0,0 +1,46 @@
1
+ export const DESIGN_RESOURCE_DIMENSIONS = [
2
+ "surface_flow",
3
+ "visual_content",
4
+ "component_control",
5
+ "state_interaction",
6
+ "motion",
7
+ "adaptation_input",
8
+ "accessibility",
9
+ "assets",
10
+ ];
11
+ export const DESIGN_RESOURCE_EVIDENCE_KINDS = [
12
+ "frame",
13
+ "component_variant",
14
+ "prototype_state",
15
+ "prototype_transition",
16
+ "motion_spec",
17
+ "motion_capture",
18
+ "responsive_spec",
19
+ "input_spec",
20
+ "accessibility_spec",
21
+ "semantic_tree",
22
+ "token_spec",
23
+ "asset",
24
+ "annotation",
25
+ ];
26
+ export const DESIGN_RESOURCE_VERIFICATION_METHODS = [
27
+ "layout_geometry",
28
+ "visual_pixel",
29
+ "design_token",
30
+ "content",
31
+ "component_state",
32
+ "interaction_trace",
33
+ "motion_timeline",
34
+ "responsive_reflow",
35
+ "input_method",
36
+ "accessibility_semantics",
37
+ "asset_integrity",
38
+ ];
39
+ export const DESIGN_RESOURCE_LOCATOR_KINDS = [
40
+ "html_selector",
41
+ "markdown_anchor",
42
+ "json_pointer",
43
+ "css_selector",
44
+ "css_custom_property",
45
+ "whole_resource",
46
+ ];
@@ -0,0 +1,4 @@
1
+ import { type DesignResourceHandoffV1 } from "./design-resource-handoff-types.js";
2
+ export declare function validateDesignResourceCoverage(handoff: DesignResourceHandoffV1, subjects: Map<string, unknown>, targets: Map<string, DesignResourceHandoffV1["targets"][number]>, conditions: Map<string, unknown>, evidence: Map<string, DesignResourceHandoffV1["evidence"][number]>, sourceItems: Map<string, string>): void;
3
+ export declare function validateDesignResourceBlockers(handoff: DesignResourceHandoffV1, subjects: Map<string, unknown>, targets: Map<string, unknown>, sourceItems: Map<string, string>): void;
4
+ export declare function validateDesignResourceReachability(handoff: DesignResourceHandoffV1): void;
@@ -0,0 +1,168 @@
1
+ import { DESIGN_RESOURCE_EVIDENCE_BY_DIMENSION, DESIGN_RESOURCE_METHODS_BY_DIMENSION, } from "./design-resource-handoff-policy.js";
2
+ import { DESIGN_RESOURCE_DIMENSIONS, } from "./design-resource-handoff-types.js";
3
+ import { invalidDesignResourceHandoff, requireDesignSourceItemKind, requireKnownDesignResourceRef, requireNonemptyDesignResourceValues, requireUniqueDesignResourceValues, } from "./design-resource-handoff-validation-primitives.js";
4
+ export function validateDesignResourceCoverage(handoff, subjects, targets, conditions, evidence, sourceItems) {
5
+ const cells = new Set();
6
+ const unresolved = [];
7
+ for (const row of handoff.coverage) {
8
+ requireNonemptyDesignResourceValues(row.subject_refs, `coverage_subject_refs_required:${row.key}`);
9
+ requireNonemptyDesignResourceValues(row.source_item_refs, `coverage_source_item_refs_required:${row.key}`);
10
+ for (const [name, values] of [
11
+ ["subject_ref", row.subject_refs],
12
+ ["target_ref", row.target_refs],
13
+ ["condition_ref", row.condition_refs],
14
+ ["evidence_ref", row.evidence_refs],
15
+ ["source_item_ref", row.source_item_refs],
16
+ ["verification_method", row.verification_methods],
17
+ ])
18
+ requireUniqueDesignResourceValues(values, `coverage_${name}_duplicate:${row.key}`);
19
+ for (const ref of row.subject_refs)
20
+ requireKnownDesignResourceRef(subjects, ref, "subject");
21
+ for (const ref of row.source_item_refs) {
22
+ requireKnownDesignResourceRef(sourceItems, ref, "source_item");
23
+ requireDesignSourceItemKind(sourceItems, ref);
24
+ }
25
+ validateCoverageApplicability(row, handoff, targets, conditions, cells);
26
+ if (row.disposition === "covered")
27
+ validateCoveredRow(row, targets, conditions, evidence);
28
+ else
29
+ validateNoncoveredRow(row);
30
+ if (row.disposition === "decision_required" ||
31
+ row.disposition === "unavailable")
32
+ unresolved.push(row.key);
33
+ }
34
+ for (const subject of handoff.subjects)
35
+ for (const targetRef of subject.target_refs) {
36
+ const target = targets.get(targetRef);
37
+ for (const conditionRef of target.condition_refs)
38
+ for (const dimension of DESIGN_RESOURCE_DIMENSIONS) {
39
+ const cell = coverageCell(subject.key, targetRef, conditionRef, dimension);
40
+ if (!cells.has(cell))
41
+ invalidDesignResourceHandoff("coverage_cell_missing", `${subject.key}:${targetRef}:${conditionRef}:${dimension}`);
42
+ }
43
+ }
44
+ if (unresolved.length)
45
+ invalidDesignResourceHandoff("unresolved_coverage", unresolved.sort().join(","));
46
+ }
47
+ function validateCoverageApplicability(row, handoff, targets, conditions, cells) {
48
+ requireNonemptyDesignResourceValues(row.target_refs, `coverage_target_refs_required:${row.key}`);
49
+ requireNonemptyDesignResourceValues(row.condition_refs, `coverage_condition_refs_required:${row.key}`);
50
+ for (const targetRef of row.target_refs)
51
+ requireKnownDesignResourceRef(targets, targetRef, "target");
52
+ for (const conditionRef of row.condition_refs)
53
+ requireKnownDesignResourceRef(conditions, conditionRef, "condition");
54
+ const subjects = new Map(handoff.subjects.map((item) => [item.key, item]));
55
+ for (const subjectRef of row.subject_refs) {
56
+ const subject = subjects.get(subjectRef);
57
+ for (const targetRef of row.target_refs) {
58
+ if (!subject.target_refs.includes(targetRef))
59
+ invalidDesignResourceHandoff("coverage_target_outside_subject", `${row.key}:${subjectRef}:${targetRef}`);
60
+ const target = targets.get(targetRef);
61
+ for (const conditionRef of row.condition_refs) {
62
+ if (!target.condition_refs.includes(conditionRef))
63
+ invalidDesignResourceHandoff("coverage_condition_outside_target", `${row.key}:${targetRef}:${conditionRef}`);
64
+ const cell = coverageCell(subjectRef, targetRef, conditionRef, row.dimension);
65
+ if (cells.has(cell))
66
+ invalidDesignResourceHandoff("coverage_cell_duplicate", `${subjectRef}:${targetRef}:${conditionRef}:${row.dimension}`);
67
+ cells.add(cell);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ function coverageCell(subjectRef, targetRef, conditionRef, dimension) {
73
+ return `${subjectRef}\0${targetRef}\0${conditionRef}\0${dimension}`;
74
+ }
75
+ export function validateDesignResourceBlockers(handoff, subjects, targets, sourceItems) {
76
+ for (const blocker of handoff.acceptance_blockers) {
77
+ for (const [name, values] of [
78
+ ["target_refs", blocker.target_refs],
79
+ ["subject_refs", blocker.subject_refs],
80
+ ["dimensions", blocker.dimensions],
81
+ ["source_item_refs", blocker.source_item_refs],
82
+ ["verification_methods", blocker.verification_methods],
83
+ ]) {
84
+ requireNonemptyDesignResourceValues(values, `acceptance_blocker_${name}_required:${blocker.key}`);
85
+ requireUniqueDesignResourceValues(values, `acceptance_blocker_${name}_duplicate:${blocker.key}`);
86
+ }
87
+ for (const ref of blocker.target_refs)
88
+ requireKnownDesignResourceRef(targets, ref, "target");
89
+ for (const ref of blocker.subject_refs)
90
+ requireKnownDesignResourceRef(subjects, ref, "subject");
91
+ for (const ref of blocker.source_item_refs) {
92
+ requireKnownDesignResourceRef(sourceItems, ref, "source_item");
93
+ requireDesignSourceItemKind(sourceItems, ref);
94
+ }
95
+ for (const dimension of blocker.dimensions)
96
+ if (!blocker.verification_methods.some((method) => DESIGN_RESOURCE_METHODS_BY_DIMENSION[dimension].includes(method)))
97
+ invalidDesignResourceHandoff("acceptance_blocker_dimension_method_missing", `${blocker.key}:${dimension}`);
98
+ const matchedCoverage = handoff.coverage.filter((row) => row.disposition === "covered" &&
99
+ blocker.target_refs.some((ref) => row.target_refs.includes(ref)) &&
100
+ blocker.subject_refs.some((ref) => row.subject_refs.includes(ref)) &&
101
+ blocker.dimensions.includes(row.dimension));
102
+ for (const ref of blocker.source_item_refs)
103
+ if (!matchedCoverage.some((row) => row.source_item_refs.includes(ref)))
104
+ invalidDesignResourceHandoff("acceptance_blocker_source_item_without_coverage", `${blocker.key}:${ref}`);
105
+ for (const method of blocker.verification_methods)
106
+ if (!matchedCoverage.some((row) => row.verification_methods.includes(method)))
107
+ invalidDesignResourceHandoff("acceptance_blocker_method_without_coverage", `${blocker.key}:${method}`);
108
+ }
109
+ }
110
+ export function validateDesignResourceReachability(handoff) {
111
+ const targetResources = new Set(handoff.targets.flatMap((target) => target.resource_refs));
112
+ const targetConditions = new Set(handoff.targets.flatMap((target) => target.condition_refs));
113
+ const coverageTargets = new Set(handoff.coverage.flatMap((row) => row.target_refs));
114
+ const coverageEvidence = new Set(handoff.coverage.flatMap((row) => row.evidence_refs));
115
+ for (const resource of handoff.resources)
116
+ if (!targetResources.has(resource.key))
117
+ invalidDesignResourceHandoff("resource_unreferenced", resource.key);
118
+ for (const condition of handoff.conditions)
119
+ if (!targetConditions.has(condition.key))
120
+ invalidDesignResourceHandoff("condition_unreferenced", condition.key);
121
+ for (const target of handoff.targets)
122
+ if (!coverageTargets.has(target.key))
123
+ invalidDesignResourceHandoff("target_without_covered_dimension", target.key);
124
+ for (const item of handoff.evidence)
125
+ if (!coverageEvidence.has(item.key))
126
+ invalidDesignResourceHandoff("evidence_unreferenced", item.key);
127
+ }
128
+ function validateCoveredRow(row, targets, conditions, evidence) {
129
+ for (const [name, values] of [
130
+ ["target_refs", row.target_refs],
131
+ ["condition_refs", row.condition_refs],
132
+ ["evidence_refs", row.evidence_refs],
133
+ ["verification_methods", row.verification_methods],
134
+ ])
135
+ requireNonemptyDesignResourceValues(values, `coverage_${name}_required:${row.key}`);
136
+ for (const ref of row.target_refs)
137
+ requireKnownDesignResourceRef(targets, ref, "target");
138
+ for (const ref of row.condition_refs)
139
+ requireKnownDesignResourceRef(conditions, ref, "condition");
140
+ for (const ref of row.evidence_refs)
141
+ requireKnownDesignResourceRef(evidence, ref, "evidence");
142
+ const allowedEvidence = new Set(DESIGN_RESOURCE_EVIDENCE_BY_DIMENSION[row.dimension]);
143
+ const allowedMethods = new Set(DESIGN_RESOURCE_METHODS_BY_DIMENSION[row.dimension]);
144
+ for (const ref of row.evidence_refs) {
145
+ const item = evidence.get(ref);
146
+ if (!allowedEvidence.has(item.kind))
147
+ invalidDesignResourceHandoff("coverage_evidence_kind_incompatible", `${row.key}:${row.dimension}:${item.key}:${item.kind}`);
148
+ }
149
+ for (const method of row.verification_methods)
150
+ if (!allowedMethods.has(method))
151
+ invalidDesignResourceHandoff("coverage_verification_method_incompatible", `${row.key}:${row.dimension}:${method}`);
152
+ for (const targetRef of row.target_refs)
153
+ for (const conditionRef of row.condition_refs)
154
+ if (!row.evidence_refs.some((evidenceRef) => {
155
+ const item = evidence.get(evidenceRef);
156
+ return (targets.get(targetRef).resource_refs.includes(item.resource_ref) &&
157
+ item.condition_refs.includes(conditionRef));
158
+ }))
159
+ invalidDesignResourceHandoff("coverage_cell_without_evidence", `${row.key}:${targetRef}:${conditionRef}`);
160
+ }
161
+ function validateNoncoveredRow(row) {
162
+ for (const [name, values] of [
163
+ ["evidence_refs", row.evidence_refs],
164
+ ["verification_methods", row.verification_methods],
165
+ ])
166
+ if (values.length)
167
+ invalidDesignResourceHandoff("noncovered_binding_forbidden", `${row.key}:${row.disposition}:${name}`);
168
+ }
@@ -0,0 +1,11 @@
1
+ export declare function indexDesignResourceItems<T extends {
2
+ key: string;
3
+ }>(items: T[]): Map<string, T>;
4
+ export declare function requireUniqueDesignResourceObjects(items: Array<{
5
+ key: string;
6
+ }>, code: string): void;
7
+ export declare function requireUniqueDesignResourceValues<T>(values: T[], code: string): void;
8
+ export declare function requireNonemptyDesignResourceValues(values: readonly unknown[], code: string): void;
9
+ export declare function requireKnownDesignResourceRef(known: Map<string, unknown> | Set<string>, ref: string, kind: string): void;
10
+ export declare function requireDesignSourceItemKind(sourceItems: Map<string, string>, ref: string): void;
11
+ export declare function invalidDesignResourceHandoff(code: string, detail: string): never;
@@ -0,0 +1,26 @@
1
+ export function indexDesignResourceItems(items) {
2
+ return new Map(items.map((item) => [item.key, item]));
3
+ }
4
+ export function requireUniqueDesignResourceObjects(items, code) {
5
+ requireUniqueDesignResourceValues(items.map((item) => item.key), code);
6
+ }
7
+ export function requireUniqueDesignResourceValues(values, code) {
8
+ if (new Set(values).size !== values.length)
9
+ invalidDesignResourceHandoff(code, "duplicate");
10
+ }
11
+ export function requireNonemptyDesignResourceValues(values, code) {
12
+ if (!values.length)
13
+ invalidDesignResourceHandoff(code, "empty");
14
+ }
15
+ export function requireKnownDesignResourceRef(known, ref, kind) {
16
+ if (!known.has(ref))
17
+ invalidDesignResourceHandoff(`${kind}_ref_unknown`, ref);
18
+ }
19
+ export function requireDesignSourceItemKind(sourceItems, ref) {
20
+ const kind = sourceItems.get(ref);
21
+ if (!["requirement", "control", "acceptance"].includes(kind))
22
+ invalidDesignResourceHandoff("design_source_item_kind_unsupported", `${ref}:${kind}`);
23
+ }
24
+ export function invalidDesignResourceHandoff(code, detail) {
25
+ throw new Error(`design_resource_handoff_invalid:${code}:${detail}`);
26
+ }
@@ -0,0 +1,6 @@
1
+ import type { DesignResourceHandoffV1 } from "./design-resource-handoff-types.js";
2
+ export declare function validateDesignResourceScope(handoff: DesignResourceHandoffV1): void;
3
+ export declare function validateDesignResourceConditions(handoff: DesignResourceHandoffV1): void;
4
+ export declare function validateDesignResourceSubjects(handoff: DesignResourceHandoffV1, targets: Map<string, DesignResourceHandoffV1["targets"][number]>): void;
5
+ export declare function validateDesignResourceTargets(handoff: DesignResourceHandoffV1, resources: Map<string, DesignResourceHandoffV1["resources"][number]>, conditions: Map<string, DesignResourceHandoffV1["conditions"][number]>): void;
6
+ export declare function validateDesignResourceEvidence(handoff: DesignResourceHandoffV1, resources: Map<string, unknown>, conditions: Map<string, unknown>): void;