asecli 0.8.1__tar.gz → 0.8.2__tar.gz

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 (255) hide show
  1. {asecli-0.8.1 → asecli-0.8.2}/PKG-INFO +8 -8
  2. {asecli-0.8.1 → asecli-0.8.2}/README.md +7 -7
  3. {asecli-0.8.1 → asecli-0.8.2}/docs/00-governance/timeline.md +1 -0
  4. asecli-0.8.2/docs/adversarial-audits/2026-09-14-123640-audit-report.md +92 -0
  5. asecli-0.8.2/docs/adversarial-audits/2026-09-14-123640-optimization-plan.md +61 -0
  6. asecli-0.8.2/docs/adversarial-audits/2026-09-14-124947-audit-report.md +128 -0
  7. asecli-0.8.2/docs/adversarial-audits/2026-09-14-124947-optimization-plan.md +65 -0
  8. {asecli-0.8.1 → asecli-0.8.2}/pyproject.toml +1 -1
  9. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/__init__.py +1 -1
  10. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/export_sg_command.py +7 -0
  11. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/contracts/sgcli.native.v3.schema.json +2 -1
  12. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/contracts.py +2 -2
  13. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/layout_audit_geometry.py +18 -15
  14. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/sg_export/conversion_report.py +25 -2
  15. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/sg_export/evidence.py +6 -5
  16. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/sg_export/pass_blend.py +4 -0
  17. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/sg_export/report_semantics.py +7 -1
  18. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/sg_export/sources.py +34 -2
  19. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/sg_export/surface_matching.py +4 -0
  20. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/sg_export/surface_semantics.py +22 -2
  21. {asecli-0.8.1 → asecli-0.8.2}/tests/test_contract_schema.py +2 -2
  22. asecli-0.8.2/tests/test_export_property_visibility.py +26 -0
  23. {asecli-0.8.1 → asecli-0.8.2}/tests/test_export_sg.py +17 -0
  24. {asecli-0.8.1 → asecli-0.8.2}/tests/test_sg_export_sources.py +30 -0
  25. asecli-0.8.2/tests/test_smoke.py +4 -0
  26. {asecli-0.8.1 → asecli-0.8.2}/tests/test_surface_semantics.py +17 -5
  27. {asecli-0.8.1 → asecli-0.8.2}/tests/test_surface_semantics_integration.py +13 -2
  28. {asecli-0.8.1 → asecli-0.8.2}/uv.lock +1 -1
  29. asecli-0.8.1/tests/test_smoke.py +0 -4
  30. {asecli-0.8.1 → asecli-0.8.2}/.github/workflows/ci.yml +0 -0
  31. {asecli-0.8.1 → asecli-0.8.2}/.github/workflows/cross-cli.yml +0 -0
  32. {asecli-0.8.1 → asecli-0.8.2}/.github/workflows/publish.yml +0 -0
  33. {asecli-0.8.1 → asecli-0.8.2}/.gitignore +0 -0
  34. {asecli-0.8.1 → asecli-0.8.2}/.project-architect.json +0 -0
  35. {asecli-0.8.1 → asecli-0.8.2}/AGENTS.md +0 -0
  36. {asecli-0.8.1 → asecli-0.8.2}/LICENSE +0 -0
  37. {asecli-0.8.1 → asecli-0.8.2}/SECURITY.md +0 -0
  38. {asecli-0.8.1 → asecli-0.8.2}/docs/00-governance/audit-supplement.json +0 -0
  39. {asecli-0.8.1 → asecli-0.8.2}/docs/00-governance/change-register.md +0 -0
  40. {asecli-0.8.1 → asecli-0.8.2}/docs/00-governance/delivery-protocol.md +0 -0
  41. {asecli-0.8.1 → asecli-0.8.2}/docs/00-governance/project-charter.md +0 -0
  42. {asecli-0.8.1 → asecli-0.8.2}/docs/00-governance/supply-chain-policy.md +0 -0
  43. {asecli-0.8.1 → asecli-0.8.2}/docs/00-governance/traceability.csv +0 -0
  44. {asecli-0.8.1 → asecli-0.8.2}/docs/01-architecture/assumption-experiments.md +0 -0
  45. {asecli-0.8.1 → asecli-0.8.2}/docs/01-architecture/module-map.md +0 -0
  46. {asecli-0.8.1 → asecli-0.8.2}/docs/01-architecture/project-architecture-and-requirements.md +0 -0
  47. {asecli-0.8.1 → asecli-0.8.2}/docs/01-architecture/technical-route.md +0 -0
  48. {asecli-0.8.1 → asecli-0.8.2}/docs/03-quality/bug-register.md +0 -0
  49. {asecli-0.8.1 → asecli-0.8.2}/docs/03-quality/regression-catalog.md +0 -0
  50. {asecli-0.8.1 → asecli-0.8.2}/docs/03-quality/test-strategy.md +0 -0
  51. {asecli-0.8.1 → asecli-0.8.2}/docs/04-delivery/project-plan-task-charter.md +0 -0
  52. {asecli-0.8.1 → asecli-0.8.2}/docs/04-delivery/roadmap.md +0 -0
  53. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-01-014104-audit-report.md +0 -0
  54. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-01-014104-optimization-plan.md +0 -0
  55. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-01-145343-audit-report.md +0 -0
  56. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-01-145343-optimization-plan.md +0 -0
  57. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-01-193521-audit-report.md +0 -0
  58. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-01-193521-optimization-plan.md +0 -0
  59. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-01-203438-audit-report.md +0 -0
  60. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-01-203438-optimization-plan.md +0 -0
  61. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-02-121155-audit-report.md +0 -0
  62. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-02-121155-optimization-plan.md +0 -0
  63. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-02-175509-audit-report.md +0 -0
  64. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-02-175509-optimization-plan.md +0 -0
  65. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-04-122304-audit-report.md +0 -0
  66. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-04-122304-optimization-plan.md +0 -0
  67. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-05-142617-audit-report.md +0 -0
  68. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-05-142617-optimization-plan.md +0 -0
  69. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-05-160945-audit-report.md +0 -0
  70. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-05-160945-optimization-plan.md +0 -0
  71. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-05-213523-audit-report.md +0 -0
  72. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-05-213523-optimization-plan.md +0 -0
  73. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-10-193631-audit-report.md +0 -0
  74. {asecli-0.8.1 → asecli-0.8.2}/docs/adversarial-audits/2026-09-10-193631-optimization-plan.md +0 -0
  75. {asecli-0.8.1 → asecli-0.8.2}/docs/first-principles/2026-08-31-231401-optimization-plan.md +0 -0
  76. {asecli-0.8.1 → asecli-0.8.2}/docs/first-principles/2026-09-01-190656-optimization-plan.md +0 -0
  77. {asecli-0.8.1 → asecli-0.8.2}/docs/proposals/2026-09-07-shadergraph-to-ase-requirements.md +0 -0
  78. {asecli-0.8.1 → asecli-0.8.2}/scripts/install.ps1 +0 -0
  79. {asecli-0.8.1 → asecli-0.8.2}/scripts/install.sh +0 -0
  80. {asecli-0.8.1 → asecli-0.8.2}/skills/asecli/SKILL.md +0 -0
  81. {asecli-0.8.1 → asecli-0.8.2}/skills/asecli/references/conversion-publication-receipt.v1.schema.json +0 -0
  82. {asecli-0.8.1 → asecli-0.8.2}/skills/asecli/references/conversion-workflow.md +0 -0
  83. {asecli-0.8.1 → asecli-0.8.2}/skills/asecli/references/layout-standard.md +0 -0
  84. {asecli-0.8.1 → asecli-0.8.2}/skills/asecli/references/master-output-settings-standard.md +0 -0
  85. {asecli-0.8.1 → asecli-0.8.2}/skills/asecli/references/material-property-standard.md +0 -0
  86. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/__init__.py +0 -0
  87. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/_editor_port_contract.py +0 -0
  88. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/_editor_primitives.py +0 -0
  89. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/_editor_spec_grammar.py +0 -0
  90. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/_editor_spec_io.py +0 -0
  91. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/_editor_spec_validation.py +0 -0
  92. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/_gui_handoff_store.py +0 -0
  93. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/_gui_project.py +0 -0
  94. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/_gui_resource_store.py +0 -0
  95. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/_gui_resource_upgrade.py +0 -0
  96. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/editor_create.py +0 -0
  97. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/editor_spec.py +0 -0
  98. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/graph_geometry.py +0 -0
  99. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/graph_geometry_parser.py +0 -0
  100. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/graph_inspect.py +0 -0
  101. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/gui_handoff.py +0 -0
  102. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/gui_presentation.py +0 -0
  103. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/gui_provider_detection.py +0 -0
  104. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/gui_runtime_probe.py +0 -0
  105. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/gui_support.py +0 -0
  106. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/gui_support_resource.py +0 -0
  107. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/mcp_client.py +0 -0
  108. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/recompile.py +0 -0
  109. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/render_settings.py +0 -0
  110. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/resource_text.py +0 -0
  111. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.authoring.part00.cs.txt +0 -0
  112. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.authoring.part01.cs.txt +0 -0
  113. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.authoring.store.cs.txt +0 -0
  114. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.condition.cs.txt +0 -0
  115. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.hydration.cs.txt +0 -0
  116. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.part00.cs.txt +0 -0
  117. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.part01.cs.txt +0 -0
  118. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.reconciliation.cs.txt +0 -0
  119. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.transaction.cs.txt +0 -0
  120. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/resources/editor_create.part00.cs.txt +0 -0
  121. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/resources/editor_create.part01.cs.txt +0 -0
  122. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/resources/editor_create.part02.cs.txt +0 -0
  123. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/resources/editor_create.part03.cs.txt +0 -0
  124. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/resources/editor_create.part04.cs.txt +0 -0
  125. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/resources/wire_route.transaction.cs.txt +0 -0
  126. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/bridge/wire_route.py +0 -0
  127. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/checks/__init__.py +0 -0
  128. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/checks/checksum.py +0 -0
  129. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/checks/local_vars.py +0 -0
  130. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/checks/usage.py +0 -0
  131. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/checks/validate.py +0 -0
  132. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/__init__.py +0 -0
  133. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/commands.py +0 -0
  134. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/commentary_command.py +0 -0
  135. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/contract.py +0 -0
  136. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/contract_command.py +0 -0
  137. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/conversion_output.py +0 -0
  138. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/create_command.py +0 -0
  139. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/custom_gui_command.py +0 -0
  140. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/graph_review_command.py +0 -0
  141. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/gui_provider.py +0 -0
  142. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/gui_support_command.py +0 -0
  143. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/io.py +0 -0
  144. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/layout_command.py +0 -0
  145. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/main.py +0 -0
  146. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/migrate_package_command.py +0 -0
  147. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/recompile_metadata.py +0 -0
  148. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/skill_command.py +0 -0
  149. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/cli/usage_command.py +0 -0
  150. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/contracts/editor-graph-spec.v3.schema.json +0 -0
  151. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/__init__.py +0 -0
  152. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/comment_bounds.py +0 -0
  153. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/comment_layout.py +0 -0
  154. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/comment_metrics.py +0 -0
  155. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/comment_purpose.py +0 -0
  156. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/commentary.py +0 -0
  157. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/compiled_metadata.py +0 -0
  158. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/compiled_properties.py +0 -0
  159. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/custom_gui.py +0 -0
  160. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/custom_gui_versions.py +0 -0
  161. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/fishbone_placement.py +0 -0
  162. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/fishbone_topology.py +0 -0
  163. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/graph_ops.py +0 -0
  164. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/graph_review.py +0 -0
  165. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/island_layout.py +0 -0
  166. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/layout.py +0 -0
  167. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/layout_audit.py +0 -0
  168. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/layout_audit_repeated.py +0 -0
  169. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/layout_graph.py +0 -0
  170. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/local_vars.py +0 -0
  171. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/material_gui_condition.py +0 -0
  172. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/material_gui_protocol.py +0 -0
  173. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/material_gui_spec.py +0 -0
  174. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/meticulous_layout.py +0 -0
  175. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/model.py +0 -0
  176. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/property_presentation.py +0 -0
  177. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/reuse_plan.py +0 -0
  178. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/wire_geometry.py +0 -0
  179. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/core/wire_router.py +0 -0
  180. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/export_sg.py +0 -0
  181. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/schema/__init__.py +0 -0
  182. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/schema/data/observed.json +0 -0
  183. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/schema/data/schemas.json +0 -0
  184. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/schema_validation.py +0 -0
  185. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/sg_export/__init__.py +0 -0
  186. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/sg_export/alpha_modulate.py +0 -0
  187. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/sg_export/binding.py +0 -0
  188. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/sg_export/custom_expression.py +0 -0
  189. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/sg_export/decoder.py +0 -0
  190. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/sg_export/model.py +0 -0
  191. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/sg_export/nodes.py +0 -0
  192. {asecli-0.8.1 → asecli-0.8.2}/src/asecli/sg_export/reconciliation.py +0 -0
  193. {asecli-0.8.1 → asecli-0.8.2}/tests/TEST.md +0 -0
  194. {asecli-0.8.1 → asecli-0.8.2}/tests/__init__.py +0 -0
  195. {asecli-0.8.1 → asecli-0.8.2}/tests/conftest.py +0 -0
  196. {asecli-0.8.1 → asecli-0.8.2}/tests/editor_create_v3_fixture.py +0 -0
  197. {asecli-0.8.1 → asecli-0.8.2}/tests/fixtures/HLIT.shader +0 -0
  198. {asecli-0.8.1 → asecli-0.8.2}/tests/fixtures/asecli_material_gui_v0_2_0.cs.txt +0 -0
  199. {asecli-0.8.1 → asecli-0.8.2}/tests/fixtures/step-antialiasing.function.txt +0 -0
  200. {asecli-0.8.1 → asecli-0.8.2}/tests/test_adversarial_hardening.py +0 -0
  201. {asecli-0.8.1 → asecli-0.8.2}/tests/test_audit_fixes.py +0 -0
  202. {asecli-0.8.1 → asecli-0.8.2}/tests/test_bridge_contract.py +0 -0
  203. {asecli-0.8.1 → asecli-0.8.2}/tests/test_bridge_recompile.py +0 -0
  204. {asecli-0.8.1 → asecli-0.8.2}/tests/test_build_reproducibility.py +0 -0
  205. {asecli-0.8.1 → asecli-0.8.2}/tests/test_cli_contract.py +0 -0
  206. {asecli-0.8.1 → asecli-0.8.2}/tests/test_commentary.py +0 -0
  207. {asecli-0.8.1 → asecli-0.8.2}/tests/test_conversion_report_semantics.py +0 -0
  208. {asecli-0.8.1 → asecli-0.8.2}/tests/test_core_contract.py +0 -0
  209. {asecli-0.8.1 → asecli-0.8.2}/tests/test_create.py +0 -0
  210. {asecli-0.8.1 → asecli-0.8.2}/tests/test_create_constant_presentation.py +0 -0
  211. {asecli-0.8.1 → asecli-0.8.2}/tests/test_cross_cli_workflow.py +0 -0
  212. {asecli-0.8.1 → asecli-0.8.2}/tests/test_custom_gui.py +0 -0
  213. {asecli-0.8.1 → asecli-0.8.2}/tests/test_custom_gui_cli.py +0 -0
  214. {asecli-0.8.1 → asecli-0.8.2}/tests/test_editor_create_bridge.py +0 -0
  215. {asecli-0.8.1 → asecli-0.8.2}/tests/test_editor_create_cli.py +0 -0
  216. {asecli-0.8.1 → asecli-0.8.2}/tests/test_editor_create_e2e.py +0 -0
  217. {asecli-0.8.1 → asecli-0.8.2}/tests/test_editor_create_spec.py +0 -0
  218. {asecli-0.8.1 → asecli-0.8.2}/tests/test_editor_create_spec_v3.py +0 -0
  219. {asecli-0.8.1 → asecli-0.8.2}/tests/test_editor_render_settings.py +0 -0
  220. {asecli-0.8.1 → asecli-0.8.2}/tests/test_governance.py +0 -0
  221. {asecli-0.8.1 → asecli-0.8.2}/tests/test_graph_review.py +0 -0
  222. {asecli-0.8.1 → asecli-0.8.2}/tests/test_graph_safety.py +0 -0
  223. {asecli-0.8.1 → asecli-0.8.2}/tests/test_gui_handoff.py +0 -0
  224. {asecli-0.8.1 → asecli-0.8.2}/tests/test_gui_native_extension.py +0 -0
  225. {asecli-0.8.1 → asecli-0.8.2}/tests/test_gui_support.py +0 -0
  226. {asecli-0.8.1 → asecli-0.8.2}/tests/test_gui_support_cli_contract.py +0 -0
  227. {asecli-0.8.1 → asecli-0.8.2}/tests/test_gui_upgrade.py +0 -0
  228. {asecli-0.8.1 → asecli-0.8.2}/tests/test_install_scripts.py +0 -0
  229. {asecli-0.8.1 → asecli-0.8.2}/tests/test_island_layout.py +0 -0
  230. {asecli-0.8.1 → asecli-0.8.2}/tests/test_layout.py +0 -0
  231. {asecli-0.8.1 → asecli-0.8.2}/tests/test_layout_governance.py +0 -0
  232. {asecli-0.8.1 → asecli-0.8.2}/tests/test_layout_local_var_policy.py +0 -0
  233. {asecli-0.8.1 → asecli-0.8.2}/tests/test_material_gui_e2e.py +0 -0
  234. {asecli-0.8.1 → asecli-0.8.2}/tests/test_mcp_security.py +0 -0
  235. {asecli-0.8.1 → asecli-0.8.2}/tests/test_migrate_package.py +0 -0
  236. {asecli-0.8.1 → asecli-0.8.2}/tests/test_mutate.py +0 -0
  237. {asecli-0.8.1 → asecli-0.8.2}/tests/test_pass_blend.py +0 -0
  238. {asecli-0.8.1 → asecli-0.8.2}/tests/test_perf.py +0 -0
  239. {asecli-0.8.1 → asecli-0.8.2}/tests/test_property_presentation.py +0 -0
  240. {asecli-0.8.1 → asecli-0.8.2}/tests/test_roundtrip.py +0 -0
  241. {asecli-0.8.1 → asecli-0.8.2}/tests/test_schema_add.py +0 -0
  242. {asecli-0.8.1 → asecli-0.8.2}/tests/test_schema_samples.py +0 -0
  243. {asecli-0.8.1 → asecli-0.8.2}/tests/test_skill_install.py +0 -0
  244. {asecli-0.8.1 → asecli-0.8.2}/tests/test_supply_chain.py +0 -0
  245. {asecli-0.8.1 → asecli-0.8.2}/tests/test_usage_audit.py +0 -0
  246. {asecli-0.8.1 → asecli-0.8.2}/tests/test_wire_route_bridge.py +0 -0
  247. {asecli-0.8.1 → asecli-0.8.2}/tools/build_schema.py +0 -0
  248. {asecli-0.8.1 → asecli-0.8.2}/tools/check_ci_governance.py +0 -0
  249. {asecli-0.8.1 → asecli-0.8.2}/tools/check_document_governance.py +0 -0
  250. {asecli-0.8.1 → asecli-0.8.2}/tools/check_packed_executor_loc.py +0 -0
  251. {asecli-0.8.1 → asecli-0.8.2}/tools/check_regression_catalog.py +0 -0
  252. {asecli-0.8.1 → asecli-0.8.2}/tools/check_release_candidate.py +0 -0
  253. {asecli-0.8.1 → asecli-0.8.2}/tools/compare_build_artifacts.py +0 -0
  254. {asecli-0.8.1 → asecli-0.8.2}/tools/generate_sbom.py +0 -0
  255. {asecli-0.8.1 → asecli-0.8.2}/tools/supply_chain_check.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: asecli
3
- Version: 0.8.1
3
+ Version: 0.8.2
4
4
  Summary: Agent-native CLI for reading, modifying, validating and compiling Amplify Shader Editor assets
5
5
  Project-URL: Homepage, https://github.com/seeseeczl/ASECLI
6
6
  Project-URL: Repository, https://github.com/seeseeczl/ASECLI
@@ -28,7 +28,7 @@ Description-Content-Type: text/markdown
28
28
 
29
29
  AseCLI 是面向 AI Agent 的本地 CLI:离线读取、编辑和校验 ASE 节点图;通过运行中的 Unity/团结引擎与 MCP,让真实 ASE 创建节点、提供精排几何并重新生成 HLSL。Skill 提供跨 Agent 的操作规则,CLI 提供可验证的执行结果。
30
30
 
31
- 当前正式版:**[0.8.1](https://github.com/seeseeczl/ASECLI/releases/tag/v0.8.1)** · [PyPI](https://pypi.org/project/asecli/0.8.1/) · [Agent 操作手册](skills/asecli/SKILL.md) · [SG 转换后整理流程](skills/asecli/references/conversion-workflow.md)
31
+ 当前正式版:**[0.8.2](https://github.com/seeseeczl/ASECLI/releases/tag/v0.8.2)** · [PyPI](https://pypi.org/project/asecli/0.8.2/) · [Agent 操作手册](skills/asecli/SKILL.md) · [SG 转换后整理流程](skills/asecli/references/conversion-workflow.md)
32
32
 
33
33
  ASECLI 接收 SGCLI 生成的裸 `EditorGraphSpec v3`,并可把受支持的 ASE Shader 直接导出为 SGCLI 的裸 `sgcli.native.v3`。两个方向都只有“生产者 spec 原文件→消费者 `--spec`”;独立 report 与发布 receipt 都不进入创建输入,创建成功也不代表转换效果等价。
34
34
 
@@ -132,7 +132,7 @@ curl -fsSL https://raw.githubusercontent.com/seeseeczl/ASECLI/main/scripts/insta
132
132
  uv tool uninstall asecli
133
133
  ```
134
134
 
135
- 当前正式版本为 `0.8.1`(透明 Multiply 的 matcher-v4 语义修复与转换认证加固),可从 [PyPI](https://pypi.org/project/asecli/0.8.1/) 或 [GitHub Release](https://github.com/seeseeczl/ASECLI/releases/tag/v0.8.1) 安装。历史版本见 [GitHub Releases](https://github.com/seeseeczl/ASECLI/releases),`v0.8.0` 保留为回滚点。
135
+ 当前正式版本为 `0.8.2`(精确源 Alpha 混合、资源快照与转换认证加固),可从 [PyPI](https://pypi.org/project/asecli/0.8.2/) 或 [GitHub Release](https://github.com/seeseeczl/ASECLI/releases/tag/v0.8.2) 安装。历史版本见 [GitHub Releases](https://github.com/seeseeczl/ASECLI/releases),`v0.8.0` 保留为回滚点。
136
136
 
137
137
  已知限制:真实 MCP 下,属性+纹理 v2 和 Reciprocal 降级 v2 的 create、manifest、validate、独立 recompile 已通过;SGCLI SphereMask v3 spec 在重载时仍可能返回 `node missing after reload: Radius` 并回滚。本次不承诺该 recipe 端到端可用,也不改变 SGCLI v2 默认值契约。
138
138
 
@@ -162,7 +162,7 @@ asecli --help
162
162
 
163
163
  ```bash
164
164
  shasum -a 256 -c SHA256SUMS
165
- uv tool install /path/to/asecli-0.8.1-py3-none-any.whl
165
+ uv tool install /path/to/asecli-0.8.2-py3-none-any.whl
166
166
  asecli --help
167
167
  ```
168
168
 
@@ -207,7 +207,7 @@ sgcli sg create Assets/ConvertedNew.shadergraph \
207
207
 
208
208
  `export-sg` 自动从源 Shader 向上识别 Unity/Tuanjie 工程;跨工程资源解析时显式传 `--target-project`。它强制生成 `<stem>.asecli-to-sgcli.spec.json`、`.report.json` 与 `.receipt.json`,同名即失败;receipt 只证明 spec/report 两份文件的提交状态与 SHA,不是中间交接包。命令不调用 SGCLI,也不生成 ASE 自有中间 JSON。未知节点、Master/Pass、外部属性或纹理 Importer 语义时只写规范报告,不写半成品 spec。反方向 `.asecli-to-sgcli.spec.json` 不能交给 ASECLI `create --spec`。
209
209
 
210
- ASECLI 随 wheel 发布自己拥有的 EditorGraphSpec v3 Schema,并固定一份 SGCLI `0.3.3` 的 `sgcli.native.v3` 生产快照;SGCLI 同样固定 ASECLI `0.8.1` 快照。双仓兼容检查会比较两组原始 Schema SHA-256,任何漂移都必须先升级生产者再放行。
210
+ ASECLI 随 wheel 发布自己拥有的 EditorGraphSpec v3 Schema,并固定一份 SGCLI `0.3.5` 的 `sgcli.native.v3` 生产快照;SGCLI 同样固定 ASECLI `0.8.2` 快照。双仓兼容检查会比较两组原始 Schema SHA-256,任何漂移都必须先升级生产者再放行。
211
211
 
212
212
  可用 `asecli contract editor-graph --version 3 --spec FILE` 在不连接 Editor 时执行权威 Schema/loader 并返回原文件 SHA。报告分开记录来源快照、发布前复核、生产者 Schema 与真实消费者读取状态。旧 `{graph,report}` wrapper 只允许按已登记形状显式迁移,且内层必须已经是 `sgcli.native.v3`;无版本 discriminator 的旧输入只报告 `legacy_format`,不得伪称已识别版本化 Schema:
213
213
 
@@ -340,9 +340,9 @@ asecli recompile Assets/Example.shader
340
340
  除显式 `--help` 保留人类可读文本外,stdout 恒为单行严格 JSON,agent 可直接解析。`--version` 也返回 JSON:
341
341
 
342
342
  ```json
343
- {"contract_version":1,"cli_version":"0.8.1","command":"parse","ok":true,"data":{"node_count":7}}
344
- {"contract_version":1,"cli_version":"0.8.1","command":"parse","ok":false,"error":{"code":"NOT_FOUND","message":"..."}}
345
- {"contract_version":1,"cli_version":"0.8.1","command":"version","ok":true,"data":{"version":"0.8.1"}}
343
+ {"contract_version":1,"cli_version":"0.8.2","command":"parse","ok":true,"data":{"node_count":7}}
344
+ {"contract_version":1,"cli_version":"0.8.2","command":"parse","ok":false,"error":{"code":"NOT_FOUND","message":"..."}}
345
+ {"contract_version":1,"cli_version":"0.8.2","command":"version","ok":true,"data":{"version":"0.8.2"}}
346
346
  ```
347
347
 
348
348
  常见错误码:`PARSE_ERROR`、`NOT_FOUND`、`USAGE_ERROR`、`SCHEMA_UNAVAILABLE`、`SCHEMA_VERSION_MISMATCH`、`VALIDATION_ERROR`、`PROPERTY_PRESENTATION_ERROR`、`LAYOUT_ERROR`、`CHECKSUM_FORMAT_ERROR`、`GUI_SUPPORT_ERROR`、`CUSTOM_GUI_ERROR`、`COMMENT_GROUP_ERROR`、`GRAPH_REVIEW_ERROR`、`SEMANTIC_MISMATCH`、`SG_EXPORT_BLOCKED`、`EXTERNAL_REFERENCE`、`SKILL_INSTALL_CONFLICT`、`SKILL_INSTALL_ERROR`、`WRITE_CONFLICT`、`WRITE_PARTIAL`、`UNSAFE_PATH`、`WRITE_ERROR`、`BRIDGE_ERROR`、`INTERNAL`。
@@ -4,7 +4,7 @@
4
4
 
5
5
  AseCLI 是面向 AI Agent 的本地 CLI:离线读取、编辑和校验 ASE 节点图;通过运行中的 Unity/团结引擎与 MCP,让真实 ASE 创建节点、提供精排几何并重新生成 HLSL。Skill 提供跨 Agent 的操作规则,CLI 提供可验证的执行结果。
6
6
 
7
- 当前正式版:**[0.8.1](https://github.com/seeseeczl/ASECLI/releases/tag/v0.8.1)** · [PyPI](https://pypi.org/project/asecli/0.8.1/) · [Agent 操作手册](skills/asecli/SKILL.md) · [SG 转换后整理流程](skills/asecli/references/conversion-workflow.md)
7
+ 当前正式版:**[0.8.2](https://github.com/seeseeczl/ASECLI/releases/tag/v0.8.2)** · [PyPI](https://pypi.org/project/asecli/0.8.2/) · [Agent 操作手册](skills/asecli/SKILL.md) · [SG 转换后整理流程](skills/asecli/references/conversion-workflow.md)
8
8
 
9
9
  ASECLI 接收 SGCLI 生成的裸 `EditorGraphSpec v3`,并可把受支持的 ASE Shader 直接导出为 SGCLI 的裸 `sgcli.native.v3`。两个方向都只有“生产者 spec 原文件→消费者 `--spec`”;独立 report 与发布 receipt 都不进入创建输入,创建成功也不代表转换效果等价。
10
10
 
@@ -108,7 +108,7 @@ curl -fsSL https://raw.githubusercontent.com/seeseeczl/ASECLI/main/scripts/insta
108
108
  uv tool uninstall asecli
109
109
  ```
110
110
 
111
- 当前正式版本为 `0.8.1`(透明 Multiply 的 matcher-v4 语义修复与转换认证加固),可从 [PyPI](https://pypi.org/project/asecli/0.8.1/) 或 [GitHub Release](https://github.com/seeseeczl/ASECLI/releases/tag/v0.8.1) 安装。历史版本见 [GitHub Releases](https://github.com/seeseeczl/ASECLI/releases),`v0.8.0` 保留为回滚点。
111
+ 当前正式版本为 `0.8.2`(精确源 Alpha 混合、资源快照与转换认证加固),可从 [PyPI](https://pypi.org/project/asecli/0.8.2/) 或 [GitHub Release](https://github.com/seeseeczl/ASECLI/releases/tag/v0.8.2) 安装。历史版本见 [GitHub Releases](https://github.com/seeseeczl/ASECLI/releases),`v0.8.0` 保留为回滚点。
112
112
 
113
113
  已知限制:真实 MCP 下,属性+纹理 v2 和 Reciprocal 降级 v2 的 create、manifest、validate、独立 recompile 已通过;SGCLI SphereMask v3 spec 在重载时仍可能返回 `node missing after reload: Radius` 并回滚。本次不承诺该 recipe 端到端可用,也不改变 SGCLI v2 默认值契约。
114
114
 
@@ -138,7 +138,7 @@ asecli --help
138
138
 
139
139
  ```bash
140
140
  shasum -a 256 -c SHA256SUMS
141
- uv tool install /path/to/asecli-0.8.1-py3-none-any.whl
141
+ uv tool install /path/to/asecli-0.8.2-py3-none-any.whl
142
142
  asecli --help
143
143
  ```
144
144
 
@@ -183,7 +183,7 @@ sgcli sg create Assets/ConvertedNew.shadergraph \
183
183
 
184
184
  `export-sg` 自动从源 Shader 向上识别 Unity/Tuanjie 工程;跨工程资源解析时显式传 `--target-project`。它强制生成 `<stem>.asecli-to-sgcli.spec.json`、`.report.json` 与 `.receipt.json`,同名即失败;receipt 只证明 spec/report 两份文件的提交状态与 SHA,不是中间交接包。命令不调用 SGCLI,也不生成 ASE 自有中间 JSON。未知节点、Master/Pass、外部属性或纹理 Importer 语义时只写规范报告,不写半成品 spec。反方向 `.asecli-to-sgcli.spec.json` 不能交给 ASECLI `create --spec`。
185
185
 
186
- ASECLI 随 wheel 发布自己拥有的 EditorGraphSpec v3 Schema,并固定一份 SGCLI `0.3.3` 的 `sgcli.native.v3` 生产快照;SGCLI 同样固定 ASECLI `0.8.1` 快照。双仓兼容检查会比较两组原始 Schema SHA-256,任何漂移都必须先升级生产者再放行。
186
+ ASECLI 随 wheel 发布自己拥有的 EditorGraphSpec v3 Schema,并固定一份 SGCLI `0.3.5` 的 `sgcli.native.v3` 生产快照;SGCLI 同样固定 ASECLI `0.8.2` 快照。双仓兼容检查会比较两组原始 Schema SHA-256,任何漂移都必须先升级生产者再放行。
187
187
 
188
188
  可用 `asecli contract editor-graph --version 3 --spec FILE` 在不连接 Editor 时执行权威 Schema/loader 并返回原文件 SHA。报告分开记录来源快照、发布前复核、生产者 Schema 与真实消费者读取状态。旧 `{graph,report}` wrapper 只允许按已登记形状显式迁移,且内层必须已经是 `sgcli.native.v3`;无版本 discriminator 的旧输入只报告 `legacy_format`,不得伪称已识别版本化 Schema:
189
189
 
@@ -316,9 +316,9 @@ asecli recompile Assets/Example.shader
316
316
  除显式 `--help` 保留人类可读文本外,stdout 恒为单行严格 JSON,agent 可直接解析。`--version` 也返回 JSON:
317
317
 
318
318
  ```json
319
- {"contract_version":1,"cli_version":"0.8.1","command":"parse","ok":true,"data":{"node_count":7}}
320
- {"contract_version":1,"cli_version":"0.8.1","command":"parse","ok":false,"error":{"code":"NOT_FOUND","message":"..."}}
321
- {"contract_version":1,"cli_version":"0.8.1","command":"version","ok":true,"data":{"version":"0.8.1"}}
319
+ {"contract_version":1,"cli_version":"0.8.2","command":"parse","ok":true,"data":{"node_count":7}}
320
+ {"contract_version":1,"cli_version":"0.8.2","command":"parse","ok":false,"error":{"code":"NOT_FOUND","message":"..."}}
321
+ {"contract_version":1,"cli_version":"0.8.2","command":"version","ok":true,"data":{"version":"0.8.2"}}
322
322
  ```
323
323
 
324
324
  常见错误码:`PARSE_ERROR`、`NOT_FOUND`、`USAGE_ERROR`、`SCHEMA_UNAVAILABLE`、`SCHEMA_VERSION_MISMATCH`、`VALIDATION_ERROR`、`PROPERTY_PRESENTATION_ERROR`、`LAYOUT_ERROR`、`CHECKSUM_FORMAT_ERROR`、`GUI_SUPPORT_ERROR`、`CUSTOM_GUI_ERROR`、`COMMENT_GROUP_ERROR`、`GRAPH_REVIEW_ERROR`、`SEMANTIC_MISMATCH`、`SG_EXPORT_BLOCKED`、`EXTERNAL_REFERENCE`、`SKILL_INSTALL_CONFLICT`、`SKILL_INSTALL_ERROR`、`WRITE_CONFLICT`、`WRITE_PARTIAL`、`UNSAFE_PATH`、`WRITE_ERROR`、`BRIDGE_ERROR`、`INTERNAL`。
@@ -97,3 +97,4 @@
97
97
  | 2026-09-11 | 双向裸规格直连第三轮对抗整改 | 执行 AA-OPT-301~308:public PR 不读取 private SGCLI;可信链要求只读 token 和精确 40 位 SHA;package wheel 原样交给 cross-CLI/publish;WaveNoise 双向语义 fixture、receipt 绑定、fixture-set 完整性、Draft 数值等价与 clean provenance 通过。全量及 Python 3.10 均 `428 passed, 3 skipped`;本地 clean release-mode 双 wheel matrix/verifier 通过。AA-OPT-309 的远端 ruleset/required checks、最终 wheel Editor/画布/render 仍开放。未提交、未推送、未发布。 | CR-0030 TASK-0065 REG-0063 AA-OPT-301 AA-OPT-302 AA-OPT-303 AA-OPT-304 AA-OPT-305 AA-OPT-306 AA-OPT-307 AA-OPT-308 AA-OPT-309 |
98
98
  | 2026-09-11 | v0.8.0 双渠道发布与本机安装完成 | tag `v0.8.0` 解引用到 `58ccf10`;[publish run 34592028675](https://github.com/seeseeczl/ASECLI/actions/runs/34592028675) 的双 Python、package、public contract、Deploy Key cross-CLI 和 PyPI OIDC 全绿。GitHub Release 五项资产与 PyPI wheel/sdist 摘要一致且未 yanked;本机 CLI 为 0.8.0,`.agents`/`.claude` Skill 与 wheel 一致,旧三处 Skill 已备份。WaveNoise 双向生产/消费 SHA 一致;最终 wheel 的 Editor/画布/render 保持未验证披露。 | REL-0016 CR-0030 TASK-0065 REG-0063 |
99
99
  | 2026-09-14 | v0.8.1 发布候选 | matcher-v4 识别并折叠原生 `Lerp(white,color,alpha)`,保留 Wave Noise 不可表示 Alpha Blend 的失败关闭;SGCLI 普通 authoring 与转换认证分离。发布前全量 `461 passed, 3 skipped`,CI governance、供应链与 diff 通过;远端 publish/PyPI、正式资产回读和本机安装待执行,Editor/画布/render 保持开放披露。 | REL-0017 CR-0030 TASK-0066 REG-0063 |
100
+ | 2026-09-14 | v0.8.1 双渠道发布与本机安装完成 | tag `v0.8.1` 解引用到 `610a7a3`;[publish run 34796442345](https://github.com/seeseeczl/ASECLI/actions/runs/34796442345) 的双 Python、可复现构建、供应链、锁定 SGCLI `b4f8310` 的跨 CLI 门禁与 PyPI OIDC 全绿。[GitHub Release](https://github.com/seeseeczl/ASECLI/releases/tag/v0.8.1) wheel/sdist 与 PyPI 摘要一致,本机 CLI 为 `0.8.1`,用户级 Skill 已同步;Editor/画布/render 保持开放披露。 | REL-0017 CR-0030 TASK-0066 REG-0063 |
@@ -0,0 +1,92 @@
1
+ # 对抗性审计报告:ASE → SG 精确 Alpha 转换增量
2
+
3
+ > 生成时间:2026-09-14 12:36:40(Asia/Shanghai)
4
+ > 项目根目录:/Users/long/GitHub/ASECLI
5
+ > Skill:adversarial-audit
6
+ > 关联优化计划:2026-09-14-123640-optimization-plan.md
7
+
8
+ ## Findings 汇总
9
+
10
+ | ID | 严重度 | 标题 | 证据等级 | 关联任务 |
11
+ | --- | --- | --- | --- | --- |
12
+ | AA-COR-001 | P1 | 精确 Blend 与材质覆盖组合未被限制,实际进入不支持的生成路径 | 已验证静态分支及 Python 接受;运行时结果为高置信推断 | AA-OPT-001 |
13
+ | AA-COR-002 | P1 | 普通 Multiply 的 Custom Function 认证由失败关闭退化为漏检放行 | 已验证 Python 最小反例;RGB 差异由公式推导 | AA-OPT-002 |
14
+ | AA-COMPAT-003 | P2 | URP 包替换丢失仓库原有 FXAA 扩展 | 已验证包文件差异;当前工程未发现消费者 | AA-OPT-003 |
15
+
16
+ ## 审计边界
17
+
18
+ - 范围:ASECLI 当前 11 个已跟踪变更文件;SGCLI 当前 12 个已跟踪变更文件;MBI3MAX 的 URP tgz 及相关依赖配置。包含调用方、反向转换、消费者认证、Target 创建/编辑和相邻 URP 生成路径。
19
+ - 方法:只读 diff、源码审查、真实 tar 内容比较、临时测试夹具反例、相关 pytest。仅落盘本文和优化计划,未修改业务代码、生产 spec、材质或 Shader。
20
+ - 基线:两个 CLI 的 HEAD;URP 原包通过 MBI3MAX 的 HEAD LFS 指针定位本地 LFS 对象。该原包不等同于任务开始时的实际加载包,不能据此断言本次修改首次引入所有依赖配置变化。
21
+ - 排除:既有 Prefab、外部重生成的源 shader、旧图、桥接和事务文件等用户工作。manifest 中 MCP 等不相关变化不归因于本次修复。
22
+ - 当前包 SHA-256:`06b07e3246e874d5b4928dbe45f0123ac2e6f0df4fd4deee0e678e8e9f544761`。
23
+
24
+ ## 威胁与失败模型
25
+
26
+ - 资产:RGB/Alpha 合成行为、可编辑图、材质绑定、已有项目渲染功能。
27
+ - 输入:CLI 创建规格、目标选项、Custom Function 函数体、生产者 report/receipt。
28
+ - 假设:生产者可能出现映射或报告错误;SHA 绑定证明文件一致性,不证明公式正确。
29
+ - 常规操作:用户可从创建/编辑接口或 SG Inspector 开启材质覆盖。
30
+ - 包升级风险:功能扩展不得无意删除已有项目代码或 GUID。
31
+ - 最贵失败:接口接受、认证通过、编译成功,但真实渲染悄悄改变。
32
+
33
+ ## Findings 详情
34
+
35
+ ### [P1] AA-COR-001 — 限制精确模式的材质覆盖组合
36
+
37
+ - 位置:`/Users/long/GitHub/SGCLI/src/sgcli/native/resources/TargetSettings.cs:18`、`:22`;`TargetEditing.cs` 的 Apply;`target_spec.py:9`。
38
+ - URP 位置:当前 tgz 内 `package/Editor/ShaderGraph/Targets/UniversalTarget.cs:1389` 的 `UberSwitchedRenderState`,以及 `BaseShaderGUI.cs:980`。
39
+ - 触发:`blend=MultiplySourceAlpha` 且 `options.allowMaterialOverride=true`;也包括先创建精确图,再仅编辑开启覆盖。
40
+ - 验证:Python `target_spec.validate` 接受该组合。C# TargetLimits 仅拒绝 zTest Disabled;创建/编辑仅检查 AlphaMode 枚举名字存在,随后无条件应用 allowMaterialOverride。
41
+ - 错误机制:开启覆盖后生成器绕过新增的精确 Blend switch,输出 `Blend [_SrcBlend] [_DstBlend]`,没有独立 Alpha 因子。Unlit/Lit SubTarget 把新枚举数值 4 写入材质 `_Blend`,而 BaseShaderGUI 的 BlendMode/switch 仍只处理原有四种值,没有 4 的实现。
42
+ - 影响:此合法接口组合无法兑现 `DstColor Zero, One Zero`;材质初始化和后续 Inspector 更新可能产生错误 RGB/Alpha 混合。当前 WaveNoise 样本未开启该选项,所以其已有测试无法覆盖这个问题。
43
+ - 最小修复:暂时明确拒绝该组合;创建和编辑必须验证合并后的最终状态,不能只看 patch。若要开放,需同时实现材质枚举、因子属性、初始化、GUI 和生成代码支持。
44
+ - 证据边界:本次未用 Editor 新建此组合;不声称已观察具体屏幕像素。
45
+ - 关联任务:AA-OPT-001。
46
+
47
+ ### [P1] AA-COR-002 — 恢复普通 Multiply 的未知函数认证保护
48
+
49
+ - 位置:`/Users/long/GitHub/SGCLI/src/sgcli/native/conversion_gate.py:43`;`surface_guard.py:39` 及 `_alpha_modulate`。
50
+ - 本次变化:移除 `fail_unproved=True` 以及未知 Custom Function 的 SEM-BLEND-002 拒绝分支。
51
+ - 触发:普通 Transparent/Multiply 的 BaseColor 上游有包含局部变量或多语句的调制函数;生产者错误地将其声明为 verified,report/receipt 与 spec 的 SHA 一致。
52
+ - 已验证反例:使用现有 `tests/native/test_conversion_gate.py` 的 `_bundle` 创建隔离测试夹具,仅在临时目录变更夹具。规格通过 `validate_native_spec`,随后 `certify` 返回 `semantic_certified=True`。未改任何生产转换规格。
53
+
54
+ ```hlsl
55
+ float3 white = float3(1,1,1);
56
+ Out = lerp(white, float3(0.2,0.2,0.2), 0.5);
57
+ Alpha = 0.5;
58
+ ```
59
+
60
+ 函数的两个输出分别接 BaseColor 与 Alpha。目标为普通 Multiply。图输出 RGB=0.6;管线额外执行 `lerp(1,0.6,0.5)` 后为 0.8。假设源只执行图中调制,就产生确定的语义差异。现有正则仅匹配整段单赋值 `Out=lerp(...)`,该反例不匹配,移除兜底后直接通过。
61
+
62
+ - 为什么属于本次回归:原版认证会以 SEM-BLEND-002 拒绝此函数;新的“非调制函数可认证”测试只测试 `Out=C*2` 的放行,未证明任意未匹配函数均不调制。
63
+ - 边界:这不是密码学签名或外部攻击者权限突破。夹具模拟错误生产者报告;哈希无认证密钥,测试名中的 signed 不表示签名。也不声称当前 WaveNoise 精确模式存在重复调制。
64
+ - 最小修复:将放宽限制限定于无管线调制的精确模式;普通 Multiply 对无法证明的函数继续失败关闭,或实现可审计的表达式/数据流证明后再允许。不要仅增加这一个字符串的黑名单。
65
+ - 关联任务:AA-OPT-002。
66
+
67
+ ### [P2] AA-COMPAT-003 — 保留原 URP 包中的 FXAA 扩展
68
+
69
+ - 位置:`/Users/long/Tuanjie3D/MBI3MAX/Packages/com.unity.render-pipelines.universal-14.1.0.tgz`。
70
+ - 对比基线:HEAD LFS SHA `023141b47e7dbae099574465b157d87dd9e3df3238b1ffc8707b85d77dcdcde0`。
71
+ - 已验证:按解压后文件名和 SHA 比较,排除 Apple `._` 元数据,新增 1、删除 1184、修改 1。代码修改为 UniversalTarget;删除项大部分是文档和测试,但还包含以下实际扩展及其 meta:
72
+ - `Runtime/FXAA/RenderAntiAliasing.cs`
73
+ - `Runtime/FXAA/RenderAntiAliasingSettings.cs`
74
+ - `Editor/FXAA/RenderAntiAliasingEditor.cs`
75
+ - 触发:依赖原包 FXAA 类型或脚本 GUID 的工程/分支消费本次替换包。
76
+ - 影响:RendererFeature 类型/序列化引用丢失,无法使用已有抗锯齿扩展。纯 Python 和单个 WaveNoise 渲染测试无法覆盖。
77
+ - 限定:搜索当前 Assets/ProjectSettings 未发现这三个类型/脚本 GUID 的消费者,因此没有证据表明当前场景已经失去 FXAA;P2 而非“当前生产场景必然损坏”。任务前该包是否已被替换不确定,发现针对当前待交付差异。
78
+ - 最小修复:用确认的完整项目包作为基线,只补 Target 逻辑;保留既有扩展及 meta。若扩展本就应移除,应独立处理并给出迁移依据。
79
+ - 关联任务:AA-OPT-003。
80
+
81
+ ## 测试与观测缺口
82
+
83
+ - 本次 ASECLI 定向测试:57 passed;SGCLI:86 passed, 1 skipped。通过说明已有测试未捕获上述反例,不代表反例无效。
84
+ - 本次未启动/重启 Editor,未重新做像素对比。上一轮的 18 组结果属于历史本任务证据:Alpha 全零差、RGB 有 1 像素 1/255;不能升级为所有平台/参数全等证明。
85
+ - 上轮正式 report 仍为 producer 阶段,`conversion_success=false`、`visual_equivalent=false`,下游证据未回填。receipt 只说明 spec/report 原子发布。聊天中的“视觉效果一致”不能当作全部验收通过。
86
+ - 反向转换新增测试只检查模式与未添加 AlphaModulate,没有真实 ASE 生成 Blend 的闭环证据;暂列验证缺口,不凭此报一个已确认缺陷。
87
+ - 隐藏纹理修复符合 ShaderLab 材质属性与 Inspector 可见性分离的语义;本轮未找到该改动的可行动反例。
88
+ - Lit、材质覆盖、目标设备以及原包扩展恢复后渲染均需在对应修复完成后集中验证。
89
+
90
+ ## 总评
91
+
92
+ **阻塞合并/发布。** 精确模式解决原 Alpha 表达能力缺口的方向成立,但两项 P1 表明公共接口和普通 Multiply 认证尚有回归。先完成 AA-OPT-001、002,并处理 AA-OPT-003 的包兼容性,再做相关 Editor 验收。此次审计不修改实现。
@@ -0,0 +1,61 @@
1
+ # 对抗性审计优化计划:ASE → SG 精确 Alpha 转换增量
2
+
3
+ > 生成时间:2026-09-14 12:36:40(Asia/Shanghai)
4
+ > 项目根目录:/Users/long/GitHub/ASECLI
5
+ > 关联报告:2026-09-14-123640-audit-report.md
6
+
7
+ ## 1. 执行摘要
8
+
9
+ P0=0,P1=2,P2=1,P3=0。建议阻塞合并/发布。本文件仅给出本次发现对应的修复任务,未执行业务代码修改。顺序:001、002 → 003 → 集中 Editor 验证。
10
+
11
+ ## 2. 修复与加固任务
12
+
13
+ | 任务 | 优先级 | 来源 | 内容 | 验收标准 | 依赖 | 风险/回滚 |
14
+ | --- | --- | --- | --- | --- | --- | --- |
15
+ | AA-OPT-001 | P1 | AA-COR-001 | 在创建和编辑的最终 Target 状态中拒绝精确模式 + allowMaterialOverride;在完整实现材质支持前保持拒绝 | 新建非法组合、先设置模式后打开覆盖、先覆盖后改模式均明确拒绝;图文件 SHA 不变;普通模式不受影响 | 无 | 精确图允许的操作收窄;仅回退对应校验补丁,不恢复用户图 |
16
+ | AA-OPT-002 | P1 | AA-COR-002 | 恢复普通 Multiply 未证明函数的失败关闭;精确模式独立处理;允许普通无害函数前提供明确证明路径 | 报告中的多语句反例不能认证;文件函数/局部变量/多输出函数有拒绝或证明;精确模式保留原表达式并通过 | 无 | 部分此前误放行输入重新阻断;不要以关闭门禁回滚 |
17
+ | AA-OPT-003 | P2 | AA-COMPAT-003 | 对确认的完整项目 URP 包施加最小补丁,保留 FXAA 和 meta | 解包文件清单/哈希对账;FXAA 类型与 GUID 保持;UniversalTarget 预期改动可读;包可由明确源重建 | 无 | 全局渲染依赖,先记录包与 manifest/lock SHA;保留当前包备份,按明确版本回滚,禁止覆盖其他用户依赖改动 |
18
+
19
+ ## 3. 测试补强任务
20
+
21
+ | 任务 | 优先级 | 覆盖缺口 | 内容与验收标准 |
22
+ | --- | --- | --- | --- |
23
+ | AA-TEST-001 | P1 | 配置组合 | 对创建/编辑最终状态增加正反例;对应修复完成后一次 Editor 会话确认拒绝无副作用 |
24
+ | AA-TEST-002 | P1 | 非单赋值调制 | 复用隔离转换夹具,覆盖本报告反例;断言无法获得 semantic_certified,而不只测正则返回值 |
25
+ | AA-TEST-003 | P2 | 包和反向转换 | 解包哈希清单断言只改白名单;SG AlphaMode=4 经实际 ASE 生成核对 RGB/Alpha Blend 与表达式次数 |
26
+ | AA-TEST-004 | P2 | 精确渲染结论 | 对最终包重做受影响的真实材质对比;保留条件、差异像素和非零差结论,未测设备写未执行 |
27
+
28
+ 先执行定向自动测试并完成全部候选修改,再集中使用一个 Editor 会话验证。不得为文档交付重复启动 Editor。
29
+
30
+ ## 4. 观测与交付任务
31
+
32
+ | 任务 | 优先级 | 内容 | 验收标准 |
33
+ | --- | --- | --- | --- |
34
+ | AA-OBS-001 | P2 | 记录实际加载的 URP 能力和包标识 | 证据包含包 SHA、Target 模式、材质覆盖状态以及生成代码 Blend/AlphaModulate;枚举存在不冒充完整行为验证 |
35
+ | AA-OBS-002 | P2 | 分离生产者 report 和下游验收 | 保留原三件套绑定,另记录消费者、重载、编译、画布、渲染证据;有未执行/不匹配时不将整体成功置真 |
36
+
37
+ ## 5. 合并/发布门禁
38
+
39
+ - [ ] 两项 P1 修复及反例回归通过。
40
+ - [ ] 原包 FXAA 扩展保留,或另有明确迁移依据。
41
+ - [ ] 定向测试和 diff 检查通过。
42
+ - [ ] 受影响 Editor 路径验证完成,未执行平台明确披露。
43
+ - [ ] 不将样本近似一致表述成全参数、全平台逐像素全等。
44
+
45
+ ## 6. 未映射项
46
+
47
+ 无。所有发现均已映射;其余缺口仅作为相关修复后的验证任务,不扩大为无关重构。
48
+
49
+ ## 7. 本次修复与实测回执(2026-09-14)
50
+
51
+ - AA-OPT-001 已修复:Python 拒绝完整非法组合;C# 在编辑前检查合并后的 Target 状态;URP 生成路径也拒绝直接从 Inspector 绕入的非法组合。可复用 Editor 探针为 SGCLI `tests/native/probes/exact_blend_audit.cs`。
52
+ - Editor 探针 10/10 通过:Unlit/Lit 各验证创建非法组合、开启覆盖、切换 Blend、两个合法组合切换。四个拒绝编辑用例的序列化内容均保持不变。所有对象仅在内存创建,不写用户图。
53
+ - AA-OPT-002 已修复:恢复普通 Multiply 的 fail_unproved 认证及 ASECLI 折叠前上游函数保护。局部变量调制反例拒绝;精确模式的相同函数仍可认证。本次实际 spec/report/receipt 重新消费通过,semantic_certified=true,三件套原字节未变。
54
+ - AA-OPT-003 已修复:新增 SGCLI `scripts/build_exact_blend_urp.py`,从完整项目 LFS 原包构建,未知源形状拒绝,输出不得覆盖已有文件。新包逐项核对 2,945 个归档条目,名称/类型相同,仅 UniversalTarget.cs 内容变化。FXAA 及原 meta 均保留;真实 Editor 已能解析 RenderAntiAliasing 类型。
55
+ - 新包 SHA-256:`16177f39c34916dd4a9ddfd977eab1bb0d10918ef16b652d923845c84aaf059b`;实际 Editor PackageCache:`com.unity.render-pipelines.universal@462d79d17c5a`。
56
+ - 回滚副本:`/tmp/urp-audit-fix.TFSWQS/previous-urp.tgz`;manifest/lock 写前副本同目录。本次修复结束两份依赖配置与写前副本 SHA 相同,未覆盖其他依赖变更。
57
+ - 自动验证:SGCLI `tests/native` + `tests/test_complete.py` 为 423 passed, 1 skipped;ASECLI 三个相关测试文件为 57 passed。三个工作区 diff 检查通过。
58
+ - 最终 Shader Graph 的 `sg validate --editor` 返回 ok=true;原 SHA `664a788b15198282ba55441150b2021c92cd8bbb78b001c63cb6e51f448ce5cf` 保持。生成代码检查:精确 Blend、无隐式 AlphaModulate、保留 float 表达式、隐藏纹理是材质属性,均通过。
59
+ - 新包下重新比较 Night/Day × 时间 0、1.2、3.62 × 透明量 0、0.5、1,共 18 组。Alpha 全部零差,RGB 17 组零差;Night/3.62/1 的 (209,133) 仍为源 RGBA(6,13,22,255)、目标 RGBA(6,12,22,255)。没有新增差异,不声明逐像素完全等价。
60
+ - 边界:本轮未重新执行 SG→ASE 真实创建、画布视觉验收或目标设备测试;反向转换相关 Python 回归通过。三项发现的实现修复和对应回归已完成,不将这些额外证据缺口标为通过。
61
+ - 原生产者 report/receipt 保留原样,下游本轮证据记录在此,未将 conversion_success/visual_equivalent 人工改真。未提交、推送或发布。
@@ -0,0 +1,128 @@
1
+ # 对抗性审计报告:ASECLI → SGCLI JSON 交接
2
+
3
+ > 时间:2026-09-14 12:49:47(Asia/Shanghai)
4
+ > 项目:/Users/long/GitHub/ASECLI;/Users/long/GitHub/SGCLI
5
+ > Skill:adversarial-audit
6
+ > 优化计划:2026-09-14-124947-optimization-plan.md
7
+
8
+ ## Findings 汇总
9
+
10
+ | ID | 优先级 | 发现 | 证据 | 修复任务 |
11
+ | --- | --- | --- | --- | --- |
12
+ | AA-JSON-001 | P1 | 创建请求与认证重复读取 spec,未绑定同一字节快照 | 已验证,确定性模拟两次读取之间的替换 | AA-OPT-001 |
13
+ | AA-JSON-002 | P1 | Custom Function 完整类型名绕过 Multiply 语义门禁 | 已验证,Schema、认证、prepare 均可接受 | AA-OPT-002 |
14
+ | AA-JSON-003 | P1 | 资源验证不比较贴图内容,且忽略平台覆盖 | 已验证,红/蓝 PNG 和不同 Android 设置被接受 | AA-OPT-003 |
15
+ | AA-JSON-004 | P2 | ASECLI 公开报告丢弃内部 Inspector 降级 | 已验证,真实 cmd_export_sg 夹具 | AA-OPT-004 |
16
+ | AA-JSON-005 | P2 | SGCLI 接受 checks 与 degradations 相互矛盾的报告 | 已验证,certify 返回 true | AA-OPT-005 |
17
+
18
+ ## 审计边界
19
+
20
+ 本轮只检查 JSON 交接:ASECLI 的候选/名称槽位绑定、资源证明、公开 report、发布入口,以及 SGCLI 的文件加载、Schema、certify、v3→v2 预处理和创建调用链。以本轮当前工作树为准,包含上一轮修复,不修改业务实现。
21
+
22
+ 方法为只读源码、相关 pytest、临时目录中的测试夹具和内存 mock。未改生产 spec/report/receipt、源 Shader、材质、URP 包,未连接或启动 Editor。本报告中的 spec 变体仅是负向测试,不是通过手工改写生产转换规格绕过转换流程。
23
+
24
+ 两端 `sgcli.native.v3` Schema SHA 都为 `bb16ce3f61e0772c51bcbfe89cd010ee426db12c59a6e84afad34fd512b41b82`。本轮没有发现 Schema 快照不同步。不能将下面的故障边界推断为现有 WaveNoise 产物已经遭到替换或贴图已错。
25
+
26
+ ## 威胁与失败模型
27
+
28
+ - 资产:实际交给 Editor 的图、属性/资源内容、report/receipt 的可信含义。
29
+ - 生产者可能出现映射错误、过时报告或重新发布文件;消费者需要检测可证明的矛盾。
30
+ - 文件可以被同一用户的其他任务/程序在两次读取之间替换。
31
+ - 不同项目可能保留同一个 Unity GUID,但贴图内容和平台导入设置已分叉。
32
+ - 同一种 SG 节点可以通过 CLI 别名或合法原生完整类型名表达。
33
+ - SHA 是内容绑定,不是来源签名;攻击者能同时任意改写全部证据时,不能靠裸 SHA 证明真实性。本审计不将这一固有限制本身报为鉴权漏洞。
34
+ - 最贵失败是创建/认证成功但消费了不同图、不同纹理或执行了不同输出公式。
35
+
36
+ ## Findings 详情
37
+
38
+ ### [P1] AA-JSON-001 — 用同一 spec 快照完成加载与认证
39
+
40
+ 位置:`/Users/long/GitHub/SGCLI/src/sgcli/native/commands.py:172`、`:188`;`native/conversion_gate.py:28`。
41
+
42
+ `_load_request` 先调用 `spec.load_for_command` 得到 request A 和 SHA A,再通过 `_conversion_certification` 调用 `certify`,后者重新读取 spec。认证没有接收第一次读入的 bytes/SHA,也不返回第二次 spec SHA 供调用方比较。创建后 `_result_metadata` 可同时输出 SHA A 和认证 B 的 true。`sg contract` 也存在相同双读。
43
+
44
+ 触发:第一次读取 A 后,文件被替换为有有效 report/receipt 的 B。无需碰改 B 的有效证据。创建逻辑继续使用 A 的内存对象,却附上 B 的认证。
45
+
46
+ 已验证:复用 `tests/native/test_conversion_gate.py::_bundle`;mock `Path.read_bytes`,仅该 spec 首次返回改名为 `UNVERIFIED_A` 的合法 bytes A,第二次返回原 bytes B。调用真实 `commands._load_request(args, 'create')`,结果:
47
+
48
+ ```text
49
+ loaded_name = UNVERIFIED_A
50
+ loaded_sha = 0745fa6146ae9e7f356182db8d4987ef45feb4588816503ea27e4d8d798073c2
51
+ certified_spec_sha = aed4618d3a398a3230dc1d684412d744700867c59ecd5b994e960ef984baf55f
52
+ semantic_certified = true
53
+ spec_reads = 2
54
+ ```
55
+
56
+ 未实际竞争调度或创建 Unity 资产;此 mock 确定性重现文件变化时的调用链行为。A 不必只改名称,也可以是另一份可创建的计算图。
57
+
58
+ 修复:读取一次不可变快照,Schema、认证和创建均用此快照;或者将初读 SHA 作为认证强制前置条件并比较。不要只在最后再读第三次文件。
59
+
60
+ ### [P1] AA-JSON-002 — 语义门禁统一使用规范节点类型
61
+
62
+ 位置:`/Users/long/GitHub/SGCLI/src/sgcli/native/surface_guard.py:39`、`:106`;`native/spec_v2.py:76` 的 bind_node。
63
+
64
+ 输入 `type="custom-function"` 会进入重复调制和未知函数检查,但合法完整类型 `UnityEditor.ShaderGraph.CustomFunctionNode` 不满足这两个字符串判断。Schema 允许原生类型名,bind_node 也会从 catalog 绑定此类型,并保留原输入字符串。
65
+
66
+ 已验证两个层面:
67
+
68
+ 1. 完整类型名配 `Out = lerp(float3(1,1,1), C, A);`,对隔离夹具更新 SHA 绑定后,真实 `_load_request`/`certify` 返回 `semantic_certified=true`。
69
+ 2. 使用测试中已声明的合法 CustomFunctionNode/Vector1Node catalog 形状,完整类型名经过 `validate_native_spec` 和 `spec_v3.prepare` 均被接受;将同一节点仅改回别名 `custom-function` 后立即报 SEM-BLEND-001。
70
+
71
+ 反例条件:Transparent/Multiply;函数输入 C=(0.2,0.2,0.2)、A=0.5;另一个 `float` 节点 0.5 接 Surface Alpha。图中输出为 0.6,URP 再调制成为 0.8。这是公式推导,不是本轮 GPU 测量。
72
+
73
+ 上一轮恢复了 fail_unproved,但其外层仍只检查别名,因此该问题仍存在。当前 ASECLI 通常输出别名;风险位于消费者公开 JSON 接口,并不证明当前 WaveNoise 精确模式有重复调制。
74
+
75
+ 修复:在可信目录绑定后统一规范类型,或者在认证和 prepare 两处共用能识别别名/原生名的类型分类器;语义检查不能取决于同一节点的拼写形式。
76
+
77
+ ### [P1] AA-JSON-003 — 资源证明包含内容与有效导入设置
78
+
79
+ 位置:`/Users/long/GitHub/ASECLI/src/asecli/sg_export/sources.py:143`、`:210`;`sg_export/conversion_report.py` 的 `_resources_verified`;`sg_export/report_semantics.py` 的 resources 证据。
80
+
81
+ `texture_dependency` 比较有限的导入整数,但不读取/比较源与目标纹理内容。`_texture_importer` 按正则取每个 key 的第一个值;平台覆盖、maxTextureSize 等不参与对比。随后 `_resources_verified` 将 `verified_importer` 当作资源已证明。
82
+
83
+ 已验证临时源/目标 Unity 项目:各有合法 1×1 PNG,源为红色、目标为蓝色;GUID 都为 `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`,14 个被读取的导入字段相同。Android 平台覆盖分别为 2048 和 32。实际调用 resolve_asset、texture_dependency 后得到 `status=verified_importer`,未报错。
84
+
85
+ ```text
86
+ source PNG SHA = b1ff9c8ea3a780bad09b346c423d2d0e46815926879b18e841d928376a946640
87
+ target PNG SHA = fce481932ea5d07a91c7991c09fdadb4bf78f9b4cc8f927188384231f9d12679
88
+ status = verified_importer
89
+ ```
90
+
91
+ 证据限定:上述反例直接验证资源层;没有用这个夹具跑完整 ASE 图导出/Editor 导入。源代码可确认公开报告只看此 status,且不携带可由消费者复核的内容摘要。Android 最大尺寸对本例 1×1 PNG 不产生尺寸差,但不同大纹理/平台配置会产生实际行为差异;红蓝像素不同本身已足以否定资源等价。
92
+
93
+ 修复:同格式资源至少比较内容 SHA,并把源/目标内容、meta 与目标平台有效 importer 状态写入独立机器证据,交接时复核。不同编码但视觉相同的资产不能简单放过,应使用明确的可验证等价规则;未知平台状态保持未证明。资源证明仍不混入裸创建 spec。
94
+
95
+ ### [P2] AA-JSON-004 — 公开报告保留已识别的 Inspector 降级
96
+
97
+ 位置:`/Users/long/GitHub/ASECLI/src/asecli/sg_export/evidence.py:33` 的 inspector_degradations;`sg_export/conversion_report.py:82` 的公开 degradations 构造。
98
+
99
+ 内部报告会记录 CUSTOM_INSPECTOR_NOT_MIGRATED、INSPECTOR_METADATA_NOT_MIGRATED。公开报告只由 checks/failure 重建 degradations,不合并这些内部记录;properties 又只依据 semantic_mapping=passed 写 verified。
100
+
101
+ 已验证:复用 `tests/test_export_sg.py` 的最小 Opaque ASE 夹具,将 Master 的 CustomEditor 设为 `MZGUI.MZGUI`,调用真实 build_candidate 和 cmd_export_sg。内部 degradations 包含 CUSTOM_INSPECTOR_NOT_MIGRATED;公开 report 只剩 SEM-EVIDENCE-001、SEM-COMPARE-001,properties=verified,而且 spec 已产出。
102
+
103
+ 影响:接收方无法从唯一公开交接报告看见已知 Inspector 行为丢失。对纯展示元数据可能不影响像素,但 Custom ShaderGUI 还可能控制关键词/材质状态;本轮未断言夹具实际执行这些行为。
104
+
105
+ 修复:将内部降级规范化为公开 report 的 rule/source/target/reason;区分只影响呈现的已知差异与影响渲染的未知外部消费者,并让对应语义状态/发布策略一致。不能直接清空降级信息。
106
+
107
+ ### [P2] AA-JSON-005 — 拒绝自相矛盾的语义证据
108
+
109
+ 位置:`/Users/long/GitHub/SGCLI/src/sgcli/native/conversion_gate.py:79` 的 `_report`。
110
+
111
+ 消费者检查各 checks 为 verified、三个 producer evidence 为 passed,但完全不检查 degradations 是否与这些声明冲突。裸 JSON Schema 只验证形状,未约束此跨字段一致性。
112
+
113
+ 已验证:在测试 report 中保留七项 verified,追加一项 `rule=SEM-RESOURCE-001, category=unsupported, reason=texture content changed`,更新 report/receipt 哈希绑定。certify 仍返回 true。这个反例模拟错误/过时生产者报告;不将能改全部文件的本地用户描述为通过了密码学签名。
114
+
115
+ 修复:认证允许正常的下游 not_run/evidence_gap(如尚未开 Editor),但必须拒绝七项生产语义规则中 unsupported/语义变化与 verified 并存。生产者 assert_spec_publishable 也应使用一致的政策,避免输出消费者必拒绝的交接。
116
+
117
+ ## 已检查的控制与未报问题
118
+
119
+ - 两端 v3 Schema 内容摘要相同,非法方向与证据配对有现存检查。
120
+ - ASECLI 发布入口对源 Shader 多次重查,并保留原始 bytes;不能将 AA-JSON-001 的消费者双读问题泛化为生产者源快照完全没保护。
121
+ - 正常生产者 report 保持 conversion_success=false、visual_equivalent=false 和下游 not_run;这本身符合生产者阶段语义,不是缺陷。
122
+ - 绝对路径绑定影响文件迁移,但属于现有明确路径合同,本轮没有将其列为未授权路径绕过。
123
+ - 本次 ASECLI 相关测试 40 passed;SGCLI 相关测试 63 passed。测试及 diff 检查通过,与负向反例同时成立。
124
+ - 本轮只审读 JSON 交接,没有新增 Shader 创建、画布或渲染结论。
125
+
126
+ ## 总评
127
+
128
+ **阻塞将这条链路宣称为完整、失败关闭的语义认证。** 有 3 项 P1、2 项 P2。优先闭合字节快照、类型规范化及资源证据,再修复生产者/消费者报告一致性。现有样本的成功不能覆盖这些交接边界;本轮仅审计,未修改实现。
@@ -0,0 +1,65 @@
1
+ # 对抗性审计优化计划:ASECLI → SGCLI JSON 交接
2
+
3
+ > 时间:2026-09-14 12:49:47(Asia/Shanghai)
4
+ > 项目根目录:/Users/long/GitHub/ASECLI
5
+ > 关联报告:2026-09-14-124947-audit-report.md
6
+
7
+ ## 1. 执行摘要
8
+
9
+ 发现 P0=0、P1=3、P2=2、P3=0。当前建议阻塞完整语义认证的合并/发布声明。本轮仅审计,以下任务尚未执行。沿现有裸 spec + report + receipt 架构修复,不引入中间 wrapper 或两 CLI 相互调用。
10
+
11
+ ## 2. 修复任务
12
+
13
+ | 任务 | 优先级 | 来源 | 最小修复 | 验收标准 | 依赖 | 风险与回滚 |
14
+ | --- | --- | --- | --- | --- | --- | --- |
15
+ | AA-OPT-001 | P1 | AA-JSON-001 | 加载、校验、认证、创建共享不可变 spec bytes/SHA | 两次读之间替换的确定性反例被拒绝,或根本不再第二次读 spec;create 与 contract 两入口一致 | 无 | 接口改动影响调用方;回退相关提交,保留失败关闭,不用关闭摘要校验作为回滚 |
16
+ | AA-OPT-002 | P1 | AA-JSON-002 | 统一别名与完整类型的语义分类 | 同一 Custom Function 两种命名均拒绝重复调制;未知函数认证策略一致;精确模式合法函数继续通过 | 无 | 原生类型合法作者路径受影响,测试等价输入;不删除原生类型支持 |
17
+ | AA-OPT-003 | P1 | AA-JSON-003 | 添加资源内容/有效导入设置证据及交接重查 | 红蓝同 GUID 拒绝;仅平台覆盖变化可检测;导出后内容或 meta 变化不可继续认证为旧资源;相同资源仍通过 | 可能涉及 report 契约同步 | 新证据字段需两端 Schema、哈希及版本策略同步;不修改纹理或以默认白纹理恢复 |
18
+ | AA-OPT-004 | P2 | AA-JSON-004 | 内部降级映射进公开报告并影响对应语义状态 | CustomEditor/MZGUI 夹具公开 report 保留定位与原因;未知渲染副作用不能被笼统认定纯 UI | 与 005 协同 | 既有有损输入可能开始阻断,这是预期;需明确兼容策略 |
19
+ | AA-OPT-005 | P2 | AA-JSON-005 | 生产与消费采用一致的语义/降级一致性规则 | verified+SEM-RESOURCE unsupported 拒绝;正常生产者下游 not_run 仍允许进入 Editor;哈希不变的原 bundle 校验正常 | 与 004 协同 | 不得一刀切禁止所有 evidence_gap,避免阻断正常创建前报告 |
20
+
21
+ ## 3. 定向测试补强
22
+
23
+ | 任务 | 优先级 | 测试内容 | 完成判据 |
24
+ | --- | --- | --- | --- |
25
+ | AA-TEST-001 | P1 | 使用真实 _load_request/_contract 和受控读取序列模拟 A→B | 创建对象的 SHA 必须与被认证 spec 相同 |
26
+ | AA-TEST-002 | P1 | 别名/完整类型 × String/File × 直接/间接调制 | 相同语义输入有相同认证结果;不只断言字符串 matcher |
27
+ | AA-TEST-003 | P1 | 两个小 Unity 项目资源夹具:不同内容、不同 GUID、不同平台覆盖、导出后变更 | 各差异被准确定位,完全一致控制组通过 |
28
+ | AA-TEST-004 | P2 | 从实际 cmd_export_sg 输出接到 SGCLI 校验入口 | 内部和公开 report 已知降级一致;不使用人工补写正确标志掩盖生产者错误 |
29
+ | AA-TEST-005 | P2 | 矛盾 report 与正常 not_run report 配对 | 前者拒绝、后者允许;保持 receipt SHA/path 绑定原有回归 |
30
+
31
+ 只运行相关模块回归。JSON/报告修复本身先离线验证;如修改实际 Editor 绑定或资源应用逻辑,再在所有候选修改完成后集中进行 Editor 验证。
32
+
33
+ ## 4. 观测与证据
34
+
35
+ | 任务 | 优先级 | 内容 | 验收 |
36
+ | --- | --- | --- | --- |
37
+ | AA-OBS-001 | P1 | 返回/记录被消费快照及资源证据摘要 | 不会将 A 的 spec SHA 与 B 的认证拼接;错误指出具体失配资产 |
38
+ | AA-OBS-002 | P2 | 用机器可读方式保留已知降级及其阶段 | producer、consumer、Editor、render 状态可区分;报告有矛盾时明确失败 |
39
+
40
+ ## 5. 门禁与回滚
41
+
42
+ - [ ] 三项 P1 及对应反例回归全部通过。
43
+ - [ ] 两项报告缺陷处理完成,正常证据缺口不被误拒绝。
44
+ - [ ] 若合同变更,两端权威 Schema 与 vendored 摘要一致。
45
+ - [ ] 真实 ASECLI 生成三件套原字节直接交给 SGCLI,通过一致快照验证。
46
+ - [ ] 失败不产生部分正式 spec/目标资产,原文件和用户改动保留。
47
+ - [ ] 回滚按各任务的代码/合同版本进行,不回滚或改写用户 Shader、纹理、生产证据。
48
+
49
+ ## 6. 未映射项
50
+
51
+ 无。所有发现均对应修复任务。此计划不包含发布、推送、无关重构或重做既有 Shader 效果。
52
+
53
+ ## 7. 本轮修复回执(2026-09-14)
54
+
55
+ - AA-OPT-001:create/contract 初读 SHA 传入认证,两次读取 A→B 的确定性反例均拒绝。
56
+ - AA-OPT-002:CustomFunction 别名和完整类型统一分类,认证与 prepare 回归覆盖两种写法。
57
+ - AA-OPT-003:生产端比较纹理内容、GUID、完整 TextureImporter(含平台覆盖),发布前重查;报告携带四份文件摘要。消费者绑定纹理属性、目标路径和实际工程,认证时及暂存导入后的提交前重查。内容、meta、缺快照、错工程、错属性/路径、重复快照均拒绝。完整 importer 文本采取保守相等策略,未知或非渲染字段差异也可能阻断,不默许降级。
58
+ - AA-OPT-004:公开报告保留内部降级代码、详情、源文件/属性位置和 CustomEditor 类名;属性语义标 unsupported。实际 cmd_export_sg 的 MZGUI 反例只留下失败报告,不产生正式 spec/receipt。
59
+ - AA-OPT-005:生产者、消费者和独立报告校验器拒绝 verified 与对应语义降级矛盾;正常下游 evidence_gap 仍允许。快照字段 Schema 和校验脚本已通过官方安装入口同步至已安装 shader-conversion,回读 changed=false,其余技能内容不变。
60
+
61
+ 验证:ASECLI 定向测试 47 passed;SGCLI native 模块测试 420 passed。其后补充畸形证据防御和提交前重查测试,最终相关 gate/resource 测试 34 passed。两仓库 git diff --check 通过。没有修改本轮范围外的已有工作树改动,没有启动 Editor,没有提交或推送。
62
+
63
+ 真实离线交接控制组:ASECLI cmd_export_sg 生成三件套,未改写产物,SGCLI sg contract --version 3 返回 validated=true、semantic_certified=true;独立报告校验器返回零错误。产物目录:`/private/var/folders/0f/lrhkp7jn3tz03szvlws2cm380000gn/T/ase-json-handoff-fixed-ulsgjyx3/out`,spec SHA-256:`8521cbb81d834768a48654595a80214094fdcffa1018a8ebb5da6b05bcc0a384`。这是无纹理控制组;资源差异通过定向文件夹具验证,不冒充真实 Unity 导入/渲染结果。
64
+
65
+ 兼容边界:含非空纹理但缺 resource_snapshots 的旧报告将被拒绝,须由 ASECLI 重新导出,不允许补写旧报告证据。本轮修复 JSON 交接可信度,不新增或替代已有视觉等价证据。
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "asecli"
3
- version = "0.8.1"
3
+ version = "0.8.2"
4
4
  description = "Agent-native CLI for reading, modifying, validating and compiling Amplify Shader Editor assets"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -1,3 +1,3 @@
1
1
  """AseCLI — agent-native toolkit for Amplify Shader Editor assets."""
2
2
 
3
- __version__ = "0.8.1"
3
+ __version__ = "0.8.2"
@@ -97,6 +97,13 @@ def cmd_export_sg(args) -> dict:
97
97
  assert_spec_publishable(report)
98
98
  _assert_source_unchanged(source, source_raw, "after report construction")
99
99
  _assert_source_unchanged(source, source_raw, "before publication")
100
+ for item in report.get('resource_snapshots', []):
101
+ for side in ('source', 'target'):
102
+ path = Path(item[side + '_path'])
103
+ for file, key in ((path, side + '_sha256'),
104
+ (Path(str(path)+'.meta'), side + '_meta_sha256')):
105
+ if hashlib.sha256(file.read_bytes()).hexdigest() != item[key]:
106
+ raise ValueError(f'resource changed before publication: {file}')
100
107
  except ExportError as exc:
101
108
  internal = exc.report
102
109
  _write_failure_report(
@@ -1281,7 +1281,8 @@
1281
1281
  "Alpha",
1282
1282
  "Premultiply",
1283
1283
  "Additive",
1284
- "Multiply"
1284
+ "Multiply",
1285
+ "MultiplySourceAlpha"
1285
1286
  ]
1286
1287
  },
1287
1288
  "two_sided": {
@@ -13,9 +13,9 @@ EDITOR_GRAPH_V3 = "contracts/editor-graph-spec.v3.schema.json"
13
13
  SGCLI_NATIVE_V3_SNAPSHOT = "contracts/sgcli.native.v3.schema.json"
14
14
  SGCLI_NATIVE_CONSUMER = {
15
15
  "package": "sgcli",
16
- "version": "0.2.0",
16
+ "version": "0.3.5",
17
17
  "contract": "sgcli.native.v3",
18
- "sha256": "b0cee4774e6a3e4a7dfd32ba1c55f8969ee9c7f5f9d48eb4be7649287e817651",
18
+ "sha256": "bb16ce3f61e0772c51bcbfe89cd010ee426db12c59a6e84afad34fd512b41b82",
19
19
  }
20
20
 
21
21