@polymorphism-tech/morph-spec 8.34.2 → 8.35.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +22 -5
- package/README.md +2 -2
- package/bin/morph-spec.js +18 -4
- package/bin/validate.js +379 -379
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +5 -4
- package/docs/QUICKSTART.md +1 -1
- package/framework/MORPH.md +16 -17
- package/framework/agents.json +197 -44
- package/framework/ai-pin.json +22 -0
- package/framework/commands/morph-media.md +45 -0
- package/framework/docs/CLI.md +236 -11
- package/framework/evals/proof-rubrics/README.md +76 -0
- package/framework/evals/proof-rubrics/eval-de-modelo.md +64 -0
- package/framework/evals/proof-rubrics/fiacao.md +54 -0
- package/framework/evals/proof-rubrics/guard-cego.md +52 -0
- package/framework/evals/proof-rubrics/media-claims.md +109 -0
- package/framework/evals/proof-rubrics/mutation-proof.md +77 -0
- package/framework/evals/proof-rubrics/observabilidade-genai.md +119 -0
- package/framework/evals/proof-rubrics/verde-nao-e-coberto.md +48 -0
- package/framework/evals/rubrics/architecture.md +30 -0
- package/framework/evals/rubrics/code-quality.md +26 -0
- package/framework/evals/rubrics/test-coverage.md +20 -0
- package/framework/hooks/claude-code/core/protect-spec-files.js +41 -4
- package/framework/hooks/claude-code/core/worktree-env-inject.js +43 -0
- package/framework/hooks/claude-code/statusline.sh +11 -11
- package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
- package/framework/hooks/git/pre-commit/agents.sh +25 -25
- package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
- package/framework/hooks/git/pre-commit/specs.sh +50 -50
- package/framework/hooks/git/pre-push/run-tests.sh +44 -44
- package/framework/hooks/shared/e2e-check.js +135 -22
- package/framework/hooks/shared/payload-utils.js +15 -2
- package/framework/hooks/shared/stdin-reader.js +26 -26
- package/framework/rules/ai-agents-standards.md +14 -2
- package/framework/schemas/ai-pin.schema.json +97 -0
- package/framework/schemas/config.schema.json +107 -0
- package/framework/schemas/feature.schema.json +23 -4
- package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
- package/framework/skills/core/morph-apply/SKILL.md +26 -5
- package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
- package/framework/skills/core/morph-eval/SKILL.md +1 -1
- package/framework/skills/core/morph-hotfix/SKILL.md +2 -2
- package/framework/skills/core/morph-implement/SKILL.md +18 -2
- package/framework/skills/core/morph-media/SKILL.md +215 -0
- package/framework/skills/core/morph-plan/SKILL.md +33 -2
- package/framework/skills/core/morph-proposal/SKILL.md +1 -1
- package/framework/skills/core/morph-review/SKILL.md +166 -9
- package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
- package/framework/skills/core/morph-standards/SKILL.md +1 -1
- package/framework/skills/core/morph-uiux/SKILL.md +1 -1
- package/framework/standards/PROVENANCE.json +81 -3
- package/framework/standards/STANDARDS.json +1483 -839
- package/framework/standards/ai-agents/agent-archetypes.md +160 -0
- package/framework/standards/ai-agents/agent-session.md +164 -68
- package/framework/standards/ai-agents/agent-spec.md +196 -0
- package/framework/standards/ai-agents/batching.md +61 -37
- package/framework/standards/ai-agents/context-providers.md +97 -24
- package/framework/standards/ai-agents/conversational-agent-with-phases.md +239 -0
- package/framework/standards/ai-agents/cost-and-budget.md +256 -0
- package/framework/standards/ai-agents/durable-workflows-hitl.md +98 -5
- package/framework/standards/ai-agents/evals-with-cache.md +289 -0
- package/framework/standards/ai-agents/guardrails.md +222 -0
- package/framework/standards/ai-agents/llm-runtime-defaults.md +226 -0
- package/framework/standards/ai-agents/mcp-server.md +119 -18
- package/framework/standards/ai-agents/mcp-tools.md +85 -32
- package/framework/standards/ai-agents/media-pipeline.md +352 -0
- package/framework/standards/ai-agents/media-video.md +267 -0
- package/framework/standards/ai-agents/middleware-patterns.md +39 -5
- package/framework/standards/ai-agents/modalities-image-gen.md +354 -105
- package/framework/standards/ai-agents/modalities-speech-to-text.md +8 -2
- package/framework/standards/ai-agents/modalities-text-to-speech.md +10 -2
- package/framework/standards/ai-agents/modalities-vision.md +6 -2
- package/framework/standards/ai-agents/multi-agent-patterns.md +61 -5
- package/framework/standards/ai-agents/observability-patterns.md +227 -17
- package/framework/standards/ai-agents/production.md +38 -9
- package/framework/standards/ai-agents/prompt-sources.md +389 -0
- package/framework/standards/ai-agents/providers/model-registry.md +174 -39
- package/framework/standards/ai-agents/rag-custom-pgvector.md +69 -4
- package/framework/standards/ai-agents/service-tier-flex.md +27 -19
- package/framework/standards/ai-agents/setup.md +166 -50
- package/framework/standards/ai-agents/structured-output.md +34 -3
- package/framework/standards/ai-agents/sweet-spot.md +23 -3
- package/framework/standards/ai-agents/testing-ai.md +236 -0
- package/framework/standards/ai-agents/vector-data-extensions.md +50 -20
- package/framework/standards/ai-agents/workflows.md +27 -7
- package/framework/standards/frontend/design-system/ai-image-generation.md +12 -0
- package/framework/standards/frontend/design-system/ai-video-generation.md +13 -0
- package/framework/standards/infrastructure/docker/local-compose-isolation.md +3 -1
- package/framework/templates/.idea/morph-templates.xml +92 -0
- package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
- package/framework/templates/IDE-SNIPPETS.md +262 -262
- package/framework/templates/REGISTRY.json +13 -0
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
- package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
- package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
- package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
- package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +1 -1
- package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
- package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
- package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
- package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
- package/framework/templates/code/dotnet/database/migration.cs +83 -83
- package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
- package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
- package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +1 -1
- package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
- package/framework/templates/code/typescript/contracts.ts +167 -167
- package/framework/templates/docs/clarifications.md +253 -253
- package/framework/templates/docs/schema-analysis.md +119 -119
- package/framework/templates/docs/ui-components.md +52 -52
- package/framework/templates/docs/ui-design-system.md +76 -76
- package/framework/templates/docs/ui-flows.md +167 -167
- package/framework/templates/docs/ui-mockups.md +98 -98
- package/framework/templates/dotnet/ai-kit/Directory.Build.props +25 -0
- package/framework/templates/dotnet/ai-kit/Directory.Packages.props +26 -0
- package/framework/templates/dotnet/ai-kit/Morph.AiKit.sln +56 -0
- package/framework/templates/dotnet/ai-kit/NuGet.config +12 -0
- package/framework/templates/dotnet/ai-kit/README.md +128 -0
- package/framework/templates/dotnet/ai-kit/global.json +9 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentApi.cs +65 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentFactory.cs +289 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentFactoryOptions.cs +91 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentSpec.cs +91 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentSpecOptions.cs +181 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/AiKitAssemblyMarker.cs +14 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/ConversationStore.cs +174 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/IConversationStore.cs +54 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/InMemoryConversationStore.cs +75 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/CountingChatClient.cs +71 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalAssertion.cs +246 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheMissException.cs +57 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheOptions.cs +78 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheStamp.cs +225 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalFixture.cs +463 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalMode.cs +32 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalQualityEvaluators.cs +49 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalScenario.cs +214 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalSummary.cs +168 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/OfflineChatClient.cs +142 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/ShortPathResponseCache.cs +349 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/IMediaGenerator.cs +42 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/IMediaProvider.cs +77 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaArtifact.cs +28 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaDisclosure.cs +107 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaGenerator.cs +253 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaIdempotencyKey.cs +103 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJob.cs +259 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJobId.cs +21 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJobState.cs +47 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaPricing.cs +102 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaProvenance.cs +44 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaRequest.cs +192 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaResult.cs +94 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaReview.cs +99 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaSeams.cs +97 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaStore.cs +133 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MorphMedia.cs +93 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/GoogleImageProvider.cs +112 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/OpenAIImageProvider.cs +288 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/VeoVideoProvider.cs +158 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/IUsageCostSink.cs +29 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/UsageCostMiddleware.cs +208 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/UsageCostRecord.cs +95 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Morph.AiKit.csproj +38 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Observability/MorphOpenTelemetryExtensions.cs +119 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Observability/MorphTelemetryOptions.cs +82 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/IProviderClientFactory.cs +33 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/ModelAlias.cs +267 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/ModelRegistry.cs +474 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/model-registry.v2.json +87 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Rag/DeltaIngest.cs +169 -0
- package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Rag/DeltaPlan.cs +49 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/AgentFactoryTests.cs +495 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/AgentSpecTests.cs +260 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/ConversationStoreTests.cs +405 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/DeltaIngestTests.cs +379 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalAssertionTests.cs +197 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalCacheMissTests.cs +139 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalCacheStampTests.cs +157 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalFailuresTests.cs +178 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalFixtureTests.cs +153 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalRefreshTests.cs +194 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalWorkspace.cs +86 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/KitEvals.cs +213 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/OfflineChatClientTests.cs +95 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeChatClient.cs +225 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeChatClientTests.cs +215 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeClock.cs +33 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeMediaProvider.cs +89 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeProviderClientFactory.cs +55 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeUsageCostSink.cs +60 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/InMemoryMediaStore.cs +131 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaAccessibilityTests.cs +133 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaAliasIsNotAnAgentTests.cs +127 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaDisclosureTests.cs +216 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaGeneratorTests.cs +264 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaIdempotencyKeyTests.cs +148 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaJobStateTests.cs +184 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaReviewTests.cs +89 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaStoreTests.cs +98 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/ModelRegistryTests.cs +451 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Morph.AiKit.Tests.csproj +76 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/SkeletonSmokeTests.cs +33 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/TelemetryTests.cs +261 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/UsageCostMiddlewareTests.cs +374 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/.morph-eval-cache.json +12 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/orcamento.acme.a-resposta-estruturada/1/CF70A7CE27BBD66A/contents.data +13 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/orcamento.acme.a-resposta-estruturada/1/CF70A7CE27BBD66A/entry.json +7 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.acme.a-saudacao/1/19F631228C6E00BA/contents.data +13 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.acme.a-saudacao/1/19F631228C6E00BA/entry.json +7 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.acme.b-escalonamento/1/A24A7C9BDD8239D8/contents.data +13 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.acme.b-escalonamento/1/A24A7C9BDD8239D8/entry.json +7 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.globex.a-saudacao/1/E38CD37DF003EDB7/contents.data +13 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-cache/cache/triagem.globex.a-saudacao/1/E38CD37DF003EDB7/entry.json +7 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-datasets/orcamento/acme/a-resposta-estruturada.json +24 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-datasets/triagem/acme/a-saudacao.json +23 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-datasets/triagem/acme/b-escalonamento.json +24 -0
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/eval-datasets/triagem/globex/a-saudacao.json +23 -0
- package/framework/templates/feature/decisions.md +122 -122
- package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
- package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
- package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
- package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
- package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
- package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
- package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
- package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
- package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
- package/framework/templates/infrastructure/github/README.md +56 -56
- package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
- package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
- package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
- package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
- package/framework/templates/integrations/asaas-client.cs +387 -387
- package/framework/templates/integrations/asaas-webhook.cs +351 -351
- package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
- package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
- package/framework/templates/project/validate.js +120 -120
- package/framework/templates/state.template.json +17 -17
- package/framework/templates/ui/design-system.css +226 -226
- package/package.json +3 -3
- package/src/commands/dashboard/dashboard.js +53 -53
- package/src/commands/e2e/e2e.js +15 -2
- package/src/commands/index.js +13 -13
- package/src/commands/project/checkpoint.js +209 -209
- package/src/commands/project/doctor.js +148 -6
- package/src/commands/project/update.js +469 -153
- package/src/commands/project/worktree.js +76 -4
- package/src/commands/state/advance.js +24 -2
- package/src/commands/state/approve.js +33 -1
- package/src/commands/state/create.js +72 -11
- package/src/commands/state/finish.js +379 -24
- package/src/commands/state/gate-check.js +190 -6
- package/src/commands/state/score.js +36 -1
- package/src/commands/validation/verify.js +134 -25
- package/src/core/state/phase-state-machine.js +197 -197
- package/src/core/state/state-manager.js +9 -1
- package/src/core/templates/template-renderer.js +477 -477
- package/src/dashboard/app/components/DetailPanel.jsx +11 -11
- package/src/dashboard/app/components/FlowGraph.jsx +17 -17
- package/src/dashboard/app/components/SearchFilter.jsx +22 -22
- package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
- package/src/dashboard/app/main.jsx +13 -13
- package/src/dashboard/app/pages/AgentMap.jsx +370 -370
- package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
- package/src/dashboard/app/pages/RulesMap.jsx +273 -273
- package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
- package/src/dashboard/app/pages/Standards.jsx +332 -332
- package/src/dashboard/app/styles/index.css +47 -47
- package/src/dashboard/index.html +12 -12
- package/src/dashboard/package.json +24 -24
- package/src/dashboard/scanner/phases-scanner.js +15 -15
- package/src/dashboard/scanner/rubrics-scanner.js +12 -12
- package/src/dashboard/scanner/rules-scanner.js +37 -37
- package/src/dashboard/scanner/skills-scanner.js +43 -43
- package/src/dashboard/scanner/squads-scanner.js +13 -13
- package/src/dashboard/vite-plugin-morph-data.js +17 -17
- package/src/dashboard/vite.config.js +24 -24
- package/src/lib/ai/ai-checks.js +182 -0
- package/src/lib/ai/ai-project-scan.js +347 -0
- package/src/lib/ai/code-audit.js +181 -0
- package/src/lib/ai/comment-stripper.js +184 -0
- package/src/lib/ai/pin-drift.js +138 -0
- package/src/lib/ai/registry-audit.js +285 -0
- package/src/lib/detectors/design-system-detector.js +188 -188
- package/src/lib/detectors/index.js +217 -217
- package/src/lib/e2e/compose-env.js +50 -4
- package/src/lib/evaluator-report.js +269 -15
- package/src/lib/generators/design-system-generator.js +508 -508
- package/src/lib/generators/settings-generator.js +209 -209
- package/src/lib/git/default-branch.js +92 -4
- package/src/lib/git/pr-files.js +56 -0
- package/src/lib/hooks/hook-executor.js +167 -167
- package/src/lib/installers/effects.js +193 -0
- package/src/lib/installers/mcp-installer.js +719 -719
- package/src/lib/installers/templates-reconcile.js +3 -3
- package/src/lib/risk-detector.js +284 -0
- package/src/lib/standards/verified-against.js +276 -0
- package/src/lib/tasks/eval-node.js +485 -0
- package/src/lib/tasks/linux-runner.js +297 -0
- package/src/lib/tasks/task-classifier.js +30 -30
- package/src/lib/tasks/task-parser.js +209 -209
- package/src/lib/tasks/test-nodes.js +486 -0
- package/src/lib/tasks/test-runner.js +410 -33
- package/src/lib/validators/checkpoint-persistence.js +39 -39
- package/src/lib/validators/css/css-validator.js +340 -340
- package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
- package/src/lib/validators/shared/issue-counter.js +14 -14
- package/src/lib/validators/verify-runner.js +583 -28
- package/src/lib/worktree/docker-audit.js +287 -0
- package/src/lib/worktree/env-allocator.js +24 -0
- package/src/lib/worktree/worktree-audit.js +30 -1
- package/src/scripts/setup-infra.js +24 -11
- package/src/utils/agent-id-mapper.js +11 -11
- package/src/utils/agents-installer.js +18 -8
- package/src/utils/claude-md-injector.js +10 -5
- package/src/utils/claude-settings-manager.js +300 -300
- package/src/utils/file-copier.js +11 -4
- package/src/utils/hooks-installer.js +29 -26
- package/src/utils/skills-installer.js +36 -29
- package/src/utils/version-checker.js +68 -3
- package/framework/standards/ai-agents/prompts-in-db.md +0 -214
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# Media — Video Generation (runtime, a partir de .NET)
|
|
2
|
+
|
|
3
|
+
> **Scope:** stacks=["dotnet"]
|
|
4
|
+
> **Layer:** 2 (on-keyword)
|
|
5
|
+
> **Keywords:** video generation, veo, seedance, kling, runway, image to video, text to video, media video
|
|
6
|
+
> **Read by Claude in:** implement (quando o projeto precisa gerar vídeo em runtime)
|
|
7
|
+
|
|
8
|
+
**Verified against:** Google.GenAI 1.21.0 + OpenAI 2.13.0 (ai-pin 2026-09-08); provado por `templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/VeoVideoProvider.cs` — `Models.GenerateVideosAsync(model, GenerateVideosSource, GenerateVideosConfig, ct)`, o polling por `Operations.GetAsync` + `operation.Done` e o sinal de bloqueio `RaiMediaFilteredCount` COMPILAM ali. Preço, duração, retenção e data de desligamento são **verificação documental** contra as páginas listadas em §Como re-verificar este standard. Last-verified: 2026-09-08.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
**A fronteira, primeiro.** Este standard é sobre **gerar vídeo em runtime a partir de .NET**: o
|
|
13
|
+
backend cria uma tarefa paga, faz polling, baixa bytes e guarda. Footage de landing page
|
|
14
|
+
scroll-driven, produzido por MCP em **tempo de autoria**, é
|
|
15
|
+
`frontend/design-system/ai-video-generation.md` — loop × direcional, `endImage`, o contorno de
|
|
16
|
+
moderação E005 e a escada de custo daquele fluxo. Os dois se citam e não se sobrepõem: lá o
|
|
17
|
+
operador é um designer numa sessão; aqui é um worker no seu servidor.
|
|
18
|
+
|
|
19
|
+
O pipeline (job, revisão, publicação, marcação) é `ai-agents/media-pipeline.md`. Imagem é
|
|
20
|
+
`ai-agents/modalities-image-gen.md`.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Quando usar
|
|
25
|
+
|
|
26
|
+
| Caso | Nota |
|
|
27
|
+
|---|---|
|
|
28
|
+
| **Vídeo curto de produto** (reels, stories, até 8 s com áudio) | O caso que paga a conta |
|
|
29
|
+
| **Animar render de cliente** | `img2vid` sobre a arte real, nunca recriação por IA |
|
|
30
|
+
| **Variação de cena** sobre um herói aprovado | Depois da aprovação da imagem, nunca antes |
|
|
31
|
+
|
|
32
|
+
**Nunca dentro de um turno de conversa.** A geração de vídeo leva de **11 s a 6 min** medidos na
|
|
33
|
+
documentação do Veo, é assíncrona **por desenho em todos os provedores** — nenhum deles devolve o
|
|
34
|
+
arquivo na resposta do POST — e custa por segundo de saída. Não existe forma de fazer isso caber num
|
|
35
|
+
turno de WhatsApp; a tentativa é `ai-agents/media-pipeline.md` §A regra dura.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## O caminho com SDK
|
|
40
|
+
|
|
41
|
+
`Google.GenAI` 1.21.0, `net8.0` + `netstandard2.0`. É o **único** caminho com SDK .NET oficial
|
|
42
|
+
depois do desligamento listado em §Deprecações.
|
|
43
|
+
|
|
44
|
+
```csharp
|
|
45
|
+
using Google.GenAI.Types;
|
|
46
|
+
|
|
47
|
+
// 1. Cria a operacao. Ela volta NAO-concluida: o video ainda nao existe.
|
|
48
|
+
// O prompt vai DENTRO de GenerateVideosSource — nao e um parametro solto.
|
|
49
|
+
var operation = await client.Models.GenerateVideosAsync(
|
|
50
|
+
"veo-3.1-fast-generate-preview",
|
|
51
|
+
new GenerateVideosSource { Prompt = prompt },
|
|
52
|
+
new GenerateVideosConfig { DurationSeconds = 8, AspectRatio = "16:9" },
|
|
53
|
+
ct);
|
|
54
|
+
|
|
55
|
+
// 2. Polling. ~10 s entre voltas e o intervalo que a doc do Veo usa; back-off e
|
|
56
|
+
// TETO DE TENTATIVAS — um laco sem saida e indistinguivel de um worker travado.
|
|
57
|
+
// `Done` e bool? : `!operation.Done` NAO compila; compare com true.
|
|
58
|
+
for (var poll = 0; operation.Done != true && poll < 60; poll++)
|
|
59
|
+
{
|
|
60
|
+
await Task.Delay(TimeSpan.FromSeconds(10), ct);
|
|
61
|
+
operation = await client.Operations.GetAsync(operation, new GetOperationConfig(), ct);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// 3. Bloqueio de moderacao NAO e erro tecnico, e o sinal e este:
|
|
65
|
+
if (operation.Response?.RaiMediaFilteredCount is > 0) { /* rejected_by_policy, sem retry */ }
|
|
66
|
+
|
|
67
|
+
// 4. BAIXE OS BYTES AGORA (operation.Response.GeneratedVideos[..].Video.VideoBytes).
|
|
68
|
+
// Ver a secao "O arquivo expira".
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
> **Assinaturas medidas contra `Google.GenAI` 1.21.0 por reflexão, não lidas em blog.** Três
|
|
72
|
+
> detalhes derrubam o build de quem copia de uma página de terceiro: o prompt viaja em
|
|
73
|
+
> `GenerateVideosSource`, `Operations.GetAsync` pede um `GetOperationConfig` (não só o token), e
|
|
74
|
+
> `operation.Done` é `bool?` — `while (!operation.Done)` não compila. O exemplar que compila está
|
|
75
|
+
> em `templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/VeoVideoProvider.cs`.
|
|
76
|
+
|
|
77
|
+
Três exigências de desenho que caem deste formato, e não são opcionais:
|
|
78
|
+
|
|
79
|
+
1. **O `operation` é estado persistido**, não variável local. Se o worker reiniciar no meio, o id da
|
|
80
|
+
operação tem de estar no banco — senão você paga de novo por um vídeo que já está pronto.
|
|
81
|
+
2. **O polling mora num job**, nunca numa request HTTP. Um `while` de 6 minutos dentro de um
|
|
82
|
+
controller é um thread pool derretido.
|
|
83
|
+
3. **Timeout e teto de tentativas explícitos.** `Done` que nunca vira `true` é um caso real, e um
|
|
84
|
+
loop sem saída é indistinguível de um worker travado.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## O caminho sem SDK
|
|
89
|
+
|
|
90
|
+
Seedance 2.0 (BytePlus ModelArk ou fal.ai), Kling 3.0 e Runway **não têm SDK .NET**. Sem exceção,
|
|
91
|
+
sem "biblioteca da comunidade": `HttpClient` **tipado** via `IHttpClientFactory`, DTOs próprios,
|
|
92
|
+
`System.Text.Json` com source generation, e Polly para 429/5xx/timeout.
|
|
93
|
+
|
|
94
|
+
O contrato é o mesmo nos três, e é o que torna o adaptador escrevível:
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
POST criar tarefa → { id } (202 / 200, NUNCA o arquivo)
|
|
98
|
+
↓ persistir o id ANTES de qualquer outra coisa
|
|
99
|
+
GET status(id) → queued | running | succeeded | failed
|
|
100
|
+
↓ polling com back-off, OU webhook (fal.ai, Runway)
|
|
101
|
+
GET resultado → URL temporaria → baixar → blob proprio
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**Persistir o id antes de qualquer outra coisa** é a linha que separa "retry custa zero" de "retry
|
|
105
|
+
custa outra geração". O resto do desenho — chave de idempotência, estados, storage — está em
|
|
106
|
+
`ai-agents/media-pipeline.md`.
|
|
107
|
+
|
|
108
|
+
Webhook, onde existe, é preferível a polling: menos chamada, menos latência de detecção. Mas o
|
|
109
|
+
polling continua sendo o caminho de recuperação quando o webhook se perde — implemente os dois, e
|
|
110
|
+
faça o handler de webhook idempotente.
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Sora: não planejar
|
|
115
|
+
|
|
116
|
+
`sora-2`, `sora-2-pro` e o `VideoClient` do `openai-dotnet` (`CreateVideo`, `GetVideo`,
|
|
117
|
+
`DownloadVideo`, `CreateVideoRemix`) **saem de circulação sem substituto** — a data está em
|
|
118
|
+
§Deprecações. "Sem substituto" é literal: a OpenAI não anunciou modelo de vídeo sucessor.
|
|
119
|
+
|
|
120
|
+
Consequência prática: **não escreva adaptador para Sora**, não pine alias de Sora, e se encontrar um
|
|
121
|
+
num projeto existente, a migração é para o caminho com SDK do Google ou para um dos HTTP crus. Um
|
|
122
|
+
adaptador escrito hoje para Sora nasce morto.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Custo por segundo
|
|
127
|
+
|
|
128
|
+
> **Toda a aritmética de dinheiro deste standard mora nesta seção, e em lugar nenhum mais.**
|
|
129
|
+
|
|
130
|
+
Preço de **lista pública**, em USD por segundo de saída, sem desconto de contrato. Consultadas em
|
|
131
|
+
**2026-09-07**: `https://ai.google.dev/gemini-api/docs/veo` com
|
|
132
|
+
`https://ai.google.dev/gemini-api/docs/pricing`, `https://docs.byteplus.com/en/docs/ModelArk/1520757`,
|
|
133
|
+
`https://fal.ai/models/bytedance/seedance-2.0/image-to-video`, `https://kling.ai/dev/pricing` e
|
|
134
|
+
`https://docs.dev.runwayml.com/guides/pricing/`.
|
|
135
|
+
|
|
136
|
+
| Modelo | Preço | Nota |
|
|
137
|
+
|---|---|---|
|
|
138
|
+
| Veo 3.1 **Lite** | $0,05 / s | Sem 4K |
|
|
139
|
+
| Veo 3.1 **Fast** — 720p | $0,10 / s | O default recomendado; áudio incluso |
|
|
140
|
+
| Veo 3.1 Standard — 720p/1080p | $0,40 / s | 4K: $0,60 / s |
|
|
141
|
+
| Seedance 2.0 (BytePlus oficial) | $0,04 – $0,78 / s | Varia por modelo e resolução; pacote pré-pago mínimo de $30,10 |
|
|
142
|
+
| Seedance 2.0 (fal.ai) | $0,3024 / s std 720p; $0,2419 / s fast | Mesmo modelo, agregador diferente, preço diferente |
|
|
143
|
+
| Kling 3.0 std | ≈ $0,42 por 5 s | Sem SDK |
|
|
144
|
+
| Runway gen4.5 | $0,12 / s | Créditos a $0,01; 12 cr/s |
|
|
145
|
+
|
|
146
|
+
Três leituras que decidem projeto:
|
|
147
|
+
|
|
148
|
+
1. **A faixa do Seedance é de 20× entre o piso oficial e o teto**, e o mesmo modelo custa preços
|
|
149
|
+
diferentes conforme o agregador. Por isso **nenhum alias default é pinado** para Seedance, Kling
|
|
150
|
+
ou Runway neste standard: escolher um seria escolher fornecedor por conveniência de escrita, e não
|
|
151
|
+
por evidência. Meça o seu caso antes de pinar.
|
|
152
|
+
2. **Vídeo é caro por segundo e mínimo de 4 s.** Um rascunho de 4 s em Lite custa uma fração de um
|
|
153
|
+
final de 8 s em Standard — a escada de custo é a mesma disciplina de imagem, com números maiores.
|
|
154
|
+
3. **Bloqueio de moderação no Veo não cobra.** Isso muda o desenho de retry: um bloqueio é
|
|
155
|
+
`rejected_by_policy` e não deve ser retentado; um erro técnico é `failed` e deve.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Duração, resolução e referências
|
|
160
|
+
|
|
161
|
+
Medido contra `https://ai.google.dev/gemini-api/docs/veo` (Veo 3.1) e a doc do BytePlus ModelArk
|
|
162
|
+
(Seedance 2.0), ambas consultadas na data declarada em §Custo por segundo.
|
|
163
|
+
|
|
164
|
+
| Parâmetro | Veo 3.1 | Seedance 2.0 |
|
|
165
|
+
|---|---|---|
|
|
166
|
+
| Duração | 4, 6 ou 8 s | 4 a 15 s |
|
|
167
|
+
| **8 s é obrigatório** para | 1080p, 4K e uso de imagens de referência | — |
|
|
168
|
+
| Aspect ratio | 16:9 ou 9:16 | 480p / 720p / 1080p |
|
|
169
|
+
| Frame rate | 24 fps | — |
|
|
170
|
+
| Áudio | nativo, incluso no preço | nativo |
|
|
171
|
+
| Imagem inicial | sim (primeiro frame) | JPEG/PNG/WebP até 30 MB |
|
|
172
|
+
| Interpolação | primeiro + último frame | imagem final opcional |
|
|
173
|
+
| Referências | **até 3 imagens** (exige 8 s) | referências de vídeo e áudio |
|
|
174
|
+
| Extensão | +7 s, até 20 vezes (720p) | — |
|
|
175
|
+
|
|
176
|
+
"8 s obrigatório para referências" é a pegadinha cara: pedir 4 s **com** imagem de referência é uma
|
|
177
|
+
requisição inválida, e descobrir isso em produção custa uma rodada de suporte.
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## O arquivo expira
|
|
182
|
+
|
|
183
|
+
O Veo retém o arquivo gerado por **2 dias**. Depois disso a URL devolve 404 e o vídeo pelo qual você
|
|
184
|
+
pagou não existe mais em lugar nenhum.
|
|
185
|
+
|
|
186
|
+
**Baixar e gravar no blob próprio é obrigação, não otimização.** O download entra no mesmo passo do
|
|
187
|
+
worker que detectou `Done`, antes de qualquer outra coisa; o banco guarda caminho relativo + sha256,
|
|
188
|
+
nunca a URL do provedor. O mesmo vale para todo agregador: URL de resultado é sempre temporária.
|
|
189
|
+
|
|
190
|
+
Um job que marcou `generated` sem ter baixado os bytes está mentindo sobre o próprio estado. Ver
|
|
191
|
+
`ai-agents/media-pipeline.md` §Storage.
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Moderação e pessoas
|
|
196
|
+
|
|
197
|
+
- **Bloqueio não cobra** (Veo). Trate-o como `rejected_by_policy`: estado terminal, **sem retry**.
|
|
198
|
+
Retentar um bloqueio é gastar dinheiro para receber o mesmo "não" — e nos provedores que cobram o
|
|
199
|
+
bloqueio, é gastar duas vezes.
|
|
200
|
+
- **`personGeneration` é restrito por região.** O mesmo prompt aprovado num mercado é recusado em
|
|
201
|
+
outro; a política tem de ser por tenant, não global.
|
|
202
|
+
- **Rostos disparam moderação com frequência.** O motivo e o contorno operacional (enquadrar do
|
|
203
|
+
pescoço para baixo, mãos, produto; reservar rosto para imagem estática) estão escritos em
|
|
204
|
+
`frontend/design-system/ai-video-generation.md` §Section 3 — este standard cita e não repete.
|
|
205
|
+
- **Nunca gere rosto de cliente real.** Além do risco jurídico, é o caso que a marcação obrigatória
|
|
206
|
+
do `media-pipeline.md` foi feita para cobrir.
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Deprecações
|
|
211
|
+
|
|
212
|
+
> **Toda data de desligamento deste standard mora nesta seção, e em lugar nenhum mais.**
|
|
213
|
+
|
|
214
|
+
Fonte, consultada em **2026-09-07**: `https://developers.openai.com/api/docs/deprecations`.
|
|
215
|
+
|
|
216
|
+
| Alias / superfície | Situação | Data |
|
|
217
|
+
|---|---|---|
|
|
218
|
+
| `sora-2`, `sora-2-pro` e a Videos API | **desligam, sem substituto** (anunciado 2026-03-24) | 2026-09-24 |
|
|
219
|
+
| `VideoClient` do `openai-dotnet` | morre junto com a API acima | 2026-09-24 |
|
|
220
|
+
|
|
221
|
+
**Próximo desligamento conhecido: 2026-09-24.** Se esta data já passou quando você está lendo, este
|
|
222
|
+
standard não está apenas velho — ele está **errado** em pelo menos uma afirmação, e a §Como
|
|
223
|
+
re-verificar diz qual página conferir. É falsificável em segundos, sem pesquisa.
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Checklist (verifiable by morph-eval)
|
|
228
|
+
|
|
229
|
+
- [ ] Nenhum código novo aponta para um alias de §Deprecações
|
|
230
|
+
- [ ] O id da operação/tarefa é **persistido antes** do primeiro polling
|
|
231
|
+
- [ ] O polling roda num job, com back-off e teto de tentativas — nunca numa request HTTP
|
|
232
|
+
- [ ] Os bytes são baixados assim que a tarefa conclui, e gravados em blob próprio
|
|
233
|
+
- [ ] O banco guarda caminho relativo + sha256, nunca a URL do provedor
|
|
234
|
+
- [ ] Bloqueio de moderação é estado terminal `rejected_by_policy`, sem retry
|
|
235
|
+
- [ ] Duração pedida respeita o mínimo do provedor (8 s no Veo quando há referência)
|
|
236
|
+
- [ ] Custo estimado gravado antes da chamada, com a tarifa de §Custo por segundo
|
|
237
|
+
- [ ] Nenhuma geração dentro de um turno de conversa
|
|
238
|
+
- [ ] Nenhum teste toca API paga — provider fake, sempre
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## Como re-verificar este standard
|
|
243
|
+
|
|
244
|
+
| Página | O que conferir |
|
|
245
|
+
|---|---|
|
|
246
|
+
| `https://developers.openai.com/api/docs/deprecations` | A tabela de §Deprecações e a linha "próximo desligamento conhecido" |
|
|
247
|
+
| `https://ai.google.dev/gemini-api/docs/veo` | Duração, resolução, limite de referências, retenção de 2 dias, `personGeneration` |
|
|
248
|
+
| `https://ai.google.dev/gemini-api/docs/pricing` | As três linhas Veo de §Custo por segundo |
|
|
249
|
+
| `https://docs.byteplus.com/en/docs/ModelArk/1520757` e `https://fal.ai/models/bytedance/seedance-2.0/image-to-video` | A faixa de preço do Seedance nos dois canais |
|
|
250
|
+
| `https://www.nuget.org/packages/Google.GenAI` | Se `GenerateVideosAsync`/`Operations.GetAsync` mudaram de forma |
|
|
251
|
+
|
|
252
|
+
Ao terminar, atualize `Last-verified` **e** o `ai-pin` citado no header.
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## References
|
|
257
|
+
|
|
258
|
+
- `ai-agents/media-pipeline.md` — o job, os estados, a idempotência, a marcação
|
|
259
|
+
- `ai-agents/modalities-image-gen.md` — imagem em runtime, e a escada de custo irmã desta
|
|
260
|
+
- `frontend/design-system/ai-video-generation.md` — footage direcional para scroll scrub via MCP:
|
|
261
|
+
loop × direcional, `endImage`, moderação E005. Consumidor diferente, tempo diferente
|
|
262
|
+
- `ai-agents/providers/model-registry.md` — o alias por provedor, com `api: videos`
|
|
263
|
+
- `backend/integrations/hangfire/hangfire-jobs.md` — o mecanismo de job que o polling usa
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
*MORPH-SPEC by Polymorphism Tech — ai-agents/media-video.md v1.0*
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
> **Keywords:** middleware, agent middleware, function calling middleware, retry, anti-hallucination, resilience, telemetry middleware, agent run middleware
|
|
6
6
|
> **Read by Claude in:** implement (when wiring cross-cutting behavior into an agent)
|
|
7
7
|
|
|
8
|
-
**Verified against:**
|
|
8
|
+
**Verified against:** Microsoft.Agents.AI 1.20.0 + Microsoft.Extensions.AI 10.9.0 (ai-pin 2026-09-08); `provado por templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentFactory.cs` para a **ordem do pipeline** — a fábrica do kit é o único lugar que conhece essa ordem, e ela é medida por teste, não herdada de folclore. As assinaturas de `Use(...)` foram **medidas por reflexão sobre `AIAgentBuilder` e `ChatClientBuilder`** em 2026-09-08. Last-verified: 2026-09-08.
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -47,7 +47,36 @@ AIAgent agent = instrumentedClient
|
|
|
47
47
|
.Build();
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
### As assinaturas, medidas
|
|
51
|
+
|
|
52
|
+
Ambas as sobrecargas de dois delegates existem no pin (reflexão em 2026-09-08):
|
|
53
|
+
|
|
54
|
+
- `AIAgentBuilder.Use(Func<...> runFunc, Func<...> runStreamingFunc)`
|
|
55
|
+
- `ChatClientBuilder.Use(Func<...> getResponseFunc, Func<...> getStreamingResponseFunc)`
|
|
56
|
+
|
|
57
|
+
Cada builder tem ainda `Use(factory)` (um delegate que embrulha o inner) e `Use(sharedFunc)` (**um** delegate que atende os dois modos). O `Use(sharedFunc)` é a resposta certa quando o middleware não se importa com streaming: escreve-se uma vez e vale para os dois caminhos.
|
|
58
|
+
|
|
59
|
+
> **Fornecer só `runFunc`/`getResponseFunc` faz o caminho de streaming rodar NÃO-streaming.** Não é erro de compilação e não há aviso: a chamada streaming é atendida pelo delegate não-streaming e o consumidor recebe a resposta inteira de uma vez, tarde. Numa UI de chat isso aparece como "o streaming parou de funcionar depois que adicionamos telemetria". Se o middleware não precisa distinguir os modos, use `Use(sharedFunc)`; se precisa, forneça **os dois**.
|
|
60
|
+
|
|
61
|
+
### A ordem do pipeline, medida
|
|
62
|
+
|
|
63
|
+
A posição de cada elo não é estética. A ordem que o ai-kit compila e testa, de fora para dentro:
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
OpenTelemetryAgent span invoke_agent — cobre a invocação inteira
|
|
67
|
+
└─ ChatClientAgent (UseProvidedChatClientAsIs = true: o pipeline abaixo é seu)
|
|
68
|
+
├─ timeout TimeoutSeconds vira CancellationToken
|
|
69
|
+
├─ usage-cost vê UMA resposta com o uso já somado das voltas
|
|
70
|
+
├─ FunctionInvoking MaxToolIterations / AllowConcurrentToolInvocation
|
|
71
|
+
├─ telemetria de chat span chat, ABAIXO do FICC
|
|
72
|
+
└─ cliente do provider memoizado pelo ModelRegistry
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Por que o middleware de custo fica ACIMA do `FunctionInvokingChatClient` (FICC):** acima dele, o middleware vê **uma** resposta cujo `Usage` já traz o total de todas as voltas de tool (medido: duas voltas de 10/4 e 30/6 chegam como `in=40, out=10`) e publica **uma** linha por chamada. Abaixo dele veria respostas parciais — e leria o mesmo objeto `UsageDetails` que o **próprio FICC muta** para acumular, o que faz a mesma conta dar resultado diferente conforme a hora de ler.
|
|
76
|
+
|
|
77
|
+
**Por que a telemetria de chat fica ABAIXO do FICC:** só assim o span `chat` fecha antes das tools e o `invoke_agent` fica sendo a raiz.
|
|
78
|
+
|
|
79
|
+
> No `ChatClientBuilder`, **o primeiro registrado é o mais externo**. Registrar o custo antes de `UseFunctionInvocation` é o que o coloca acima do FICC.
|
|
51
80
|
|
|
52
81
|
---
|
|
53
82
|
|
|
@@ -74,7 +103,9 @@ async Task<ChatResponse> TelemetryMiddleware(
|
|
|
74
103
|
}
|
|
75
104
|
```
|
|
76
105
|
|
|
77
|
-
Para o setup completo de OpenTelemetry (traces, métricas, Aspire Dashboard, `
|
|
106
|
+
Para o setup completo de OpenTelemetry (traces, métricas, Aspire Dashboard, os **dois** nomes de `ActivitySource`), consulte `ai-agents-observability-patterns`, que é o dono canônico. Não duplique aqui — este middleware é um ponto de entrada, não a solução completa.
|
|
107
|
+
|
|
108
|
+
> **Correção de 2026-09-08:** `AgentOpenTelemetryConsts` **não existe** em `Microsoft.Agents.AI` 1.20.0 (medido). As fontes reais são `Experimental.Microsoft.Agents.AI` e `Experimental.Microsoft.Extensions.AI`.
|
|
78
109
|
|
|
79
110
|
---
|
|
80
111
|
|
|
@@ -191,7 +222,8 @@ Precisa de middleware no agent?
|
|
|
191
222
|
- [ ] Function Calling middleware retorna string descritiva em vez de lançar exceção
|
|
192
223
|
- [ ] Anti-hallucination: argumentos validados antes de chamar `next()`
|
|
193
224
|
- [ ] Nenhum middleware com `using Microsoft.SemanticKernel` — MAF 1.0 GA não usa SK
|
|
194
|
-
- [ ] Streaming: se nenhum middleware streaming for fornecido, downgrade documentado como decisão consciente
|
|
225
|
+
- [ ] Streaming: se nenhum middleware streaming for fornecido, o downgrade para não-streaming está documentado como decisão consciente — ou o middleware usa `Use(sharedFunc)`
|
|
226
|
+
- [ ] A posição de cada elo é intencional: custo **acima** do `FunctionInvokingChatClient`, telemetria de chat **abaixo** dele
|
|
195
227
|
- [ ] Middleware que chama serviços externos tem timeout configurado
|
|
196
228
|
|
|
197
229
|
---
|
|
@@ -201,7 +233,9 @@ Precisa de middleware no agent?
|
|
|
201
233
|
- `ai-agents-setup` — pacotes, DI, quick start
|
|
202
234
|
- `ai-agents-production` — panorama completo: observability, A2A, MCP, caching, middleware-as-one-of-many-concerns
|
|
203
235
|
- `ai-agents-providers-model-registry` — `_modelRegistry.GetChatClient(alias)`, provider-agnostic pattern
|
|
236
|
+
- `ai-agents-observability-patterns` — dono canônico de spans, fontes e duplicação
|
|
237
|
+
- Reference implementation da ordem do pipeline (compila e é testada contra o pin): `templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentFactory.cs` + `Middleware/UsageCostMiddleware.cs`
|
|
204
238
|
|
|
205
239
|
---
|
|
206
240
|
|
|
207
|
-
*MORPH-SPEC by Polymorphism Tech — ai-agents/middleware-patterns.md
|
|
241
|
+
*MORPH-SPEC by Polymorphism Tech — ai-agents/middleware-patterns.md v2.0 (2026-09-08)*
|