asecli 0.8.0__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.0 → asecli-0.8.2}/PKG-INFO +8 -8
  2. {asecli-0.8.0 → asecli-0.8.2}/README.md +7 -7
  3. {asecli-0.8.0 → asecli-0.8.2}/docs/00-governance/change-register.md +1 -1
  4. {asecli-0.8.0 → asecli-0.8.2}/docs/00-governance/timeline.md +3 -1
  5. {asecli-0.8.0 → asecli-0.8.2}/docs/00-governance/traceability.csv +1 -1
  6. {asecli-0.8.0 → asecli-0.8.2}/docs/04-delivery/project-plan-task-charter.md +2 -1
  7. asecli-0.8.2/docs/adversarial-audits/2026-09-14-123640-audit-report.md +92 -0
  8. asecli-0.8.2/docs/adversarial-audits/2026-09-14-123640-optimization-plan.md +61 -0
  9. asecli-0.8.2/docs/adversarial-audits/2026-09-14-124947-audit-report.md +128 -0
  10. asecli-0.8.2/docs/adversarial-audits/2026-09-14-124947-optimization-plan.md +65 -0
  11. {asecli-0.8.0 → asecli-0.8.2}/pyproject.toml +1 -1
  12. {asecli-0.8.0 → asecli-0.8.2}/scripts/install.ps1 +1 -1
  13. {asecli-0.8.0 → asecli-0.8.2}/scripts/install.sh +1 -1
  14. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/__init__.py +1 -1
  15. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/export_sg_command.py +7 -0
  16. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/contracts/sgcli.native.v3.schema.json +2 -1
  17. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/contracts.py +2 -2
  18. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/layout_audit_geometry.py +18 -15
  19. asecli-0.8.2/src/asecli/sg_export/alpha_modulate.py +113 -0
  20. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/sg_export/conversion_report.py +43 -30
  21. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/sg_export/decoder.py +3 -3
  22. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/sg_export/evidence.py +6 -5
  23. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/sg_export/model.py +1 -1
  24. asecli-0.8.2/src/asecli/sg_export/pass_blend.py +204 -0
  25. asecli-0.8.2/src/asecli/sg_export/report_semantics.py +63 -0
  26. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/sg_export/sources.py +65 -17
  27. asecli-0.8.2/src/asecli/sg_export/surface_matching.py +169 -0
  28. asecli-0.8.2/src/asecli/sg_export/surface_semantics.py +248 -0
  29. {asecli-0.8.0 → asecli-0.8.2}/tests/test_contract_schema.py +2 -2
  30. asecli-0.8.2/tests/test_conversion_report_semantics.py +73 -0
  31. asecli-0.8.2/tests/test_export_property_visibility.py +26 -0
  32. {asecli-0.8.0 → asecli-0.8.2}/tests/test_export_sg.py +17 -0
  33. {asecli-0.8.0 → asecli-0.8.2}/tests/test_install_scripts.py +2 -2
  34. asecli-0.8.2/tests/test_pass_blend.py +69 -0
  35. asecli-0.8.2/tests/test_sg_export_sources.py +86 -0
  36. asecli-0.8.2/tests/test_smoke.py +4 -0
  37. asecli-0.8.2/tests/test_surface_semantics.py +343 -0
  38. asecli-0.8.2/tests/test_surface_semantics_integration.py +56 -0
  39. {asecli-0.8.0 → asecli-0.8.2}/uv.lock +1 -1
  40. asecli-0.8.0/tests/test_smoke.py +0 -4
  41. {asecli-0.8.0 → asecli-0.8.2}/.github/workflows/ci.yml +0 -0
  42. {asecli-0.8.0 → asecli-0.8.2}/.github/workflows/cross-cli.yml +0 -0
  43. {asecli-0.8.0 → asecli-0.8.2}/.github/workflows/publish.yml +0 -0
  44. {asecli-0.8.0 → asecli-0.8.2}/.gitignore +0 -0
  45. {asecli-0.8.0 → asecli-0.8.2}/.project-architect.json +0 -0
  46. {asecli-0.8.0 → asecli-0.8.2}/AGENTS.md +0 -0
  47. {asecli-0.8.0 → asecli-0.8.2}/LICENSE +0 -0
  48. {asecli-0.8.0 → asecli-0.8.2}/SECURITY.md +0 -0
  49. {asecli-0.8.0 → asecli-0.8.2}/docs/00-governance/audit-supplement.json +0 -0
  50. {asecli-0.8.0 → asecli-0.8.2}/docs/00-governance/delivery-protocol.md +0 -0
  51. {asecli-0.8.0 → asecli-0.8.2}/docs/00-governance/project-charter.md +0 -0
  52. {asecli-0.8.0 → asecli-0.8.2}/docs/00-governance/supply-chain-policy.md +0 -0
  53. {asecli-0.8.0 → asecli-0.8.2}/docs/01-architecture/assumption-experiments.md +0 -0
  54. {asecli-0.8.0 → asecli-0.8.2}/docs/01-architecture/module-map.md +0 -0
  55. {asecli-0.8.0 → asecli-0.8.2}/docs/01-architecture/project-architecture-and-requirements.md +0 -0
  56. {asecli-0.8.0 → asecli-0.8.2}/docs/01-architecture/technical-route.md +0 -0
  57. {asecli-0.8.0 → asecli-0.8.2}/docs/03-quality/bug-register.md +0 -0
  58. {asecli-0.8.0 → asecli-0.8.2}/docs/03-quality/regression-catalog.md +0 -0
  59. {asecli-0.8.0 → asecli-0.8.2}/docs/03-quality/test-strategy.md +0 -0
  60. {asecli-0.8.0 → asecli-0.8.2}/docs/04-delivery/roadmap.md +0 -0
  61. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-01-014104-audit-report.md +0 -0
  62. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-01-014104-optimization-plan.md +0 -0
  63. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-01-145343-audit-report.md +0 -0
  64. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-01-145343-optimization-plan.md +0 -0
  65. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-01-193521-audit-report.md +0 -0
  66. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-01-193521-optimization-plan.md +0 -0
  67. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-01-203438-audit-report.md +0 -0
  68. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-01-203438-optimization-plan.md +0 -0
  69. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-02-121155-audit-report.md +0 -0
  70. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-02-121155-optimization-plan.md +0 -0
  71. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-02-175509-audit-report.md +0 -0
  72. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-02-175509-optimization-plan.md +0 -0
  73. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-04-122304-audit-report.md +0 -0
  74. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-04-122304-optimization-plan.md +0 -0
  75. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-05-142617-audit-report.md +0 -0
  76. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-05-142617-optimization-plan.md +0 -0
  77. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-05-160945-audit-report.md +0 -0
  78. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-05-160945-optimization-plan.md +0 -0
  79. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-05-213523-audit-report.md +0 -0
  80. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-05-213523-optimization-plan.md +0 -0
  81. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-10-193631-audit-report.md +0 -0
  82. {asecli-0.8.0 → asecli-0.8.2}/docs/adversarial-audits/2026-09-10-193631-optimization-plan.md +0 -0
  83. {asecli-0.8.0 → asecli-0.8.2}/docs/first-principles/2026-08-31-231401-optimization-plan.md +0 -0
  84. {asecli-0.8.0 → asecli-0.8.2}/docs/first-principles/2026-09-01-190656-optimization-plan.md +0 -0
  85. {asecli-0.8.0 → asecli-0.8.2}/docs/proposals/2026-09-07-shadergraph-to-ase-requirements.md +0 -0
  86. {asecli-0.8.0 → asecli-0.8.2}/skills/asecli/SKILL.md +0 -0
  87. {asecli-0.8.0 → asecli-0.8.2}/skills/asecli/references/conversion-publication-receipt.v1.schema.json +0 -0
  88. {asecli-0.8.0 → asecli-0.8.2}/skills/asecli/references/conversion-workflow.md +0 -0
  89. {asecli-0.8.0 → asecli-0.8.2}/skills/asecli/references/layout-standard.md +0 -0
  90. {asecli-0.8.0 → asecli-0.8.2}/skills/asecli/references/master-output-settings-standard.md +0 -0
  91. {asecli-0.8.0 → asecli-0.8.2}/skills/asecli/references/material-property-standard.md +0 -0
  92. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/__init__.py +0 -0
  93. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/_editor_port_contract.py +0 -0
  94. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/_editor_primitives.py +0 -0
  95. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/_editor_spec_grammar.py +0 -0
  96. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/_editor_spec_io.py +0 -0
  97. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/_editor_spec_validation.py +0 -0
  98. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/_gui_handoff_store.py +0 -0
  99. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/_gui_project.py +0 -0
  100. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/_gui_resource_store.py +0 -0
  101. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/_gui_resource_upgrade.py +0 -0
  102. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/editor_create.py +0 -0
  103. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/editor_spec.py +0 -0
  104. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/graph_geometry.py +0 -0
  105. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/graph_geometry_parser.py +0 -0
  106. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/graph_inspect.py +0 -0
  107. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/gui_handoff.py +0 -0
  108. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/gui_presentation.py +0 -0
  109. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/gui_provider_detection.py +0 -0
  110. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/gui_runtime_probe.py +0 -0
  111. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/gui_support.py +0 -0
  112. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/gui_support_resource.py +0 -0
  113. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/mcp_client.py +0 -0
  114. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/recompile.py +0 -0
  115. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/render_settings.py +0 -0
  116. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/resource_text.py +0 -0
  117. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.authoring.part00.cs.txt +0 -0
  118. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.authoring.part01.cs.txt +0 -0
  119. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.authoring.store.cs.txt +0 -0
  120. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.condition.cs.txt +0 -0
  121. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.hydration.cs.txt +0 -0
  122. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.part00.cs.txt +0 -0
  123. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.part01.cs.txt +0 -0
  124. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.reconciliation.cs.txt +0 -0
  125. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/resources/asecli_material_gui.transaction.cs.txt +0 -0
  126. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/resources/editor_create.part00.cs.txt +0 -0
  127. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/resources/editor_create.part01.cs.txt +0 -0
  128. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/resources/editor_create.part02.cs.txt +0 -0
  129. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/resources/editor_create.part03.cs.txt +0 -0
  130. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/resources/editor_create.part04.cs.txt +0 -0
  131. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/resources/wire_route.transaction.cs.txt +0 -0
  132. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/bridge/wire_route.py +0 -0
  133. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/checks/__init__.py +0 -0
  134. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/checks/checksum.py +0 -0
  135. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/checks/local_vars.py +0 -0
  136. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/checks/usage.py +0 -0
  137. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/checks/validate.py +0 -0
  138. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/__init__.py +0 -0
  139. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/commands.py +0 -0
  140. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/commentary_command.py +0 -0
  141. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/contract.py +0 -0
  142. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/contract_command.py +0 -0
  143. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/conversion_output.py +0 -0
  144. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/create_command.py +0 -0
  145. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/custom_gui_command.py +0 -0
  146. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/graph_review_command.py +0 -0
  147. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/gui_provider.py +0 -0
  148. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/gui_support_command.py +0 -0
  149. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/io.py +0 -0
  150. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/layout_command.py +0 -0
  151. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/main.py +0 -0
  152. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/migrate_package_command.py +0 -0
  153. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/recompile_metadata.py +0 -0
  154. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/skill_command.py +0 -0
  155. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/cli/usage_command.py +0 -0
  156. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/contracts/editor-graph-spec.v3.schema.json +0 -0
  157. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/__init__.py +0 -0
  158. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/comment_bounds.py +0 -0
  159. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/comment_layout.py +0 -0
  160. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/comment_metrics.py +0 -0
  161. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/comment_purpose.py +0 -0
  162. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/commentary.py +0 -0
  163. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/compiled_metadata.py +0 -0
  164. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/compiled_properties.py +0 -0
  165. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/custom_gui.py +0 -0
  166. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/custom_gui_versions.py +0 -0
  167. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/fishbone_placement.py +0 -0
  168. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/fishbone_topology.py +0 -0
  169. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/graph_ops.py +0 -0
  170. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/graph_review.py +0 -0
  171. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/island_layout.py +0 -0
  172. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/layout.py +0 -0
  173. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/layout_audit.py +0 -0
  174. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/layout_audit_repeated.py +0 -0
  175. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/layout_graph.py +0 -0
  176. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/local_vars.py +0 -0
  177. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/material_gui_condition.py +0 -0
  178. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/material_gui_protocol.py +0 -0
  179. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/material_gui_spec.py +0 -0
  180. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/meticulous_layout.py +0 -0
  181. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/model.py +0 -0
  182. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/property_presentation.py +0 -0
  183. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/reuse_plan.py +0 -0
  184. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/wire_geometry.py +0 -0
  185. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/core/wire_router.py +0 -0
  186. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/export_sg.py +0 -0
  187. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/schema/__init__.py +0 -0
  188. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/schema/data/observed.json +0 -0
  189. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/schema/data/schemas.json +0 -0
  190. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/schema_validation.py +0 -0
  191. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/sg_export/__init__.py +0 -0
  192. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/sg_export/binding.py +0 -0
  193. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/sg_export/custom_expression.py +0 -0
  194. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/sg_export/nodes.py +0 -0
  195. {asecli-0.8.0 → asecli-0.8.2}/src/asecli/sg_export/reconciliation.py +0 -0
  196. {asecli-0.8.0 → asecli-0.8.2}/tests/TEST.md +0 -0
  197. {asecli-0.8.0 → asecli-0.8.2}/tests/__init__.py +0 -0
  198. {asecli-0.8.0 → asecli-0.8.2}/tests/conftest.py +0 -0
  199. {asecli-0.8.0 → asecli-0.8.2}/tests/editor_create_v3_fixture.py +0 -0
  200. {asecli-0.8.0 → asecli-0.8.2}/tests/fixtures/HLIT.shader +0 -0
  201. {asecli-0.8.0 → asecli-0.8.2}/tests/fixtures/asecli_material_gui_v0_2_0.cs.txt +0 -0
  202. {asecli-0.8.0 → asecli-0.8.2}/tests/fixtures/step-antialiasing.function.txt +0 -0
  203. {asecli-0.8.0 → asecli-0.8.2}/tests/test_adversarial_hardening.py +0 -0
  204. {asecli-0.8.0 → asecli-0.8.2}/tests/test_audit_fixes.py +0 -0
  205. {asecli-0.8.0 → asecli-0.8.2}/tests/test_bridge_contract.py +0 -0
  206. {asecli-0.8.0 → asecli-0.8.2}/tests/test_bridge_recompile.py +0 -0
  207. {asecli-0.8.0 → asecli-0.8.2}/tests/test_build_reproducibility.py +0 -0
  208. {asecli-0.8.0 → asecli-0.8.2}/tests/test_cli_contract.py +0 -0
  209. {asecli-0.8.0 → asecli-0.8.2}/tests/test_commentary.py +0 -0
  210. {asecli-0.8.0 → asecli-0.8.2}/tests/test_core_contract.py +0 -0
  211. {asecli-0.8.0 → asecli-0.8.2}/tests/test_create.py +0 -0
  212. {asecli-0.8.0 → asecli-0.8.2}/tests/test_create_constant_presentation.py +0 -0
  213. {asecli-0.8.0 → asecli-0.8.2}/tests/test_cross_cli_workflow.py +0 -0
  214. {asecli-0.8.0 → asecli-0.8.2}/tests/test_custom_gui.py +0 -0
  215. {asecli-0.8.0 → asecli-0.8.2}/tests/test_custom_gui_cli.py +0 -0
  216. {asecli-0.8.0 → asecli-0.8.2}/tests/test_editor_create_bridge.py +0 -0
  217. {asecli-0.8.0 → asecli-0.8.2}/tests/test_editor_create_cli.py +0 -0
  218. {asecli-0.8.0 → asecli-0.8.2}/tests/test_editor_create_e2e.py +0 -0
  219. {asecli-0.8.0 → asecli-0.8.2}/tests/test_editor_create_spec.py +0 -0
  220. {asecli-0.8.0 → asecli-0.8.2}/tests/test_editor_create_spec_v3.py +0 -0
  221. {asecli-0.8.0 → asecli-0.8.2}/tests/test_editor_render_settings.py +0 -0
  222. {asecli-0.8.0 → asecli-0.8.2}/tests/test_governance.py +0 -0
  223. {asecli-0.8.0 → asecli-0.8.2}/tests/test_graph_review.py +0 -0
  224. {asecli-0.8.0 → asecli-0.8.2}/tests/test_graph_safety.py +0 -0
  225. {asecli-0.8.0 → asecli-0.8.2}/tests/test_gui_handoff.py +0 -0
  226. {asecli-0.8.0 → asecli-0.8.2}/tests/test_gui_native_extension.py +0 -0
  227. {asecli-0.8.0 → asecli-0.8.2}/tests/test_gui_support.py +0 -0
  228. {asecli-0.8.0 → asecli-0.8.2}/tests/test_gui_support_cli_contract.py +0 -0
  229. {asecli-0.8.0 → asecli-0.8.2}/tests/test_gui_upgrade.py +0 -0
  230. {asecli-0.8.0 → asecli-0.8.2}/tests/test_island_layout.py +0 -0
  231. {asecli-0.8.0 → asecli-0.8.2}/tests/test_layout.py +0 -0
  232. {asecli-0.8.0 → asecli-0.8.2}/tests/test_layout_governance.py +0 -0
  233. {asecli-0.8.0 → asecli-0.8.2}/tests/test_layout_local_var_policy.py +0 -0
  234. {asecli-0.8.0 → asecli-0.8.2}/tests/test_material_gui_e2e.py +0 -0
  235. {asecli-0.8.0 → asecli-0.8.2}/tests/test_mcp_security.py +0 -0
  236. {asecli-0.8.0 → asecli-0.8.2}/tests/test_migrate_package.py +0 -0
  237. {asecli-0.8.0 → asecli-0.8.2}/tests/test_mutate.py +0 -0
  238. {asecli-0.8.0 → asecli-0.8.2}/tests/test_perf.py +0 -0
  239. {asecli-0.8.0 → asecli-0.8.2}/tests/test_property_presentation.py +0 -0
  240. {asecli-0.8.0 → asecli-0.8.2}/tests/test_roundtrip.py +0 -0
  241. {asecli-0.8.0 → asecli-0.8.2}/tests/test_schema_add.py +0 -0
  242. {asecli-0.8.0 → asecli-0.8.2}/tests/test_schema_samples.py +0 -0
  243. {asecli-0.8.0 → asecli-0.8.2}/tests/test_skill_install.py +0 -0
  244. {asecli-0.8.0 → asecli-0.8.2}/tests/test_supply_chain.py +0 -0
  245. {asecli-0.8.0 → asecli-0.8.2}/tests/test_usage_audit.py +0 -0
  246. {asecli-0.8.0 → asecli-0.8.2}/tests/test_wire_route_bridge.py +0 -0
  247. {asecli-0.8.0 → asecli-0.8.2}/tools/build_schema.py +0 -0
  248. {asecli-0.8.0 → asecli-0.8.2}/tools/check_ci_governance.py +0 -0
  249. {asecli-0.8.0 → asecli-0.8.2}/tools/check_document_governance.py +0 -0
  250. {asecli-0.8.0 → asecli-0.8.2}/tools/check_packed_executor_loc.py +0 -0
  251. {asecli-0.8.0 → asecli-0.8.2}/tools/check_regression_catalog.py +0 -0
  252. {asecli-0.8.0 → asecli-0.8.2}/tools/check_release_candidate.py +0 -0
  253. {asecli-0.8.0 → asecli-0.8.2}/tools/compare_build_artifacts.py +0 -0
  254. {asecli-0.8.0 → asecli-0.8.2}/tools/generate_sbom.py +0 -0
  255. {asecli-0.8.0 → 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.0
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.0](https://github.com/seeseeczl/ASECLI/releases/tag/v0.8.0)** · [PyPI](https://pypi.org/project/asecli/0.8.0/) · [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.0`(双向消费者原生裸 JSON 规格直连与可审计发布证据),可从 [PyPI](https://pypi.org/project/asecli/0.8.0/) 或 [GitHub Release](https://github.com/seeseeczl/ASECLI/releases/tag/v0.8.0) 安装。历史版本见 [GitHub Releases](https://github.com/seeseeczl/ASECLI/releases),`v0.7.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.0-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.0` 的 `sgcli.native.v3` 生产快照;SGCLI 同样固定 ASECLI `0.8.0` 快照。双仓兼容检查会比较两组原始 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.0","command":"parse","ok":true,"data":{"node_count":7}}
344
- {"contract_version":1,"cli_version":"0.8.0","command":"parse","ok":false,"error":{"code":"NOT_FOUND","message":"..."}}
345
- {"contract_version":1,"cli_version":"0.8.0","command":"version","ok":true,"data":{"version":"0.8.0"}}
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.0](https://github.com/seeseeczl/ASECLI/releases/tag/v0.8.0)** · [PyPI](https://pypi.org/project/asecli/0.8.0/) · [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.0`(双向消费者原生裸 JSON 规格直连与可审计发布证据),可从 [PyPI](https://pypi.org/project/asecli/0.8.0/) 或 [GitHub Release](https://github.com/seeseeczl/ASECLI/releases/tag/v0.8.0) 安装。历史版本见 [GitHub Releases](https://github.com/seeseeczl/ASECLI/releases),`v0.7.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.0-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.0` 的 `sgcli.native.v3` 生产快照;SGCLI 同样固定 ASECLI `0.8.0` 快照。双仓兼容检查会比较两组原始 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.0","command":"parse","ok":true,"data":{"node_count":7}}
320
- {"contract_version":1,"cli_version":"0.8.0","command":"parse","ok":false,"error":{"code":"NOT_FOUND","message":"..."}}
321
- {"contract_version":1,"cli_version":"0.8.0","command":"version","ok":true,"data":{"version":"0.8.0"}}
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`。
@@ -43,6 +43,6 @@ evidence: [docs/05-audits/2026-09-01-122217-optimization-tasks.md]
43
43
  | CR-0027 | 将随 wheel 分发的 ASECLI Skill 从 Codex 默认安装扩展为主流 Agent Skills 通用安装 | MOD-CLI MOD-SKILL | 新增 `--agent`、`--scope`、`--project-root`;开放 `.agents/skills` 覆盖 Codex/Cursor/Gemini CLI/GitHub Copilot,Claude Code 使用 `.claude/skills`;无参数与 `--skill-root` 保持兼容;`all` 先检查所有内容冲突 | REG-0058 | 禁用新路由参数即可退回 CR-0015 的 Codex 默认目录;不删除或覆盖已安装 Skill | 定向 46 passed、Skill validator、Project Architect strict 与隔离 wheel 安装通过;BUG-0023 已修复固定片段编译与 SHA 回归;全量 358 passed/3 skipped;发布追溯 REL-0013 |
44
44
  | CR-0028 | 补齐 SG JSON 创建后的 ASE 图整理工作流:端口级复用计划、折叠接口计算基线、刚性计算岛排布与分层验收 | MOD-CORE MOD-LAYOUT MOD-CLI MOD-SKILL | 只读 graph-review;fanout 必须显式选择,默认消费组规则不变;island-columns 默认 1;不重建现有 Shader,不修改 SGCLI,不猜动态节点字段 | REG-0060 REG-0061 | 不用新增参数即保留原布局;回退本任务文件增量,不覆盖并行创建器改动;不发布 | 自动验证中;Local Var 自动 Editor 创建未实现,画布/GUI/渲染验收待具体目标,不以只读计划冒充写入 |
45
45
  | CR-0029 | 强化 CLI JSON 输出契约:原子 ASCII-safe 写出、拒绝非有限数、统一契约/命令/版本字段与错误码注册表 | MOD-CORE MOD-LAYOUT MOD-BRIDGE MOD-CLI MOD-SKILL | 除显式 `--help` 外 stdout 恒为一个严格 JSON;`--version` 改为 JSON;新增顶层字段为加性;损坏几何失败关闭 | REG-0062 | 回滚到 `v0.6.4`;不改 Shader 计算、Editor 交易或用户资产 | 对抗审计 5 项 finding 均关闭;定向 76 passed,全量 388 passed/3 skipped,wheel/ASCII/中文错误路径 smoke 通过;发布见 REL-0015 |
46
- | CR-0030 | 两 CLI 取消外部中间包:ASECLI 直接输出 SGCLI 原生裸 `sgcli.native.v3`,并以方向化 spec/report 文件名与 SGCLI 的 EditorGraphSpec 输出对称 | MOD-CLI MOD-BRIDGE MOD-SG-EXPORT MOD-CONTRACT MOD-SKILL | 新增 `export-sg`、`contract`;`create --spec` 拒绝 wrapper/report/反方向后缀;旧历史 JSON 不进入正式流程;候选 wheel Schema/篡改负例、发布 receipt 与跨仓 required workflow 失败关闭;不调用或依赖 SGCLI 运行时 | REG-0063 | 禁用新入口或回滚 wheel;不得恢复消费者隐式解包/正式 translator,不批量改名历史文件 | `v0.8.0` 发布候选:第三轮补齐只读 Deploy Key、精确 SGCLI commit、build-once wheel、WaveNoise 语义 fixture、receipt 交叉绑定、fixture-set 完整性、Draft 数值等价与 clean provenance;全量 `428 passed, 3 skipped`(Python 3.10 同结果)。远端发布与本机安装执行中;最终 wheel Editor/画布/渲染仍开放 |
46
+ | CR-0030 | 两 CLI 取消外部中间包:ASECLI 直接输出 SGCLI 原生裸 `sgcli.native.v3`,并以方向化 spec/report 文件名与 SGCLI 的 EditorGraphSpec 输出对称 | MOD-CLI MOD-BRIDGE MOD-SG-EXPORT MOD-CONTRACT MOD-SKILL | 新增 `export-sg`、`contract`;`create --spec` 拒绝 wrapper/report/反方向后缀;旧历史 JSON 不进入正式流程;候选 wheel Schema/篡改负例、发布 receipt 与跨仓 required workflow 失败关闭;不调用或依赖 SGCLI 运行时 | REG-0063 | 禁用新入口或回滚 wheel;不得恢复消费者隐式解包/正式 translator,不批量改名历史文件 | `v0.8.0@58ccf10` 已发布:publish run 34592028675、GitHub/PyPI 同源资产、本机 CLI/Skill 和 WaveNoise 双向原文件 SHA 全部复核通过;全量 `428 passed, 3 skipped`(Python 3.10 同结果)。最终 wheel Editor/画布/渲染仍开放,不声明视觉等价 |
47
47
 
48
48
  授权来源:用户于 2026-09-01 明确要求“执行优化任务,全部完成”,并于同日批准吸收 ASE Editor API 方案后要求“执行”;随后明确要求先推送并执行对抗性审计优化计划。2026-09-02 用户要求推送并进一步明确“以正式的 CLI 形式发布”,据此创建私有正式 GitHub Release `v0.1.0`;同日进一步明确说明条样式一致性必须成为 CLI 的规范能力,据此登记 CR-0011/BUG-0015,并明确所有通过 CLI 构建的 ASE 文件都必须使用中文属性显示名、自动变量名与默认值 Tooltip 和中文使用说明,据此登记 CR-0012。同日用户要求执行 `2026-09-02-211218` 优化计划,据此登记 CR-0013;随后书面授权打 tag 并发布 `v0.2.0`。2026-09-03 用户要求执行最新优化任务书并把剩余门槛全部完成,据此登记 CR-0014 并授权完成必要提交、直接推送与远程 CI 验证;随后明确要求“推送并发布”,据此授权创建私有正式版本 `v0.3.0`。2026-09-04 用户要求将 ASE 精排与 Inspector 编排规范作为可安装 Skill 并授权发布 `v0.3.1`。2026-09-05 用户要求执行 MZGUI 对接与效率优化,随后分别授权私有版本 `v0.4.0`、`v0.4.1` 和审计补丁 `v0.4.2`。2026-09-06 用户明确 Tooltip 必填、HelpBox 可选、条件置灰并授权 `v0.5.0`;随后要求脑图式 DAG 精排并授权 `v0.6.0`;又将 Local Var 门槛改为两个及以上不同消费组,据此登记 CR-0020;最后以多组人工示范明确递归局部鱼骨、Comment 保留和显式 WireNode 路由并要求执行,据此登记 CR-0021。2026-09-07 用户明确授权提交、推送、私有 Release `v0.6.1` 和本机安装。同日进一步明确要求开源该项目并提供同事安装命令,据此登记 CR-0022:采用 MIT 许可证并将 GitHub 仓库转为 public。随后要求做成最终、最常见的安装形态,据此登记 CR-0023:发布 PyPI 项目 `asecli`,用户命令为 `uv tool install asecli`;仍未授权 CLI Hub。2026-09-08 用户进一步明确要求推送、发布新版本并安装本机,据此授权 `v0.6.2` 的 main 推送、tag、GitHub Release、PyPI Trusted Publishing 与本机正式产物安装;CLI Hub 仍不在授权范围。首次 PyPI OIDC 因没有对应账号和 Trusted Publisher 失败后,用户说明没有 PyPI 账号并明确要求继续 GitHub Release 发布,据此以 CR-0025 将 PyPI 延后并完成 GitHub-only 交付。随后用户取得 PyPI 账号并明确要求继续配置,据此登记 CR-0026,启用精确匹配的 Pending Publisher 并通过 run 34192454152 attempt 3 完成首次 PyPI 发布。同日用户要求将现有 Skill 改为主流 Agent 通用,据此登记 CR-0027;本次不包含推送、tag 或发布。2026-09-10 用户要求对 JSON 输出能力执行对抗审计与优化,随后明确要求推送、发布并安装本机,据此登记 CR-0029 并授权 `v0.7.0` GitHub Release、PyPI Trusted Publishing 与本机 CLI/Skill 安装;CLI Hub 仍不在范围。
@@ -95,4 +95,6 @@
95
95
  | 2026-09-10 | v0.7.0 双渠道发布与本机安装完成 | tag `v0.7.0` 解引用为 `029fea4`;run 34475832000 的双 Python verify、package 与 PyPI OIDC publish 全成功;GitHub Release 为 Latest,五项资产与 PyPI wheel/sdist 摘要一致;本机 CLI、官方索引 uvx 及三处全局 Skill 均通过,旧 Skill 已完整备份 | REL-0015 CR-0029 TASK-0064 REG-0062 |
96
96
  | 2026-09-11 | 双向裸规格直连第二轮对抗整改 | CR-0030 / ADR-0022 / TASK-0065 / REG-0063:完成 AA-OPT-201~207,补齐 Draft parity、候选 wheel 契约可信根、篡改负例、required workflow、语义矩阵、离线 artifact、发布 receipt 与迁移 provenance。全量 `419 passed, 3 skipped`;最终 wheel `2e38ef11...` 可复现,真实双向 WaveNoise producer/consumer SHA 一致。用户级 ASECLI Skill 因不同内容按规则拒绝覆盖;最终 wheel Editor/画布/render 仍开放。未提交、未推送、未发布。 | CR-0030 ADR-0022 TASK-0065 REG-0063 AA-OPT-201 AA-OPT-202 AA-OPT-203 AA-OPT-204 AA-OPT-205 AA-OPT-206 AA-OPT-207 |
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
- | 2026-09-11 | v0.8.0 发布候选 | 用户授权两个 CLI 分别推送、发布并更新本机;ASECLI 以 pre-1.0 次版本发布双向裸 JSON 与第三轮门禁,保留 v0.7.0 回滚点。私有 SGCLI 跨仓认证使用专用只读 Deploy Key;本地双 Python、可复现构建和 clean release-mode 双 wheel matrix/verifier 已通过。远端 publish/OIDC、双渠道回读与本机安装继续执行;最终 Editor/画布/render 保持开放披露。 | REL-0016 CR-0030 TASK-0065 REG-0063 |
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
+ | 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 |
@@ -62,4 +62,4 @@ CR-0027,变更,已发布,ADR-0021,MOD-CLI MOD-SKILL,TASK-0059 TASK-0060,REG-0058
62
62
  BUG-0023,缺陷,已修复,ADR-0020,MOD-BRIDGE,TASK-0060,REG-0059,2026-09-08 两类真实 v2 CLI create/manifest/validate/recompile 通过;358 passed/3 skipped,REL-0013,long,方法体兼容 KeyValuePair;SphereMask Radius 重载仍为已知限制
63
63
  CR-0028,变更,已发布(视觉与自动LocalVar仍待验),ADR-0021,MOD-CORE MOD-LAYOUT MOD-CLI MOD-SKILL,TASK-0061 TASK-0062 TASK-0063,REG-0060 REG-0061,端口级基线与复用计划及岛内刚性多列布局;未自动创建LocalVar;未做实机验收,REL-0014,long,保留并行创建器改动;不修改SGCLI
64
64
  CR-0029,变更,已发布,ADR-0001 ADR-0009,MOD-CORE MOD-LAYOUT MOD-BRIDGE MOD-CLI MOD-SKILL,TASK-0064,REG-0062,2026-09-10 v0.7.0@029fea4;run 34475832000 全成功;GitHub/PyPI 摘要一致;本机 CLI/Skill 安装幂等,REL-0015,long,严格原子 JSON;非有限数拒绝;version JSON;22 错误码;17 子命令动态覆盖
65
- CR-0030,变更,发布候选(视觉门禁开放),ADR-0022,MOD-CLI MOD-BRIDGE MOD-SG-EXPORT MOD-CONTRACT MOD-SKILL,TASK-0065,REG-0063,2026-09-11 v0.8.0 候选 428 passed/3 skipped;Python 3.10 同结果;clean release-mode 双 wheel WaveNoise/receipt/Schema/artifact verifier 通过,REL-0016,long,消费者原生裸规格与方向命名;远端发布与本机安装执行中
65
+ CR-0030,变更,已发布(视觉门禁开放),ADR-0022,MOD-CLI MOD-BRIDGE MOD-SG-EXPORT MOD-CONTRACT MOD-SKILL,TASK-0065,REG-0063,2026-09-11 v0.8.0 publish run 34592028675 全绿;GitHub/PyPI 资产、本机 CLI/Skill 和 WaveNoise 双向原文件 SHA 通过,REL-0016,long,消费者原生裸规格与方向命名;最终 wheel Editor/画布/渲染仍开放
@@ -105,7 +105,8 @@ kickoff_completion: complete
105
105
  | TASK-0062 | CR-0028 | 独立计算岛刚性多列摆放 | TASK-0061;已有鱼骨与真实几何契约 | island_layout.py/meticulous_layout.py 与测试 | 拆改岛内连接、自动 WireNode 路由、虚构几何 | long/2026-09-08 | REG-0061;相对位置、依赖与二次幂等 | 几何缺失/布局硬失败时零写入 | 定向 94 passed;自动环节已验证;实机待验 | 自动验证完成,实机待验 |
106
106
  | TASK-0063 | CR-0028 | 将转换后交付流程接入 CLI 与 Skill | TASK-0061 TASK-0062;用户完整过程 | graph_review_command.py/main.py/layout_command.py;Skill/README/治理 | 发布、覆盖用户 Skill、改并行创建器、生产 Shader | long/2026-09-08 | REG-0060 REG-0061;CLI JSON/只读/失败码、Skill validator | 计划冒充创建或结构冒充视觉时停止 | 定向 94 passed;自动环节已验证;未接入自动 Local Var Editor 创建 | 自动验证完成,实机待验 |
107
107
  | TASK-0064 | CR-0029 | 关闭 JSON 输出对抗审计并发布安装 `v0.7.0` | AA-OPT-001~005;用户推送、发布、安装授权 | contract/main;Commentary/layout/Editor 几何;README/Skill;版本与 REL-0015 | CLI Hub;修改用户 Shader;覆盖未知 Skill;绕过发布门禁 | long/2026-09-10 | REG-0062;双 Python、完整治理、可复现构建、远程 publish/OIDC、双渠道摘要、本机 CLI/Skill | CI、OIDC、摘要、安装或 Skill 冲突任一失败即停止,保留 `v0.6.4` | v0.7.0@029fea4;run 34475832000 全成功;GitHub/PyPI 摘要一致;本机 CLI/Skill 安装与幂等通过 | 已发布 |
108
- | TASK-0065 | CR-0030 ADR-0022 AA-OPT-201~207 AA-OPT-301~309 REL-0016 | 实现 ASECLI→native v3 与 SGCLI→EditorGraphSpec v3 的双向裸规格原文件直连并发布 0.8.0 | 用户确认的合并优化计划、三轮对抗审计与推送发布安装授权 | `export_sg.py`、`sg_export/**`、`contracts/**`、`schema_validation.py`、`conversion_output.py`、CLI/create、README/Skill、测试、治理和 cross-CLI workflows | 调用 SGCLI;恢复 source-native/wrapper 主链;修改生产 Shader;覆盖用户 dirty Skill;绕过失败门禁 | long/2026-09-11 | REG-0063;Draft parity;候选 wheel Schema/篡改负例;固定 WaveNoise 语义;artifact 完整性与 clean provenance;双 Python全量;远端 publish/OIDC;双渠道回读;本机 CLI/Skill;Editor/画布/渲染分层 | 未知 ASE/Target/资源/端口、部分 spec、同名覆盖、Schema 漂移、脏候选、远端门禁或资产冲突即停止 | 0.8.0 候选全量 428 passed/3 skipped;0.3.0/0.8.0 wheel 可复现且本地 clean matrix/verifier 通过;只读 Deploy Key 已配置;远端发布与安装执行中;最终 Editor/画布/渲染开放披露 | 发布候选(REL-0016) |
108
+ | TASK-0065 | CR-0030 ADR-0022 AA-OPT-201~207 AA-OPT-301~309 REL-0016 | 实现 ASECLI→native v3 与 SGCLI→EditorGraphSpec v3 的双向裸规格原文件直连并发布 0.8.0 | 用户确认的合并优化计划、三轮对抗审计与推送发布安装授权 | `export_sg.py`、`sg_export/**`、`contracts/**`、`schema_validation.py`、`conversion_output.py`、CLI/create、README/Skill、测试、治理和 cross-CLI workflows | 调用 SGCLI;恢复 source-native/wrapper 主链;修改生产 Shader;覆盖用户 dirty Skill;绕过失败门禁 | long/2026-09-11 | REG-0063;Draft parity;候选 wheel Schema/篡改负例;固定 WaveNoise 语义;artifact 完整性与 clean provenance;双 Python全量;远端 publish/OIDC;双渠道回读;本机 CLI/Skill;Editor/画布/渲染分层 | 未知 ASE/Target/资源/端口、部分 spec、同名覆盖、Schema 漂移、脏候选、远端门禁或资产冲突即停止 | `v0.8.0@58ccf10` 已发布;run 34592028675、GitHub/PyPI 资产、本机 CLI/Skill 和 WaveNoise 双向原文件 SHA 全部复核通过;最终 Editor/画布/渲染开放披露 | 已发布(REL-0016,视觉开放) |
109
+ | TASK-0066 | CR-0030 ADR-0022 AA-OPT-201 AA-OPT-202 REL-0017 | 发布并安装 matcher-v4 与 ASE→SG 转换认证补丁 v0.8.1 | 用户要求两个 CLI 分别推送、发布并安装本机 | `sg_export/**`、report、版本、README、回归与发布证据 | 修改生产 Shader;绕过不可表示 Alpha Blend;恢复 wrapper;覆盖未知 Skill | long/2026-09-14 | REG-0063;两仓全量、治理、供应链、Tag publish、GitHub/PyPI 摘要、本机 CLI/Skill;Editor/视觉分层 | 任一自动/远端/摘要/安装门禁失败即停止并保留 v0.8.0 | 本地候选 `461 passed, 3 skipped`,远端与安装待执行 | verified |
109
110
 
110
111
  ## 验证、风险与回滚
111
112
 
@@ -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.0"
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"
@@ -21,7 +21,7 @@ if ($env:ASECLI_REF) {
21
21
  $tag = (Invoke-RestMethod "https://api.github.com/repos/$repo/releases/latest").tag_name
22
22
  }
23
23
  if (-not $tag) {
24
- $tag = "v0.8.0"
24
+ $tag = "v0.8.1"
25
25
  }
26
26
 
27
27
  $version = $tag.TrimStart("v")
@@ -32,7 +32,7 @@ else
32
32
  TAG=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" | sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p' | head -n 1)
33
33
  fi
34
34
  if [ -z "$TAG" ]; then
35
- TAG="v0.8.0"
35
+ TAG="v0.8.1"
36
36
  fi
37
37
  VERSION=${TAG#v}
38
38
  WHEEL="https://github.com/${REPO}/releases/download/${TAG}/asecli-${VERSION}-py3-none-any.whl"
@@ -1,3 +1,3 @@
1
1
  """AseCLI — agent-native toolkit for Amplify Shader Editor assets."""
2
2
 
3
- __version__ = "0.8.0"
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": {