@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.
- package/CLAUDE.md +20 -3
- 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 +234 -9
- 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/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/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 +140 -5
- package/src/commands/project/update.js +469 -153
- package/src/commands/project/worktree.js +8 -1
- 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 +333 -21
- 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/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,215 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: morph-media
|
|
3
|
+
description: Conduz a AUTORIA de mídia gerada por IA — escolher o modelo pelo trabalho, montar o prompt como spec versionada, encadear derivadas a partir de um herói aprovado, subir a escada de custo e conduzir o gate humano de escolha entre N candidatas. É o lado processo; o conhecimento de API, custo e conformidade vive nos standards de mídia.
|
|
4
|
+
version: core
|
|
5
|
+
when-to-invoke: quando a tarefa é PRODUZIR imagem ou vídeo por IA (catálogo, marketing, asset de LP) e alguém precisa decidir modelo, prompt e aprovação
|
|
6
|
+
user-invokable: true
|
|
7
|
+
cliVersion: "8.35.0"
|
|
8
|
+
stacks:
|
|
9
|
+
- dotnet
|
|
10
|
+
- nextjs
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# morph-media
|
|
14
|
+
|
|
15
|
+
## Objetivo
|
|
16
|
+
|
|
17
|
+
Conduzir a **autoria** de mídia gerada: a sequência de decisões humanas que vai de "precisamos de
|
|
18
|
+
uma foto do sofá em verde" até um arquivo aprovado, com o menor gasto possível e sem claim visual
|
|
19
|
+
falso.
|
|
20
|
+
|
|
21
|
+
**Esta skill não ensina API.** O que é `IImageGenerator`, quanto custa cada modelo, que alias está
|
|
22
|
+
desligado e o que a lei exige está escrito, com fonte datada, em:
|
|
23
|
+
|
|
24
|
+
| Standard | O que carrega |
|
|
25
|
+
|---|---|
|
|
26
|
+
| `.morph/framework/standards/ai-agents/modalities-image-gen.md` | Imagem em runtime: a API, os aliases pinados, custo por chamada, deprecações |
|
|
27
|
+
| `.morph/framework/standards/ai-agents/media-video.md` | Vídeo em runtime: Veo por SDK, provedores só-HTTP, custo por segundo, o arquivo que expira |
|
|
28
|
+
| `.morph/framework/standards/ai-agents/media-pipeline.md` | O job, os estados, a revisão humana, a proveniência e a marcação |
|
|
29
|
+
| `.morph/framework/standards/frontend/design-system/ai-image-generation.md` | Autoria de asset de LP via MCP: fidelidade de marca, `assets.md`, `next/image` |
|
|
30
|
+
| `.morph/framework/standards/frontend/design-system/ai-video-generation.md` | Footage direcional para scroll scrub: loop × direcional, `endImage`, moderação E005 |
|
|
31
|
+
|
|
32
|
+
Abra o que a tarefa pede. Esta skill diz **o que fazer com eles**.
|
|
33
|
+
|
|
34
|
+
## Quando invocar
|
|
35
|
+
|
|
36
|
+
Quando alguém disser "gerar imagem do produto", "fazer o vídeo do reel", "criar o hero da LP",
|
|
37
|
+
"variação de cor do móvel", "mockup para a campanha" — ou mencionar `/morph-media`.
|
|
38
|
+
|
|
39
|
+
**Quando NÃO invocar:** quando o pedido é *implementar* o subsistema de mídia num projeto .NET.
|
|
40
|
+
Isso é uma feature normal, e o insumo são os três standards de `ai-agents/` acima.
|
|
41
|
+
|
|
42
|
+
## A regra que atravessa tudo
|
|
43
|
+
|
|
44
|
+
> **Nunca gere mídia dentro de um turno de conversa.** O turno enfileira e confirma; a mídia volta
|
|
45
|
+
> depois, revisada.
|
|
46
|
+
|
|
47
|
+
Ela vale na autoria também, e por outro motivo: dentro de um turno ninguém compara candidatas. A
|
|
48
|
+
escolha entre N opções **é** o gate humano — ver §5.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Passo 1 — Escolher o modelo pelo TRABALHO, não pelo hábito
|
|
53
|
+
|
|
54
|
+
Uma pergunta decide quase tudo: **existe um produto real a preservar?**
|
|
55
|
+
|
|
56
|
+
| Trabalho | Caminho | Por quê |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| Variação sobre foto real de produto | **Edição com referência**, nunca geração do zero | Gerar do zero inventa material, medida e cor que o produto não tem — claim visual falso |
|
|
59
|
+
| Muitas referências do mesmo objeto | Modelo com maior teto de referências | O limite por modelo está no standard de imagem, §Referências de produto |
|
|
60
|
+
| Lote grande e barato (thumbnails, variantes) | O alias de piso da família, com Batch | Batch é −50 %; é a maior alavanca isolada |
|
|
61
|
+
| Texto legível dentro da imagem | Modelo com texto multilíngue, em `medium`/`high` | Texto pequeno em `low` sai errado, e re-render custa mais que ter começado certo |
|
|
62
|
+
| Asset de LP com movimento de scroll | Footage **direcional**, nunca loop | Um loop perfeito parece congelado sob scrub — `ai-video-generation.md` §Section 1 |
|
|
63
|
+
| Vídeo curto de produto em runtime | O caminho com SDK do `media-video.md` | É o único com SDK .NET oficial |
|
|
64
|
+
|
|
65
|
+
**Antes de pinar qualquer alias, abra a tabela de deprecações** do standard da modalidade. Um alias
|
|
66
|
+
desligado não é preferência de estilo: é uma chamada que devolve erro depois de você ter escrito o
|
|
67
|
+
código inteiro em cima dela.
|
|
68
|
+
|
|
69
|
+
## Passo 2 — Montar o prompt como spec versionada
|
|
70
|
+
|
|
71
|
+
Prompt de produção é **template versionado**, nunca string concatenada. A ordem importa, e as duas
|
|
72
|
+
famílias de modelo concordam nela:
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
cena/fundo → sujeito → detalhes-chave → restrições
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Seis regras que mudam o resultado mais do que qualquer outra coisa:
|
|
79
|
+
|
|
80
|
+
1. **Descreva em prosa, não em lista de keywords.** "beautiful, stunning, 4k, masterpiece" adiciona
|
|
81
|
+
ruído, não qualidade. Briefe como se briefasse um fotógrafo.
|
|
82
|
+
2. **Seja hiper-específico no sujeito.** "armadura de fantasia" produz genérico; "armadura élfica de
|
|
83
|
+
placas prateadas, gravada com folhas, gola alta, ombreiras em asa de falcão" produz uma imagem.
|
|
84
|
+
3. **Descreva em camadas** — primeiro plano, plano médio, fundo. Descrição plana produz imagem
|
|
85
|
+
plana; camadas produzem profundidade.
|
|
86
|
+
4. **Iluminação é a maior alavanca isolada de qualidade.** Sempre declare, com termos de fotografia,
|
|
87
|
+
e prefira **múltiplas fontes** com direções e temperaturas diferentes. Luz única e frontal é o
|
|
88
|
+
que faz uma imagem parecer amadora.
|
|
89
|
+
5. **Enquadre positivamente.** "rua deserta, completamente parada" funciona; "rua sem carros" não —
|
|
90
|
+
o modelo lida mal com negação.
|
|
91
|
+
6. **Contexto e finalidade entram no prompt.** "logo para uma marca de skincare minimalista premium"
|
|
92
|
+
decide melhor que "faça um logo".
|
|
93
|
+
|
|
94
|
+
**Texto na imagem:** cite literalmente entre aspas e soletre marcas. Erro de grafia é o defeito mais
|
|
95
|
+
comum dessa categoria — **confira lendo a imagem gerada** e corrija com uma edição pontual ("corrija
|
|
96
|
+
a grafia para 'X' exatamente; mantenha o resto"). Duas ou três iterações são normais.
|
|
97
|
+
|
|
98
|
+
**Aspect ratio é decisão, não default.** Escolha pelo destino final (feed, story, banner, impressão).
|
|
99
|
+
|
|
100
|
+
## Passo 3 — Editar é o oposto de gerar
|
|
101
|
+
|
|
102
|
+
| | Gerar | Editar |
|
|
103
|
+
|---|---|---|
|
|
104
|
+
| Estratégia | **Profundidade** — composição em camadas, texturas, luz dramática | **Contenção** — 1 a 2 frases, exatamente o que muda |
|
|
105
|
+
| Erro típico | Prompt raso → imagem plana e genérica | Prompt longo → o modelo "re-imagina" tudo e o resultado fica artificial |
|
|
106
|
+
|
|
107
|
+
Padrões de edição que funcionam:
|
|
108
|
+
|
|
109
|
+
- **Acrescentar/remover:** uma frase. Não explique como integrar — o modelo faz isso bem quando você
|
|
110
|
+
não o sufoca.
|
|
111
|
+
- **Trocar o fundo:** diga o fundo novo e pare. Ele casa a iluminação sozinho.
|
|
112
|
+
- **Inpaint:** nomeie o que muda e o que fica. *"Troque o sofá azul por um chesterfield de couro
|
|
113
|
+
marrom. Mantenha o resto."*
|
|
114
|
+
- **"Preserve list" repetida em CADA iteração.** É o que impede o drift de acumular.
|
|
115
|
+
- **Uma mudança por vez.** Refinamentos em série, nunca em bloco.
|
|
116
|
+
- **Ao driftar, recomece** com a descrição completa em vez de empilhar correções.
|
|
117
|
+
|
|
118
|
+
## Passo 4 — Encadear a partir de um herói aprovado
|
|
119
|
+
|
|
120
|
+
A consistência não vem do prompt; vem da **referência**.
|
|
121
|
+
|
|
122
|
+
1. Gere e **aprove** o herói primeiro — a imagem que define paleta, luz e enquadramento.
|
|
123
|
+
2. Use o herói aprovado como **referência** das derivadas. Nunca gere as derivadas em paralelo com o
|
|
124
|
+
herói: elas herdam o erro que ainda não foi visto.
|
|
125
|
+
3. Indexe cada referência no prompt ("image 1 = o sofá; image 2 = o tecido") e diga como interagem.
|
|
126
|
+
4. Imagens que vão virar vídeo são enquadradas **sem rosto** — rosto derruba moderação, e o contorno
|
|
127
|
+
está em `ai-video-generation.md` §Section 3.
|
|
128
|
+
|
|
129
|
+
**O que a IA nunca recria:** render arquitetônico do cliente e foto real de produto. Esses são
|
|
130
|
+
animados ou editados a partir do arquivo real — recriá-los é inventar o que o cliente já tem.
|
|
131
|
+
|
|
132
|
+
## Passo 5 — A escada de custo, e o gate humano que mora nela
|
|
133
|
+
|
|
134
|
+
Os dois são **o mesmo passo**, e é isso que faz a escada ser cumprida em vez de pulada.
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
1. N candidatas na qualidade MAIS BAIXA / menor duração
|
|
138
|
+
↓
|
|
139
|
+
2. GATE: humano escolhe entre as N (ou manda regenerar)
|
|
140
|
+
↓
|
|
141
|
+
3. a VENCEDORA, e só ela, é regerada em alta
|
|
142
|
+
↓
|
|
143
|
+
4. GATE: aprovação final, com marcação e destino
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Mecânica do gate, herdada de um fluxo que já rodou em produção:
|
|
147
|
+
|
|
148
|
+
- **Mostre as N lado a lado.** Uma página local simples com as opções basta; o humano responde "opção 2".
|
|
149
|
+
- **Registre a escolha** (passo, opção, arquivo) num arquivo de decisão. Sem registro, ninguém
|
|
150
|
+
reconstrói por que aquela imagem venceu.
|
|
151
|
+
- **Rejeição volta ao MESMO passo.** Regenere com o feedback e reabra o gate. Nunca avance com "a
|
|
152
|
+
menos ruim".
|
|
153
|
+
- **Para vídeo, mostre MOVIMENTO, nunca um still.** Um frame parado não prova que o scrub funciona —
|
|
154
|
+
o canvas pode estar quebrado e a foto parecer ótima. Apresente o preview navegável ou uma tira de
|
|
155
|
+
frames em posições diferentes.
|
|
156
|
+
- **Juiz LLM é pré-filtro**, para derrubar as obviamente ruins e economizar o tempo do humano. Ele
|
|
157
|
+
não assume a responsabilidade por um claim visual.
|
|
158
|
+
|
|
159
|
+
Sem a escada, a conta de gerar tudo em alta é dezenas de vezes maior — os números estão em
|
|
160
|
+
`modalities-image-gen.md` §Custo por chamada e `media-video.md` §Custo por segundo.
|
|
161
|
+
|
|
162
|
+
## Passo 6 — Fechar: nomear, marcar, registrar
|
|
163
|
+
|
|
164
|
+
- **Nome em kebab-case sem acento**, dizendo o que é: `hero-sofa-verde-01.png`.
|
|
165
|
+
- **Grave os bytes** no repositório do projeto ou no blob próprio. URL de provedor expira — e no
|
|
166
|
+
vídeo, o arquivo do provedor some em dois dias.
|
|
167
|
+
- **Registre a proveniência**: modelo, prompt final, referências, opções, custo estimado. É o que
|
|
168
|
+
responde "de onde veio esta imagem" seis meses depois.
|
|
169
|
+
- **Marque como gerada por IA** quando a imagem puder parecer autêntica sobre produto, pessoa ou
|
|
170
|
+
lugar, registrando **o texto e a superfície** — legenda, sobreposição, texto alternativo, ficha do
|
|
171
|
+
produto. "Marcado" sem dizer ONDE não responde se alguém consegue ver. A obrigação, com a ressalva
|
|
172
|
+
de fonte, está em `media-pipeline.md` §Marcação; quando a mídia nasce em runtime, o ponto de
|
|
173
|
+
publicação **recusa** sem esse par (§Como esta obrigação é presa).
|
|
174
|
+
- **Nunca publique claim visual falso:** material, medida ou cor que o produto não tem. Produto real
|
|
175
|
+
sobre cena gerada é declarado como tal.
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Mapa rápido: imagem por fase de um trabalho de marca
|
|
180
|
+
|
|
181
|
+
Quando o trabalho é identidade visual e não catálogo, a lista do que gerar é esta — e o **nível
|
|
182
|
+
mínimo** diz o que não pode faltar:
|
|
183
|
+
|
|
184
|
+
| Fase | Imagens | Nível |
|
|
185
|
+
|---|---|---|
|
|
186
|
+
| Estratégia | moodboard estratégico (1) | opcional |
|
|
187
|
+
| Naming / conceito | moodboard de conceito (1) | quando a fase roda |
|
|
188
|
+
| Identidade visual | 2-3 conceitos de logo + 1 swatch de paleta + 1 moodboard fotográfico | **core** |
|
|
189
|
+
| Templates sociais | 1-2 mockups (feed + story) | opcional |
|
|
190
|
+
| Impressos / aplicação | 1-2 mockups (cartão, fachada, tela) | opcional |
|
|
191
|
+
| Brand book | capa (1) | quando o book roda |
|
|
192
|
+
|
|
193
|
+
**Regra de ouro desta trilha:** o modelo gera **conceito e mockup**, nunca o vetor final do logo.
|
|
194
|
+
Diga isso ao usuário com todas as letras — "são conceitos para direção; o logo vetorial final é
|
|
195
|
+
trabalho de design". Tratar a saída como entregável vetorial é o erro clássico aqui.
|
|
196
|
+
|
|
197
|
+
## Anti-patterns
|
|
198
|
+
|
|
199
|
+
| Anti-pattern | Por quê é errado |
|
|
200
|
+
|---|---|
|
|
201
|
+
| Gerar tudo em alta qualidade "para já sair pronto" | Multiplica a conta por dezenas e ainda assim exige escolha |
|
|
202
|
+
| Gerar as derivadas antes de aprovar o herói | Elas herdam o erro que ninguém viu ainda |
|
|
203
|
+
| Prompt de edição longo | O modelo re-imagina a cena e o resultado fica artificial |
|
|
204
|
+
| Aprovar vídeo por um frame parado | Um still não prova movimento |
|
|
205
|
+
| Empilhar correções depois do drift | Recomeçar com descrição completa custa menos |
|
|
206
|
+
| Pinar um alias sem abrir a tabela de deprecações | Código inteiro escrito sobre um endpoint com data de morte |
|
|
207
|
+
| Guardar a URL do provedor | Ela expira; guarde os bytes |
|
|
208
|
+
| Recriar por IA o render ou a foto real do cliente | Inventa o que já existe, e vira claim falso |
|
|
209
|
+
| Tratar conceito de logo como arte final | O vetor é trabalho de design, não de modelo |
|
|
210
|
+
|
|
211
|
+
## Referências
|
|
212
|
+
|
|
213
|
+
- Os cinco standards da tabela do topo — a fonte de API, custo, prazo e conformidade.
|
|
214
|
+
- Proveniência do conhecimento absorvido: `.morph/framework/standards/PROVENANCE.json`
|
|
215
|
+
(`gemini-image`, `cinematic-lp`, `brand-design`).
|
|
@@ -4,7 +4,7 @@ description: Guia a produção dos artefatos de planejamento de uma feature (use
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao iniciar a fase plan de uma feature, após o Gate 1 (proposal aprovado)
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "8.
|
|
7
|
+
cliVersion: "8.35.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-plan
|
|
@@ -24,6 +24,13 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
|
|
|
24
24
|
|
|
25
25
|
1. **Garanta que `proposal.md` e `stack-scan.md` estão no seu contexto antes de planejar.** Se não tem o conteúdo atual em contexto (sessão fresca, ou conteúdo possivelmente desatualizado), **use a tool Read para carregá-los** — não confie em cache de turnos anteriores. Na dúvida, Read. `.morph/features/{feature}/0-proposal/proposal.md` (problema, escopo, riscos — o comportamento é destilado aqui no passo 2, não vem pronto do proposal) e `.morph/features/{feature}/0-proposal/stack-scan.md` (contexto técnico detectado: greenfield vs brownfield, stack atual, drift). Em brownfield, o stack-scan informa decisões de spec/mandate — não invente padrões que conflitam com o detectado.
|
|
26
26
|
|
|
27
|
+
**E `.morph/features/{feature}/1-design/*.md`, quando o diretório existe** — os artefatos da fase
|
|
28
|
+
uiux (wireframes, decisões de layout, componentes propostos). Leia TODOS os `.md` de lá: eles
|
|
29
|
+
descrevem comportamento de interface que o `proposal.md` não carrega, e um plano que os ignora
|
|
30
|
+
dimensiona a feature pela metade. **Diretório ausente NÃO é erro** — a fase uiux é opcional
|
|
31
|
+
(MORPH.md §2.1) e a maioria das features não a toma; nesse caso não há passo nenhum a rodar e o
|
|
32
|
+
plano segue idêntico ao de hoje.
|
|
33
|
+
|
|
27
34
|
1b. **Scout — mapa do território antes de planejar (opcional, mas o default em feature grande ou brownfield).** É o call-site do "scout opcional antes do plan" que a MORPH.md promete. Dispare quando a feature toca área que você não tem em contexto, ou quando o `stack-scan.md` acusou brownfield com desvios.
|
|
28
35
|
|
|
29
36
|
```
|
|
@@ -145,9 +152,19 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
|
|
|
145
152
|
dentro de um worktree. Se estiver cravado, **isso é uma task**.
|
|
146
153
|
- **Setup de autenticação**, se a aplicação tem login: `e2e.auth` em `config.json`
|
|
147
154
|
(`mode: seed|storageState|bypass|none`, `seedCommand`, `storageStatePath`, `envFile`), com as
|
|
148
|
-
credenciais num `.env.e2e` **gitignored** — nunca no config commitado.
|
|
155
|
+
credenciais num `.env.e2e` **gitignored** — nunca no config commitado. **`mode` é obrigatório
|
|
156
|
+
sempre que houver `seedCommand`**: com `mode` ausente (ou `"none"`) o seed fica **inerte** — o
|
|
157
|
+
comando está configurado e nunca roda, e o autor acredita que a base é semeada. O `verify`
|
|
158
|
+
avisa (`[e2e] warning: …` nomeando `e2e.auth.seedCommand` e `e2e.auth.mode`), mas um aviso não
|
|
159
|
+
repara um plano: escreva o `mode` no config que a task de setup entrega. **Se a app tem login e
|
|
149
160
|
isso não existe, crie a task de setup**: sem ela a navegação para na tela de login e a
|
|
150
161
|
verificação de runtime vira teatro. É gap de Gate 2, não dispensa de Gate 3.
|
|
162
|
+
- **Baseline de contagem de testes é um COMANDO aqui também:** se o projeto declara
|
|
163
|
+
`project.tests[]`, o `expectedCount` de cada suíte é gravado por `morph-spec verify {feature}
|
|
164
|
+
--record-baseline` a partir de uma execução verde — **nunca digitado no config**. Um número
|
|
165
|
+
inventado **alto demais** deixa o verify vermelho por `count-drop` e trava o próprio comando que
|
|
166
|
+
o consertaria (só sai rebaixando/apagando o número à mão). Forma de `project.tests[]`:
|
|
167
|
+
`.morph/framework/CLI.md`, seção "Suítes de teste".
|
|
151
168
|
- **Quando não se aplica** (biblioteca pura, chore sem runtime), registre a dispensa e o porquê.
|
|
152
169
|
- Checklist de done com critérios verificáveis por tarefa.
|
|
153
170
|
- **Baseline é um COMANDO, nunca um número.** O mandate congela no Gate 2 e é lido por
|
|
@@ -221,6 +238,19 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
|
|
|
221
238
|
|
|
222
239
|
**Preencha `outputs` (paths planejados) em cada task** — o `morph-spec dag` usa os outputs para detectar colisão de arquivos entre fluxos paralelos e recomendar `isolation: "worktree"`. Task sem `outputs` entra como footprint desconhecido (não força isolamento, mas o dag não consegue protegê-la de colisão).
|
|
223
240
|
|
|
241
|
+
**5c. Cross-check do `1-design/` — todo aviso de capacidade tem destino.** Se o diretório existe,
|
|
242
|
+
rode antes de fechar o array `tasks`:
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
grep -riE "capacidade nova|precisa de backend|dimensionar junto" .morph/features/{feature}/1-design/
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Cada ocorrência é o designer dizendo que a tela pede algo que ainda não existe. Ela vira **task
|
|
249
|
+
irmã** no `tasks.json` **ou** exclusão registrada em `decisions.md` com o motivo — **nunca fica
|
|
250
|
+
sem destino**. Medido em campo: duas ocorrências dessas passaram batidas em features reais e
|
|
251
|
+
viraram trabalho descoberto na fase implement, quando o escopo já estava aprovado no Gate 2.
|
|
252
|
+
Sem hits, ou sem `1-design/`, o passo é um no-op silencioso.
|
|
253
|
+
|
|
224
254
|
Antes de retornar, valide rodando `morph-spec dag {feature}` — o comando parseia e valida o schema do tasks.json (ids únicos `T\d+`, enums de `status`/`effort`, `dependencies` válidas) e já imprime a análise de DAG que a `/morph-apply` vai usar. Erros de schema abortam com a lista do que corrigir.
|
|
225
255
|
|
|
226
256
|
6. Apresente o Gate 2 segundo trust mode.
|
|
@@ -283,6 +313,7 @@ Ao registrar a aprovação do Gate 2, atualize o frontmatter de cada use case de
|
|
|
283
313
|
- `morph-spec graph explain|affected --uses-only` — "isto já existe?" e "quem usa de verdade" (passo 1c); **sem grafo, o fallback é `grep -rn`**
|
|
284
314
|
- `.morph/context/README.md` — inventário do projeto (entidades, endpoints, componentes com path); insumo declarado do passo 1c, atualizado por `morph-spec context refresh`
|
|
285
315
|
- `.morph/specs/usecases/` — acervo permanente de use cases do projeto (`usecase reserve` já lê antes de numerar; em `bug`, é onde mora o UC a corrigir)
|
|
316
|
+
- `.morph/features/{feature}/1-design/` — artefatos da fase uiux, insumo do passo 1 e do cross-check do passo 5c (ausente não é erro)
|
|
286
317
|
- `.morph/features/{feature}/0-proposal/proposal.md` — escopo da feature
|
|
287
318
|
- `.morph/features/{feature}/0-proposal/stack-scan.md` — contexto técnico detectado
|
|
288
319
|
- `.morph/framework/schemas/tasks.schema.json` — schema e enums de tasks.json
|
|
@@ -4,7 +4,7 @@ description: Orquestra a fase de proposta+plano de uma feature morph-spec. Encad
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao receber instrução "use /morph-proposal" do usuário, ou ao iniciar uma nova feature
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "8.
|
|
7
|
+
cliVersion: "8.35.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-proposal
|
|
@@ -4,7 +4,7 @@ description: Conduz a fase de revisão e produz o review-report.md para o Gate 3
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao iniciar a fase review, após todas as tasks de tasks.json estarem com status `done`
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "8.
|
|
7
|
+
cliVersion: "8.35.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-review
|
|
@@ -59,16 +59,21 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
59
59
|
que este passo trata — prossiga com o dispatch abaixo.
|
|
60
60
|
|
|
61
61
|
**Despache o avaliador independente** — o score do Gate 3 nunca é auto-atribuído por quem implementou:
|
|
62
|
-
- Rode `morph-spec verify {feature} --json` (escopo feature) e capture o JSON — é a saída real de build+testes+validadores+e2e que você anexa ao prompt do avaliador independente (`morph-evaluator`).
|
|
62
|
+
- Rode `morph-spec verify {feature} --json` (escopo feature) e capture o JSON — é a saída real de build+testes+validadores+e2e que você anexa ao prompt do avaliador independente (`morph-evaluator`). **Sem `--filter`, sempre:** o `--filter` é do loop por task, onde o relógio de uma task não paga a suíte inteira; a prova que o avaliador lê tem de cobrir **todos** os nós de `nodes.tests.runs[]` (uma suíte filtrada aparece como `skip` nomeando o filtro — Gate 3 aberto sobre isso é verde sobre código não testado). Se a suíte inteira não couber numa chamada, rode-a em background; não a encolha com `--filter`.
|
|
63
63
|
- **Confira o nó `e2e` do verify antes de despachar.** Ele carrega o estado do stack:
|
|
64
64
|
- `pass` → a aplicação subiu e está saudável; o avaliador pode navegá-la. **Passe a URL no prompt**
|
|
65
65
|
— cada feature roda no seu bloco de portas, não em `localhost:3000`; pegue de
|
|
66
66
|
`morph-spec e2e status {feature} --json` (`baseUrl`) e não deixe o avaliador adivinhar.
|
|
67
67
|
- `fail` → **não abra o Gate 3.** Volte ao loop de correção: a app não sobe, ou as specs quebraram.
|
|
68
|
-
- `skip` →
|
|
69
|
-
|
|
70
|
-
`
|
|
71
|
-
|
|
68
|
+
- `skip` → **a classificação já é do `gate-check`, não sua.** A razão literal do skip viaja no
|
|
69
|
+
stamp `verification` (`e2eReason`) e `classifyE2eSkip` — em `risk-detector.js`, fonte única —
|
|
70
|
+
decide: `project` ("não containeriza") e `scope` ("o grupo de tasks não toca runtime") são
|
|
71
|
+
**dispensa legítima** e passam com o motivo gravado em `gateDecisions.review.signals`;
|
|
72
|
+
`environment` ("docker indisponível"), `requested` (`--skip-e2e`) e `unknown` (qualquer outra
|
|
73
|
+
razão, **inclusive razão nenhuma**) **pausam o Gate 3 sozinhos**. Não registre `gate-decision`
|
|
74
|
+
à mão para esses casos — deixou de ser necessário. O que continua sendo seu: dizer ao avaliador
|
|
75
|
+
que a app **não** foi exercida, e atacar a causa (rodar o e2e onde ele possa rodar) em vez de
|
|
76
|
+
despachar como se ela tivesse sido.
|
|
72
77
|
- **Confira também `traceability.warnings`** (advisory, nunca faz `verify` falhar): cada entrada é
|
|
73
78
|
um arquivo citado no `recap.md` sem task dona em `outputs` — repasse ao avaliador como sinal de
|
|
74
79
|
rastreabilidade para a dimensão de qualidade, não como bloqueio automático do gate.
|
|
@@ -118,6 +123,89 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
118
123
|
dimensão e ainda assim piorou o produto — e essa pergunta é a única
|
|
119
124
|
que o score não faz sozinho. Não aceite "agora tem teste" como
|
|
120
125
|
fechamento: RE-EXECUTE os probes da rodada anterior.
|
|
126
|
+
PROCURE O QUE ESTÁ ERRADO — não confirme o que já foi dito.
|
|
127
|
+
Um relatório que só concorda com o recap não avaliou nada. A
|
|
128
|
+
pergunta que orienta a sua sessão inteira é: O QUE O IMPLEMENTADOR
|
|
129
|
+
NÃO VIU? O que ele não podia ver do lugar onde estava, o que ele
|
|
130
|
+
viu e não mediu, e o que ele mediu com a régua errada.
|
|
131
|
+
PROVE, não confie: um teste verde prova que o código RODA, nunca
|
|
132
|
+
que o teste MORDE. Aplique as cinco rubricas de PROVA e pontue-as
|
|
133
|
+
0-10 (elas NÃO são dimensões do composto; impõem teto em
|
|
134
|
+
test-coverage):
|
|
135
|
+
.morph/framework/evals/proof-rubrics/mutation-proof.md
|
|
136
|
+
.morph/framework/evals/proof-rubrics/verde-nao-e-coberto.md
|
|
137
|
+
.morph/framework/evals/proof-rubrics/fiacao.md
|
|
138
|
+
.morph/framework/evals/proof-rubrics/guard-cego.md
|
|
139
|
+
.morph/framework/evals/proof-rubrics/eval-de-modelo.md
|
|
140
|
+
E, SÓ quando a feature chama LLM, mais uma — que impõe teto em
|
|
141
|
+
code-quality, não em test-coverage:
|
|
142
|
+
.morph/framework/evals/proof-rubrics/observabilidade-genai.md
|
|
143
|
+
A aplicabilidade dela NÃO é determinística, e isso é deliberado:
|
|
144
|
+
nenhuma leitura de tasks.json ou do mandate mede "esta feature
|
|
145
|
+
chama um modelo". São DUAS etapas. (1) FILTRO mecânico, de alta
|
|
146
|
+
recall: o mandate.md cita ao menos um standard ai-agents — falso
|
|
147
|
+
⇒ `not_evaluated`, sem mais discussão. (2) DETERMINAÇÃO sua, por
|
|
148
|
+
escrito: a feature entrega código que CHAMA um modelo? Registre a
|
|
149
|
+
resposta COM O MOTIVO (o símbolo/arquivo que chama, ou por que o
|
|
150
|
+
diff não chama nada). Task com group em {docs, tests} é INDÍCIO
|
|
151
|
+
contra, nunca veredito — um harness de agente vive inteiro em
|
|
152
|
+
`tests`. `not_evaluated` NÃO aplica teto, e um not_evaluated MUDO
|
|
153
|
+
não é dispensa: é o escape que o standard ai-agents-guardrails
|
|
154
|
+
proíbe (standard, não rubrica — não existe rubrica de guardrails).
|
|
155
|
+
Ela pergunta a PROPRIEDADE ("dá para reconstruir o que foi
|
|
156
|
+
ao provedor, e o que ele respondeu, neste turno?"), nunca "tem span
|
|
157
|
+
OpenTelemetry?": telemetria própria COM teste de fidelidade alcança
|
|
158
|
+
9-10 igual, e wiring sem evidência capturada não passa de 8.
|
|
159
|
+
MUTAÇÃO — o método, e a ordem dele importa:
|
|
160
|
+
- COMMITE O FIX ANTES DE MUTAR. Se a sessão morrer no meio, o
|
|
161
|
+
que sobrevive é a mutação, não a correção.
|
|
162
|
+
- Ancore no CALL SITE que carrega a decisão, não no `if`
|
|
163
|
+
refatorado. Uma rodada POR CLÁUSULA de um predicado composto.
|
|
164
|
+
- Rode a suíte INTEIRA (sem filtro): só ela autoriza a frase
|
|
165
|
+
"derruba N de M". Filtro estreito é prova vácua.
|
|
166
|
+
- LEIA O MOTIVO da falha, não só o md5: md5 prova que ALGO
|
|
167
|
+
mudou, jamais O QUÊ.
|
|
168
|
+
- REVERTA por snapshot/restore de BYTES (cópia feita ANTES) +
|
|
169
|
+
`os.utime` para devolver o mtime, e confirme por md5. NUNCA
|
|
170
|
+
`git checkout --`: ele descarta trabalho não commitado de
|
|
171
|
+
outra pessoa — aconteceu de verdade num Gate 3 desta epic.
|
|
172
|
+
- TERMINE com `git status --porcelain src/` VAZIO. Mutação
|
|
173
|
+
esquecida em produção é o pior desfecho deste método.
|
|
174
|
+
Grave no relatório a seção `## Mutações`, uma linha por mutação,
|
|
175
|
+
com os CINCO campos: arquivo:linha | diff | md5 antes/depois |
|
|
176
|
+
quantos testes derrubou (sobre o total da suíte) | o MOTIVO
|
|
177
|
+
literal da falha. Feature sem código de produção declara a seção
|
|
178
|
+
com a linha `não aplicável — feature sem código de produção`. A
|
|
179
|
+
seção é OBRIGATÓRIA: sem ela o `morph-spec gate-check` PAUSA o
|
|
180
|
+
Gate 3 sozinho, e nenhum score alto compra a passagem.
|
|
181
|
+
MÍDIA GERADA — rubrica CONDICIONAL, aplique SÓ se a feature gera
|
|
182
|
+
mídia (alguma task de tasks.json cita, em standards[], um destes:
|
|
183
|
+
standards/ai-agents/modalities-image-gen.md,
|
|
184
|
+
standards/ai-agents/media-video.md,
|
|
185
|
+
standards/ai-agents/media-pipeline.md). Nesse caso aplique também
|
|
186
|
+
e pontue 0-10:
|
|
187
|
+
.morph/framework/evals/proof-rubrics/media-claims.md
|
|
188
|
+
Ela cobra QUATRO afirmações — custo, revisão humana, marcação e
|
|
189
|
+
hot path não bloqueado — cada uma com o código que a prende e o
|
|
190
|
+
teste que a prova. Grave a seção `## Mídia gerada` com uma linha
|
|
191
|
+
por afirmação. A seção é OBRIGATÓRIA nessa condição: sem ela o
|
|
192
|
+
`morph-spec gate-check` PAUSA o Gate 3. Feature que NÃO gera mídia
|
|
193
|
+
não declara a seção nem a chave — a isenção é automática, e
|
|
194
|
+
escrever a seção "por precaução" é cerimônia vazia.
|
|
195
|
+
Grave também a linha literal, machine-readable:
|
|
196
|
+
`**Proof-Scores:** mutation={n} verde={n} fiacao={n} guard={n} eval={n}`
|
|
197
|
+
— os cinco 0-10, na ordem das rubricas acima. O MENOR deles
|
|
198
|
+
impõe o teto em test-coverage (tabela em
|
|
199
|
+
.morph/framework/evals/rubrics/test-coverage.md).
|
|
200
|
+
Se a feature gera mídia, acrescente ` media={n}` à MESMA linha.
|
|
201
|
+
Se a rubrica de observabilidade GenAI se aplicar, acrescente
|
|
202
|
+
` obs={n}` (ou ` obs=not_evaluated`) à MESMA linha.
|
|
203
|
+
As duas são lidas À PARTE: NÃO entram no mínimo acima (um media ou
|
|
204
|
+
um obs baixo não pode derrubar o teto de teste por um motivo que
|
|
205
|
+
não é de teste). `media` impõe teto em ARQUITETURA (tabela em
|
|
206
|
+
.morph/framework/evals/rubrics/architecture.md) e `obs` impõe teto
|
|
207
|
+
em CODE-QUALITY (tabela em
|
|
208
|
+
.morph/framework/evals/rubrics/code-quality.md).
|
|
121
209
|
Contrato do relatório final: GRAVE seu relatório em
|
|
122
210
|
`.morph/features/{feature}/4-review/evaluator-report.md` ANTES de
|
|
123
211
|
encerrar — esse arquivo é o valor de retorno autoritativo desta
|
|
@@ -137,6 +225,33 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
137
225
|
é falha de protocolo.
|
|
138
226
|
```
|
|
139
227
|
- **Fallback (tipo não registrado):** se `morph-evaluator` não estiver na sua lista de subagent types, despache `general-purpose` colando o campo `persona` do agente `evaluator` (Read em `.morph/framework/agents.json`) no topo do prompt — e **registre o fallback no review-report** (seção de método).
|
|
228
|
+
- **Ao retomar o controle, HIGIENE DA ÁRVORE antes de qualquer leitura de score.** Rode, nesta
|
|
229
|
+
ordem e ANTES de abrir o relatório:
|
|
230
|
+
```bash
|
|
231
|
+
git status --porcelain src/ # vazio = o avaliador reverteu o que mutou
|
|
232
|
+
grep -rn "MUTACAO" src/ # nenhum hit = nenhum marcador esquecido
|
|
233
|
+
```
|
|
234
|
+
(No PowerShell, `Select-String -Path src -Pattern MUTACAO -Recurse` faz o mesmo; o shell do
|
|
235
|
+
harness é Git Bash, então a forma POSIX acima é a canônica.) **Por que antes:** o avaliador
|
|
236
|
+
muta código de produção de propósito, e um avaliador que morreu no meio da rodada deixa a
|
|
237
|
+
mutação NO DISCO. Ler o score primeiro e só depois descobrir a árvore suja significa ter
|
|
238
|
+
avaliado — e possivelmente aprovado — um estado que ninguém quis. E **não rode build/teste
|
|
239
|
+
enquanto o agente ainda está `running`**: ele muta o disco a meio, e o vermelho que você veria
|
|
240
|
+
seria da mutação dele, não do produto.
|
|
241
|
+
|
|
242
|
+
Árvore suja aqui é **falha de protocolo**. Reverta **pela mesma disciplina que o prompt exige
|
|
243
|
+
do avaliador** — nunca por git: peça o snapshot que ele diz ter feito (`cp` ANTES de mutar) e
|
|
244
|
+
restaure por cópia, conferindo `md5sum` de cada arquivo. Sem snapshot recuperável, o caminho é
|
|
245
|
+
desfazer a edição **linha a linha**, a partir do `diff` que a seção `## Mutações` obriga a
|
|
246
|
+
registrar. Registre o que fez na seção de método do review-report.
|
|
247
|
+
|
|
248
|
+
> **NUNCA `git checkout -- src/` aqui**, nem com ressalva. Na árvore típica de uma feature em
|
|
249
|
+
> review **não existe nenhum commit da feature** — o trabalho inteiro está não commitado, e o
|
|
250
|
+
> `checkout` o apaga junto com a mutação. Numa árvore desta epic havia 23 arquivos modificados
|
|
251
|
+
> e zero commits próprios; nesta mesma epic um avaliador rodou esse comando e destruiu
|
|
252
|
+
> alterações não commitadas de outro agente (só não houve perda porque ele tinha capturado o
|
|
253
|
+
> diff antes). É a mesma proibição que o prompt do passo 4 já dá ao avaliador: aqui ela vale
|
|
254
|
+
> para VOCÊ.
|
|
140
255
|
- **Leia primeiro** `.morph/features/{feature}/4-review/evaluator-report.md` — é o valor de retorno autoritativo, não a mensagem de texto do dispatch (que é cortesia, útil só quando chega inteira). Os scores por dimensão e o composto do review-report vêm **desse arquivo**, não da sua auto-avaliação. Se o arquivo vier ausente, oco, ou sem os scores por dimensão, registre a falha de protocolo na seção de método do review-report e re-despache.
|
|
141
256
|
|
|
142
257
|
5. Produza `review-report.md` em `.morph/features/{feature}/4-review/` com:
|
|
@@ -152,6 +267,24 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
152
267
|
avaliador navegou. Dispensa (`skip`) entra aqui **por extenso**: o valor de um gate está tanto
|
|
153
268
|
no que ele provou quanto no que ele deixou de provar, e uma dispensa silenciosa se lê como
|
|
154
269
|
aprovação. Se houver spec Playwright recomendada pelo avaliador, liste-a como melhoria.
|
|
270
|
+
- **Prova de mutação** — a seção `## Mutações` do `evaluator-report.md`, repassada aqui em
|
|
271
|
+
resumo (quantas mutações, quantas derrubaram teste, e a linha `**Proof-Scores:**`). O formato
|
|
272
|
+
que o avaliador grava, e que o `morph-spec gate-check` cobra:
|
|
273
|
+
|
|
274
|
+
```markdown
|
|
275
|
+
## Mutações
|
|
276
|
+
|
|
277
|
+
| # | Arquivo:linha | Mutação (diff) | md5 antes | md5 depois | Testes derrubados | Motivo da falha |
|
|
278
|
+
|---|---|---|---|---|---|---|
|
|
279
|
+
| M1 | src/lib/x.js:42 | `- if (a && b)` / `+ if (a)` | abc… | def… | 3 de 2684 | `expected 3 got 0` em x.test.js:88 |
|
|
280
|
+
|
|
281
|
+
**Reversão:** snapshot/restore de bytes + `os.utime`; `git status --porcelain src/` vazio.
|
|
282
|
+
**Proof-Scores:** mutation=9 verde=8 fiacao=9 guard=7
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
Feature sem código de produção declara a seção com `não aplicável — feature sem código de
|
|
286
|
+
produção`. **Sem a seção, o `gate-check review` PAUSA** — a regra vive em código
|
|
287
|
+
(`risk-detector.js`), não na boa vontade do prompt.
|
|
155
288
|
- Lista de itens bloqueantes (se houver) — com descrição e critério de resolução
|
|
156
289
|
- Lista de melhorias recomendadas (não bloqueantes)
|
|
157
290
|
- Recomendação final: Aprovado / Rejeitar com condições / Reprovar
|
|
@@ -161,6 +294,20 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
161
294
|
(A barra de avanço por task é 9; uma dimensão individual abaixo de 8 no review da feature
|
|
162
295
|
inteira é um bloqueante crítico que o loop de correção deveria ter pego.)
|
|
163
296
|
|
|
297
|
+
**Para CONFIRMAR uma correção, retome o MESMO avaliador — não despache um frio.** Use
|
|
298
|
+
`SendMessage` com o id do agente que já avaliou, colando no recado o `git status --porcelain` e o
|
|
299
|
+
`git log --oneline` do que mudou desde o relatório dele. Ele já tem em contexto o que apontou e
|
|
300
|
+
os probes que rodou; um avaliador novo re-descobre o produto inteiro para checar um item, e
|
|
301
|
+
re-executa do zero os probes da rodada anterior.
|
|
302
|
+
|
|
303
|
+
> Isto **não** contradiz a cláusula que proíbe o **sub-agent** de chamar `SendMessage`. As
|
|
304
|
+
> direções são opostas: o sub-agent não chama `SendMessage` porque o retorno dele é o ARQUIVO, e
|
|
305
|
+
> uma mensagem a mais custa um turno inútil ao orquestrador. Aqui quem fala é o ORQUESTRADOR,
|
|
306
|
+
> para dentro de uma sessão que ele mesmo abriu — a única forma de continuar uma avaliação em vez
|
|
307
|
+
> de recomeçá-la. Se o agente já encerrou e o id não retoma, aí sim despache um novo, e diga a
|
|
308
|
+
> ele no prompt que é uma REAVALIAÇÃO (o relatório é append-only: ele acrescenta ao fim, e o
|
|
309
|
+
> `gate-check` lê o token do FIM, o vigente).
|
|
310
|
+
|
|
164
311
|
7. **NÃO finalize o trace manualmente.** O hook `trace-autogen` gera e finaliza `.morph/traces/YYYY-MM-DD-{feature}-implement.json` automaticamente (incl. `phase_summary` e `completed_at`) no último write de `tasks.json` — quando a última task sai de `pending`/`in_progress`. Se o trace parecer desatualizado, a causa é um `morph-spec score` faltante ou um recap sem o bloco da task — corrija a fonte, não o trace.
|
|
165
312
|
|
|
166
313
|
8. Apresente o Gate 3 segundo trust mode — **única apresentação do gate**: `morph-apply` §5 aponta
|
|
@@ -168,12 +315,14 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
168
315
|
|
|
169
316
|
Rode `morph-spec gate-check {feature} review [--json]` — lê `trust` de `.morph/config/config.json`, decide via `shouldPauseGate` e persiste `gateDecisions.review` com timestamp server-side, imprimindo `pause`/`reason`/`signals`. É o default — não recompute a tabela do MORPH.md §5 em linguagem natural.
|
|
170
317
|
|
|
171
|
-
|
|
318
|
+
**NÃO passe `evalScore` por `--signals` aqui.** O composto do avaliador é lido do disco sozinho: o `gate-check` procura o token `**Composite-Score:**` em `4-review/evaluator-report.md` (passo 4) e carimba `evalScoreSource: evaluator-report` — a **única** procedência que o Gate 3 aceita. Um `evalScore` vindo por override troca o valor mas rebaixa a procedência para `signals-override`, e o Gate 3 **pausa** por "sem score do avaliador independente" sem sequer olhar o número — inclusive quando é o mesmo número do relatório. Sem o token (relatório ausente ou oco), o `evalScore` cai na **PROXY** das `taskScores` — auto-avaliação de quem implementou — e o gate pausa igual. A correção, nos dois casos, é produzir o relatório íntegro do passo 4; nunca o override.
|
|
319
|
+
|
|
320
|
+
Os itens bloqueantes das **verificações mecânicas sempre-rodar** do passo 3 continuam entrando por `--signals` — é para isso que a flag serve aqui:
|
|
172
321
|
```
|
|
173
|
-
morph-spec gate-check {feature} review --signals '{"
|
|
322
|
+
morph-spec gate-check {feature} review --signals '{"standardsViolations":[]}'
|
|
174
323
|
```
|
|
175
324
|
|
|
176
|
-
Julgamento do revisor que nenhuma dessas chaves representa: use `gate-decision` direto em vez de `gate-check
|
|
325
|
+
Julgamento do revisor que nenhuma dessas chaves representa — e forçar a passagem apesar da pausa: use `gate-decision` direto em vez de `gate-check` (`morph-spec gate-decision {feature} review --pause false --reason "..."`), que é explícito e fica registrado.
|
|
177
326
|
|
|
178
327
|
**Nunca edite `feature.json` à mão** (colide com o hook state-sync — erro "file modified since read"). Os caminhos acima gravam no mesmo lugar; o hook `gate-guard.js` confere depois se a ação bateu com a decisão persistida.
|
|
179
328
|
|
|
@@ -218,6 +367,14 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
218
367
|
- `.morph/framework/MORPH.md` — seção 5 (Gate 3 + regras de pausa), seção 1 (papel Evaluator), Trust Mode
|
|
219
368
|
- `.claude/agents/morph-evaluator.md` — subagent do avaliador (gerado de `.morph/framework/agents.json`), despachado no passo 4
|
|
220
369
|
- `.claude/skills/morph-eval/SKILL.md` — rubricas e bandas que o avaliador aplica
|
|
370
|
+
- `.morph/framework/evals/proof-rubrics/` — as sete rubricas de PROVA citadas no prompt do passo 4
|
|
371
|
+
(`mutation-proof.md`, `verde-nao-e-coberto.md`, `fiacao.md`, `guard-cego.md`, `eval-de-modelo.md`, `media-claims.md`, `observabilidade-genai.md`):
|
|
372
|
+
não são dimensões do composto. **Cinco** impõem teto em `test-coverage` pelo MENOR delas — as quatro
|
|
373
|
+
universais mais `eval-de-modelo`, que perguntam a mesma coisa: *a evidência é real?*. As outras
|
|
374
|
+
duas são condicionais e entram FORA do menor-das-cinco: `media-claims.md`, em feature que gera
|
|
375
|
+
mídia, impõe teto em `architecture`; `observabilidade-genai.md`, em feature que chama LLM, impõe
|
|
376
|
+
teto em `code-quality`. Somá-las faria um `media=4` ou um `obs=4` derrubar o teto de TESTE por um
|
|
377
|
+
motivo que não tem nada a ver com teste.
|
|
221
378
|
- `.morph/framework/evals/trace-schema.md` — formato canônico do trace
|
|
222
379
|
- `.morph/features/{feature}/2-plan/mandate.md` — critérios de done da feature
|
|
223
380
|
- `.morph/features/{feature}/2-plan/spec.md` — arquitetura e contratos
|
|
@@ -4,7 +4,7 @@ description: Varre o codebase existente, detecta stack atual, compara com o stac
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao iniciar uma feature em projeto brownfield (codebase já existente)
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "8.
|
|
7
|
+
cliVersion: "8.35.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-stack-scan
|
|
@@ -4,7 +4,7 @@ description: Localiza um standard específico via busca server-side (morph-spec
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: quando precisar consultar um standard específico durante a implementação
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "8.
|
|
7
|
+
cliVersion: "8.35.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-standards
|
|
@@ -4,7 +4,7 @@ description: Conduz a fase opcional de UI/UX — design system, mockups, compone
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao tomar o ramo uiux (morph-spec advance --design), depois do Gate 1 e antes do morph-plan
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "8.
|
|
7
|
+
cliVersion: "8.35.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-uiux
|