@polymorphism-tech/morph-spec 8.34.2 → 8.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (325) hide show
  1. package/CLAUDE.md +20 -3
  2. package/README.md +2 -2
  3. package/bin/morph-spec.js +18 -4
  4. package/bin/validate.js +379 -379
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +5 -4
  7. package/docs/QUICKSTART.md +1 -1
  8. package/framework/MORPH.md +16 -17
  9. package/framework/agents.json +197 -44
  10. package/framework/ai-pin.json +22 -0
  11. package/framework/commands/morph-media.md +45 -0
  12. package/framework/docs/CLI.md +234 -9
  13. package/framework/evals/proof-rubrics/README.md +76 -0
  14. package/framework/evals/proof-rubrics/eval-de-modelo.md +64 -0
  15. package/framework/evals/proof-rubrics/fiacao.md +54 -0
  16. package/framework/evals/proof-rubrics/guard-cego.md +52 -0
  17. package/framework/evals/proof-rubrics/media-claims.md +109 -0
  18. package/framework/evals/proof-rubrics/mutation-proof.md +77 -0
  19. package/framework/evals/proof-rubrics/observabilidade-genai.md +119 -0
  20. package/framework/evals/proof-rubrics/verde-nao-e-coberto.md +48 -0
  21. package/framework/evals/rubrics/architecture.md +30 -0
  22. package/framework/evals/rubrics/code-quality.md +26 -0
  23. package/framework/evals/rubrics/test-coverage.md +20 -0
  24. package/framework/hooks/claude-code/core/protect-spec-files.js +41 -4
  25. package/framework/hooks/claude-code/statusline.sh +11 -11
  26. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  27. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  28. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  29. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  30. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  31. package/framework/hooks/shared/e2e-check.js +135 -22
  32. package/framework/hooks/shared/stdin-reader.js +26 -26
  33. package/framework/rules/ai-agents-standards.md +14 -2
  34. package/framework/schemas/ai-pin.schema.json +97 -0
  35. package/framework/schemas/config.schema.json +107 -0
  36. package/framework/schemas/feature.schema.json +23 -4
  37. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  38. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  39. package/framework/skills/core/morph-apply/SKILL.md +26 -5
  40. package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
  41. package/framework/skills/core/morph-eval/SKILL.md +1 -1
  42. package/framework/skills/core/morph-hotfix/SKILL.md +2 -2
  43. package/framework/skills/core/morph-implement/SKILL.md +18 -2
  44. package/framework/skills/core/morph-media/SKILL.md +215 -0
  45. package/framework/skills/core/morph-plan/SKILL.md +33 -2
  46. package/framework/skills/core/morph-proposal/SKILL.md +1 -1
  47. package/framework/skills/core/morph-review/SKILL.md +166 -9
  48. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  49. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  50. package/framework/skills/core/morph-uiux/SKILL.md +1 -1
  51. package/framework/standards/PROVENANCE.json +81 -3
  52. package/framework/standards/STANDARDS.json +1483 -839
  53. package/framework/standards/ai-agents/agent-archetypes.md +160 -0
  54. package/framework/standards/ai-agents/agent-session.md +164 -68
  55. package/framework/standards/ai-agents/agent-spec.md +196 -0
  56. package/framework/standards/ai-agents/batching.md +61 -37
  57. package/framework/standards/ai-agents/context-providers.md +97 -24
  58. package/framework/standards/ai-agents/conversational-agent-with-phases.md +239 -0
  59. package/framework/standards/ai-agents/cost-and-budget.md +256 -0
  60. package/framework/standards/ai-agents/durable-workflows-hitl.md +98 -5
  61. package/framework/standards/ai-agents/evals-with-cache.md +289 -0
  62. package/framework/standards/ai-agents/guardrails.md +222 -0
  63. package/framework/standards/ai-agents/llm-runtime-defaults.md +226 -0
  64. package/framework/standards/ai-agents/mcp-server.md +119 -18
  65. package/framework/standards/ai-agents/mcp-tools.md +85 -32
  66. package/framework/standards/ai-agents/media-pipeline.md +352 -0
  67. package/framework/standards/ai-agents/media-video.md +267 -0
  68. package/framework/standards/ai-agents/middleware-patterns.md +39 -5
  69. package/framework/standards/ai-agents/modalities-image-gen.md +354 -105
  70. package/framework/standards/ai-agents/modalities-speech-to-text.md +8 -2
  71. package/framework/standards/ai-agents/modalities-text-to-speech.md +10 -2
  72. package/framework/standards/ai-agents/modalities-vision.md +6 -2
  73. package/framework/standards/ai-agents/multi-agent-patterns.md +61 -5
  74. package/framework/standards/ai-agents/observability-patterns.md +227 -17
  75. package/framework/standards/ai-agents/production.md +38 -9
  76. package/framework/standards/ai-agents/prompt-sources.md +389 -0
  77. package/framework/standards/ai-agents/providers/model-registry.md +174 -39
  78. package/framework/standards/ai-agents/rag-custom-pgvector.md +69 -4
  79. package/framework/standards/ai-agents/service-tier-flex.md +27 -19
  80. package/framework/standards/ai-agents/setup.md +166 -50
  81. package/framework/standards/ai-agents/structured-output.md +34 -3
  82. package/framework/standards/ai-agents/sweet-spot.md +23 -3
  83. package/framework/standards/ai-agents/testing-ai.md +236 -0
  84. package/framework/standards/ai-agents/vector-data-extensions.md +50 -20
  85. package/framework/standards/ai-agents/workflows.md +27 -7
  86. package/framework/standards/frontend/design-system/ai-image-generation.md +12 -0
  87. package/framework/standards/frontend/design-system/ai-video-generation.md +13 -0
  88. package/framework/standards/infrastructure/docker/local-compose-isolation.md +3 -1
  89. package/framework/templates/.idea/morph-templates.xml +92 -0
  90. package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
  91. package/framework/templates/IDE-SNIPPETS.md +262 -262
  92. package/framework/templates/REGISTRY.json +13 -0
  93. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  94. package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
  95. package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
  96. package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
  97. package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +1 -1
  98. package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
  99. package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
  100. package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
  101. package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
  102. package/framework/templates/code/dotnet/database/migration.cs +83 -83
  103. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  104. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  105. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  106. package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
  107. package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +1 -1
  108. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  109. package/framework/templates/code/typescript/contracts.ts +167 -167
  110. package/framework/templates/docs/clarifications.md +253 -253
  111. package/framework/templates/docs/schema-analysis.md +119 -119
  112. package/framework/templates/docs/ui-components.md +52 -52
  113. package/framework/templates/docs/ui-design-system.md +76 -76
  114. package/framework/templates/docs/ui-flows.md +167 -167
  115. package/framework/templates/docs/ui-mockups.md +98 -98
  116. package/framework/templates/dotnet/ai-kit/Directory.Build.props +25 -0
  117. package/framework/templates/dotnet/ai-kit/Directory.Packages.props +26 -0
  118. package/framework/templates/dotnet/ai-kit/Morph.AiKit.sln +56 -0
  119. package/framework/templates/dotnet/ai-kit/NuGet.config +12 -0
  120. package/framework/templates/dotnet/ai-kit/README.md +128 -0
  121. package/framework/templates/dotnet/ai-kit/global.json +9 -0
  122. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentApi.cs +65 -0
  123. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentFactory.cs +289 -0
  124. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentFactoryOptions.cs +91 -0
  125. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentSpec.cs +91 -0
  126. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentSpecOptions.cs +181 -0
  127. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/AiKitAssemblyMarker.cs +14 -0
  128. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/ConversationStore.cs +174 -0
  129. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/IConversationStore.cs +54 -0
  130. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/InMemoryConversationStore.cs +75 -0
  131. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/CountingChatClient.cs +71 -0
  132. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalAssertion.cs +246 -0
  133. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheMissException.cs +57 -0
  134. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheOptions.cs +78 -0
  135. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheStamp.cs +225 -0
  136. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalFixture.cs +463 -0
  137. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalMode.cs +32 -0
  138. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalQualityEvaluators.cs +49 -0
  139. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalScenario.cs +214 -0
  140. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalSummary.cs +168 -0
  141. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/OfflineChatClient.cs +142 -0
  142. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/ShortPathResponseCache.cs +349 -0
  143. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/IMediaGenerator.cs +42 -0
  144. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/IMediaProvider.cs +77 -0
  145. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaArtifact.cs +28 -0
  146. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaDisclosure.cs +107 -0
  147. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaGenerator.cs +253 -0
  148. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaIdempotencyKey.cs +103 -0
  149. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJob.cs +259 -0
  150. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJobId.cs +21 -0
  151. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJobState.cs +47 -0
  152. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaPricing.cs +102 -0
  153. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaProvenance.cs +44 -0
  154. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaRequest.cs +192 -0
  155. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaResult.cs +94 -0
  156. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaReview.cs +99 -0
  157. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaSeams.cs +97 -0
  158. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaStore.cs +133 -0
  159. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MorphMedia.cs +93 -0
  160. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/GoogleImageProvider.cs +112 -0
  161. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/OpenAIImageProvider.cs +288 -0
  162. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/VeoVideoProvider.cs +158 -0
  163. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/IUsageCostSink.cs +29 -0
  164. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/UsageCostMiddleware.cs +208 -0
  165. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/UsageCostRecord.cs +95 -0
  166. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Morph.AiKit.csproj +38 -0
  167. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Observability/MorphOpenTelemetryExtensions.cs +119 -0
  168. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Observability/MorphTelemetryOptions.cs +82 -0
  169. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/IProviderClientFactory.cs +33 -0
  170. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/ModelAlias.cs +267 -0
  171. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/ModelRegistry.cs +474 -0
  172. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/model-registry.v2.json +87 -0
  173. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Rag/DeltaIngest.cs +169 -0
  174. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Rag/DeltaPlan.cs +49 -0
  175. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/AgentFactoryTests.cs +495 -0
  176. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/AgentSpecTests.cs +260 -0
  177. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/ConversationStoreTests.cs +405 -0
  178. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/DeltaIngestTests.cs +379 -0
  179. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalAssertionTests.cs +197 -0
  180. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalCacheMissTests.cs +139 -0
  181. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalCacheStampTests.cs +157 -0
  182. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalFailuresTests.cs +178 -0
  183. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalFixtureTests.cs +153 -0
  184. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalRefreshTests.cs +194 -0
  185. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalWorkspace.cs +86 -0
  186. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/KitEvals.cs +213 -0
  187. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/OfflineChatClientTests.cs +95 -0
  188. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeChatClient.cs +225 -0
  189. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeChatClientTests.cs +215 -0
  190. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeClock.cs +33 -0
  191. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeMediaProvider.cs +89 -0
  192. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeProviderClientFactory.cs +55 -0
  193. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeUsageCostSink.cs +60 -0
  194. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/InMemoryMediaStore.cs +131 -0
  195. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaAccessibilityTests.cs +133 -0
  196. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaAliasIsNotAnAgentTests.cs +127 -0
  197. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaDisclosureTests.cs +216 -0
  198. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaGeneratorTests.cs +264 -0
  199. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaIdempotencyKeyTests.cs +148 -0
  200. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaJobStateTests.cs +184 -0
  201. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaReviewTests.cs +89 -0
  202. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaStoreTests.cs +98 -0
  203. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/ModelRegistryTests.cs +451 -0
  204. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Morph.AiKit.Tests.csproj +76 -0
  205. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/SkeletonSmokeTests.cs +33 -0
  206. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/TelemetryTests.cs +261 -0
  207. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/UsageCostMiddlewareTests.cs +374 -0
  208. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/.morph-eval-cache.json +12 -0
  209. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/orcamento.acme.a-resposta-estruturada/1/CF70A7CE27BBD66A/contents.data +13 -0
  210. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/orcamento.acme.a-resposta-estruturada/1/CF70A7CE27BBD66A/entry.json +7 -0
  211. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.acme.a-saudacao/1/19F631228C6E00BA/contents.data +13 -0
  212. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.acme.a-saudacao/1/19F631228C6E00BA/entry.json +7 -0
  213. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.acme.b-escalonamento/1/A24A7C9BDD8239D8/contents.data +13 -0
  214. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.acme.b-escalonamento/1/A24A7C9BDD8239D8/entry.json +7 -0
  215. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.globex.a-saudacao/1/E38CD37DF003EDB7/contents.data +13 -0
  216. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.globex.a-saudacao/1/E38CD37DF003EDB7/entry.json +7 -0
  217. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-datasets/orcamento/acme/a-resposta-estruturada.json +24 -0
  218. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-datasets/triagem/acme/a-saudacao.json +23 -0
  219. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-datasets/triagem/acme/b-escalonamento.json +24 -0
  220. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-datasets/triagem/globex/a-saudacao.json +23 -0
  221. package/framework/templates/feature/decisions.md +122 -122
  222. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
  223. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  224. package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
  225. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  226. package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
  227. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  228. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
  229. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  230. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  231. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  232. package/framework/templates/infrastructure/github/README.md +56 -56
  233. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  234. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  235. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  236. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  237. package/framework/templates/integrations/asaas-client.cs +387 -387
  238. package/framework/templates/integrations/asaas-webhook.cs +351 -351
  239. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  240. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  241. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  242. package/framework/templates/project/validate.js +120 -120
  243. package/framework/templates/state.template.json +17 -17
  244. package/framework/templates/ui/design-system.css +226 -226
  245. package/package.json +3 -3
  246. package/src/commands/dashboard/dashboard.js +53 -53
  247. package/src/commands/e2e/e2e.js +15 -2
  248. package/src/commands/index.js +13 -13
  249. package/src/commands/project/checkpoint.js +209 -209
  250. package/src/commands/project/doctor.js +140 -5
  251. package/src/commands/project/update.js +469 -153
  252. package/src/commands/project/worktree.js +8 -1
  253. package/src/commands/state/advance.js +24 -2
  254. package/src/commands/state/approve.js +33 -1
  255. package/src/commands/state/create.js +72 -11
  256. package/src/commands/state/finish.js +333 -21
  257. package/src/commands/state/gate-check.js +190 -6
  258. package/src/commands/state/score.js +36 -1
  259. package/src/commands/validation/verify.js +134 -25
  260. package/src/core/state/phase-state-machine.js +197 -197
  261. package/src/core/state/state-manager.js +9 -1
  262. package/src/core/templates/template-renderer.js +477 -477
  263. package/src/dashboard/app/components/DetailPanel.jsx +11 -11
  264. package/src/dashboard/app/components/FlowGraph.jsx +17 -17
  265. package/src/dashboard/app/components/SearchFilter.jsx +22 -22
  266. package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
  267. package/src/dashboard/app/main.jsx +13 -13
  268. package/src/dashboard/app/pages/AgentMap.jsx +370 -370
  269. package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
  270. package/src/dashboard/app/pages/RulesMap.jsx +273 -273
  271. package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
  272. package/src/dashboard/app/pages/Standards.jsx +332 -332
  273. package/src/dashboard/app/styles/index.css +47 -47
  274. package/src/dashboard/index.html +12 -12
  275. package/src/dashboard/package.json +24 -24
  276. package/src/dashboard/scanner/phases-scanner.js +15 -15
  277. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  278. package/src/dashboard/scanner/rules-scanner.js +37 -37
  279. package/src/dashboard/scanner/skills-scanner.js +43 -43
  280. package/src/dashboard/scanner/squads-scanner.js +13 -13
  281. package/src/dashboard/vite-plugin-morph-data.js +17 -17
  282. package/src/dashboard/vite.config.js +24 -24
  283. package/src/lib/ai/ai-checks.js +182 -0
  284. package/src/lib/ai/ai-project-scan.js +347 -0
  285. package/src/lib/ai/code-audit.js +181 -0
  286. package/src/lib/ai/comment-stripper.js +184 -0
  287. package/src/lib/ai/pin-drift.js +138 -0
  288. package/src/lib/ai/registry-audit.js +285 -0
  289. package/src/lib/detectors/design-system-detector.js +188 -188
  290. package/src/lib/detectors/index.js +217 -217
  291. package/src/lib/e2e/compose-env.js +50 -4
  292. package/src/lib/evaluator-report.js +269 -15
  293. package/src/lib/generators/design-system-generator.js +508 -508
  294. package/src/lib/generators/settings-generator.js +209 -209
  295. package/src/lib/git/default-branch.js +92 -4
  296. package/src/lib/hooks/hook-executor.js +167 -167
  297. package/src/lib/installers/effects.js +193 -0
  298. package/src/lib/installers/mcp-installer.js +719 -719
  299. package/src/lib/installers/templates-reconcile.js +3 -3
  300. package/src/lib/risk-detector.js +284 -0
  301. package/src/lib/standards/verified-against.js +276 -0
  302. package/src/lib/tasks/eval-node.js +485 -0
  303. package/src/lib/tasks/linux-runner.js +297 -0
  304. package/src/lib/tasks/task-classifier.js +30 -30
  305. package/src/lib/tasks/task-parser.js +209 -209
  306. package/src/lib/tasks/test-nodes.js +486 -0
  307. package/src/lib/tasks/test-runner.js +410 -33
  308. package/src/lib/validators/checkpoint-persistence.js +39 -39
  309. package/src/lib/validators/css/css-validator.js +340 -340
  310. package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
  311. package/src/lib/validators/shared/issue-counter.js +14 -14
  312. package/src/lib/validators/verify-runner.js +583 -28
  313. package/src/lib/worktree/docker-audit.js +287 -0
  314. package/src/lib/worktree/env-allocator.js +24 -0
  315. package/src/lib/worktree/worktree-audit.js +30 -1
  316. package/src/scripts/setup-infra.js +24 -11
  317. package/src/utils/agent-id-mapper.js +11 -11
  318. package/src/utils/agents-installer.js +18 -8
  319. package/src/utils/claude-md-injector.js +10 -5
  320. package/src/utils/claude-settings-manager.js +300 -300
  321. package/src/utils/file-copier.js +11 -4
  322. package/src/utils/hooks-installer.js +29 -26
  323. package/src/utils/skills-installer.js +36 -29
  324. package/src/utils/version-checker.js +68 -3
  325. package/framework/standards/ai-agents/prompts-in-db.md +0 -214
@@ -1,173 +1,422 @@
1
- # Modalities — Image Generation (Text to Image)
1
+ # Modalities — Image Generation (media-generation)
2
2
 
3
3
  > **Scope:** stacks=["dotnet"]
4
4
  > **Layer:** 2 (on-keyword)
5
- > **Keywords:** image generation, text to image, dall-e, gpt-image, mockup generation, image synthesis
6
- > **Read by Claude in:** implement (quando o projeto precisa gerar imagens a partir de texto)
5
+ > **Keywords:** image generation, text to image, gpt-image, nano banana, image editing, product photo, mockup generation, image synthesis
6
+ > **Read by Claude in:** implement (quando o projeto precisa gerar ou editar imagens em runtime)
7
7
 
8
- **Verified against:** MAF 1.0 GA + OpenAI .NET SDK 2.x. Last-verified: 2026-05-19.
8
+ **Verified against:** OpenAI 2.13.0 + Microsoft.Extensions.AI 10.9.0 + Google.GenAI 1.21.0 (ai-pin 2026-09-08); provado por `templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/OpenAIImageProvider.cs` — `IImageGenerator`, `MEAI001`, `ImageGenerationRequest.OriginalImages` e a ausência de propriedade tipada para `quality` COMPILAM ali, e `OPENAI001` em `GeneratedImageQuality` foi medido pelo compilador. `HostedImageGenerationTool` foi medido por reflexão sobre a assembly do pin (existe, não é experimental); preço, data de desligamento e limites de referência são **verificação documental** contra as páginas de §Como re-verificar este standard. Last-verified: 2026-09-08.
9
9
 
10
10
  ---
11
11
 
12
- ## Quando usar geração de imagem
12
+ Geração de imagem **em runtime, a partir de .NET**. Autoria de asset de landing page por MCP, em
13
+ tempo de design, é outro standard e outro consumidor:
14
+ `frontend/design-system/ai-image-generation.md` — prompt craft de marca, `assets.md`, integração com
15
+ `next/image`. Este aqui é sobre a chamada paga que o seu backend faz, o que ela custa e onde ela
16
+ pode morar.
17
+
18
+ O pipeline que recebe o pedido, revisa e publica está em `ai-agents/media-pipeline.md`. Vídeo está
19
+ em `ai-agents/media-video.md`.
13
20
 
14
- Use quando o produto precisa criar imagens em runtime a partir de um prompt textual:
21
+ ---
22
+
23
+ ## Quando usar geração de imagem
15
24
 
16
- - **Mockups e protótipos visuais:** gerar capa de produto, banner de campanha, layout de tela
17
- - **Conteúdo para social media:** imagens para posts geradas a partir de briefing do usuário
18
- - **Visualizações:** diagramas, ilustrações ou thumbnails dinâmicos
25
+ | Caso | Por que a geração ganha do asset estático |
26
+ |---|---|
27
+ | **Catálogo** | Variação de tecido, cor e cena sobre o **mesmo** produto real, a partir de foto de referência |
28
+ | **Marketing** | Peça de campanha por segmento, com texto na imagem, em volume |
29
+ | **Variação de produto** | N combinações que ninguém fotografaria uma a uma |
19
30
 
20
- **Nota importante:** geração de imagem é uma **chamada de serviço ao provider**, não um agente conversacional. Não crie um `AIAgent` para isso — use `ImageClient` diretamente via DI.
31
+ **Não use** quando um asset estático resolve: custo por chamada, latência de vários segundos e
32
+ nenhuma garantia de repetibilidade. Se a imagem não muda por usuário ou por contexto, sirva de CDN.
21
33
 
22
- **Não use** quando um asset estático resolve o problema. Geração de imagem tem custo por chamada e latência de vários segundos. Se a imagem não muda por usuário/contexto, sirva de CDN.
34
+ **Não use dentro de um turno de conversa.** Esta é a regra dura da casa, e ela não é estética:
35
+ a documentação da própria OpenAI declara que um prompt complexo pode levar **até 2 minutos**, cada
36
+ chamada custa dinheiro, e dentro do turno **não existe revisão humana possível**. O turno enfileira
37
+ e confirma; a mídia volta depois, revisada. O mecanismo que prende essa regra — e não apenas a
38
+ explica — está em `ai-agents/media-pipeline.md`.
23
39
 
24
40
  ---
25
41
 
26
42
  ## A API
27
43
 
28
- O projeto resolve o `ImageClient` para o provider configurado. No OpenAI SDK (.NET 2.x), o caminho é:
44
+ Duas superfícies, e a escolha entre elas é por **necessidade**, não por gosto.
45
+
46
+ ### Abstração `IImageGenerator` (Microsoft.Extensions.AI)
29
47
 
30
48
  ```csharp
49
+ using Microsoft.Extensions.AI;
31
50
  using OpenAI.Images;
32
51
 
33
- ImageClient client = new("dall-e-3", apiKey);
34
- GeneratedImage image = await client.GenerateImageAsync(prompt, options);
52
+ #pragma warning disable MEAI001 // IImageGenerator e experimental: a superficie pode mudar entre menores
53
+ // AsIImageGenerator() vem de Microsoft.Extensions.AI.OpenAI — um pacote A MAIS.
54
+ // Sem ele, escreva o adaptador (e o kit escreve: ver a nota abaixo).
55
+ IImageGenerator generator = new ImageClient("gpt-image-2", apiKey).AsIImageGenerator();
56
+
57
+ var response = await generator.GenerateAsync(
58
+ new ImageGenerationRequest { Prompt = prompt },
59
+ new ImageGenerationOptions { MediaType = "image/png", Count = 1 },
60
+ ct);
61
+ #pragma warning restore MEAI001
62
+
63
+ var bytes = response.Contents.OfType<DataContent>().First().Data;
35
64
  ```
36
65
 
37
- O projeto injeta `ImageClient` via DI (ver §Exemplo). A resolução pode ser feita via factory ou diretamente por configuração — não há um `GetImageClient("alias")` no `ModelRegistry` padrão; registre o `ImageClient` como serviço nomeado ou use uma factory simples que lê `model-registry.json`.
66
+ > **A ponte é um pacote separado, e isso muda o seu `.csproj`.** `AsIImageGenerator()` é uma extensão
67
+ > de `Microsoft.Extensions.AI.OpenAI`; ter `Microsoft.Extensions.AI` e `OpenAI` **não** basta —
68
+ > medido pelo compilador. Se o pacote da ponte não estiver no seu pin, o caminho é escrever um
69
+ > `IImageGenerator` sobre o `ImageClient`, como o exemplar do kit faz em
70
+ > `templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/OpenAIImageProvider.cs`. As duas
71
+ > alternativas são legítimas; o que não é legítimo é descobrir isso em tempo de build depois de ter
72
+ > escrito o pipeline inteiro.
73
+
74
+ Fatos que decidem o desenho, medidos contra `Microsoft.Extensions.AI.Abstractions` 10.9.0:
75
+
76
+ - `IImageGenerator` carrega `[Experimental("MEAI001")]`. Suprimir o diagnóstico é obrigatório, e o
77
+ `#pragma` **leva comentário do risco** — é o que separa "assumimos a instabilidade" de
78
+ "silenciamos um aviso".
79
+ - `ImageGenerationRequest` tem `Prompt` e `OriginalImages` (`IEnumerable<AIContent>`). `OriginalImages`
80
+ é o gancho de **edição com referência** — é por ele que o produto real é preservado.
81
+ - `ImageGenerationOptions` expõe `AdditionalProperties`, `Count`, `ImageSize`, `MediaType`,
82
+ `ModelId`, `RawRepresentationFactory`, `ResponseFormat` e `StreamingCount`. **Não há propriedade
83
+ tipada** para `quality`, `background` ou `input_fidelity`: esses vão por `AdditionalProperties` ou
84
+ por `RawRepresentationFactory`. Escrever `options.Quality` não compila, e procurar por ela é o
85
+ primeiro tropeço de quem chega vindo do `ImageClient` direto.
86
+ - Único adaptador oficial é OpenAI/Azure OpenAI (`OpenAIClientExtensions.AsIImageGenerator`, **no
87
+ pacote `Microsoft.Extensions.AI.OpenAI` — ver a ressalva acima**). Para
88
+ Gemini **não existe** adaptador MEAI oficial: use `Google.GenAI` direto
89
+ (`Client.Models.GenerateContentAsync` com `ResponseModalities = ["IMAGE", "TEXT"]`, lendo
90
+ `Candidates[0].Content.Parts[..].InlineData`), ou escreva um `IImageGenerator` próprio.
91
+
92
+ ### Images API direto, quando o produto real precisa ser preservado
93
+
94
+ `POST /v1/images/edits` aceita N imagens de referência (PNG/JPG/WebP, cada uma **abaixo de 50 MB**,
95
+ mesmo formato e tamanho) e uma `mask` PNG com alfa nas mesmas dimensões da primeira imagem. É o
96
+ caminho para catálogo: editar preserva; gerar do zero recria.
97
+
98
+ `GenerateImageVariationAsync` do SDK **não é opção** — a API de variações só existia no modelo
99
+ listado em §Deprecações.
38
100
 
39
101
  ---
40
102
 
41
- ## Exemplo C# completo
103
+ ## Tool hospedada de imagem
104
+
105
+ `Microsoft.Extensions.AI.HostedImageGenerationTool` existe na 10.9.0, **não** é experimental e é um
106
+ *marker*: ela não gera nada, apenas informa ao serviço que o modelo pode gerar
107
+ (`Name => "image_generation"`). O adaptador da OpenAI mapeia `ModelId → Model`,
108
+ `MediaType → OutputFileFormat`, `StreamingCount → PartialImageCount` e `ImageSize → Size`;
109
+ **`quality`, `background`, `moderation` e `input_fidelity` não são mapeados**. O resultado volta
110
+ como `ImageGenerationToolResultContent { Outputs = [DataContent] }` dentro de
111
+ `ChatResponse.Messages[..].Contents` — nunca como `FunctionResultContent`.
112
+
113
+ > **Procedência, separada em dois níveis.** Que o tipo **existe** e **não** é experimental na 10.9.0
114
+ > foi medido por reflexão sobre a assembly do pin. Já a **tabela de mapeamento** acima vem da leitura
115
+ > de `OpenAIResponsesChatClient.cs` em
116
+ > `https://github.com/dotnet/extensions/blob/main/src/Libraries/Microsoft.Extensions.AI.OpenAI/`,
117
+ > consultado em 2026-09-07 — é
118
+ > código **interno** da ponte, fora da superfície pública, e portanto não confirmável por reflexão.
119
+ > Confirme contra o provedor configurado antes de contar com um desses parâmetros pela tool.
120
+
121
+ **E é exatamente por isso que ela não entra no agente de WhatsApp.** A tool é o caminho natural de
122
+ "me mostra esse sofá em verde", e a documentação a descreve para chat/atendimento. Este standard
123
+ **contradiz** essa leitura para o atendimento, com o motivo escrito:
124
+
125
+ | Fato | Consequência no turno |
126
+ |---|---|
127
+ | Latência documentada de até 2 min | O turno estoura; o cliente vê silêncio |
128
+ | Custo por chamada, sem teto natural | Um usuário curioso vira uma fatura |
129
+ | `quality`/`moderation` não mapeados pelo adaptador | Você não controla nem o custo nem o filtro |
130
+ | Nenhuma revisão possível dentro do turno | Claim visual errado sai direto para o cliente |
131
+
132
+ O que o turno faz é **enfileirar e confirmar**. A tool hospedada é legítima em ferramenta interna,
133
+ com humano na frente da tela e orçamento controlado — nunca no canal do cliente.
42
134
 
43
- ```csharp
44
- using OpenAI.Images;
45
- using Microsoft.Extensions.Configuration;
135
+ ---
46
136
 
47
- public sealed class ImageGenerationService
48
- {
49
- private readonly ImageClient _client;
137
+ ## Provedor por alias
50
138
 
51
- public ImageGenerationService(IConfiguration config)
52
- {
53
- // O projeto configura o modelo e a chave via config/model-registry.json ou appsettings
54
- var model = config["ImageGen:Model"] ?? "dall-e-3";
55
- var apiKey = config["OpenAI:ApiKey"]!;
56
- _client = new ImageClient(model, apiKey);
57
- }
139
+ O alias mora no `model-registry.v2.json` do kit, com `api` declarando o protocolo. Alias de imagem
140
+ usa `api: images`; alias de vídeo, `api: videos` (ver `ai-agents/media-video.md`). O `AgentFactory`
141
+ **recusa com erro nomeado** um alias de mídia passado como agente de chat: um alias de imagem
142
+ resolvido como conversa apontaria para um modelo que não fala chat, e a falha apareceria tarde e
143
+ confusa.
58
144
 
59
- /// <summary>
60
- /// Gera uma imagem a partir de um prompt e retorna os bytes PNG.
61
- /// Prefira armazenar os bytes; URLs retornadas pelo provider são efêmeras (expiram em ~1h).
62
- /// </summary>
63
- public async Task<BinaryData> GenerateImageBytesAsync(
64
- string prompt,
65
- GeneratedImageSize? size = null,
66
- GeneratedImageQuality? quality = null,
67
- CancellationToken ct = default)
68
- {
69
- var resolvedSize = size ?? GeneratedImageSize.W1024xH1024;
70
- var resolvedQuality = quality ?? GeneratedImageQuality.Standard;
145
+ | Papel | Alias | Por quê |
146
+ |---|---|---|
147
+ | Imagem, default | `gpt-image-2` | Default do próprio provedor; resolução arbitrária (múltiplos de 16 px, lado ≤ 3840 px, razão ≤ 3:1); até 8 imagens coerentes por prompt; `input_fidelity` deixou de existir porque a fidelidade já é alta |
148
+ | Imagem, referência de produto | `gemini-3.1-flash-image` | 10 objetos + 4 personagens + 3 estilos de referência — o caso "muitas fotos do mesmo móvel" |
149
+ | Imagem, lote barato | `gemini-3.1-flash-lite-image` | O piso de preço da família, com 14 objetos de referência |
150
+ | Vídeo | ver `ai-agents/media-video.md` | Fora do escopo deste standard |
71
151
 
72
- var options = new ImageGenerationOptions
73
- {
74
- Size = resolvedSize,
75
- Quality = resolvedQuality,
76
- ResponseFormat = GeneratedImageFormat.Bytes
77
- };
152
+ **Nenhum alias fora desta lista sem passar pela tabela de §Deprecações primeiro.** Um alias
153
+ proibido não é preferência de estilo: é dinheiro gasto num endpoint que vai devolver erro.
78
154
 
79
- GeneratedImage image = await _client.GenerateImageAsync(prompt, options, ct);
80
- return image.ImageBytes;
81
- }
155
+ ---
82
156
 
83
- /// <summary>
84
- /// Gera uma imagem e retorna a URI. Use apenas quando precisar da URL diretamente
85
- /// e souber que o downstream vai consumir a URL antes de ela expirar (~1h no OpenAI).
86
- /// </summary>
87
- public async Task<Uri> GenerateImageUriAsync(string prompt, CancellationToken ct = default)
88
- {
89
- var options = new ImageGenerationOptions
90
- {
91
- Size = GeneratedImageSize.W1024xH1024,
92
- Quality = GeneratedImageQuality.Standard,
93
- ResponseFormat = GeneratedImageFormat.Uri
94
- };
157
+ ## Prompt como spec versionada
95
158
 
96
- GeneratedImage image = await _client.GenerateImageAsync(prompt, options, ct);
97
- return image.ImageUri!;
98
- }
99
- }
100
- ```
159
+ Um prompt de produção é **template versionado**, nunca string concatenada no handler. O que o
160
+ template fixa:
101
161
 
102
- **Registro DI:**
162
+ 1. **Estrutura, sempre na mesma ordem:** cena/fundo → sujeito → detalhes-chave → restrições.
163
+ Segmentos rotulados; frases descritivas, não lista de keywords.
164
+ 2. **Fotorrealismo declarado** quando é o caso ("photorealistic", "professional product
165
+ photography"); termos de câmera servem à composição, não à física.
166
+ 3. **Texto na imagem entre aspas literais**, marcas soletradas.
167
+ 4. **"Preserve list" repetida em CADA iteração de edição** — "change only X, keep everything else".
168
+ Iterações pequenas e sequenciais; ao driftar, reinicie a conversa com a descrição completa em vez
169
+ de empilhar correções.
170
+ 5. **Fundo transparente vem do parâmetro, não do prompt** (`background=transparent` + PNG/WebP):
171
+ descrever o fundo no texto faz o prompt vencer o parâmetro.
103
172
 
104
- ```csharp
105
- // Program.cs
106
- builder.Services.AddSingleton<ImageGenerationService>();
107
- ```
173
+ O prompt final vai para a proveniência do job junto com o `revised_prompt` que o provedor devolve —
174
+ ver `ai-agents/media-pipeline.md`. Prompt que não foi gravado não pode ser reproduzido nem auditado.
175
+
176
+ Para prompt craft de marca (paleta, tom, herói aprovado como referência das derivadas), o standard
177
+ é `frontend/design-system/ai-image-generation.md`; este não o repete.
178
+
179
+ ---
180
+
181
+ ## Referências de produto
182
+
183
+ | Modelo | Limite de referência |
184
+ |---|---|
185
+ | `gemini-3.1-flash-lite-image` | 14 objetos |
186
+ | `gemini-3.1-flash-image` | 10 objetos + 4 personagens + 3 estilos |
187
+ | `gemini-3-pro-image` | 6 objetos + 5 personagens |
188
+ | OpenAI `/v1/images/edits` | N imagens, cada uma abaixo de 50 MB, mesmo formato e tamanho |
189
+
190
+ **Indexe cada referência no prompt** ("image 1 = o sofá; image 2 = o tecido") e diga como elas
191
+ interagem. Referência não nomeada é referência que o modelo escolhe sozinho como usar.
192
+
193
+ O hash sha256 de cada referência entra na chave de idempotência do pedido (`media-pipeline.md`):
194
+ trocar a foto de referência **é** outro pedido, mesmo com o prompt idêntico.
195
+
196
+ ---
108
197
 
109
- **Consumo:**
198
+ ## Exemplo C# completo
110
199
 
111
200
  ```csharp
112
- public class CampaignController(ImageGenerationService imageGen, IBlobStorage storage) : ControllerBase
201
+ // SEM `using OpenAI.Images;`. Ele nao e necessario aqui — o gerador chega injetado e nenhum
202
+ // tipo do SDK da OpenAI aparece neste arquivo — e deixa-lo torna `ImageGenerationOptions`
203
+ // AMBIGUO (CS0104) entre Microsoft.Extensions.AI e OpenAI.Images. Onde os dois convivem de
204
+ // verdade, como no adaptador do kit, o tipo vai QUALIFICADO.
205
+ using Microsoft.Extensions.AI;
206
+
207
+ // O pragma abre ACIMA da classe, e nao dentro do metodo: o parametro do construtor primario
208
+ // tambem nomeia IImageGenerator, e MEAI001 e ERRO por padrao — nao aviso. Pragma dentro do
209
+ // corpo deixa a assinatura de fora e o arquivo nao compila.
210
+ #pragma warning disable MEAI001 // IImageGenerator/ImageGenerationRequest sao experimentais: a superficie pode mudar entre menores.
211
+
212
+ /// <summary>
213
+ /// Adaptador de PROVIDER. Note o que ele NAO e: um servico publico que um handler
214
+ /// possa chamar. Quem produz bytes vive atras do enfileiramento descrito em
215
+ /// ai-agents/media-pipeline.md, e no kit esse tipo e `internal` de proposito.
216
+ /// </summary>
217
+ /// <remarks>
218
+ /// O IImageGenerator chega INJETADO, e nao construido aqui. As duas formas de obte-lo
219
+ /// sao legitimas e a escolha e do seu pin (ver a ressalva da secao "A API"):
220
+ /// - com Microsoft.Extensions.AI.OpenAI no pin: imageClient.AsIImageGenerator()
221
+ /// - sem ele: um IImageGenerator escrito a mao sobre o ImageClient, como em
222
+ /// templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/OpenAIImageProvider.cs
223
+ /// Injetar em vez de construir e o que faz ESTE exemplo compilar nos dois casos.
224
+ /// </remarks>
225
+ internal sealed class OpenAiImageAdapter(IImageGenerator generator)
113
226
  {
114
- [HttpPost("generate-banner")]
115
- public async Task<IActionResult> GenerateBanner([FromBody] BannerRequest req)
227
+ // ReadOnlyMemory<byte> dos dois lados porque e o tipo REAL de DataContent.Data.
228
+ // Declarar BinaryData aqui nao converte (CS0029) — e o compilador que decide isso.
229
+ public async Task<ReadOnlyMemory<byte>> ProduceAsync(
230
+ string prompt,
231
+ IReadOnlyList<ReadOnlyMemory<byte>> references,
232
+ CancellationToken ct)
116
233
  {
117
- BinaryData bytes = await imageGen.GenerateImageBytesAsync(
118
- prompt: req.Briefing,
119
- size: GeneratedImageSize.W1792xH1024,
120
- quality: GeneratedImageQuality.High);
121
-
122
- // Persista no storage do projeto antes de retornar
123
- string storedUrl = await storage.UploadAsync(bytes, "image/png");
124
- return Ok(new { url = storedUrl });
234
+ var request = new ImageGenerationRequest { Prompt = prompt };
235
+ if (references.Count > 0)
236
+ {
237
+ // OriginalImages e o gancho de EDICAO: preserva o produto real em vez de recria-lo.
238
+ request.OriginalImages = [.. references.Select(r => new DataContent(r, "image/png"))];
239
+ }
240
+
241
+ var options = new ImageGenerationOptions
242
+ {
243
+ MediaType = "image/png",
244
+ Count = 1,
245
+ // Nao ha propriedade tipada para quality/background/input_fidelity na 10.9.0.
246
+ AdditionalProperties = new() { ["quality"] = "low" },
247
+ };
248
+
249
+ var response = await generator.GenerateAsync(request, options, ct);
250
+
251
+ return response.Contents.OfType<DataContent>().First().Data;
125
252
  }
126
253
  }
254
+
255
+ #pragma warning restore MEAI001
127
256
  ```
128
257
 
258
+ **Escada de qualidade, e ela é obrigatória:** gere N candidatas em `low`, escolha com humano, e só
259
+ então regenere a vencedora em `high`. A conta de gerar tudo em `high` está em §Custo por chamada.
260
+
129
261
  ---
130
262
 
131
263
  ## Parâmetros
132
264
 
133
- > Valores verificados contra OpenAI .NET SDK 2.x / DALL-E 3 (2026-05-19). Outros providers podem variar.
265
+ > Superfície de `ImageGenerationOptions` medida contra `Microsoft.Extensions.AI.Abstractions`
266
+ > 10.9.0; parâmetros de wire medidos contra a Images API da OpenAI.
267
+
268
+ | Parâmetro | Onde vive | Nota |
269
+ |---|---|---|
270
+ | `ModelId` | tipado | Vem do alias, nunca do handler |
271
+ | `Count` | tipado | N candidatas numa chamada; cobra por imagem |
272
+ | `ImageSize` | tipado (`System.Drawing.Size`) | `gpt-image-2` aceita múltiplos de 16 px até 3840 px de lado |
273
+ | `MediaType` | tipado | `image/png`, `image/jpeg`, `image/webp` |
274
+ | `ResponseFormat` | tipado | Prefira bytes. URL de provedor expira — ver §Deprecações e `media-pipeline.md` |
275
+ | `StreamingCount` | tipado | Imagens parciais (0-3) para feedback de UI interna |
276
+ | `quality` | `AdditionalProperties` | `low`/`medium`/`high`/`auto`. **Não é tipado na 10.9.0** |
277
+ | `background` | `AdditionalProperties` | `transparent`/`opaque`/`auto`; exige PNG ou WebP |
278
+ | `moderation` | `AdditionalProperties` | `auto`/`low`. Bloqueio é `rejected_by_policy`, não erro técnico |
279
+ | `output_compression` | `AdditionalProperties` | 0-100, só JPEG/WebP |
280
+ | `mask` | só Images API direto | PNG com alfa, mesmas dimensões da primeira referência |
281
+
282
+ Nada em `AdditionalProperties` é validado em compilação. Um erro de digitação ali é um parâmetro que
283
+ o provedor ignora em silêncio — cubra com teste de contrato o mapa nome→valor que o seu adaptador
284
+ monta.
285
+
286
+ ---
287
+
288
+ ## Custo por chamada
289
+
290
+ > **Toda a aritmética de dinheiro deste standard mora nesta seção, e em lugar nenhum mais.**
291
+ > Re-verificar preço é reabrir esta seção e §Deprecações — não reler o standard inteiro.
292
+
293
+ Preço de **lista pública**, em USD, sem desconto de contrato. Consultadas em **2026-09-07**:
294
+ `https://developers.openai.com/api/docs/pricing` e `https://ai.google.dev/gemini-api/docs/pricing`.
295
+
296
+ | Item | Preço | Origem |
297
+ |---|---|---|
298
+ | `gpt-image-2` — token de imagem de saída | $30,00 / 1M | OpenAI pricing (lista) |
299
+ | `gpt-image-2` — 1024², low / medium / high | ≈ $0,006 / $0,053 / $0,211 | **Estimativa de terceiro**, derivada da calculadora (`https://wavespeed.ai/blog/posts/gpt-image-2-pricing-2026/`). **Não é preço de lista** — a OpenAI publica por token |
300
+ | `gemini-3.1-flash-lite-image` | $0,0336 (Batch = Standard) | Gemini pricing |
301
+ | `gemini-3.1-flash-image` — 1K | $0,067 (Batch $0,034) | Gemini pricing |
302
+ | `gemini-3-pro-image` — 1K/2K | $0,134 (Batch $0,067) | Gemini pricing |
303
+ | Batch API (OpenAI e Google) | −50 % | páginas de pricing acima |
304
+
305
+ **A ressalva da segunda linha é parte do standard, não rodapé.** O preço por imagem do `gpt-image-2`
306
+ não tem fonte primária: a única tarifa oficial é por token. Um número derivado por terceiro serve
307
+ para dimensionar teto de orçamento, nunca para faturar cliente.
308
+
309
+ Três consequências de desenho, não de opinião:
134
310
 
135
- | Parâmetro | Tipo | Opções | Nota |
136
- |-----------|------|--------|------|
137
- | `Size` | `GeneratedImageSize` | `W1024xH1024`, `W1792xH1024`, `W1024xH1792` | DALL-E 3 suporta os três; DALL-E 2 tem conjunto diferente |
138
- | `Quality` | `GeneratedImageQuality` | `Standard`, `High` | `High` = mais detalhe, mais custo e latência |
139
- | `Style` | `GeneratedImageStyle` | `Natural`, `Vivid` | `Vivid` = mais saturado/dramático; `Natural` = realista |
140
- | `ResponseFormat` | `GeneratedImageFormat` | `Bytes`, `Uri` | Prefira `Bytes` — URLs expiram em ~1h |
311
+ 1. **Escada de qualidade.** A diferença entre `low` e `high` na estimativa acima é de mais de 30×.
312
+ Candidatas em `low`; `high` só na aprovada.
313
+ 2. **Batch para catálogo.** Metade do preço em lote é a maior alavanca isolada disponível. A decisão
314
+ Batch × Flex × síncrono já está escrita: `ai-agents/batching.md` e `ai-agents/service-tier-flex.md`.
315
+ 3. **Custo estimado gravado ANTES da chamada**, e teto por tenant/dia em unidades (imagens ×
316
+ qualidade). O mecanismo está em `ai-agents/media-pipeline.md`; a tarifa está aqui.
317
+
318
+ Token de imagem de **entrada** (edição com referência) também é cobrado, e `input_fidelity: high`
319
+ nos modelos legados aumenta a fatura. Edição não é mais barata que geração por definição.
320
+
321
+ ---
322
+
323
+ ## Deprecações
324
+
325
+ > **Toda data de desligamento deste standard mora nesta seção, e em lugar nenhum mais.**
326
+
327
+ Fontes, consultadas em **2026-09-07**: `https://developers.openai.com/api/docs/deprecations` e
328
+ `https://ai.google.dev/gemini-api/docs/imagen` (mais o changelog em
329
+ `https://ai.google.dev/gemini-api/docs/changelog`).
330
+
331
+ | Alias | Situação | Data |
332
+ |---|---|---|
333
+ | `gpt-image-1`, `gpt-image-1-mini`, `gpt-image-1.5`, `chatgpt-image-latest` | **desligam** (anunciado 2026-06-02) | 2026-12-01 |
334
+ | `dall-e-2`, `dall-e-3` | **desligados** | 2026-05-12 |
335
+ | `imagen-4.0-generate-001` e irmãos | **desligado** (anunciado 2026-06-15) | 2026-08-17 |
336
+ | `gemini-2.5-flash-image` | legado, migrar — sem data anunciada | — |
337
+ | `sora-2`, `sora-2-pro` (vídeo) | **desligam, sem substituto** | 2026-09-24 — ver `ai-agents/media-video.md` |
338
+
339
+ **Próximo desligamento conhecido: 2026-09-24.** Se esta data já passou quando você está lendo, este
340
+ standard não está apenas velho — ele está **errado**, e a §Como re-verificar diz em qual página
341
+ conferir. Uma data no passado nesta linha é falsificação em segundos, sem pesquisa.
342
+
343
+ O alias `dall-e` continua na busca do `STANDARDS.json` de propósito: quem procurar pelo modelo morto
344
+ tem de cair **aqui**, no lugar que diz que ele morreu.
141
345
 
142
346
  ---
143
347
 
144
348
  ## Anti-patterns
145
349
 
146
350
  | Anti-pattern | Por quê é errado | Jeito certo |
147
- |--------------|-----------------|-------------|
148
- | Gerar imagem quando asset estático resolve | Custo por chamada + latência sem ganho | Sirva de CDN; só gere quando o conteúdo é dinâmico por usuário/contexto |
149
- | Não moderar o prompt antes de enviar | Prompts maliciosos podem gerar conteúdo impróprio; o provider rejeitará e você terá erro 400 sem log útil | Aplique validação/moderação de prompt antes de chamar `GenerateImageAsync`; veja `ai-agents-middleware-patterns` |
150
- | Armazenar a URI retornada sem baixar | URLs do provider são efêmeras (~1h no OpenAI); links quebram depois | Use `ResponseFormat = Bytes`, persista no storage do projeto e sirva sua própria URL |
151
- | Criar `AIAgent` para geração de imagem | `ImageClient` não é `IChatClient`; não há sentido em wrappear como agente | Injete `ImageGenerationService` diretamente — é um serviço, não um agente |
351
+ |---|---|---|
352
+ | Gerar imagem quando asset estático resolve | Custo e latência sem ganho | Sirva de CDN |
353
+ | **Gerar dentro do turno de conversa** | Latência de até 2 min, custo por mensagem, zero revisão | Enfileire e confirme (`media-pipeline.md`) |
354
+ | **Usar alias em lista de desligamento** | Dinheiro gasto num endpoint com data de morte | Confira §Deprecações antes de pinar |
355
+ | **Gravar a URL do provedor em vez dos bytes** | URL de provedor expira; o link quebra depois | Baixe, grave no blob próprio, guarde caminho + sha256 |
356
+ | **Gerar do zero quando o produto real existe** | Inventa material, medida ou cor que o produto não tem — claim visual falso | Edição com `OriginalImages` / `/v1/images/edits` |
357
+ | Não moderar o prompt antes de enviar | Erro 400 sem log útil e conteúdo impróprio | Valide antes; ver `ai-agents/middleware-patterns.md` |
358
+ | Criar `AIAgent` para geração de imagem | `IImageGenerator` não é `IChatClient` | Serviço enfileirado, não agente |
359
+ | Suprimir `MEAI001` sem comentário | Silencia o aviso e esconde o risco de breaking change | `#pragma` com o motivo escrito na linha |
152
360
 
153
361
  ---
154
362
 
155
363
  ## Checklist (verifiable by morph-eval)
156
364
 
157
- - [ ] `ImageClient` injetado via DI — não instanciado inline nos controllers
158
- - [ ] `ResponseFormat = GeneratedImageFormat.Bytes` na maioria dos casos; URLs armazenadas no storage do projeto
159
- - [ ] Prompt passa por validação/moderação antes de ir ao provider
160
- - [ ] Não usa `AIAgent`/`AsAIAgent` para geração de imagem — é um `ImageGenerationService`
161
- - [ ] Model e API key vêm de config, não hardcoded
365
+ - [ ] O alias escolhido **não** está na tabela de §Deprecações
366
+ - [ ] A chamada passa por `IImageGenerator` (ou adaptador próprio), sem acoplar o handler ao SDK
367
+ - [ ] `MEAI001` suprimido explicitamente, com comentário do risco na mesma linha
368
+ - [ ] Edição com referência usa `OriginalImages` / `/v1/images/edits` quando o produto real existe
369
+ - [ ] Prompt montado por template versionado, com a estrutura fixa e a "preserve list" repetida
370
+ - [ ] `quality` mínimo por finalidade — candidatas em `low`, `high` só na aprovada
371
+ - [ ] Custo estimado gravado **antes** da chamada, com a tarifa de §Custo por chamada
372
+ - [ ] Bytes gravados em blob próprio; nenhuma URL de provedor persistida como se fosse permanente
373
+ - [ ] Nenhuma geração dentro de um turno de conversa — o handler devolve id de job
374
+ - [ ] Nenhum teste toca API paga
375
+
376
+ ---
377
+
378
+ ## Como re-verificar este standard
379
+
380
+ Cinco páginas, cinco perguntas. Cabe numa sessão; é o custo que torna o corte de 90 dias cumprível
381
+ em vez de desativado por allowlist.
382
+
383
+ | Página | O que conferir |
384
+ |---|---|
385
+ | `https://developers.openai.com/api/docs/deprecations` | A tabela de §Deprecações inteira, e a linha "próximo desligamento conhecido" |
386
+ | `https://developers.openai.com/api/docs/pricing` | O preço por token de saída de imagem, e se apareceu preço por imagem oficial (hoje não há) |
387
+ | `https://ai.google.dev/gemini-api/docs/pricing` | As três linhas Gemini de §Custo por chamada |
388
+ | `https://ai.google.dev/gemini-api/docs/image-generation` | Limites de referência da §Referências de produto |
389
+ | `https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.ai.imagegenerationoptions` + `https://www.nuget.org/packages/Microsoft.Extensions.AI` | Se `quality`/`background` ganharam propriedade tipada, e se `MEAI001` saiu do experimental |
390
+
391
+ **E o exemplo, que é uma afirmação verificável, se re-verifica compilando — não lendo:**
392
+
393
+ ```bash
394
+ node scripts/extract-doc-csharp.mjs \
395
+ framework/standards/ai-agents/modalities-image-gen.md \
396
+ "## Exemplo C# completo" /tmp/probe/Exemplo.cs
397
+ cd /tmp/probe && dotnet build # csproj com o pin + TreatWarningsAsErrors
398
+ ```
399
+
400
+ O `TreatWarningsAsErrors` é obrigatório na sonda: sem ele `MEAI001` vira aviso e o build fica verde
401
+ sobre um exemplo que o consumidor **não** consegue compilar. Este bloco foi medido nos dois
402
+ cenários do pin — com e sem `Microsoft.Extensions.AI.OpenAI` — e sai `0 Aviso(s), 0 Erro(s)` nos
403
+ dois. Antes disso ele carregava três erros independentes, nenhum ligado ao pacote-ponte.
404
+
405
+ Ao terminar, atualize `Last-verified` **e** o `ai-pin` citado no header — re-datar sem re-verificar é
406
+ o defeito que `scripts/check-freshness.js` existe para impedir.
162
407
 
163
408
  ---
164
409
 
165
410
  ## References
166
411
 
167
- - `ai-agents-setup` — packages, DI, e providers disponíveis
168
- - `ai-agents-providers-model-registry` — padrão de alias; adapte para resolver `ImageClient` por provider
169
- - OpenAI .NET SDK — `ImageClient`: https://github.com/openai/openai-dotnet
412
+ - `ai-agents/media-pipeline.md` — o job, a revisão humana, a marcação e a regra dura
413
+ - `ai-agents/media-video.md` — vídeo em runtime, e o desligamento da Sora
414
+ - `frontend/design-system/ai-image-generation.md` — autoria de asset de LP via MCP: prompt craft de
415
+ marca, `assets.md`, `next/image`. Consumidor diferente, tempo diferente
416
+ - `ai-agents/batching.md` · `ai-agents/service-tier-flex.md` — a decisão Batch × Flex × síncrono
417
+ - `ai-agents/providers/model-registry.md` — o alias por provedor
418
+ - `ai-agents/setup.md` — pacotes e DI
170
419
 
171
420
  ---
172
421
 
173
- *MORPH-SPEC by Polymorphism Tech — ai-agents/modalities-image-gen.md v1.0 (2026-05-19)*
422
+ *MORPH-SPEC by Polymorphism Tech — ai-agents/modalities-image-gen.md v2.0*
@@ -5,7 +5,7 @@
5
5
  > **Keywords:** speech to text, transcription, whisper, audio to text, voice transcription
6
6
  > **Read by Claude in:** implement (quando o projeto precisa transcrever áudio para texto)
7
7
 
8
- **Verified against:** MAF 1.0 GA + OpenAI .NET SDK 2.x. Last-verified: 2026-05-19.
8
+ **Verified against:** OpenAI 2.13.0 + Microsoft.Extensions.AI 10.9.0 (ai-pin 2026-09-08). **Verificação documental**, sem cláusula `provado por` — o ai-kit não transcreve áudio. `AudioClient.TranscribeAudioAsync` e a ponte `AsISpeechToTextClient` foram **medidas por reflexão sobre as assemblies do pin** em 2026-09-08. Last-verified: 2026-09-08.
9
9
 
10
10
  ---
11
11
 
@@ -39,6 +39,12 @@ string text = transcription.Text;
39
39
 
40
40
  O projeto injeta `AudioClient` via DI. Para transcrição com timestamps (ex: sincronização de legenda), use `AudioTranscriptionOptions` com `ResponseFormat = AudioTranscriptionFormat.Verbose`.
41
41
 
42
+ > **Conferência de 2026-09-08.** As sobrecargas existentes na assembly `OpenAI` 2.13.0 são `TranscribeAudioAsync(string audioFilePath, AudioTranscriptionOptions)` e `TranscribeAudioAsync(Stream audio, string audioFilename, AudioTranscriptionOptions, CancellationToken)` — **a de `Stream` exige o nome do arquivo**, porque é dele que o serviço deduz o formato. Passar só o stream não compila.
43
+ >
44
+ > **Caminho por abstração (opcional):** `Microsoft.Extensions.AI` 10.9.0 define `ISpeechToTextClient`, e `Microsoft.Extensions.AI.OpenAI` publica `audioClient.AsISpeechToTextClient()`. Vale quando o projeto quer trocar de provedor sem tocar no chamador; o `AudioClient` direto continua sendo o caminho mais curto.
45
+ >
46
+ > **Reescrita de conteúdo de mídia está FORA do escopo desta re-verificação** (é épico próprio). O que se fez aqui foi conferir nome por nome e re-datar.
47
+
42
48
  ---
43
49
 
44
50
  ## Exemplo C# completo
@@ -168,4 +174,4 @@ builder.Services.AddSingleton<TranscriptionService>();
168
174
 
169
175
  ---
170
176
 
171
- *MORPH-SPEC by Polymorphism Tech — ai-agents/modalities-speech-to-text.md v1.0 (2026-05-19)*
177
+ *MORPH-SPEC by Polymorphism Tech — ai-agents/modalities-speech-to-text.md v1.1 (2026-09-08)*
@@ -5,7 +5,7 @@
5
5
  > **Keywords:** text to speech, TTS, voice synthesis, audio generation, speech synthesis
6
6
  > **Read by Claude in:** implement (quando o projeto precisa gerar áudio a partir de texto)
7
7
 
8
- **Verified against:** MAF 1.0 GA + OpenAI .NET SDK 2.x. Last-verified: 2026-05-19.
8
+ **Verified against:** OpenAI 2.13.0 + Microsoft.Extensions.AI 10.9.0 (ai-pin 2026-09-08). **Verificação documental**, sem cláusula `provado por` — o ai-kit não gera áudio. `AudioClient.GenerateSpeechAsync`, a sobrecarga de streaming e a ponte `AsITextToSpeechClient` foram **medidas por reflexão sobre as assemblies do pin** em 2026-09-08. Last-verified: 2026-09-08.
9
9
 
10
10
  ---
11
11
 
@@ -36,6 +36,14 @@ BinaryData speech = await client.GenerateSpeechAsync(text, GeneratedSpeechVoice.
36
36
 
37
37
  Retorna `BinaryData` (bytes de áudio) que você persiste ou serve via stream. Para controlar formato e velocidade, use `SpeechGenerationOptions`.
38
38
 
39
+ > **Conferência de 2026-09-08.** A assinatura na assembly `OpenAI` 2.13.0 é `GenerateSpeechAsync(string text, GeneratedSpeechVoice voice, SpeechGenerationOptions options, CancellationToken)` — a **voz é parâmetro obrigatório**, não uma opção dentro de `SpeechGenerationOptions`.
40
+ >
41
+ > **Novidade útil que não estava aqui:** existe `GenerateSpeechStreamingAsync(...)`, que devolve os pedaços de áudio conforme saem. Para texto longo servido a um usuário, é a diferença entre esperar o arquivo inteiro e começar a tocar — vale mais que qualquer ajuste de formato.
42
+ >
43
+ > **Caminho por abstração (opcional):** `Microsoft.Extensions.AI` 10.9.0 define `ITextToSpeechClient`, e `Microsoft.Extensions.AI.OpenAI` publica `audioClient.AsITextToSpeechClient()`.
44
+ >
45
+ > **Reescrita de conteúdo de mídia está FORA do escopo desta re-verificação** (é épico próprio). O que se fez aqui foi conferir nome por nome e re-datar.
46
+
39
47
  ---
40
48
 
41
49
  ## Exemplo C# completo
@@ -178,4 +186,4 @@ public class AudioController(TextToSpeechService tts) : ControllerBase
178
186
 
179
187
  ---
180
188
 
181
- *MORPH-SPEC by Polymorphism Tech — ai-agents/modalities-text-to-speech.md v1.0 (2026-05-19)*
189
+ *MORPH-SPEC by Polymorphism Tech — ai-agents/modalities-text-to-speech.md v1.1 (2026-09-08)*
@@ -5,7 +5,7 @@
5
5
  > **Keywords:** vision, image to text, OCR, image analysis, multimodal input, image agent, PDF analysis
6
6
  > **Read by Claude in:** implement (quando o agente recebe imagem ou PDF)
7
7
 
8
- **Verified against:** MAF 1.0 GA. Last-verified: 2026-05-19.
8
+ **Verified against:** Microsoft.Extensions.AI 10.9.0 + Microsoft.Agents.AI 1.20.0 (ai-pin 2026-09-08). **Verificação documental**, sem cláusula `provado por` — o ai-kit não exercita conteúdo multimodal. Os três tipos de conteúdo citados (`TextContent`, `UriContent`, `DataContent`) foram **conferidos por reflexão sobre `Microsoft.Extensions.AI.Abstractions` 10.9.0** em 2026-09-08 e continuam existindo com esses nomes. Last-verified: 2026-09-08.
9
9
 
10
10
  ---
11
11
 
@@ -51,6 +51,10 @@ O `IChatClient` (e portanto `AIAgent`) aceita `IEnumerable<ChatMessage>` — voc
51
51
  | `DataContent.LoadFromAsync(path)` | Carrega imagem de arquivo/stream (helper canônico) |
52
52
  | `new DataContent(binaryData, mediaType)` | Imagem embutida a partir de bytes já em memória |
53
53
 
54
+ > **Conferência de 2026-09-08.** Os quatro nomes acima estão intactos na 10.9.0 — nada a corrigir neste standard além da data. O que mudou ao redor: a lista de `AIContent` cresceu (`ImageGenerationToolCallContent`, `CodeInterpreterToolCallContent`, `McpServerToolCallContent`, `WebSearchToolCallContent`), sinal de que ferramentas hospedadas passaram a devolver conteúdo tipado — assunto de `ai-agents-setup` §*Por que Responses é o default*, não deste standard.
55
+ >
56
+ > **Reescrita de conteúdo de mídia está FORA do escopo desta re-verificação** (é épico próprio). O que se fez aqui foi conferir nome por nome e re-datar.
57
+
54
58
  ---
55
59
 
56
60
  ## Exemplo C# completo
@@ -198,4 +202,4 @@ string desc3 = await agent.AnalyzeImageBytesAsync(data, "image/png",
198
202
 
199
203
  ---
200
204
 
201
- *MORPH-SPEC by Polymorphism Tech — ai-agents/modalities-vision.md v1.0 (2026-05-19)*
205
+ *MORPH-SPEC by Polymorphism Tech — ai-agents/modalities-vision.md v1.1 (2026-09-08)*