agentic-dev 0.2.11 → 0.2.12
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/README.md +53 -46
- package/package.json +8 -22
- package/.agent/prd.json +0 -29
- package/.agent/progress.txt +0 -1
- package/.agent/prompt.md +0 -21
- package/.agent/ralph-loop-state.json +0 -13
- package/.agent/ralph-supervisor-state.json +0 -12
- package/.agent/ralph-supervisor.sh +0 -238
- package/.agent/ralph.sh +0 -305
- package/.agent/runs/README.md +0 -7
- package/.agent/sdd-build-ast-audit.json +0 -13
- package/.claude/CLAUDE.md +0 -44
- package/.claude/agentic-dev.json +0 -3
- package/.claude/agents/ai-dev.md +0 -27
- package/.claude/agents/backend-dev.md +0 -26
- package/.claude/agents/db-dev.md +0 -26
- package/.claude/agents/devops.md +0 -27
- package/.claude/agents/frontend-dev.md +0 -25
- package/.claude/agents/github-ops.md +0 -25
- package/.claude/agents/test-dev.md +0 -26
- package/.claude/agents/uiux-designer.md +0 -25
- package/.claude/settings.json +0 -49
- package/.claude/settings.local.json +0 -8
- package/.claude/skills/sdd/SKILL.md +0 -189
- package/.claude/skills/sdd/agents/openai.yaml +0 -4
- package/.claude/skills/sdd/references/section-map.md +0 -67
- package/.claude/workspace-config.json +0 -3
- package/.codex/agentic-dev.json +0 -3
- package/.codex/agents/README.md +0 -22
- package/.codex/agents/api.toml +0 -11
- package/.codex/agents/architecture.toml +0 -11
- package/.codex/agents/ci.toml +0 -11
- package/.codex/agents/gitops.toml +0 -11
- package/.codex/agents/orchestrator.toml +0 -11
- package/.codex/agents/quality.toml +0 -11
- package/.codex/agents/runtime.toml +0 -11
- package/.codex/agents/security.toml +0 -11
- package/.codex/agents/specs.toml +0 -11
- package/.codex/agents/ui.toml +0 -11
- package/.codex/config.toml +0 -46
- package/.codex/skills/SKILL.md +0 -13
- package/.codex/skills/sdd/SKILL.md +0 -189
- package/.codex/skills/sdd/agents/openai.yaml +0 -4
- package/.codex/skills/sdd/references/section-map.md +0 -67
- package/.dockerignore +0 -8
- package/.env.example +0 -50
- package/.gitignore +0 -16
- package/AGENTS.md +0 -86
- package/SDD_SKILL.md +0 -589
- package/compose.yml +0 -206
- package/infra/compose/.env.dev.example +0 -28
- package/infra/compose/.env.prod.example +0 -29
- package/infra/compose/README.md +0 -35
- package/infra/compose/dev.yml +0 -125
- package/infra/compose/prod.yml +0 -126
- package/infra/terraform/README.md +0 -34
- package/infra/terraform/aws/data/.terraform.lock.hcl +0 -25
- package/infra/terraform/aws/data/README.md +0 -18
- package/infra/terraform/aws/data/main.tf +0 -147
- package/infra/terraform/aws/data/outputs.tf +0 -14
- package/infra/terraform/aws/data/variables.tf +0 -57
- package/infra/terraform/aws/data/versions.tf +0 -10
- package/infra/terraform/aws/domain/.terraform.lock.hcl +0 -25
- package/infra/terraform/aws/domain/README.md +0 -20
- package/infra/terraform/aws/domain/env/dev.tfvars.example +0 -6
- package/infra/terraform/aws/domain/env/prod.tfvars.example +0 -7
- package/infra/terraform/aws/domain/main.tf +0 -149
- package/infra/terraform/aws/domain/outputs.tf +0 -29
- package/infra/terraform/aws/domain/variables.tf +0 -58
- package/infra/terraform/aws/domain/versions.tf +0 -10
- package/infra/terraform/openstack/README.md +0 -38
- package/infra/terraform/openstack/dev/.terraform.lock.hcl +0 -24
- package/infra/terraform/openstack/dev/README.md +0 -18
- package/infra/terraform/openstack/dev/main.tf +0 -49
- package/infra/terraform/openstack/dev/providers.tf +0 -15
- package/infra/terraform/openstack/dev/terraform.tfvars.example +0 -54
- package/infra/terraform/openstack/dev/variables.tf +0 -210
- package/infra/terraform/openstack/dev/versions.tf +0 -10
- package/infra/terraform/openstack/modules/environment_host/main.tf +0 -143
- package/infra/terraform/openstack/modules/environment_host/outputs.tf +0 -25
- package/infra/terraform/openstack/modules/environment_host/templates/docker-host-user-data.sh.tftpl +0 -40
- package/infra/terraform/openstack/modules/environment_host/variables.tf +0 -145
- package/infra/terraform/openstack/modules/environment_host/versions.tf +0 -7
- package/infra/terraform/openstack/prod/.terraform.lock.hcl +0 -24
- package/infra/terraform/openstack/prod/README.md +0 -18
- package/infra/terraform/openstack/prod/main.tf +0 -49
- package/infra/terraform/openstack/prod/providers.tf +0 -15
- package/infra/terraform/openstack/prod/terraform.tfvars.example +0 -55
- package/infra/terraform/openstack/prod/variables.tf +0 -210
- package/infra/terraform/openstack/prod/versions.tf +0 -10
- package/infra/terraform/openstack/server/.terraform.lock.hcl +0 -45
- package/infra/terraform/openstack/server/README.md +0 -47
- package/infra/terraform/openstack/server/main.tf +0 -161
- package/infra/terraform/openstack/server/outputs.tf +0 -30
- package/infra/terraform/openstack/server/providers.tf +0 -30
- package/infra/terraform/openstack/server/templates/server-user-data.sh.tftpl +0 -50
- package/infra/terraform/openstack/server/variables.tf +0 -233
- package/infra/terraform/openstack/server/zz_aspace.auto.tfvars.example.json +0 -29
- package/pnpm-workspace.yaml +0 -2
- package/scripts/dev/audit_sdd_build_ast.py +0 -277
- package/sdd/01_planning/01_feature/INDEX.md +0 -16
- package/sdd/01_planning/01_feature/README.md +0 -76
- package/sdd/01_planning/01_feature/alerts_feature_spec.md +0 -55
- package/sdd/01_planning/01_feature/auth_feature_spec.md +0 -57
- package/sdd/01_planning/01_feature/catalog_feature_spec.md +0 -61
- package/sdd/01_planning/01_feature/fulfillment_feature_spec.md +0 -58
- package/sdd/01_planning/01_feature/health_feature_spec.md +0 -52
- package/sdd/01_planning/01_feature/inventory_feature_spec.md +0 -60
- package/sdd/01_planning/01_feature/order_feature_spec.md +0 -63
- package/sdd/01_planning/01_feature/shipping_feature_spec.md +0 -55
- package/sdd/01_planning/01_feature/support_feature_spec.md +0 -53
- package/sdd/01_planning/01_feature/user_feature_spec.md +0 -54
- package/sdd/01_planning/02_screen/INDEX.md +0 -13
- package/sdd/01_planning/02_screen/README.md +0 -41
- package/sdd/01_planning/02_screen/admin_screen_spec.pdf +0 -0
- package/sdd/01_planning/02_screen/assets/README.md +0 -16
- package/sdd/01_planning/02_screen/assets/example/README.md +0 -13
- package/sdd/01_planning/02_screen/landing_screen_spec.pdf +0 -0
- package/sdd/01_planning/02_screen/mobile_screen_spec.pdf +0 -0
- package/sdd/01_planning/02_screen/web_screen_spec.pdf +0 -0
- package/sdd/01_planning/03_architecture/INDEX.md +0 -9
- package/sdd/01_planning/03_architecture/README.md +0 -25
- package/sdd/01_planning/03_architecture/architecture_document_structure.md +0 -77
- package/sdd/01_planning/03_architecture/backend/README.md +0 -10
- package/sdd/01_planning/03_architecture/frontend/README.md +0 -12
- package/sdd/01_planning/03_architecture/infra/README.md +0 -10
- package/sdd/01_planning/03_architecture/tech-research/README.md +0 -4
- package/sdd/01_planning/03_architecture/templates_system_architecture.md +0 -84
- package/sdd/01_planning/04_data/INDEX.md +0 -4
- package/sdd/01_planning/04_data/README.md +0 -10
- package/sdd/01_planning/04_data/templates_data_modeling.md +0 -119
- package/sdd/01_planning/05_api/README.md +0 -12
- package/sdd/01_planning/05_api/templates_api_contract.md +0 -90
- package/sdd/01_planning/06_iac/README.md +0 -11
- package/sdd/01_planning/06_iac/templates_runtime_and_cicd_baseline.md +0 -46
- package/sdd/01_planning/07_integration/README.md +0 -11
- package/sdd/01_planning/07_integration/templates_frontend_api_integration.md +0 -46
- package/sdd/01_planning/08_nonfunctional/README.md +0 -7
- package/sdd/01_planning/09_security/README.md +0 -7
- package/sdd/01_planning/10_test/README.md +0 -12
- package/sdd/01_planning/10_test/templates_test_strategy.md +0 -60
- package/sdd/01_planning/INDEX.md +0 -19
- package/sdd/01_planning/README.md +0 -17
- package/sdd/02_plan/01_feature/README.md +0 -34
- package/sdd/02_plan/01_feature/_feature_todo_template.md +0 -29
- package/sdd/02_plan/02_screen/INDEX.md +0 -19
- package/sdd/02_plan/02_screen/README.md +0 -39
- package/sdd/02_plan/02_screen/_screen_todo_template.md +0 -60
- package/sdd/02_plan/03_architecture/README.md +0 -23
- package/sdd/02_plan/03_architecture/architecture_document_governance.md +0 -40
- package/sdd/02_plan/03_architecture/build_ast_runtime_tree_governance.md +0 -53
- package/sdd/02_plan/03_architecture/repository_governance.md +0 -39
- package/sdd/02_plan/03_architecture/runtime_and_structure_governance.md +0 -38
- package/sdd/02_plan/03_architecture/templates-hexagonal-template-architecture.md +0 -9
- package/sdd/02_plan/03_architecture/toolchain_governance.md +0 -98
- package/sdd/02_plan/04_data/README.md +0 -5
- package/sdd/02_plan/05_api/README.md +0 -5
- package/sdd/02_plan/06_iac/README.md +0 -11
- package/sdd/02_plan/06_iac/dev_runtime_delivery.md +0 -36
- package/sdd/02_plan/06_iac/template_runtime_delivery.md +0 -50
- package/sdd/02_plan/07_integration/README.md +0 -5
- package/sdd/02_plan/07_integration/frontend_live_integration.md +0 -31
- package/sdd/02_plan/08_nonfunctional/README.md +0 -5
- package/sdd/02_plan/08_nonfunctional/repository_hygiene.md +0 -26
- package/sdd/02_plan/09_security/README.md +0 -5
- package/sdd/02_plan/10_test/README.md +0 -11
- package/sdd/02_plan/10_test/regression_verification.md +0 -39
- package/sdd/02_plan/10_test/templates/README.md +0 -8
- package/sdd/02_plan/10_test/templates/ui_parity_web_contract.template.yaml +0 -23
- package/sdd/02_plan/10_test/verification_strategy.md +0 -43
- package/sdd/02_plan/99_generated/from_planning/ui_parity/.gitkeep +0 -1
- package/sdd/02_plan/README.md +0 -40
- package/sdd/03_build/01_feature/README.md +0 -20
- package/sdd/03_build/01_feature/domain/README.md +0 -3
- package/sdd/03_build/01_feature/domain/account_and_access.md +0 -20
- package/sdd/03_build/01_feature/domain/catalog_and_inventory.md +0 -20
- package/sdd/03_build/01_feature/domain/ordering_and_fulfillment.md +0 -21
- package/sdd/03_build/01_feature/domain/support_and_observability.md +0 -21
- package/sdd/03_build/01_feature/domain_surfaces.md +0 -28
- package/sdd/03_build/01_feature/service/README.md +0 -3
- package/sdd/03_build/01_feature/service/admin_surface.md +0 -15
- package/sdd/03_build/01_feature/service/landing_surface.md +0 -13
- package/sdd/03_build/01_feature/service/mobile_surface.md +0 -14
- package/sdd/03_build/01_feature/service/web_surface.md +0 -14
- package/sdd/03_build/02_screen/README.md +0 -25
- package/sdd/03_build/02_screen/_screen_build_template.md +0 -26
- package/sdd/03_build/02_screen/admin/README.md +0 -5
- package/sdd/03_build/02_screen/landing/README.md +0 -5
- package/sdd/03_build/02_screen/mobile/README.md +0 -5
- package/sdd/03_build/02_screen/web/README.md +0 -5
- package/sdd/03_build/03_architecture/README.md +0 -10
- package/sdd/03_build/03_architecture/architecture_document_governance.md +0 -30
- package/sdd/03_build/03_architecture/build_ast_runtime_tree_governance.md +0 -24
- package/sdd/03_build/03_architecture/repository_governance.md +0 -18
- package/sdd/03_build/03_architecture/toolchain_governance.md +0 -36
- package/sdd/03_build/06_iac/README.md +0 -3
- package/sdd/03_build/06_iac/dev_runtime_delivery.md +0 -10
- package/sdd/03_build/06_iac/template_runtime_delivery.md +0 -49
- package/sdd/03_build/07_integration/README.md +0 -3
- package/sdd/03_build/07_integration/frontend_live_integration.md +0 -11
- package/sdd/03_build/08_nonfunctional/README.md +0 -3
- package/sdd/03_build/08_nonfunctional/repository_hygiene.md +0 -10
- package/sdd/03_build/10_test/README.md +0 -9
- package/sdd/03_build/10_test/regression_verification.md +0 -16
- package/sdd/03_build/10_test/verification_harness.md +0 -11
- package/sdd/03_build/README.md +0 -35
- package/sdd/03_verify/01_feature/README.md +0 -5
- package/sdd/03_verify/01_feature/domain_verification.md +0 -14
- package/sdd/03_verify/01_feature/service_verification.md +0 -22
- package/sdd/03_verify/02_screen/README.md +0 -6
- package/sdd/03_verify/02_screen/_screen_verify_template.md +0 -20
- package/sdd/03_verify/02_screen/admin/README.md +0 -4
- package/sdd/03_verify/02_screen/landing/README.md +0 -4
- package/sdd/03_verify/02_screen/mobile/README.md +0 -4
- package/sdd/03_verify/02_screen/web/README.md +0 -4
- package/sdd/03_verify/03_architecture/README.md +0 -10
- package/sdd/03_verify/03_architecture/architecture_document_governance.md +0 -15
- package/sdd/03_verify/03_architecture/build_ast_runtime_tree_governance.md +0 -28
- package/sdd/03_verify/03_architecture/repository_governance.md +0 -16
- package/sdd/03_verify/03_architecture/toolchain_governance.md +0 -58
- package/sdd/03_verify/06_iac/README.md +0 -3
- package/sdd/03_verify/06_iac/dev_runtime_delivery.md +0 -10
- package/sdd/03_verify/06_iac/template_runtime_delivery.md +0 -42
- package/sdd/03_verify/07_integration/README.md +0 -3
- package/sdd/03_verify/07_integration/frontend_live_integration.md +0 -16
- package/sdd/03_verify/08_nonfunctional/README.md +0 -3
- package/sdd/03_verify/08_nonfunctional/repository_hygiene.md +0 -14
- package/sdd/03_verify/10_test/README.md +0 -9
- package/sdd/03_verify/10_test/regression_verification.md +0 -16
- package/sdd/03_verify/10_test/ui_parity/README.md +0 -4
- package/sdd/03_verify/10_test/ui_parity/loop_runs/.gitkeep +0 -0
- package/sdd/03_verify/10_test/ui_parity/reference/.gitkeep +0 -0
- package/sdd/03_verify/10_test/ui_parity/staged_runs/.gitkeep +0 -0
- package/sdd/03_verify/10_test/verification_harness.md +0 -17
- package/sdd/03_verify/README.md +0 -22
- package/sdd/05_operate/01_runbooks/.gitkeep +0 -1
- package/sdd/05_operate/01_runbooks/README.md +0 -4
- package/sdd/05_operate/02_delivery_status/README.md +0 -4
- package/sdd/05_operate/02_delivery_status/service_status.md +0 -16
- package/sdd/05_operate/README.md +0 -12
- package/sdd/99_toolchain/01_automation/.gitkeep +0 -1
- package/sdd/99_toolchain/01_automation/README.md +0 -76
- package/sdd/99_toolchain/01_automation/agentic-dev/analyze_proof_results.py +0 -132
- package/sdd/99_toolchain/01_automation/agentic-dev/analyze_route_gap.py +0 -85
- package/sdd/99_toolchain/01_automation/agentic-dev/assets/repo-contract.template.json +0 -75
- package/sdd/99_toolchain/01_automation/agentic-dev/bootstrap_frontend_parity.sh +0 -84
- package/sdd/99_toolchain/01_automation/agentic-dev/init_frontend_parity.sh +0 -33
- package/sdd/99_toolchain/01_automation/agentic-dev/init_repo_contract.sh +0 -51
- package/sdd/99_toolchain/01_automation/agentic-dev/repo-contract.json +0 -76
- package/sdd/99_toolchain/01_automation/agentic-dev/resolve_frontend_target.py +0 -52
- package/sdd/99_toolchain/01_automation/agentic-dev/resolve_repo_contract.py +0 -56
- package/sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh +0 -100
- package/sdd/99_toolchain/01_automation/agentic-dev/run_repo_phase.sh +0 -140
- package/sdd/99_toolchain/01_automation/agentic-dev/validate_json_schema.py +0 -39
- package/sdd/99_toolchain/01_automation/agentic-parity-harness-design.md +0 -291
- package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/dashboard.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/login.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/queue.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/admin_screen_capture/support.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/landing_screen_capture/home.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/landing_screen_capture/login.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/landing_screen_capture/workspace.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/mobile_screen_capture/dashboard.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/mobile_screen_capture/fulfillment.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/mobile_screen_capture/login.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/web_screen_capture/dashboard.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/web_screen_capture/login.png +0 -0
- package/sdd/99_toolchain/01_automation/assets/web_screen_capture/orders.png +0 -0
- package/sdd/99_toolchain/01_automation/build_asset_recipes.py +0 -10
- package/sdd/99_toolchain/01_automation/build_screen_spec_pdf.py +0 -427
- package/sdd/99_toolchain/01_automation/capture_screen_assets.mjs +0 -148
- package/sdd/99_toolchain/01_automation/harness-layout.md +0 -34
- package/sdd/99_toolchain/01_automation/parity-execution-tooling-design.md +0 -319
- package/sdd/99_toolchain/01_automation/playwright_exactness_manifest.py +0 -21
- package/sdd/99_toolchain/01_automation/run_playwright_exactness.py +0 -87
- package/sdd/99_toolchain/01_automation/screen_spec_manifest.py +0 -321
- package/sdd/99_toolchain/01_automation/spec_asset_builder.py +0 -274
- package/sdd/99_toolchain/01_automation/ui-contract-projection.md +0 -79
- package/sdd/99_toolchain/01_automation/ui-parity/README.md +0 -60
- package/sdd/99_toolchain/01_automation/ui-parity/cli/extract-reference-pages.mjs +0 -2
- package/sdd/99_toolchain/01_automation/ui-parity/cli/materialize-reference-assets.mjs +0 -58
- package/sdd/99_toolchain/01_automation/ui-parity/cli/normalize-reference-assets.mjs +0 -2
- package/sdd/99_toolchain/01_automation/ui-parity/cli/route-gap-report.mjs +0 -187
- package/sdd/99_toolchain/01_automation/ui-parity/cli/run-proof.mjs +0 -50
- package/sdd/99_toolchain/01_automation/ui-parity/cli/scaffold-contract.mjs +0 -62
- package/sdd/99_toolchain/01_automation/ui-parity/cli/upload-parity1.mjs +0 -2
- package/sdd/99_toolchain/01_automation/ui-parity/contracts/collector-metadata.schema.json +0 -33
- package/sdd/99_toolchain/01_automation/ui-parity/contracts/proof-result.schema.json +0 -76
- package/sdd/99_toolchain/01_automation/ui-parity/contracts/route-gap-report.schema.json +0 -95
- package/sdd/99_toolchain/01_automation/ui-parity/core/capture-runner.mjs +0 -55
- package/sdd/99_toolchain/01_automation/ui-parity/core/load-adapter.mjs +0 -25
- package/sdd/99_toolchain/01_automation/ui-parity/core/load-contract.mjs +0 -81
- package/sdd/99_toolchain/01_automation/ui-parity/core/paths.mjs +0 -23
- package/sdd/99_toolchain/01_automation/ui-parity/core/proof-runner.mjs +0 -255
- package/sdd/99_toolchain/01_automation/ui-parity/interfaces/ui-parity-artifact-layout.md +0 -23
- package/sdd/99_toolchain/01_automation/ui-parity/interfaces/ui-parity-proof-interface.md +0 -60
- package/sdd/99_toolchain/01_automation/ui-parity/interfaces/ui-parity-route-gap-interface.md +0 -82
- package/sdd/99_toolchain/01_automation/ui-parity/runtime/playwright-runtime.mjs +0 -16
- package/sdd/99_toolchain/01_automation/ui-parity/runtime/static-runtime.mjs +0 -6
- package/sdd/99_toolchain/02_policies/.gitkeep +0 -1
- package/sdd/99_toolchain/02_policies/build-ast-governance-policy.md +0 -22
- package/sdd/99_toolchain/02_policies/compose-runtime-baseline-policy.md +0 -24
- package/sdd/99_toolchain/02_policies/convention-storage-policy.md +0 -26
- package/sdd/99_toolchain/02_policies/main-push-before-dev-deploy-policy.md +0 -27
- package/sdd/99_toolchain/02_policies/regression-verification-policy.md +0 -22
- package/sdd/99_toolchain/03_templates/.gitkeep +0 -1
- package/sdd/99_toolchain/03_templates/asset_recipe_manifest.example.py +0 -38
- package/sdd/99_toolchain/03_templates/generated_assets/README.md +0 -11
- package/sdd/99_toolchain/03_templates/generated_assets/example-brand-lockup.svg +0 -3
- package/sdd/99_toolchain/03_templates/generated_assets/example-brand-mark.svg +0 -3
- package/sdd/99_toolchain/03_templates/generated_assets/example-brand-wordmark.svg +0 -3
- package/sdd/99_toolchain/03_templates/playwright_exactness_manifest.example.py +0 -21
- package/sdd/99_toolchain/README.md +0 -23
- package/sdd/README.md +0 -21
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# regression verification
|
|
2
|
-
|
|
3
|
-
## Status
|
|
4
|
-
|
|
5
|
-
- pass
|
|
6
|
-
|
|
7
|
-
## Retained Checks
|
|
8
|
-
|
|
9
|
-
- `sdd/02_plan/10_test/regression_verification.md`가 current regression scope baseline으로 추가됐다.
|
|
10
|
-
- `AGENTS.md`, `.codex/skills/sdd/SKILL.md`, `sdd/99_toolchain/01_automation/README.md`가 direct-only verification 금지와 selected regression surface 기록 규칙을 함께 유지한다.
|
|
11
|
-
- `sdd/03_build/10_test/regression_verification.md`가 template workflow 반영 상태를 current-state로 설명한다.
|
|
12
|
-
- screen exact automation gate가 Playwright인 경우 suite id, toolchain runner command, artifact path를 retained check에 함께 남긴다.
|
|
13
|
-
|
|
14
|
-
## Residual Risk
|
|
15
|
-
|
|
16
|
-
- regression scope selection은 아직 자동 selector가 없어서 문서 규칙과 reviewer 판단에 의존한다.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# verification harness
|
|
2
|
-
|
|
3
|
-
## Status
|
|
4
|
-
|
|
5
|
-
- pass
|
|
6
|
-
|
|
7
|
-
## Retained Checks
|
|
8
|
-
|
|
9
|
-
- verify harness는 stable current artifact path를 사용한다.
|
|
10
|
-
- UI parity reference asset과 proof output은 current durable location을 사용한다.
|
|
11
|
-
- screen local exactness는 `python3 sdd/99_toolchain/01_automation/run_playwright_exactness.py --suite <suite-id> --base-url <url>`를 canonical harness entrypoint로 사용한다.
|
|
12
|
-
- regression verification scope는 별도 durable baseline에서 선택하고, harness는 selected surface 중 automation 가능한 slice를 담당한다.
|
|
13
|
-
|
|
14
|
-
## Residual Risk
|
|
15
|
-
|
|
16
|
-
- harness CLI default path가 legacy verify folder를 다시 가리키면 drift가 생긴다.
|
|
17
|
-
- regression surface selector 자동화가 없어 shared-impact 판정은 문서와 reviewer 판단에 의존한다.
|
package/sdd/03_verify/README.md
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# Verify Governance
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
|
|
5
|
-
- `sdd/03_verify/`는 현재 구현 상태에 대한 retained verification을 durable 문서로 유지하는 루트다.
|
|
6
|
-
- 날짜별 gate/test log를 쌓지 않고, 현재 기준의 pass/fail 상태와 residual risk만 남긴다.
|
|
7
|
-
|
|
8
|
-
## Canonical Rule
|
|
9
|
-
|
|
10
|
-
- `03_verify`는 `02_plan`, `03_build`와 같은 section 축을 따른다.
|
|
11
|
-
- feature, screen, architecture, IAC, test surface별 verification summary를 같은 파일에서 갱신한다.
|
|
12
|
-
- history성 gate/test 로그는 `03_verify`에 두지 않는다.
|
|
13
|
-
|
|
14
|
-
## Sections
|
|
15
|
-
|
|
16
|
-
- `01_feature/`: feature 범주별 retained verification summary
|
|
17
|
-
- `02_screen/`: screen별 retained verification summary
|
|
18
|
-
- `03_architecture/`: 거버넌스/구조 관련 verification summary
|
|
19
|
-
- `06_iac/`: delivery/runtime verification summary
|
|
20
|
-
- `07_integration/`: integration verification summary
|
|
21
|
-
- `08_nonfunctional/`: nonfunctional verification summary
|
|
22
|
-
- `10_test/`: 반복 사용하는 검증 harness summary
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# service status
|
|
2
|
-
|
|
3
|
-
## Current Live State
|
|
4
|
-
|
|
5
|
-
- template repo는 root compose/developer baseline 기준의 current buildable state를 유지한다.
|
|
6
|
-
- production release timeline은 SDD에 누적하지 않는다.
|
|
7
|
-
|
|
8
|
-
## Monitoring Baseline
|
|
9
|
-
|
|
10
|
-
- backend `pytest`
|
|
11
|
-
- frontend app build
|
|
12
|
-
- parity harness current output path 확인
|
|
13
|
-
|
|
14
|
-
## Residual Risk
|
|
15
|
-
|
|
16
|
-
- 실제 서비스 레포에 이식할 때는 각 서비스의 runtime/edge 기준으로 다시 구체화해야 한다.
|
package/sdd/05_operate/README.md
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# Operate Governance
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
|
|
5
|
-
- `sdd/05_operate/`는 현재 배포 상태, 모니터링 기준, 운영 절차를 durable 문서로 유지하는 루트다.
|
|
6
|
-
- raw 운영 로그나 히스토리성 release note는 남기지 않는다.
|
|
7
|
-
|
|
8
|
-
## Canonical Rule
|
|
9
|
-
|
|
10
|
-
- runbook은 절차를 설명하는 durable 문서로 유지한다.
|
|
11
|
-
- delivery status는 현재 live state와 확인 기준만 남기고 덮어쓴다.
|
|
12
|
-
- raw runtime log와 상세 incident timeline은 backend/application logging system의 역할이다.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
# Automation Toolchain
|
|
2
|
-
|
|
3
|
-
`01_automation`은 screen spec 생성, capture asset 수집, parity harness 실행, Playwright exactness orchestration, recipe 기반 정적 자산 생성을 위한 자동화 자산을 둔다.
|
|
4
|
-
|
|
5
|
-
## Scope
|
|
6
|
-
|
|
7
|
-
- screen spec capture script
|
|
8
|
-
- screen spec PDF generator
|
|
9
|
-
- parity harness
|
|
10
|
-
- Playwright exactness runner / suite registry
|
|
11
|
-
- generator manifest
|
|
12
|
-
- asset recipe builder
|
|
13
|
-
- regression verification scope selection rule
|
|
14
|
-
|
|
15
|
-
## Screen Spec Rule
|
|
16
|
-
|
|
17
|
-
- feature code: `DOMAIN-FNNN`
|
|
18
|
-
- screen code: `SERVICE-SNNN`
|
|
19
|
-
- desktop capture 기준 visible area: `1710x951`
|
|
20
|
-
- 기본 capture viewport: `1690x940`
|
|
21
|
-
- capture mode: `viewport-first`
|
|
22
|
-
|
|
23
|
-
## Canonical Tools
|
|
24
|
-
|
|
25
|
-
- [screen_spec_manifest.py](./screen_spec_manifest.py)
|
|
26
|
-
- [capture_screen_assets.mjs](./capture_screen_assets.mjs)
|
|
27
|
-
- [build_screen_spec_pdf.py](./build_screen_spec_pdf.py)
|
|
28
|
-
- [spec_asset_builder.py](./spec_asset_builder.py)
|
|
29
|
-
- [build_asset_recipes.py](./build_asset_recipes.py)
|
|
30
|
-
- [playwright_exactness_manifest.py](./playwright_exactness_manifest.py)
|
|
31
|
-
- [run_playwright_exactness.py](./run_playwright_exactness.py)
|
|
32
|
-
|
|
33
|
-
## Storage Rule
|
|
34
|
-
|
|
35
|
-
- generated runtime asset은 각 구현 repo 경로에 둔다.
|
|
36
|
-
- planning 산출물은 `sdd/01_planning/02_screen/assets/` 아래에 둔다.
|
|
37
|
-
- generator와 manifest는 `sdd/99_toolchain/01_automation/`에 둔다.
|
|
38
|
-
- Playwright harness source는 repo 상황에 따라 `research/agent-browser/pocs/playwright-dev-e2e/` 같은 runtime location에 둘 수 있지만, canonical invocation과 suite registry는 `sdd/99_toolchain/01_automation/`이 소유한다.
|
|
39
|
-
|
|
40
|
-
## Regression Verification Rule
|
|
41
|
-
|
|
42
|
-
- toolchain은 builder/harness를 제공하더라도 direct target만 확인하고 종료하는 흐름을 허용하지 않는다.
|
|
43
|
-
- `sdd` 작업은 `sdd/02_plan/10_test/regression_verification.md`를 기준으로 direct, upstream, downstream, shared surface를 선택한다.
|
|
44
|
-
- parity harness나 build check는 회귀 검수의 일부일 뿐이고, 실제 완료 기준은 선택한 regression surface 전체에 대한 retained evidence다.
|
|
45
|
-
- Playwright exactness suite가 있는 surface는 `run_playwright_exactness.py`를 canonical local gate로 사용한다.
|
|
46
|
-
- shared route, shell, auth/session, shared component, API/data contract, generated asset, builder output 변경은 adjacent consumer까지 검수 범위를 넓힌다.
|
|
47
|
-
- 아직 자동화가 없는 회귀 surface는 command/manual verification으로 메우고, automation gap은 `sdd/03_build`, `sdd/03_verify`에 residual risk로 남긴다.
|
|
48
|
-
- Browser Use나 수동 시각 점검은 Playwright exactness gate를 대체하지 않고 보강/진단 용도로만 사용한다.
|
|
49
|
-
|
|
50
|
-
## Asset Recipe Rule
|
|
51
|
-
|
|
52
|
-
- 정적 디자인 자산 추출의 canonical tool name은 `스펙에셋빌더`다.
|
|
53
|
-
- generic 실행 파일은 `[spec_asset_builder.py](./spec_asset_builder.py)`다.
|
|
54
|
-
- `[build_asset_recipes.py](./build_asset_recipes.py)`는 기존 호출 호환용 wrapper다.
|
|
55
|
-
- 화면명세서에 있는 icon, logo, illustration, 기타 재사용 가능한 static asset은 먼저 `스펙에셋빌더`로 추출한 뒤 구현 코드에서 사용한다.
|
|
56
|
-
- reusable asset planning 문서는 `sdd/01_planning/02_screen/assets/` 아래에 둔다.
|
|
57
|
-
- 프로젝트별 규칙은 Python manifest에서 `ASSET_RECIPES` 리스트로 선언한다.
|
|
58
|
-
- 각 recipe는 `source`, `crop_box`, `transparent_white_threshold`, `trim`, `output`, `children`을 조합해 재사용 가능한 SVG/PNG 자산을 생성한다.
|
|
59
|
-
- `--verify-exact`를 사용하면 generated output이 source crop과 픽셀 단위로 동일한지 검증한다.
|
|
60
|
-
- builder로 표현 가능한 자산을 수동 redraw나 screenshot crop으로 대체하지 않는다.
|
|
61
|
-
- 수동 예외가 필요하면 plan/build/verify 문서에 source, 예외 사유, 최종 자산 경로를 함께 남긴다.
|
|
62
|
-
- 예시 manifest는 [`../03_templates/asset_recipe_manifest.example.py`](../03_templates/asset_recipe_manifest.example.py)에 둔다.
|
|
63
|
-
- 예시 generated output은 [`../03_templates/generated_assets/README.md`](../03_templates/generated_assets/README.md) 경로를 사용한다.
|
|
64
|
-
|
|
65
|
-
## Playwright Exactness Rule
|
|
66
|
-
|
|
67
|
-
- Playwright exactness의 canonical registry는 [playwright_exactness_manifest.py](./playwright_exactness_manifest.py)다.
|
|
68
|
-
- canonical runner는 [run_playwright_exactness.py](./run_playwright_exactness.py)다.
|
|
69
|
-
- downstream repo는 suite source를 runtime location에 둘 수 있지만, retained command는 wrapper 기준으로 남긴다.
|
|
70
|
-
- suite id, spec file, target screen batch, artifact path는 durable current-state로 관리한다.
|
|
71
|
-
- screen 작업의 기본 local exactness gate는 다음 순서를 따른다.
|
|
72
|
-
- design guide / asset / screen spec baseline 확인
|
|
73
|
-
- `python3 sdd/99_toolchain/01_automation/run_playwright_exactness.py --suite <suite-id> --base-url <url>`
|
|
74
|
-
- 필요하면 `--api-base-url`, `--browser`, `--grep`를 추가한다.
|
|
75
|
-
- 실행 결과와 artifact path를 `sdd/03_verify` current summary에 기록한다.
|
|
76
|
-
- 시작점 예시는 [`../03_templates/playwright_exactness_manifest.example.py`](../03_templates/playwright_exactness_manifest.example.py)를 따른다.
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
import json
|
|
3
|
-
import sys
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
VALID_OK_STATUSES = {"passed"}
|
|
8
|
-
VALID_FAIL_STATUSES = {"failed", "size_mismatch", "missing_reference", "capture_error"}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def collect_cases(node, bucket):
|
|
12
|
-
if isinstance(node, dict):
|
|
13
|
-
score = None
|
|
14
|
-
identifier = None
|
|
15
|
-
for key in ("diff_ratio", "score", "difference_ratio"):
|
|
16
|
-
value = node.get(key)
|
|
17
|
-
if isinstance(value, (int, float)):
|
|
18
|
-
score = float(value)
|
|
19
|
-
break
|
|
20
|
-
for key in ("screen_code", "id", "name", "case", "route"):
|
|
21
|
-
value = node.get(key)
|
|
22
|
-
if isinstance(value, str) and value.strip():
|
|
23
|
-
identifier = value.strip()
|
|
24
|
-
break
|
|
25
|
-
if score is not None:
|
|
26
|
-
bucket.append((identifier or f"case_{len(bucket)+1}", score))
|
|
27
|
-
for value in node.values():
|
|
28
|
-
collect_cases(value, bucket)
|
|
29
|
-
elif isinstance(node, list):
|
|
30
|
-
for item in node:
|
|
31
|
-
collect_cases(item, bucket)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def summarize(path: Path) -> int:
|
|
35
|
-
data = json.loads(path.read_text(encoding="utf-8"))
|
|
36
|
-
cases = []
|
|
37
|
-
collect_cases(data, cases)
|
|
38
|
-
unique = []
|
|
39
|
-
seen = set()
|
|
40
|
-
for identifier, score in sorted(cases, key=lambda item: item[1], reverse=True):
|
|
41
|
-
key = (identifier, score)
|
|
42
|
-
if key in seen:
|
|
43
|
-
continue
|
|
44
|
-
seen.add(key)
|
|
45
|
-
unique.append((identifier, score))
|
|
46
|
-
|
|
47
|
-
print(f"proof_file={path}")
|
|
48
|
-
print(f"cases_found={len(unique)}")
|
|
49
|
-
if not unique:
|
|
50
|
-
print("No comparable cases with numeric diff_ratio/score found.")
|
|
51
|
-
return 0
|
|
52
|
-
failing = [item for item in unique if item[1] > 0]
|
|
53
|
-
best = min(unique, key=lambda item: item[1])
|
|
54
|
-
worst = max(unique, key=lambda item: item[1])
|
|
55
|
-
print(f"failing_cases={len(failing)}")
|
|
56
|
-
print(f"best_case={best[0]} score={best[1]:.8f}")
|
|
57
|
-
print(f"worst_case={worst[0]} score={worst[1]:.8f}")
|
|
58
|
-
for identifier, score in failing[:10]:
|
|
59
|
-
print(f"- {identifier}: {score:.8f}")
|
|
60
|
-
return 0
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
def check_gate(path: Path) -> int:
|
|
64
|
-
data = json.loads(path.read_text(encoding="utf-8"))
|
|
65
|
-
summary = data.get("summary")
|
|
66
|
-
screens = data.get("screens")
|
|
67
|
-
if not isinstance(summary, dict):
|
|
68
|
-
print("proof_gate=fail reason=missing_summary")
|
|
69
|
-
return 2
|
|
70
|
-
if not isinstance(screens, list):
|
|
71
|
-
print("proof_gate=fail reason=missing_screens")
|
|
72
|
-
return 2
|
|
73
|
-
|
|
74
|
-
failing_statuses = []
|
|
75
|
-
for screen in screens:
|
|
76
|
-
if not isinstance(screen, dict):
|
|
77
|
-
failing_statuses.append(("unknown", "invalid_row"))
|
|
78
|
-
continue
|
|
79
|
-
status = screen.get("status")
|
|
80
|
-
identifier = screen.get("id") or screen.get("route") or "unknown"
|
|
81
|
-
if status in VALID_OK_STATUSES:
|
|
82
|
-
continue
|
|
83
|
-
if status in VALID_FAIL_STATUSES:
|
|
84
|
-
failing_statuses.append((identifier, status))
|
|
85
|
-
else:
|
|
86
|
-
failing_statuses.append((identifier, f"unknown_status:{status}"))
|
|
87
|
-
|
|
88
|
-
capture_error = int(summary.get("capture_error", 0) or 0)
|
|
89
|
-
failed = int(summary.get("failed", 0) or 0)
|
|
90
|
-
missing_reference = int(summary.get("missing_reference", 0) or 0)
|
|
91
|
-
matched = bool(summary.get("matched", False))
|
|
92
|
-
|
|
93
|
-
if failing_statuses or capture_error > 0 or failed > 0 or missing_reference > 0 or not matched:
|
|
94
|
-
print("proof_gate=fail")
|
|
95
|
-
print(f"summary_failed={failed}")
|
|
96
|
-
print(f"summary_missing_reference={missing_reference}")
|
|
97
|
-
print(f"summary_capture_error={capture_error}")
|
|
98
|
-
print(f"summary_matched={matched}")
|
|
99
|
-
for identifier, status in failing_statuses[:20]:
|
|
100
|
-
print(f"- {identifier}: {status}")
|
|
101
|
-
return 2
|
|
102
|
-
|
|
103
|
-
print("proof_gate=pass")
|
|
104
|
-
return 0
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
def main() -> int:
|
|
108
|
-
if len(sys.argv) < 2:
|
|
109
|
-
print("Usage: analyze_proof_results.py [--gate] <proof-json>", file=sys.stderr)
|
|
110
|
-
return 1
|
|
111
|
-
|
|
112
|
-
gate_mode = False
|
|
113
|
-
args = sys.argv[1:]
|
|
114
|
-
if args and args[0] == "--gate":
|
|
115
|
-
gate_mode = True
|
|
116
|
-
args = args[1:]
|
|
117
|
-
if not args:
|
|
118
|
-
print("Usage: analyze_proof_results.py [--gate] <proof-json>", file=sys.stderr)
|
|
119
|
-
return 1
|
|
120
|
-
|
|
121
|
-
path = Path(args[0])
|
|
122
|
-
if not path.is_file():
|
|
123
|
-
print(f"File not found: {path}", file=sys.stderr)
|
|
124
|
-
return 1
|
|
125
|
-
|
|
126
|
-
if gate_mode:
|
|
127
|
-
return check_gate(path)
|
|
128
|
-
return summarize(path)
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
if __name__ == "__main__":
|
|
132
|
-
raise SystemExit(main())
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
import json
|
|
3
|
-
import sys
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
FAIL_STATUSES = {"missing", "stateful"}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def summarize(path: Path) -> int:
|
|
11
|
-
data = json.loads(path.read_text(encoding="utf-8"))
|
|
12
|
-
summary = data.get("summary", {})
|
|
13
|
-
screens = data.get("screens", [])
|
|
14
|
-
print(f"route_gap_file={path}")
|
|
15
|
-
print(f"service={data.get('service', 'unknown')}")
|
|
16
|
-
print(f"total={summary.get('total', 0)}")
|
|
17
|
-
print(f"direct={summary.get('direct', 0)}")
|
|
18
|
-
print(f"shared={summary.get('shared', 0)}")
|
|
19
|
-
print(f"stateful={summary.get('stateful', 0)}")
|
|
20
|
-
print(f"missing={summary.get('missing', 0)}")
|
|
21
|
-
for row in screens:
|
|
22
|
-
if isinstance(row, dict) and row.get("status") in FAIL_STATUSES:
|
|
23
|
-
print(f"- {row.get('id', 'unknown')}: {row.get('status')}")
|
|
24
|
-
return 0
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def check_gate(path: Path) -> int:
|
|
28
|
-
data = json.loads(path.read_text(encoding="utf-8"))
|
|
29
|
-
summary = data.get("summary")
|
|
30
|
-
screens = data.get("screens")
|
|
31
|
-
if not isinstance(summary, dict):
|
|
32
|
-
print("route_gap_gate=fail reason=missing_summary")
|
|
33
|
-
return 2
|
|
34
|
-
if not isinstance(screens, list):
|
|
35
|
-
print("route_gap_gate=fail reason=missing_screens")
|
|
36
|
-
return 2
|
|
37
|
-
|
|
38
|
-
failing_rows = []
|
|
39
|
-
for row in screens:
|
|
40
|
-
if not isinstance(row, dict):
|
|
41
|
-
failing_rows.append(("unknown", "invalid_row"))
|
|
42
|
-
continue
|
|
43
|
-
status = str(row.get("status", "")).strip().lower()
|
|
44
|
-
identifier = row.get("id") or row.get("title") or "unknown"
|
|
45
|
-
if status in FAIL_STATUSES:
|
|
46
|
-
failing_rows.append((identifier, status))
|
|
47
|
-
|
|
48
|
-
if failing_rows or int(summary.get("missing", 0) or 0) > 0 or int(summary.get("stateful", 0) or 0) > 0:
|
|
49
|
-
print("route_gap_gate=fail")
|
|
50
|
-
print(f"summary_missing={summary.get('missing', 0)}")
|
|
51
|
-
print(f"summary_stateful={summary.get('stateful', 0)}")
|
|
52
|
-
for identifier, status in failing_rows[:20]:
|
|
53
|
-
print(f"- {identifier}: {status}")
|
|
54
|
-
return 2
|
|
55
|
-
|
|
56
|
-
print("route_gap_gate=pass")
|
|
57
|
-
return 0
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
def main() -> int:
|
|
61
|
-
if len(sys.argv) < 2:
|
|
62
|
-
print("Usage: analyze_route_gap.py [--gate] <route-gap-json>", file=sys.stderr)
|
|
63
|
-
return 1
|
|
64
|
-
|
|
65
|
-
gate_mode = False
|
|
66
|
-
args = sys.argv[1:]
|
|
67
|
-
if args and args[0] == "--gate":
|
|
68
|
-
gate_mode = True
|
|
69
|
-
args = args[1:]
|
|
70
|
-
if not args:
|
|
71
|
-
print("Usage: analyze_route_gap.py [--gate] <route-gap-json>", file=sys.stderr)
|
|
72
|
-
return 1
|
|
73
|
-
|
|
74
|
-
path = Path(args[0])
|
|
75
|
-
if not path.is_file():
|
|
76
|
-
print(f"File not found: {path}", file=sys.stderr)
|
|
77
|
-
return 1
|
|
78
|
-
|
|
79
|
-
if gate_mode:
|
|
80
|
-
return check_gate(path)
|
|
81
|
-
return summarize(path)
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
if __name__ == "__main__":
|
|
85
|
-
raise SystemExit(main())
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schema_version": 1,
|
|
3
|
-
"name": "replace-service-name",
|
|
4
|
-
"spec": {
|
|
5
|
-
"planning_paths": [
|
|
6
|
-
"sdd/01_planning",
|
|
7
|
-
"sdd/02_plan"
|
|
8
|
-
],
|
|
9
|
-
"canonical_targets_dir": "sdd/02_plan"
|
|
10
|
-
},
|
|
11
|
-
"frontend": {
|
|
12
|
-
"default_target": "web",
|
|
13
|
-
"targets": {
|
|
14
|
-
"web": {
|
|
15
|
-
"dir": "client/web",
|
|
16
|
-
"adapter_path": "client/web/scripts/ui-parity-web-adapter.mjs",
|
|
17
|
-
"screens_path": "client/web/src/lib/specScreens.json",
|
|
18
|
-
"routes_path": "client/web/src/lib/specRouteCatalog.json",
|
|
19
|
-
"preview_url": "http://127.0.0.1:4301",
|
|
20
|
-
"parity_contract_path": "sdd/02_plan/10_test/templates/ui_parity_web_contract.yaml",
|
|
21
|
-
"route_gap_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_web_route_gap_report.json",
|
|
22
|
-
"route_gap_markdown_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_web_route_gap_report.md",
|
|
23
|
-
"proof_output": "sdd/03_verify/10_test/ui_parity/templates_web_agentic_dev_latest.json"
|
|
24
|
-
},
|
|
25
|
-
"mobile": {
|
|
26
|
-
"dir": "client/mobile",
|
|
27
|
-
"adapter_path": "client/mobile/scripts/ui-parity-mobile-adapter.mjs",
|
|
28
|
-
"screens_path": "client/mobile/src/lib/specScreens.json",
|
|
29
|
-
"routes_path": "client/mobile/src/lib/specRouteCatalog.json",
|
|
30
|
-
"preview_url": "http://127.0.0.1:4302",
|
|
31
|
-
"parity_contract_path": "sdd/02_plan/10_test/templates/ui_parity_mobile_contract.yaml",
|
|
32
|
-
"route_gap_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_mobile_route_gap_report.json",
|
|
33
|
-
"route_gap_markdown_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_mobile_route_gap_report.md",
|
|
34
|
-
"proof_output": "sdd/03_verify/10_test/ui_parity/templates_mobile_agentic_dev_latest.json"
|
|
35
|
-
},
|
|
36
|
-
"admin": {
|
|
37
|
-
"dir": "client/admin",
|
|
38
|
-
"adapter_path": "client/admin/scripts/ui-parity-admin-adapter.mjs",
|
|
39
|
-
"screens_path": "client/admin/src/lib/specScreens.json",
|
|
40
|
-
"routes_path": "client/admin/src/lib/specRouteCatalog.json",
|
|
41
|
-
"preview_url": "http://127.0.0.1:4400",
|
|
42
|
-
"parity_contract_path": "sdd/02_plan/10_test/templates/ui_parity_admin_contract.yaml",
|
|
43
|
-
"route_gap_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_admin_route_gap_report.json",
|
|
44
|
-
"route_gap_markdown_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_admin_route_gap_report.md",
|
|
45
|
-
"proof_output": "sdd/03_verify/10_test/ui_parity/templates_admin_agentic_dev_latest.json"
|
|
46
|
-
},
|
|
47
|
-
"landing": {
|
|
48
|
-
"dir": "client/landing",
|
|
49
|
-
"adapter_path": "client/landing/scripts/ui-parity-landing-adapter.mjs",
|
|
50
|
-
"screens_path": "client/landing/src/lib/specScreens.json",
|
|
51
|
-
"routes_path": "client/landing/src/lib/specRouteCatalog.json",
|
|
52
|
-
"preview_url": "http://127.0.0.1:4300",
|
|
53
|
-
"parity_contract_path": "sdd/02_plan/10_test/templates/ui_parity_landing_contract.yaml",
|
|
54
|
-
"route_gap_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_landing_route_gap_report.json",
|
|
55
|
-
"route_gap_markdown_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_landing_route_gap_report.md",
|
|
56
|
-
"proof_output": "sdd/03_verify/10_test/ui_parity/templates_landing_agentic_dev_latest.json"
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
},
|
|
60
|
-
"commands": {
|
|
61
|
-
"plan_audit": "bash sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh route_gap .",
|
|
62
|
-
"build": "bash sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh build .",
|
|
63
|
-
"proof": "bash sdd/99_toolchain/01_automation/agentic-dev/run_frontend_target.sh proof .",
|
|
64
|
-
"deploy_dev": "echo 'replace deploy_dev command' >&2",
|
|
65
|
-
"verify_dev": "echo 'replace verify_dev command' >&2"
|
|
66
|
-
},
|
|
67
|
-
"artifacts": {
|
|
68
|
-
"route_gap_output": "sdd/02_plan/99_generated/from_planning/ui_parity/ui_parity_web_route_gap_report.json",
|
|
69
|
-
"proof_output": "sdd/03_verify/10_test/ui_parity/replace_agentic_dev_latest.json"
|
|
70
|
-
},
|
|
71
|
-
"notes": [
|
|
72
|
-
"Replace the commands and proof output path after cloning the template.",
|
|
73
|
-
"plan_audit is expected to generate and gate a route-gap report before proof."
|
|
74
|
-
]
|
|
75
|
-
}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
usage() {
|
|
5
|
-
cat <<'EOF'
|
|
6
|
-
Usage: bootstrap_frontend_parity.sh [repo_root] [target]
|
|
7
|
-
|
|
8
|
-
Run first-time frontend parity bootstrap for a cloned template.
|
|
9
|
-
|
|
10
|
-
Steps:
|
|
11
|
-
1. init repo contract and route-gap assets
|
|
12
|
-
2. build frontend
|
|
13
|
-
3. start preview server
|
|
14
|
-
4. materialize reference assets
|
|
15
|
-
5. run plan_audit gate
|
|
16
|
-
6. run proof gate
|
|
17
|
-
EOF
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
|
|
21
|
-
usage
|
|
22
|
-
exit 0
|
|
23
|
-
fi
|
|
24
|
-
|
|
25
|
-
repo_root="$(cd "${1:-$(pwd)}" && pwd)"
|
|
26
|
-
frontend_target="${2:-}"
|
|
27
|
-
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
28
|
-
target_payload="$(python3 "${script_dir}/resolve_frontend_target.py" "${repo_root}" "${frontend_target}")"
|
|
29
|
-
read_target_value() {
|
|
30
|
-
local key="$1"
|
|
31
|
-
python3 - "${target_payload}" "${key}" <<'PY'
|
|
32
|
-
import json
|
|
33
|
-
import sys
|
|
34
|
-
|
|
35
|
-
payload = json.loads(sys.argv[1])
|
|
36
|
-
key = sys.argv[2]
|
|
37
|
-
value = payload
|
|
38
|
-
for part in key.split("."):
|
|
39
|
-
if not isinstance(value, dict):
|
|
40
|
-
raise SystemExit(1)
|
|
41
|
-
value = value.get(part)
|
|
42
|
-
if value is None:
|
|
43
|
-
raise SystemExit(1)
|
|
44
|
-
print(value if isinstance(value, str) else json.dumps(value, ensure_ascii=False))
|
|
45
|
-
PY
|
|
46
|
-
}
|
|
47
|
-
target_name="$(read_target_value "name")"
|
|
48
|
-
target_dir="$(read_target_value "target.dir")"
|
|
49
|
-
preview_url="$(read_target_value "target.preview_url")"
|
|
50
|
-
preview_log="${repo_root}/sdd/03_verify/10_test/ui_parity/${target_name}-preview.log"
|
|
51
|
-
preview_pid=""
|
|
52
|
-
|
|
53
|
-
cleanup() {
|
|
54
|
-
if [[ -n "${preview_pid}" ]] && kill -0 "${preview_pid}" >/dev/null 2>&1; then
|
|
55
|
-
kill "${preview_pid}" >/dev/null 2>&1 || true
|
|
56
|
-
wait "${preview_pid}" >/dev/null 2>&1 || true
|
|
57
|
-
fi
|
|
58
|
-
}
|
|
59
|
-
trap cleanup EXIT
|
|
60
|
-
|
|
61
|
-
bash "${script_dir}/init_frontend_parity.sh" "${repo_root}" "${frontend_target}"
|
|
62
|
-
|
|
63
|
-
cd "${repo_root}"
|
|
64
|
-
mkdir -p "$(dirname "${preview_log}")"
|
|
65
|
-
bash "${script_dir}/run_frontend_target.sh" build "${repo_root}" "${frontend_target}"
|
|
66
|
-
npm --prefix "${target_dir}" run preview >"${preview_log}" 2>&1 &
|
|
67
|
-
preview_pid="$!"
|
|
68
|
-
for _ in $(seq 1 30); do
|
|
69
|
-
if curl -fsS "${preview_url}" >/dev/null 2>&1; then
|
|
70
|
-
break
|
|
71
|
-
fi
|
|
72
|
-
sleep 1
|
|
73
|
-
done
|
|
74
|
-
if ! curl -fsS "${preview_url}" >/dev/null 2>&1; then
|
|
75
|
-
echo "Preview server did not become ready: ${preview_url}" >&2
|
|
76
|
-
echo "Preview log: ${preview_log}" >&2
|
|
77
|
-
exit 1
|
|
78
|
-
fi
|
|
79
|
-
bash "${script_dir}/run_frontend_target.sh" materialize_references "${repo_root}" "${frontend_target}"
|
|
80
|
-
|
|
81
|
-
bash "${script_dir}/run_repo_phase.sh" plan_audit "${repo_root}" "${frontend_target}"
|
|
82
|
-
bash "${script_dir}/run_repo_phase.sh" proof "${repo_root}" "${frontend_target}"
|
|
83
|
-
|
|
84
|
-
echo "frontend_parity_bootstrap=ok"
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
usage() {
|
|
5
|
-
cat <<'EOF'
|
|
6
|
-
Usage: init_frontend_parity.sh [repo_root] [target]
|
|
7
|
-
|
|
8
|
-
Bootstrap repo-local frontend parity assets for a cloned template.
|
|
9
|
-
|
|
10
|
-
Steps:
|
|
11
|
-
1. Ensure repo contract aliases exist
|
|
12
|
-
2. Scaffold ui parity contract
|
|
13
|
-
3. Generate route-gap json/markdown manifests
|
|
14
|
-
|
|
15
|
-
Optional runtime steps such as reference materialization and proof are intentionally excluded.
|
|
16
|
-
EOF
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
|
|
20
|
-
usage
|
|
21
|
-
exit 0
|
|
22
|
-
fi
|
|
23
|
-
|
|
24
|
-
repo_root="$(cd "${1:-$(pwd)}" && pwd)"
|
|
25
|
-
frontend_target="${2:-}"
|
|
26
|
-
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
27
|
-
|
|
28
|
-
bash "${script_dir}/init_repo_contract.sh" "${repo_root}" >/dev/null
|
|
29
|
-
|
|
30
|
-
bash "${script_dir}/run_frontend_target.sh" scaffold "${repo_root}" "${frontend_target}"
|
|
31
|
-
bash "${script_dir}/run_frontend_target.sh" route_gap "${repo_root}" "${frontend_target}"
|
|
32
|
-
|
|
33
|
-
echo "frontend_parity_init=ok"
|