pomaster 0.3.0 → 0.4.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/README.md +9 -10
- package/catalog/archetypes/archetype.frontend.error_taxonomy.json +13 -5
- package/catalog/archetypes/archetype.frontend.feature_oriented.json +1 -1
- package/catalog/archetypes/archetype.state.async_command.json +4 -4
- package/catalog/catalog-lock.draft.json +1120 -104
- package/catalog/gates/gate.be.api.contract_checks.json +2 -1
- package/catalog/gates/gate.be.chg.contract_change_checks.json +2 -1
- package/catalog/gates/gate.chg.prechange_checks.json +2 -1
- package/catalog/gates/gate.web.api.request_checks.json +2 -1
- package/catalog/gates/gate.web.grid.checks.json +2 -1
- package/catalog/knowledge/knowledge.api.example_stable_error_code.json +2 -1
- package/catalog/knowledge/knowledge.chg.example_compat_window.json +2 -1
- package/catalog/knowledge/knowledge.chg.example_prop_migration.json +2 -1
- package/catalog/knowledge/knowledge.fp.api.field_drift_no_contract.json +2 -1
- package/catalog/knowledge/knowledge.fp.api.per_page_http_client.json +2 -1
- package/catalog/knowledge/knowledge.fp.be.contract_drift.json +2 -1
- package/catalog/knowledge/knowledge.fp.chg.page_local_padding.json +2 -1
- package/catalog/knowledge/knowledge.fp.grid.global_td_width.json +2 -1
- package/catalog/knowledge/knowledge.web.api.example_get_entity_list.json +2 -1
- package/catalog/knowledge/knowledge.web.grid.example_column_preset.json +2 -1
- package/catalog/policies/authority.be.api_contract_ownership.json +2 -1
- package/catalog/policies/authority.be.contract_ownership.json +2 -1
- package/catalog/policies/authority.chg.change_owners.json +2 -1
- package/catalog/policies/authority.web.api.request_owners.json +2 -1
- package/catalog/policies/authority.web.grid.ownership.json +2 -1
- package/catalog/policies/policy.ai.change_plan_first.json +91 -0
- package/catalog/policies/policy.ai.fact_inference_separation.json +91 -0
- package/catalog/policies/policy.ai.read_search_verify_before_write.json +92 -0
- package/catalog/policies/policy.ai.rule_relaxation_approval.json +91 -0
- package/catalog/policies/policy.api.backward_compat_defaults.json +2 -1
- package/catalog/policies/policy.api.contract_impl_consistency.json +2 -1
- package/catalog/policies/policy.api.no_informal_contract.json +2 -1
- package/catalog/policies/policy.arch.adr_immutable_history.json +91 -0
- package/catalog/policies/policy.arch.decision_tradeoff_record.json +2 -1
- package/catalog/policies/policy.arch.no_convenience_over_boundary.json +93 -0
- package/catalog/policies/policy.arch.prefer_verifiable_option.json +92 -0
- package/catalog/policies/policy.authz.no_gating_proxy_trust.json +99 -0
- package/catalog/policies/policy.authz.permission_scope_expansion_gate.json +99 -0
- package/catalog/policies/policy.authz.server_five_factor_verification.json +101 -0
- package/catalog/policies/policy.be.conc.prefer_db_constraints.json +97 -0
- package/catalog/policies/policy.be.db.expand_migrate_contract.json +97 -0
- package/catalog/policies/policy.be.idem.key_payload_conflict.json +97 -0
- package/catalog/policies/policy.be.model.single_boundary_conversion.json +97 -0
- package/catalog/policies/policy.be.sql.index_for_known_queries.json +97 -0
- package/catalog/policies/policy.be.state.single_rule_source.json +97 -0
- package/catalog/policies/policy.be.txn.short_locks_compensation.json +96 -0
- package/catalog/policies/policy.bound.search_first_entry_only.json +91 -0
- package/catalog/policies/policy.boundary.validate_in_encode_out.json +92 -0
- package/catalog/policies/policy.cache.failure_mode_guards.json +93 -0
- package/catalog/policies/policy.cache.lifecycle_definition.json +2 -1
- package/catalog/policies/policy.cache.schema_versioning.json +91 -0
- package/catalog/policies/policy.cfg.config_attribute_completeness.json +95 -0
- package/catalog/policies/policy.cfg.key_rename_dual_read.json +92 -0
- package/catalog/policies/policy.cfg.no_secret_dispersal.json +90 -0
- package/catalog/policies/policy.cfg.production_safe_defaults.json +92 -0
- package/catalog/policies/policy.cfg.schema_backed_config.json +92 -0
- package/catalog/policies/policy.chg.affect_templates.json +2 -1
- package/catalog/policies/policy.chg.breaking_versioning.json +2 -1
- package/catalog/policies/policy.chg.compat_migration_rollback.json +2 -1
- package/catalog/policies/policy.chg.deprecate_before_delete.json +2 -1
- package/catalog/policies/policy.chg.fix_at_root_cause_level.json +2 -1
- package/catalog/policies/policy.chg.no_unrelated_changes.json +91 -0
- package/catalog/policies/policy.chg.observable_evolution.json +2 -1
- package/catalog/policies/policy.chg.prechange_consumer_scan.json +2 -1
- package/catalog/policies/policy.chg.staged_rollout.json +2 -1
- package/catalog/policies/policy.chg.sync_contract_docs_tests.json +2 -1
- package/catalog/policies/policy.conflict.priority_ladder.json +2 -1
- package/catalog/policies/policy.contract.no_invented_facts.json +93 -0
- package/catalog/policies/policy.dep.admission_six_dimension_check.json +2 -1
- package/catalog/policies/policy.dep.build_path_supply_chain.json +93 -0
- package/catalog/policies/policy.dep.change_surface_review.json +2 -1
- package/catalog/policies/policy.dep.introduction_review.json +2 -1
- package/catalog/policies/policy.dep.no_untrusted_source_no_lock_bypass.json +92 -0
- package/catalog/policies/policy.dep.time_boxed_urgent_exception.json +91 -0
- package/catalog/policies/policy.deploy.no_dev_env_as_production_fact.json +91 -0
- package/catalog/policies/policy.deploy.operational_capabilities.json +93 -0
- package/catalog/policies/policy.deploy.runtime_fact_record.json +97 -0
- package/catalog/policies/policy.derived.single_implementation.json +2 -1
- package/catalog/policies/policy.err.failure_five_part_mapping.json +101 -0
- package/catalog/policies/policy.err.no_internal_detail_exposure.json +97 -0
- package/catalog/policies/policy.err.published_code_immutable.json +98 -0
- package/catalog/policies/policy.evid.acceptance_binds_verifiable_evidence.json +92 -0
- package/catalog/policies/policy.evid.no_silent_gate_removal.json +90 -0
- package/catalog/policies/policy.evid.no_unverifiable_pass.json +92 -0
- package/catalog/policies/policy.flag.cleanup_after_full_rollout.json +94 -0
- package/catalog/policies/policy.flag.consistent_off_state.json +92 -0
- package/catalog/policies/policy.flag.kill_switch.json +91 -0
- package/catalog/policies/policy.flag.lifecycle_metadata.json +93 -0
- package/catalog/policies/policy.flag.not_a_permission.json +92 -0
- package/catalog/policies/policy.gate.p0_non_bypassable.json +92 -0
- package/catalog/policies/policy.gate.risk_factors_confirmed.json +93 -0
- package/catalog/policies/policy.guard.no_check_weakening.json +92 -0
- package/catalog/policies/policy.integration.call_definition_minimum.json +95 -0
- package/catalog/policies/policy.integration.fault_containment.json +94 -0
- package/catalog/policies/policy.job.lifecycle_definition.json +96 -0
- package/catalog/policies/policy.job.no_unmanaged_execution.json +92 -0
- package/catalog/policies/policy.job.operational_features.json +93 -0
- package/catalog/policies/policy.obs.actionable_signals.json +93 -0
- package/catalog/policies/policy.obs.alert_with_owner.json +91 -0
- package/catalog/policies/policy.obs.context_field_baseline.json +91 -0
- package/catalog/policies/policy.obs.correlation_context_minimum.json +2 -1
- package/catalog/policies/policy.obs.no_sensitive_or_unbounded_logging.json +92 -0
- package/catalog/policies/policy.obs.no_sensitive_raw_values.json +93 -0
- package/catalog/policies/policy.obs.rum_dimension_whitelist.json +2 -1
- package/catalog/policies/policy.obs.signal_change_impact.json +91 -0
- package/catalog/policies/policy.obs.source_map_access_control.json +92 -0
- package/catalog/policies/policy.obs.telemetry_lifecycle_declared.json +93 -0
- package/catalog/policies/policy.obs.trace_correlation.json +91 -0
- package/catalog/policies/policy.perf.budget_change_retest.json +91 -0
- package/catalog/policies/policy.perf.evidence_binding.json +95 -0
- package/catalog/policies/policy.perf.observation_dimensions.json +94 -0
- package/catalog/policies/policy.proc.checklist_change_policy.json +91 -0
- package/catalog/policies/policy.proc.pre_code_declaration.json +2 -1
- package/catalog/policies/policy.proc.scope_drift_reclassify.json +91 -0
- package/catalog/policies/policy.prv.processing_scope_re_review.json +97 -0
- package/catalog/policies/policy.prv.sensitive_data_six_facts.json +102 -0
- package/catalog/policies/policy.registry.human_fields_validated_decorrelated.json +93 -0
- package/catalog/policies/policy.rel.no_irreversible_unmonitored_full_release.json +91 -0
- package/catalog/policies/policy.rel.observability_before_ship.json +91 -0
- package/catalog/policies/policy.rel.pre_release_confirmation.json +2 -1
- package/catalog/policies/policy.rel.process_change_needs_drill_audit.json +91 -0
- package/catalog/policies/policy.rel.traceable_build.json +93 -0
- package/catalog/policies/policy.role.domain_decision_authority.json +2 -1
- package/catalog/policies/policy.role.human_signs_for_ai.json +93 -0
- package/catalog/policies/policy.sec.authn_policy_unified.json +91 -0
- package/catalog/policies/policy.sec.no_client_side_trust.json +92 -0
- package/catalog/policies/policy.sec.no_longterm_security_disable.json +91 -0
- package/catalog/policies/policy.sec.no_script_readable_credentials.json +91 -0
- package/catalog/policies/policy.sec.no_secrets_in_client_surface.json +91 -0
- package/catalog/policies/policy.sec.relaxation_approval.json +92 -0
- package/catalog/policies/policy.sec.security_relaxation_gate.json +92 -0
- package/catalog/policies/policy.sec.third_party_execution_register.json +2 -1
- package/catalog/policies/policy.sec.trust_boundary_enforcement.json +93 -0
- package/catalog/policies/policy.sec.upload_download_server_recheck.json +91 -0
- package/catalog/policies/policy.sec.url_source_allowlist.json +91 -0
- package/catalog/policies/policy.spec.admission_criteria.json +2 -1
- package/catalog/policies/policy.spec.derived_view_regeneration.json +2 -1
- package/catalog/policies/policy.spec.draft_not_baseline.json +2 -1
- package/catalog/policies/policy.spec.family_conflict_precedence.json +93 -0
- package/catalog/policies/policy.spec.file_structure_contract.json +2 -1
- package/catalog/policies/policy.spec.freeze_before_use.json +93 -0
- package/catalog/policies/policy.spec.metadata_required.json +2 -1
- package/catalog/policies/policy.spec.post_dev_backfill_classify.json +2 -1
- package/catalog/policies/policy.spec.primary_source_basis.json +93 -0
- package/catalog/policies/policy.spec.procedural_record_not_surrogate.json +2 -1
- package/catalog/policies/policy.spec.semantic_identity.json +2 -1
- package/catalog/policies/policy.spec.unresolved_ledger_gate.json +2 -1
- package/catalog/policies/policy.stack.derived_store_not_authority.json +93 -0
- package/catalog/policies/policy.stack.dual_web_stack_boundary.json +93 -0
- package/catalog/policies/policy.stack.entry_chain_recorded.json +93 -0
- package/catalog/policies/policy.stack.entry_limits_aligned.json +94 -0
- package/catalog/policies/policy.stack.local_form_not_prod_fact.json +93 -0
- package/catalog/policies/policy.stack.multi_datastore_ownership.json +93 -0
- package/catalog/policies/policy.stack.no_implicit_selection.json +2 -1
- package/catalog/policies/policy.stack.persistence_coexistence_scope.json +93 -0
- package/catalog/policies/policy.stack.toolchain_versions_pinned.json +95 -0
- package/catalog/policies/policy.stack.upgrade_compat_verified.json +93 -0
- package/catalog/policies/policy.struct.module_entry_dependency_declared.json +92 -0
- package/catalog/policies/policy.struct.no_unexplained_top_level_dir.json +91 -0
- package/catalog/policies/policy.struct.reuse_proven_structure.json +91 -0
- package/catalog/policies/policy.test.control_nondeterminism_keep_diagnosis.json +91 -0
- package/catalog/policies/policy.test.isolation_and_cleanup.json +93 -0
- package/catalog/policies/policy.test.no_synthetic_stability.json +92 -0
- package/catalog/policies/policy.test.pyramid_and_ci_matrix.json +92 -0
- package/catalog/policies/policy.test.removal_justification.json +91 -0
- package/catalog/policies/policy.test.removal_needs_substitute_evidence.json +91 -0
- package/catalog/policies/policy.test.risk_driven_plan.json +92 -0
- package/catalog/policies/policy.test.stable_observable_assertions.json +92 -0
- package/catalog/policies/policy.tool.discoverable_toolchain.json +92 -0
- package/catalog/policies/policy.tool.no_hand_edit_generated_no_ci_drift.json +91 -0
- package/catalog/policies/policy.tool.no_vendored_body_edits.json +94 -0
- package/catalog/policies/policy.tool.scoped_scan_boundary.json +2 -1
- package/catalog/policies/policy.tool.upgrade_verify_lock_rollback.json +92 -0
- package/catalog/policies/policy.web.api.auth_app_client_split.json +2 -1
- package/catalog/policies/policy.web.api.client_change_impact.json +2 -1
- package/catalog/policies/policy.web.api.domain_api_only.json +2 -1
- package/catalog/policies/policy.web.api.error_normalization.json +2 -1
- package/catalog/policies/policy.web.api.generated_client.json +2 -1
- package/catalog/policies/policy.web.api.late_result_guard.json +2 -1
- package/catalog/policies/policy.web.api.mutation_idempotency.json +2 -1
- package/catalog/policies/policy.web.api.no_network_optimism.json +2 -1
- package/catalog/policies/policy.web.api.query_cancel_stale_drop.json +2 -1
- package/catalog/policies/policy.web.api.request_infrastructure.json +2 -1
- package/catalog/policies/policy.web.api.retry_discipline.json +2 -1
- package/catalog/policies/policy.web.api.session_recovery_split.json +2 -1
- package/catalog/policies/policy.web.api.single_http_client.json +2 -1
- package/catalog/policies/policy.web.api.single_loading_source.json +2 -1
- package/catalog/policies/policy.web.api.transport_vs_business.json +2 -1
- package/catalog/policies/policy.web.api.trusted_endpoint_source.json +2 -1
- package/catalog/policies/policy.web.api.typed_domain_naming.json +2 -1
- package/catalog/policies/policy.web.arch.layer_isolation.json +2 -1
- package/catalog/policies/policy.web.arch.naming_conventions.json +2 -1
- package/catalog/policies/policy.web.arch.public_api_barrel.json +2 -1
- package/catalog/policies/policy.web.chg.controlled_change_triggers.json +2 -1
- package/catalog/policies/policy.web.comp.no_trivial_or_god_component.json +91 -0
- package/catalog/policies/policy.web.comp.public_contract_completeness.json +93 -0
- package/catalog/policies/policy.web.copy.action_object_clarity.json +92 -0
- package/catalog/policies/policy.web.copy.enumerable_placement.json +91 -0
- package/catalog/policies/policy.web.copy.error_next_step.json +92 -0
- package/catalog/policies/policy.web.copy.suppression_ledger_discipline.json +2 -1
- package/catalog/policies/policy.web.grid.column_schema_fields.json +2 -1
- package/catalog/policies/policy.web.grid.config_isolation.json +2 -1
- package/catalog/policies/policy.web.grid.freeze_key_columns.json +2 -1
- package/catalog/policies/policy.web.grid.interaction_registry.json +2 -1
- package/catalog/policies/policy.web.grid.keyboard_clipboard.json +2 -1
- package/catalog/policies/policy.web.grid.schema_driven_shell.json +2 -1
- package/catalog/policies/policy.web.grid.schema_versioning.json +2 -1
- package/catalog/policies/policy.web.grid.server_ops_virtualization.json +2 -1
- package/catalog/policies/policy.web.grid.shell_change_matrix.json +2 -1
- package/catalog/policies/policy.web.grid.width_fix_ladder.json +2 -1
- package/catalog/policies/policy.web.handoff.state_matrix_full.json +94 -0
- package/catalog/policies/policy.web.i18n.copy_key_discipline.json +92 -0
- package/catalog/policies/policy.web.i18n.raw_value_for_compute.json +91 -0
- package/catalog/policies/policy.web.page.region_consistency.json +93 -0
- package/catalog/policies/policy.web.perf.budget_skeleton.json +2 -1
- package/catalog/policies/policy.web.style.ownership_matrix.json +2 -1
- package/catalog/policies/policy.web.track.attempt_result_correlation.json +91 -0
- package/catalog/policies/policy.web.track.consent_lifecycle.json +2 -1
- package/catalog/policies/policy.web.track.no_synthetic_actions.json +92 -0
- package/catalog/policies/policy.web.track.privacy_default_deny.json +2 -1
- package/catalog/policies/policy.web.track.stable_event_keys.json +2 -1
- package/catalog/policies/policy.web.track.typed_client_validation.json +91 -0
- package/catalog/policies/policy.web.uiux.provider_evidence_not_business_truth.json +2 -1
- package/catalog/policies/policy.wf.no_planned_as_verified.json +91 -0
- package/catalog/policies/policy.wf.task_facts_preconfirm.json +94 -0
- package/catalog/policies/profile.baseline.java_enterprise_default.json +96 -0
- package/catalog/sensors/sensor.browser.deterministic.json +2 -1
- package/catalog/sensors/sensor.browser.interactive.json +2 -1
- package/catalog/sensors/sensor.build.static.json +2 -1
- package/catalog/sensors/sensor.contract.conformance.json +2 -1
- package/catalog/sensors/sensor.performance.budget.json +2 -1
- package/catalog/sensors/sensor.production.metric.json +2 -1
- package/catalog/tools/seed_b6b_frontend.py +1424 -0
- package/catalog/tools/seed_b6c_backend.py +1495 -0
- package/catalog/tools/seed_b6d_baseline.py +620 -0
- package/catalog/tools/seed_b6e_evidence.py +1305 -0
- package/catalog/tools/seed_d3_review.py +1105 -0
- package/catalog/tools/seed_v06_batch2_materials.py +27 -18
- package/dist/bin.js +23026 -16635
- package/package.json +2 -1
- package/seeds/baseline/backend/api-contract.md +26 -0
- package/seeds/baseline/backend/architecture.md +31 -0
- package/seeds/baseline/backend/data-access.md +31 -0
- package/seeds/baseline/backend/directory-structure.md +11 -0
- package/seeds/baseline/backend/integration-runtime.md +21 -0
- package/seeds/baseline/backend/quality.md +31 -0
- package/seeds/baseline/backend/stack.yaml +13 -0
- package/seeds/baseline/backend/transaction-concurrency.md +26 -0
- package/seeds/baseline/data/lineage.md +11 -0
- package/seeds/baseline/data/migration.md +11 -0
- package/seeds/baseline/data/model.md +31 -0
- package/seeds/baseline/data/precision-units.md +31 -0
- package/seeds/baseline/data/quality.md +31 -0
- package/seeds/baseline/frontend/api-and-error.md +21 -0
- package/seeds/baseline/frontend/architecture.md +26 -0
- package/seeds/baseline/frontend/design-system.md +21 -0
- package/seeds/baseline/frontend/directory-structure.md +16 -0
- package/seeds/baseline/frontend/quality.md +26 -0
- package/seeds/baseline/frontend/stack.yaml +17 -0
- package/seeds/baseline/frontend/state-and-data.md +26 -0
- package/seeds/baseline/manifest.yaml +32 -0
- package/seeds/baseline/platform/delivery.md +36 -0
- package/seeds/baseline/platform/environment.md +11 -0
- package/seeds/baseline/platform/observability.md +31 -0
- package/seeds/baseline/platform/security.md +26 -0
- package/seeds/manifest.json +2006 -0
- package/seeds/specs/evidence/accessibility.md +89 -0
- package/seeds/specs/evidence/architecture.md +89 -0
- package/seeds/specs/evidence/browser-e2e.md +91 -0
- package/seeds/specs/evidence/build.md +91 -0
- package/seeds/specs/evidence/business-acceptance.md +89 -0
- package/seeds/specs/evidence/complexity-crap.md +97 -0
- package/seeds/specs/evidence/contract.md +89 -0
- package/seeds/specs/evidence/coverage.md +91 -0
- package/seeds/specs/evidence/data-migration.md +91 -0
- package/seeds/specs/evidence/dead-code-duplicate.md +89 -0
- package/seeds/specs/evidence/dependency-supply-chain.md +89 -0
- package/seeds/specs/evidence/index.md +55 -0
- package/seeds/specs/evidence/mutation.md +89 -0
- package/seeds/specs/evidence/performance.md +89 -0
- package/seeds/specs/evidence/release.md +91 -0
- package/seeds/specs/evidence/runtime-observability.md +91 -0
- package/seeds/specs/evidence/security.md +89 -0
- package/seeds/specs/evidence/typecheck-lint.md +91 -0
- package/seeds/specs/evidence/unit-component-integration.md +91 -0
- package/seeds/specs/evidence/visual-regression.md +89 -0
- package/seeds/specs/hard/backend/01-architecture-governance-protocol.md +68 -0
- package/seeds/specs/hard/backend/02-project-structure-governance-protocol.md +68 -0
- package/seeds/specs/hard/backend/03-directory-boundary-protocol.md +68 -0
- package/seeds/specs/hard/backend/04-layering-architecture-protocol.md +68 -0
- package/seeds/specs/hard/backend/05-task-workflow-protocol.md +68 -0
- package/seeds/specs/hard/backend/06-ai-generated-code-protocol.md +68 -0
- package/seeds/specs/hard/backend/07-evidence-acceptance-protocol.md +68 -0
- package/seeds/specs/hard/backend/08-contract-change-protocol.md +68 -0
- package/seeds/specs/hard/backend/09-role-responsibility-protocol.md +68 -0
- package/seeds/specs/hard/backend/10-security-protocol.md +68 -0
- package/seeds/specs/hard/backend/11-environment-configuration-protocol.md +67 -0
- package/seeds/specs/hard/backend/12-api-contract-protocol.md +68 -0
- package/seeds/specs/hard/backend/13-privacy-data-lifecycle-protocol.md +68 -0
- package/seeds/specs/hard/backend/14-business-rules-state-protocol.md +68 -0
- package/seeds/specs/hard/backend/15-data-model-protocol.md +68 -0
- package/seeds/specs/hard/backend/16-error-code-protocol.md +68 -0
- package/seeds/specs/hard/backend/17-permission-authorization-protocol.md +68 -0
- package/seeds/specs/hard/backend/18-database-schema-migration-protocol.md +68 -0
- package/seeds/specs/hard/backend/19-query-index-sql-protocol.md +68 -0
- package/seeds/specs/hard/backend/20-transaction-boundary-protocol.md +68 -0
- package/seeds/specs/hard/backend/21-concurrency-locking-protocol.md +68 -0
- package/seeds/specs/hard/backend/22-idempotency-protocol.md +68 -0
- package/seeds/specs/hard/backend/23-cache-redis-consistency-protocol.md +68 -0
- package/seeds/specs/hard/backend/24-external-integration-resilience-protocol.md +68 -0
- package/seeds/specs/hard/backend/25-async-job-scheduler-protocol.md +68 -0
- package/seeds/specs/hard/backend/26-engineering-tooling-protocol.md +68 -0
- package/seeds/specs/hard/backend/27-dependency-supply-chain-protocol.md +68 -0
- package/seeds/specs/hard/backend/28-testing-protocol.md +68 -0
- package/seeds/specs/hard/backend/29-observability-logging-tracing-protocol.md +68 -0
- package/seeds/specs/hard/backend/30-performance-capacity-protocol.md +68 -0
- package/seeds/specs/hard/backend/31-runtime-deployment-protocol.md +68 -0
- package/seeds/specs/hard/backend/32-release-versioning-rollback-protocol.md +68 -0
- package/seeds/specs/hard/backend/index.md +177 -0
- package/seeds/specs/hard/frontend/01-development-checklist-protocol.md +86 -0
- package/seeds/specs/hard/frontend/02-ai-generated-code-protocol.md +82 -0
- package/seeds/specs/hard/frontend/03-acceptance-gate-protocol.md +86 -0
- package/seeds/specs/hard/frontend/04-security-protocol.md +283 -0
- package/seeds/specs/hard/frontend/05-environment-configuration-protocol.md +80 -0
- package/seeds/specs/hard/frontend/06-change-governance-protocol.md +90 -0
- package/seeds/specs/hard/frontend/07-frontend-backend-communication-protocol.md +219 -0
- package/seeds/specs/hard/frontend/08-role-responsibility-protocol.md +80 -0
- package/seeds/specs/hard/frontend/09-module-boundary-protocol.md +81 -0
- package/seeds/specs/hard/frontend/10-engineering-tooling-protocol.md +89 -0
- package/seeds/specs/hard/frontend/11-dependency-package-management-protocol.md +87 -0
- package/seeds/specs/hard/frontend/12-business-rules-protocol.md +79 -0
- package/seeds/specs/hard/frontend/13-monetary-precision-protocol.md +81 -0
- package/seeds/specs/hard/frontend/14-data-model-protocol.md +85 -0
- package/seeds/specs/hard/frontend/15-request-api-protocol.md +87 -0
- package/seeds/specs/hard/frontend/16-error-handling-protocol.md +79 -0
- package/seeds/specs/hard/frontend/17-permission-protocol.md +79 -0
- package/seeds/specs/hard/frontend/18-state-management-protocol.md +88 -0
- package/seeds/specs/hard/frontend/19-cache-protocol.md +79 -0
- package/seeds/specs/hard/frontend/20-testing-protocol.md +88 -0
- package/seeds/specs/hard/frontend/21-design-system-protocol.md +79 -0
- package/seeds/specs/hard/frontend/22-theme-protocol.md +79 -0
- package/seeds/specs/hard/frontend/23-accessibility-protocol.md +189 -0
- package/seeds/specs/hard/frontend/24-component-protocol.md +80 -0
- package/seeds/specs/hard/frontend/25-page-structure-protocol.md +79 -0
- package/seeds/specs/hard/frontend/26-style-layout-protocol.md +80 -0
- package/seeds/specs/hard/frontend/27-rendering-state-protocol.md +81 -0
- package/seeds/specs/hard/frontend/28-form-protocol.md +88 -0
- package/seeds/specs/hard/frontend/29-routing-url-protocol.md +79 -0
- package/seeds/specs/hard/frontend/30-data-grid-protocol.md +83 -0
- package/seeds/specs/hard/frontend/31-performance-protocol.md +137 -0
- package/seeds/specs/hard/frontend/32-file-import-export-protocol.md +80 -0
- package/seeds/specs/hard/frontend/33-release-versioning-protocol.md +79 -0
- package/seeds/specs/hard/frontend/34-monitoring-logging-protocol.md +128 -0
- package/seeds/specs/hard/frontend/35-mock-protocol.md +97 -0
- package/seeds/specs/hard/frontend/36-feature-flag-protocol.md +79 -0
- package/seeds/specs/hard/frontend/37-browser-device-compatibility-protocol.md +83 -0
- package/seeds/specs/hard/frontend/38-internationalization-protocol.md +243 -0
- package/seeds/specs/hard/frontend/39-copywriting-protocol.md +79 -0
- package/seeds/specs/hard/frontend/40-analytics-protocol.md +98 -0
- package/seeds/specs/hard/frontend/41-design-handoff-protocol.md +80 -0
- package/seeds/specs/hard/frontend/42-browser-runtime-lifecycle-protocol.md +86 -0
- package/seeds/specs/hard/frontend/43-time-temporal-protocol.md +86 -0
- package/seeds/specs/hard/frontend/44-privacy-data-lifecycle-protocol.md +87 -0
- package/seeds/specs/hard/frontend/45-browser-storage-protocol.md +87 -0
- package/seeds/specs/hard/frontend/index.md +308 -0
- package/seeds/specs/hard/stacks/java/index.md +20 -0
- package/seeds/specs/hard/stacks/java/java-language-overlay.md +35 -0
- package/seeds/specs/hard/stacks/jpa/index.md +20 -0
- package/seeds/specs/hard/stacks/jpa/jpa-persistence-overlay.md +35 -0
- package/seeds/specs/hard/stacks/kubernetes-ingress/index.md +20 -0
- package/seeds/specs/hard/stacks/kubernetes-ingress/kubernetes-ingress-overlay.md +35 -0
- package/seeds/specs/hard/stacks/messaging/index.md +20 -0
- package/seeds/specs/hard/stacks/messaging/messaging-reliability-overlay.md +35 -0
- package/seeds/specs/hard/stacks/mybatis/index.md +20 -0
- package/seeds/specs/hard/stacks/mybatis/mybatis-persistence-overlay.md +35 -0
- package/seeds/specs/hard/stacks/mysql/index.md +20 -0
- package/seeds/specs/hard/stacks/mysql/mysql-database-overlay.md +35 -0
- package/seeds/specs/hard/stacks/nginx/index.md +20 -0
- package/seeds/specs/hard/stacks/nginx/nginx-proxy-overlay.md +35 -0
- package/seeds/specs/hard/stacks/postgresql/index.md +20 -0
- package/seeds/specs/hard/stacks/postgresql/postgresql-database-overlay.md +35 -0
- package/seeds/specs/hard/stacks/redis/index.md +20 -0
- package/seeds/specs/hard/stacks/redis/redis-cache-overlay.md +35 -0
- package/seeds/specs/hard/stacks/spring-batch/index.md +20 -0
- package/seeds/specs/hard/stacks/spring-batch/spring-batch-job-overlay.md +35 -0
- package/seeds/specs/hard/stacks/spring-boot/index.md +20 -0
- package/seeds/specs/hard/stacks/spring-boot/spring-boot-application-overlay.md +35 -0
- package/seeds/specs/hard/stacks/spring-mvc/index.md +20 -0
- package/seeds/specs/hard/stacks/spring-mvc/spring-mvc-web-overlay.md +35 -0
- package/seeds/specs/hard/stacks/spring-webflux/index.md +20 -0
- package/seeds/specs/hard/stacks/spring-webflux/spring-webflux-reactive-overlay.md +35 -0
- package/seeds/specs/hard/stacks/tomcat/index.md +20 -0
- package/seeds/specs/hard/stacks/tomcat/tomcat-runtime-overlay.md +35 -0
|
@@ -0,0 +1,620 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""B6d baseline 体系 25 文件新著工具(播种资产 + 自指指纹 pin + unknowns 台账单源)。
|
|
3
|
+
|
|
4
|
+
输入(只读):
|
|
5
|
+
- packages/cli/seeds/manifest.json B6b/B6c 清单(107 条原样保留并入)
|
|
6
|
+
- doc/POMaster-vNext-Consolidated-PRD.md(语义真源,不读取——内容由 §3 树职责
|
|
7
|
+
注释逐字承载为常量表;§7.2/7.3 示例词 NON-AUTHORITATIVE 不住播种面)
|
|
8
|
+
|
|
9
|
+
输出:
|
|
10
|
+
- packages/cli/seeds/baseline/manifest.yaml baseline 身份/seed 来源/
|
|
11
|
+
版本/unknowns 台账(YAML 直接可解析——机器锚面)
|
|
12
|
+
- packages/cli/seeds/baseline/frontend/{stack.yaml,architecture.md,
|
|
13
|
+
directory-structure.md,design-system.md,state-and-data.md,api-and-error.md,quality.md}
|
|
14
|
+
- packages/cli/seeds/baseline/backend/{stack.yaml,architecture.md,
|
|
15
|
+
directory-structure.md,api-contract.md,data-access.md,transaction-concurrency.md,
|
|
16
|
+
integration-runtime.md,quality.md}
|
|
17
|
+
- packages/cli/seeds/baseline/data/{model.md,precision-units.md,migration.md,
|
|
18
|
+
lineage.md,quality.md}
|
|
19
|
+
- packages/cli/seeds/baseline/platform/{security.md,environment.md,
|
|
20
|
+
observability.md,delivery.md}
|
|
21
|
+
- packages/cli/seeds/manifest.json 播种清单单源(B6b/B6c 107 条
|
|
22
|
+
原样保留 + B6D 25 条追加;132 条全量分母)
|
|
23
|
+
|
|
24
|
+
新著形态定案(ADR-lite,B6d;任务红线「本子批是新著非逐字移植」):
|
|
25
|
+
- **新著 ≠ 移植**:旧包无 25 文件成套资产(运行时 factsource stack-baseline.schema +
|
|
26
|
+
02-technology-baseline planned 模板是语义祖先,仅字段/词形参照;capability/status/
|
|
27
|
+
supersedes/ACR 演化语义不并入一期——提案 §3「manifest unknowns 台账是最小充分起步」)。
|
|
28
|
+
骨架章节 = PRD §3 目录树职责注释逐字词形(文件职责真源);任何具体技术选型词
|
|
29
|
+
(Vue/Spring/MySQL 等)不得作为默认值写入(E2/PRD §7.1 NON-AUTHORITATIVE——示例
|
|
30
|
+
只住 PRD 与 catalog 注记),起步值一律 UNKNOWN(A1/宪法 C1 词形纪律——旧「待填写」
|
|
31
|
+
词形零移植,工具级禁词扫描兜底);
|
|
32
|
+
- **播种件无 frontmatter**(本批 ADR,与 specs 面移植件刻意分形):25 件均为纯正文
|
|
33
|
+
——yaml 直接可解析(项目侧机器锚面零污染:frontmatter 块会使 yaml.safe_load 取
|
|
34
|
+
到错误文档)、md 零噪音(Owner 填写面)。清单 provenance 改走 entry 级
|
|
35
|
+
authoring="new" 词形 + **自指指纹**:source_sha256 = 播种件自身字节 sha256
|
|
36
|
+
(新著无 vendor 源字节——移植件「frontmatter 双锚」语义不适用;自指指纹防的是
|
|
37
|
+
包内清单↔资产失同步,与移植件防源漂移功能等价;装载器 seed-manifest.ts 按
|
|
38
|
+
authoring 分流校验);
|
|
39
|
+
- **lane 词形**:B6D 条目 lane = 播种分区词形 frontend/backend/data/platform
|
|
40
|
+
(与 target 词形同源;baseline 根 manifest 条目取 "baseline";CATALOG_LANE_VALUES
|
|
41
|
+
是 catalog 条目 applicability 闭包,零扩值不受影响——清单 entry 的 lane 是播种
|
|
42
|
+
lane 注记,catalog 面无 data/platform 条目产生);
|
|
43
|
+
- **manifest.yaml 形态**(提案 §3 schema 落地 + 静态面裁剪):seed.catalog_version
|
|
44
|
+
省略(播种件是包内静态字节,init 不做动态注入——动态版本注入面不存在;
|
|
45
|
+
seed_version: B6D 批次代号承载版本信息,零墙钟批次代号先例);unknowns 台账 =
|
|
46
|
+
两个 stack.yaml 键集的派生词形 baseline/<lane>/stack.yaml:<key>(FE 9 + BE 5 =
|
|
47
|
+
14 条),Owner 回填选型后逐条销账;status: CURRENT 按提案;
|
|
48
|
+
- **stack.yaml 键集**(PRD §3 注释逐字):frontend = framework/language/build/
|
|
49
|
+
router/state/grid/ui/css/testing(9 键);backend = language/framework/persistence/
|
|
50
|
+
database/cache(5 键);值一律 UNKNOWN。**零 profile 预填**(衔接面裁定):catalog
|
|
51
|
+
PROFILE.BASELINE.JAVA_ENTERPRISE_DEFAULT 卡 includes 9 项组合是信息性参考
|
|
52
|
+
(B6c A1 登记「可预填」),本批不采用——PRD §7.2 警示句「起步值一律 UNKNOWN」
|
|
53
|
+
优先,组合词禁入播种面(工具禁词表兜底);衔接闭环点 = stack.yaml 显式选型承载
|
|
54
|
+
specs/hard/stacks/ overlay 的 bound 语义(B6c STACK_OVERLAY_NOTE 注记的 B6d 落位);
|
|
55
|
+
- **stack.yaml 形态校验**(提案「最小 schema 或留自由文件面」裁定):取测试级键集
|
|
56
|
+
形态校验(baseline-seeds.spec.ts:键集 == unknowns 台账派生 + 值全 UNKNOWN),
|
|
57
|
+
不新增运行时装载器/schema 物料——baseline 件的运行时消费(context compile
|
|
58
|
+
AUTHORITATIVE 输入)是后续批次面,本批不加无消费者的机制(catalog PROJECT_
|
|
59
|
+
BASELINE_TEMPLATE 注记同理一期不做,提案 §1 矩阵「可选」);
|
|
60
|
+
- **播种面零变更**:SEEDABLE_STORE_DIRS 已含 baseline 四分区(B6a),kernel/layout
|
|
61
|
+
零改动;seed-once-missing-only 语义不变。
|
|
62
|
+
|
|
63
|
+
用法:
|
|
64
|
+
python seed_b6d_baseline.py # 物化(write_if_changed 幂等)
|
|
65
|
+
python seed_b6d_baseline.py --verify # 只读重演(字节逐等比对)
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
import hashlib
|
|
69
|
+
import io
|
|
70
|
+
import json
|
|
71
|
+
import os
|
|
72
|
+
import re
|
|
73
|
+
import sys
|
|
74
|
+
|
|
75
|
+
import yaml
|
|
76
|
+
|
|
77
|
+
if __name__ == "__main__":
|
|
78
|
+
try:
|
|
79
|
+
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
|
|
80
|
+
except Exception:
|
|
81
|
+
pass
|
|
82
|
+
|
|
83
|
+
HERE = os.path.dirname(os.path.abspath(__file__)) # .../POMaster_VNext/catalog/tools
|
|
84
|
+
VNEXT = os.path.dirname(os.path.dirname(HERE)) # .../POMaster_VNext
|
|
85
|
+
REPO = os.path.dirname(VNEXT) # d:/Vscode Documents/po-master
|
|
86
|
+
SEEDS_DIR = os.path.join(VNEXT, "packages", "cli", "seeds")
|
|
87
|
+
BASELINE_ASSET_DIR = os.path.join(SEEDS_DIR, "baseline")
|
|
88
|
+
MANIFEST_PATH = os.path.join(SEEDS_DIR, "manifest.json")
|
|
89
|
+
|
|
90
|
+
BATCH = "B6D"
|
|
91
|
+
MANIFEST_SCHEMA = "pomaster.seed-manifest/1"
|
|
92
|
+
PLANTED_TOTAL = 132
|
|
93
|
+
BATCH_SCOPE = ("B6d:baseline 体系 25 文件新著播种(manifest.yaml 1 + frontend 7 + "
|
|
94
|
+
"backend 8 + data 5 + platform 4;UNKNOWN 起步,「待填写」词形零移植;"
|
|
95
|
+
"B6b/B6c 107 条在册——清单合并承载全量分母 132)")
|
|
96
|
+
|
|
97
|
+
# 设计源锚(新著件的 source_path 词形——非 vendor 字节源,provenance 语义见头注 ADR)。
|
|
98
|
+
DESIGN_SOURCE = ("doc/POMaster-vNext-Consolidated-PRD.md#s3-baseline-tree"
|
|
99
|
+
"(PRD §3 树职责注释逐字承载;新著无 vendor 字节源——"
|
|
100
|
+
"语义祖先=旧 stack-baseline.schema + 02-technology-baseline 模板,仅参照)")
|
|
101
|
+
|
|
102
|
+
NEW_AUTHORING_NOTES = [
|
|
103
|
+
"B6d 新著件(非移植):旧包无 25 文件成套资产——语义祖先为运行时 factsource "
|
|
104
|
+
"stack-baseline.schema 与 02-technology-baseline planned 模板(仅字段/词形参照,"
|
|
105
|
+
"capability/status/supersedes/ACR 演化语义不并入一期,提案 §3);骨架章节照 PRD "
|
|
106
|
+
"§3 baseline 树职责注释逐字;内容零发明:起步值一律 UNKNOWN,示例与默认值不住"
|
|
107
|
+
"播种面(PRD §7.1 NON-AUTHORITATIVE——示例只住 PRD/catalog 注记)",
|
|
108
|
+
"B6d 形态注记:本件无 frontmatter(纯正文——yaml 直接可解析/md 零噪音,Owner "
|
|
109
|
+
"填写面);清单 pin=资产自身字节 sha256(authoring=new 自指指纹——新著无 vendor "
|
|
110
|
+
"源字节,防包内清单↔资产失同步,装载器按 authoring 分流校验)",
|
|
111
|
+
]
|
|
112
|
+
|
|
113
|
+
# ======================================================================
|
|
114
|
+
# stack.yaml 键集(PRD §3 注释逐字)+ manifest.yaml unknowns 台账派生
|
|
115
|
+
# ======================================================================
|
|
116
|
+
FE_STACK_KEYS = ["framework", "language", "build", "router", "state",
|
|
117
|
+
"grid", "ui", "css", "testing"]
|
|
118
|
+
BE_STACK_KEYS = ["language", "framework", "persistence", "database", "cache"]
|
|
119
|
+
|
|
120
|
+
STACK_YAML_CONTENT = {
|
|
121
|
+
"frontend": (
|
|
122
|
+
"# baseline/frontend/stack.yaml —— 前端技术选型(工程决策记录;不复制 package.json/锁文件)\n"
|
|
123
|
+
"# 职责(PRD §3):framework/language/build/router/state/grid/ui/css/testing\n"
|
|
124
|
+
"# 起步值一律 UNKNOWN;Owner 决策后逐键回填,并在 baseline/manifest.yaml 的\n"
|
|
125
|
+
"# unknowns 台账对本键销账。\n"
|
|
126
|
+
"# 选型承载 specs/hard/stacks/ overlay 的 bound 语义(显式选型 = 绑定;未选型 =\n"
|
|
127
|
+
"# installed 未 bound——B6c 播种注记的 B6d 落位)。\n"
|
|
128
|
+
"# catalog TECHNOLOGY_PROFILE 卡(含 PROFILE 组合清单)仅为信息性参考——不预填\n"
|
|
129
|
+
"# 本文件(NON-AUTHORITATIVE:示例与组合建议只住 catalog 注记,不住项目基线)。\n"
|
|
130
|
+
),
|
|
131
|
+
"backend": (
|
|
132
|
+
"# baseline/backend/stack.yaml —— 后端技术选型(工程决策记录;不复制构建清单)\n"
|
|
133
|
+
"# 职责(PRD §3):language/framework/persistence/database/cache\n"
|
|
134
|
+
"# 起步值一律 UNKNOWN;Owner 决策后逐键回填,并在 baseline/manifest.yaml 的\n"
|
|
135
|
+
"# unknowns 台账对本键销账。\n"
|
|
136
|
+
"# 选型承载 specs/hard/stacks/ overlay 的 bound 语义(显式选型 = 绑定;未选型 =\n"
|
|
137
|
+
"# installed 未 bound——B6c 播种注记的 B6d 落位)。\n"
|
|
138
|
+
"# catalog TECHNOLOGY_PROFILE 卡(含 PROFILE 组合清单)仅为信息性参考——不预填\n"
|
|
139
|
+
"# 本文件(NON-AUTHORITATIVE:示例与组合建议只住 catalog 注记,不住项目基线)。\n"
|
|
140
|
+
),
|
|
141
|
+
}
|
|
142
|
+
for _lane, _keys in (("frontend", FE_STACK_KEYS), ("backend", BE_STACK_KEYS)):
|
|
143
|
+
STACK_YAML_CONTENT[_lane] += "".join(f"{k}: UNKNOWN\n" for k in _keys)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def unknowns_ledger():
|
|
147
|
+
"""unknowns 台账词形(与两个 stack.yaml 键集一一对应——工具单源派生)。"""
|
|
148
|
+
return ([f"baseline/frontend/stack.yaml:{k}" for k in FE_STACK_KEYS]
|
|
149
|
+
+ [f"baseline/backend/stack.yaml:{k}" for k in BE_STACK_KEYS])
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def build_manifest_yaml():
|
|
153
|
+
lines = [
|
|
154
|
+
"# baseline/manifest.yaml —— Project Engineering Baseline 身份/seed 来源/版本/UNKNOWN 台账单源\n"
|
|
155
|
+
"# 职责(PRD §3 树):baseline 身份/seed 来源/版本/UNKNOWN 台账。\n"
|
|
156
|
+
"# 本文件由 pomaster init 播种(B6d);id/lanes/unknowns 是 baseline 体系的机器\n"
|
|
157
|
+
"# 可读锚;unknowns 台账与 frontend/backend 两个 stack.yaml 的键集一一对应——\n"
|
|
158
|
+
"# Owner 回填选型后逐条销账(台账之外的新选型键由 Owner 自行增补登记)。\n",
|
|
159
|
+
"id: BASELINE.PROJECT\n",
|
|
160
|
+
"schema_version: 1\n",
|
|
161
|
+
"seed:\n",
|
|
162
|
+
" tool: pomaster init\n",
|
|
163
|
+
" seed_version: B6D\n",
|
|
164
|
+
" seed_manifest: package://seeds/manifest.json\n",
|
|
165
|
+
"status: CURRENT\n",
|
|
166
|
+
"lanes:\n",
|
|
167
|
+
" frontend: ./frontend\n",
|
|
168
|
+
" backend: ./backend\n",
|
|
169
|
+
" data: ./data\n",
|
|
170
|
+
" platform: ./platform\n",
|
|
171
|
+
"unknowns:\n",
|
|
172
|
+
]
|
|
173
|
+
lines += [f" - {u}\n" for u in unknowns_ledger()]
|
|
174
|
+
return "".join(lines)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
# ======================================================================
|
|
178
|
+
# md 模板骨架(章节 = PRD §3 职责注释逐字词形;起步值一律 UNKNOWN)
|
|
179
|
+
# ======================================================================
|
|
180
|
+
HEADER_DISCIPLINE = (
|
|
181
|
+
"- 状态:播种模板(Expected 面)——项目 Owner 就地填写;起步值一律 UNKNOWN,"
|
|
182
|
+
"不确定保持 UNKNOWN,不猜测、不留空白或任何占位描述词形(旧模板占位词形零移植)。\n"
|
|
183
|
+
"- 填写纪律:技术选型词与阈值数字仅由 Owner 决策后写入本文件;示例与默认值不住"
|
|
184
|
+
"播种面(PRD §7.1 NON-AUTHORITATIVE——示例只住 PRD 与 catalog 注记)。\n"
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def md_template(title, rel, duty, sections):
|
|
189
|
+
"""统一 md 骨架:标题 + 职责头 + 纪律头 + 逐节(起步值 UNKNOWN + 填写指引)。
|
|
190
|
+
|
|
191
|
+
sections: [(节名, 填写指引一句话)];节名照 PRD §3 职责注释词形。
|
|
192
|
+
"""
|
|
193
|
+
out = [f"# {title}\n\n",
|
|
194
|
+
f"- 路径:{rel}\n",
|
|
195
|
+
f"- 职责(PRD §3):{duty}\n",
|
|
196
|
+
HEADER_DISCIPLINE]
|
|
197
|
+
for name, guide in sections:
|
|
198
|
+
out.append(f"## {name}\n\n")
|
|
199
|
+
out.append("- 起步值:UNKNOWN\n")
|
|
200
|
+
out.append(f"- 填写指引:{guide}\n\n")
|
|
201
|
+
return "".join(out)
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
# 25 件分母(1 manifest + 7 FE + 8 BE + 5 data + 4 platform);节表 = PRD §3 注释逐字。
|
|
205
|
+
MD_TEMPLATES = {
|
|
206
|
+
"frontend/architecture.md": md_template(
|
|
207
|
+
"前端架构基线", "baseline/frontend/architecture.md",
|
|
208
|
+
"Purpose / Layers / Responsibility / Dependencies",
|
|
209
|
+
[
|
|
210
|
+
("Purpose", "本前端子系统的架构目的与覆盖范围(一段话说清它承担什么、不承担什么)。"),
|
|
211
|
+
("Layers", "逐层登记:层名 + 一句话职责(层集合由 Owner 定义,不预设层数)。"),
|
|
212
|
+
("Responsibility", "跨层职责分配规则(哪一类变更落在哪一层,逐类登记)。"),
|
|
213
|
+
("Dependencies", "层间依赖规则:允许的依赖方向与禁止的依赖方向,逐条显式登记。"),
|
|
214
|
+
]),
|
|
215
|
+
"frontend/directory-structure.md": md_template(
|
|
216
|
+
"前端目录结构基线", "baseline/frontend/directory-structure.md",
|
|
217
|
+
"目标目录模板 + 职责说明",
|
|
218
|
+
[
|
|
219
|
+
("目标目录模板", "目标目录树逐条登记:目录名 + 一句话职责(由 Owner 依项目形态定义)。"),
|
|
220
|
+
("职责说明", "关键目录的边界说明:放什么、不放什么;歧义归属裁决规则。"),
|
|
221
|
+
]),
|
|
222
|
+
"frontend/design-system.md": md_template(
|
|
223
|
+
"前端设计系统基线", "baseline/frontend/design-system.md",
|
|
224
|
+
"token strategy / component source / reuse rules",
|
|
225
|
+
[
|
|
226
|
+
("token strategy", "设计令牌的组织与消费策略(令牌分层、命名、消费入口)。"),
|
|
227
|
+
("component source", "组件的权威来源与准入规则(来源登记;自造组件的判定与禁止面)。"),
|
|
228
|
+
("reuse rules", "复用规则:何时复用既有件、何时新建、禁止的绕过路径。"),
|
|
229
|
+
]),
|
|
230
|
+
"frontend/state-and-data.md": md_template(
|
|
231
|
+
"前端状态与数据基线", "baseline/frontend/state-and-data.md",
|
|
232
|
+
"state ownership / server-state / cache / derived",
|
|
233
|
+
[
|
|
234
|
+
("state ownership", "逐类状态登记属主:谁拥有写权、谁只读;跨组件共享的裁决。"),
|
|
235
|
+
("server-state", "服务端状态的获取、同步与失效策略(缓存期/重取时机由 Owner 定)。"),
|
|
236
|
+
("cache", "客户端缓存范围与失效规则(缓存什么、何时不缓存)。"),
|
|
237
|
+
("derived", "派生状态的计算位置与一致性约束(派生链登记;禁止的重复真源)。"),
|
|
238
|
+
]),
|
|
239
|
+
"frontend/api-and-error.md": md_template(
|
|
240
|
+
"前端 API 与错误处理基线", "baseline/frontend/api-and-error.md",
|
|
241
|
+
"client hierarchy / error taxonomy / retry",
|
|
242
|
+
[
|
|
243
|
+
("client hierarchy", "请求客户端的分层与唯一出口(每层职责;禁止的旁路调用)。"),
|
|
244
|
+
("error taxonomy", "错误分类与用户呈现映射(逐类登记:识别方式与呈现口径)。"),
|
|
245
|
+
("retry", "重试规则:哪些操作可重试、上限与退避方式(由 Owner 决策)。"),
|
|
246
|
+
]),
|
|
247
|
+
"frontend/quality.md": md_template(
|
|
248
|
+
"前端质量基线", "baseline/frontend/quality.md",
|
|
249
|
+
"coverage budget / CRAP / browser matrix / a11y",
|
|
250
|
+
[
|
|
251
|
+
("coverage budget", "覆盖率预算(阈值数字由 Owner 决策;口径与度量面一并登记)。"),
|
|
252
|
+
("CRAP", "复杂度风险阈值的治理约定(告警与阻断的取值由 Owner 决策)。"),
|
|
253
|
+
("browser matrix", "浏览器与设备支持矩阵逐项列出(支持/降级/不支持三档)。"),
|
|
254
|
+
("a11y", "可访问性基线(对标哪一版标准、核查方式与频率,由 Owner 决策)。"),
|
|
255
|
+
]),
|
|
256
|
+
"backend/architecture.md": md_template(
|
|
257
|
+
"后端架构基线", "baseline/backend/architecture.md",
|
|
258
|
+
"System / Service / Layer / Module / Boundary",
|
|
259
|
+
[
|
|
260
|
+
("System", "系统全景:服务清单与系统边界(每个服务一句话职责)。"),
|
|
261
|
+
("Service", "单服务职责与自治范围(数据归属与对外承诺)。"),
|
|
262
|
+
("Layer", "层结构与各层职责(逐层登记;层集合由 Owner 定义)。"),
|
|
263
|
+
("Module", "模块划分与三要素:入口、职责、依赖(逐模块登记)。"),
|
|
264
|
+
("Boundary", "跨模块/跨服务边界规则:允许与禁止的依赖方向逐条显式登记。"),
|
|
265
|
+
]),
|
|
266
|
+
"backend/directory-structure.md": md_template(
|
|
267
|
+
"后端目录结构基线", "baseline/backend/directory-structure.md",
|
|
268
|
+
"项目后端目录模板",
|
|
269
|
+
[
|
|
270
|
+
("项目后端目录模板", "目标目录树逐条登记:目录名 + 一句话职责 + 关键边界说明。"),
|
|
271
|
+
]),
|
|
272
|
+
"backend/api-contract.md": md_template(
|
|
273
|
+
"后端 API 契约基线", "baseline/backend/api-contract.md",
|
|
274
|
+
"REST style / error envelope / auth / versioning",
|
|
275
|
+
[
|
|
276
|
+
("REST style", "接口风格约定(资源组织、命名、方法语义)由 Owner 决策后登记。"),
|
|
277
|
+
("error envelope", "错误信封结构:字段、语义与错误码分配规则(逐字段登记)。"),
|
|
278
|
+
("auth", "认证与授权的机制决策(机制、凭据载体、失效策略)。"),
|
|
279
|
+
("versioning", "契约版本策略:版本载体、兼容承诺、废弃流程。"),
|
|
280
|
+
]),
|
|
281
|
+
"backend/data-access.md": md_template(
|
|
282
|
+
"后端数据访问基线", "baseline/backend/data-access.md",
|
|
283
|
+
"Repository / SQL / N+1 / index / pagination",
|
|
284
|
+
[
|
|
285
|
+
("Repository", "数据访问的组织形态与唯一出口(禁止的直连路径逐条登记)。"),
|
|
286
|
+
("SQL", "SQL 编写与审查规则(谁写、谁审、禁写形态)。"),
|
|
287
|
+
("N+1", "查询放大问题的预防约定(识别方式与处置路径)。"),
|
|
288
|
+
("index", "索引策略:建索引的依据与登记方式(逐索引登记)。"),
|
|
289
|
+
("pagination", "分页约定(分页方式与默认页大小由 Owner 决策)。"),
|
|
290
|
+
]),
|
|
291
|
+
"backend/transaction-concurrency.md": md_template(
|
|
292
|
+
"后端事务与并发基线", "baseline/backend/transaction-concurrency.md",
|
|
293
|
+
"TX boundary / lock / optimistic / idempotency",
|
|
294
|
+
[
|
|
295
|
+
("TX boundary", "事务边界:在哪一层开启、如何传播、如何收口(逐场景登记)。"),
|
|
296
|
+
("lock", "锁策略:锁粒度、持有时长、死锁预防规则。"),
|
|
297
|
+
("optimistic", "乐观并发:版本载体与冲突处理路径。"),
|
|
298
|
+
("idempotency", "幂等键的载体与覆盖范围(逐类操作登记)。"),
|
|
299
|
+
]),
|
|
300
|
+
"backend/integration-runtime.md": md_template(
|
|
301
|
+
"后端集成与运行时基线", "baseline/backend/integration-runtime.md",
|
|
302
|
+
"external integration / resilience / deployment",
|
|
303
|
+
[
|
|
304
|
+
("external integration", "外部集成登记要素逐条填:对端、协议、超时、降级(取值由 Owner 定)。"),
|
|
305
|
+
("resilience", "韧性策略的适用范围:超时、重试、熔断、隔离(逐策略登记适用面)。"),
|
|
306
|
+
("deployment", "部署形态与运行时约束(形态、资源约束、发布单元)。"),
|
|
307
|
+
]),
|
|
308
|
+
"backend/quality.md": md_template(
|
|
309
|
+
"后端质量基线", "baseline/backend/quality.md",
|
|
310
|
+
"coverage / CRAP / mutation / architecture / contract",
|
|
311
|
+
[
|
|
312
|
+
("coverage", "覆盖率要求(阈值数字由 Owner 决策;口径一并登记)。"),
|
|
313
|
+
("CRAP", "复杂度风险阈值(告警与阻断取值由 Owner 决策)。"),
|
|
314
|
+
("mutation", "变异测试的适用范围与判卷阈值(范围、阈值由 Owner 决策)。"),
|
|
315
|
+
("architecture", "架构核查方式:依赖方向与分层约定的验证手段与频率。"),
|
|
316
|
+
("contract", "契约测试的覆盖范围与触发时机。"),
|
|
317
|
+
]),
|
|
318
|
+
"data/model.md": md_template(
|
|
319
|
+
"数据模型基线", "baseline/data/model.md",
|
|
320
|
+
"Entity / Table / Identifier / Relation / lifecycle",
|
|
321
|
+
[
|
|
322
|
+
("Entity", "实体清单逐条登记:实体名 + 一句话定义。"),
|
|
323
|
+
("Table", "物理表与实体的映射规则(一比一/拆分/合并的裁决依据)。"),
|
|
324
|
+
("Identifier", "标识符策略:形态、生成方、唯一性范围(逐实体登记)。"),
|
|
325
|
+
("Relation", "关系与基数逐对登记(双方、基数、删除语义)。"),
|
|
326
|
+
("lifecycle", "对象生命周期:状态集合与允许的转移规则(逐对象登记)。"),
|
|
327
|
+
]),
|
|
328
|
+
"data/precision-units.md": md_template(
|
|
329
|
+
"数据精度与单位基线", "baseline/data/precision-units.md",
|
|
330
|
+
"Money / Currency / Quantity / Scale / Rounding",
|
|
331
|
+
[
|
|
332
|
+
("Money", "金额的表示与运算规则(表示形态、运算入口由 Owner 决策)。"),
|
|
333
|
+
("Currency", "币种处理规则与默认币种(默认值由 Owner 决策)。"),
|
|
334
|
+
("Quantity", "数量的表示与单位登记(逐量纲登记)。"),
|
|
335
|
+
("Scale", "精度与小数位登记(逐字段登记)。"),
|
|
336
|
+
("Rounding", "舍入模式与适用场景(逐场景登记)。"),
|
|
337
|
+
]),
|
|
338
|
+
"data/migration.md": md_template(
|
|
339
|
+
"数据迁移基线", "baseline/data/migration.md",
|
|
340
|
+
"expand / migrate / contract / rollback",
|
|
341
|
+
[
|
|
342
|
+
("迁移策略(expand / migrate / contract / rollback)",
|
|
343
|
+
"扩-迁-缩三阶段约定与回滚方案;每次迁移的审批面与验证要求。"),
|
|
344
|
+
]),
|
|
345
|
+
"data/lineage.md": md_template(
|
|
346
|
+
"数据血缘基线", "baseline/data/lineage.md",
|
|
347
|
+
"Source / Transform / Target",
|
|
348
|
+
[
|
|
349
|
+
("数据链路(Source → Transform → Target)",
|
|
350
|
+
"逐条登记:来源 → 变换 → 目标;每段的属主与校验点。"),
|
|
351
|
+
]),
|
|
352
|
+
"data/quality.md": md_template(
|
|
353
|
+
"数据质量基线", "baseline/data/quality.md",
|
|
354
|
+
"null / uniqueness / precision / stale / reconciliation",
|
|
355
|
+
[
|
|
356
|
+
("null", "空值语义:哪些字段可空、空值的含义(逐字段登记)。"),
|
|
357
|
+
("uniqueness", "唯一性约束逐条登记(约束、范围、违反时的处置)。"),
|
|
358
|
+
("precision", "跨系统边界的精度承诺(承诺什么、由谁保证)。"),
|
|
359
|
+
("stale", "时效性:数据的有效期与陈旧判定(逐类数据登记)。"),
|
|
360
|
+
("reconciliation", "对账机制:周期、口径、差异处置路径。"),
|
|
361
|
+
]),
|
|
362
|
+
"platform/security.md": md_template(
|
|
363
|
+
"平台安全基线", "baseline/platform/security.md",
|
|
364
|
+
"auth / secret / sensitive data / trust zone",
|
|
365
|
+
[
|
|
366
|
+
("auth", "认证与授权机制决策(机制、会话策略、权限模型由 Owner 定)。"),
|
|
367
|
+
("secret", "密钥与凭据的管理规则(存放、注入方式、轮换周期由 Owner 定)。"),
|
|
368
|
+
("sensitive data", "敏感数据清单与处理规则(分类、最小化、脱敏要求)。"),
|
|
369
|
+
("trust zone", "信任边界划分:哪些组件在边界内、哪些在边界外、跨界规则。"),
|
|
370
|
+
]),
|
|
371
|
+
"platform/environment.md": md_template(
|
|
372
|
+
"平台环境基线", "baseline/platform/environment.md",
|
|
373
|
+
"local / dev / test / stage / prod 差异规则",
|
|
374
|
+
[
|
|
375
|
+
("环境差异规则(local / dev / test / stage / prod)",
|
|
376
|
+
"逐环境登记:用途、配置差异面、数据策略、访问控制;差异必须显式登记,"
|
|
377
|
+
"禁止隐式假设(环境集合由 Owner 按项目实际裁剪)。"),
|
|
378
|
+
]),
|
|
379
|
+
"platform/observability.md": md_template(
|
|
380
|
+
"平台可观测性基线", "baseline/platform/observability.md",
|
|
381
|
+
"log / metric / trace / audit / correlation",
|
|
382
|
+
[
|
|
383
|
+
("log", "日志分类、级别语义与保留策略。"),
|
|
384
|
+
("metric", "指标清单与口径(逐指标登记:名称、含义、维度)。"),
|
|
385
|
+
("trace", "链路追踪的范围与采样策略(由 Owner 决策)。"),
|
|
386
|
+
("audit", "审计事件清单与不可抵赖要求(逐事件登记)。"),
|
|
387
|
+
("correlation", "关联标识:请求贯穿链路的载体与传播规则。"),
|
|
388
|
+
]),
|
|
389
|
+
"platform/delivery.md": md_template(
|
|
390
|
+
"平台交付基线", "baseline/platform/delivery.md",
|
|
391
|
+
"build / CI / release / version / rollback / artifact",
|
|
392
|
+
[
|
|
393
|
+
("build", "构建过程与产物定义(入口、产物清单)。"),
|
|
394
|
+
("CI", "CI 检查集与门槛(逐检查登记:名称与放行语义)。"),
|
|
395
|
+
("release", "发布流程与审批面(阶段、审批人、放行条件)。"),
|
|
396
|
+
("version", "版本策略与兼容承诺(版本词形、承诺范围)。"),
|
|
397
|
+
("rollback", "回滚方案与演练要求(触发条件、步骤、演练频率)。"),
|
|
398
|
+
("artifact", "制品管理:仓库、保留策略、不可变承诺。"),
|
|
399
|
+
]),
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
# 分区分母(PRD §3 树 1+7+8+5+4 = 25;清单 entry lane = 播种分区词形)。
|
|
403
|
+
LANE_TARGETS = {
|
|
404
|
+
"frontend": ["stack.yaml", "architecture.md", "directory-structure.md",
|
|
405
|
+
"design-system.md", "state-and-data.md", "api-and-error.md",
|
|
406
|
+
"quality.md"],
|
|
407
|
+
"backend": ["stack.yaml", "architecture.md", "directory-structure.md",
|
|
408
|
+
"api-contract.md", "data-access.md", "transaction-concurrency.md",
|
|
409
|
+
"integration-runtime.md", "quality.md"],
|
|
410
|
+
"data": ["model.md", "precision-units.md", "migration.md", "lineage.md",
|
|
411
|
+
"quality.md"],
|
|
412
|
+
"platform": ["security.md", "environment.md", "observability.md", "delivery.md"],
|
|
413
|
+
}
|
|
414
|
+
assert len(LANE_TARGETS["frontend"]) == 7
|
|
415
|
+
assert len(LANE_TARGETS["backend"]) == 8
|
|
416
|
+
assert len(LANE_TARGETS["data"]) == 5
|
|
417
|
+
assert len(LANE_TARGETS["platform"]) == 4
|
|
418
|
+
|
|
419
|
+
# ======================================================================
|
|
420
|
+
# 词形纪律自校验(UNKNOWN 起步;「待填写」零残留;零技术默认词;零阈值数字)
|
|
421
|
+
# ======================================================================
|
|
422
|
+
# 禁词表 = PRD §7.1 警示句列举词 + B6c PROFILE 卡 includes 组合词 + 常见栈词
|
|
423
|
+
# (case-insensitive 词边界;骨架节名词形如 REST/CRAP/a11y/UI 是 PRD 职责词形不入表)。
|
|
424
|
+
FORBIDDEN_TECH_PATTERN = re.compile(
|
|
425
|
+
r"\b(vue|react|angular|svelte|emberjs|nuxt|pinia|redux|mobx|rxjs"
|
|
426
|
+
r"|spring|mybatis|jpa|hibernate|struts"
|
|
427
|
+
r"|mysql|postgresql|postgres|mariadb|sqlite|mongodb|redis|memcached|etcd"
|
|
428
|
+
r"|nginx|tomcat|jetty|undertow|iis"
|
|
429
|
+
r"|kubernetes|docker|helm|terraform|ansible"
|
|
430
|
+
r"|java|kotlin|scala|groovy|python|django|flask|rails|laravel|php|ruby|perl"
|
|
431
|
+
r"|typescript|javascript|coffeescript"
|
|
432
|
+
r"|vitest|jest|mocha|karma|playwright|cypress|selenium|puppeteer"
|
|
433
|
+
r"|webpack|rollup|esbuild|parcel|gulp|grunt|eslint|prettier|biome"
|
|
434
|
+
r"|tailwind|bootstrap|antd|mui|chakra|primereact|devextreme|handsontable"
|
|
435
|
+
r"|tanstack|ag-grid|wcag"
|
|
436
|
+
r"|graphql|grpc|protobuf|thrift"
|
|
437
|
+
r"|kafka|rabbitmq|rocketmq|pulsar|activemq"
|
|
438
|
+
r"|elasticsearch|solr|clickhouse|doris|starrocks|minio)\b",
|
|
439
|
+
re.IGNORECASE,
|
|
440
|
+
)
|
|
441
|
+
FORBIDDEN_PLACEHOLDER_PATTERN = re.compile(r"(待填写|待补|TBD|TODO|FIXME)", re.IGNORECASE)
|
|
442
|
+
# 阈值数字默认值面(90%/warning=6/fail=12 类)——起步态零数字百分比。
|
|
443
|
+
FORBIDDEN_THRESHOLD_PATTERN = re.compile(r"\d+\s*%")
|
|
444
|
+
# 零墙钟(A4)。
|
|
445
|
+
WALLCLOCK_PATTERN = re.compile(r"\d{4}-\d{2}-\d{2}T")
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
def assert_word_discipline(rel, text):
|
|
449
|
+
"""单件词形纪律 fail-closed(禁词命中即爆——本批红线「零发明内容」)。"""
|
|
450
|
+
hit = FORBIDDEN_TECH_PATTERN.search(text)
|
|
451
|
+
assert hit is None, f"词形纪律违例(技术默认词) {rel}: {hit.group(0) if hit else ''}"
|
|
452
|
+
hit = FORBIDDEN_PLACEHOLDER_PATTERN.search(text)
|
|
453
|
+
assert hit is None, f"词形纪律违例(占位词形,起步值须 UNKNOWN) {rel}: {hit.group(0)}"
|
|
454
|
+
hit = FORBIDDEN_THRESHOLD_PATTERN.search(text)
|
|
455
|
+
assert hit is None, f"词形纪律违例(阈值数字) {rel}: {hit.group(0)}"
|
|
456
|
+
assert not WALLCLOCK_PATTERN.search(text), f"零墙钟违例(A4) {rel}"
|
|
457
|
+
assert "UNKNOWN" in text, f"起步词形缺席 {rel}(全部字段/章节起步值 = UNKNOWN)"
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
def build_seed_assets():
|
|
461
|
+
"""25 件字节 + manifest 文档(107 条原样保留 + B6D 25 条追加)。"""
|
|
462
|
+
assets = {}
|
|
463
|
+
b6d_entries = []
|
|
464
|
+
b6d_targets = []
|
|
465
|
+
|
|
466
|
+
# baseline/manifest.yaml(机器锚面——yaml.safe_load 直接可解析性在构建期断言)。
|
|
467
|
+
manifest_yaml = build_manifest_yaml()
|
|
468
|
+
assets["baseline/manifest.yaml"] = manifest_yaml.encode("utf-8")
|
|
469
|
+
# stack.yaml ×2(键集/台账在构建期对账)。
|
|
470
|
+
for lane in ("frontend", "backend"):
|
|
471
|
+
assets[f"baseline/{lane}/stack.yaml"] = STACK_YAML_CONTENT[lane].encode("utf-8")
|
|
472
|
+
# md 模板 ×22。
|
|
473
|
+
for rel, content in MD_TEMPLATES.items():
|
|
474
|
+
assets[f"baseline/{rel}"] = content.encode("utf-8")
|
|
475
|
+
|
|
476
|
+
# ---- 构建期自校验(fail-closed)----
|
|
477
|
+
# 1) 分母 25 = 1 + 4 分区计数;md 件 22(25 - manifest - 2 stack)。
|
|
478
|
+
assert len(assets) == 25, f"baseline 分母漂移: {len(assets)}"
|
|
479
|
+
# 2) 逐件词形纪律。
|
|
480
|
+
for rel, data in sorted(assets.items()):
|
|
481
|
+
assert_word_discipline(rel, data.decode("utf-8"))
|
|
482
|
+
# 3) yaml 直接可解析(manifest/stack 三件;frontmatter 缺席的机器证明)。
|
|
483
|
+
for rel in ("baseline/manifest.yaml", "baseline/frontend/stack.yaml",
|
|
484
|
+
"baseline/backend/stack.yaml"):
|
|
485
|
+
doc = yaml.safe_load(assets[rel].decode("utf-8"))
|
|
486
|
+
assert isinstance(doc, dict), f"{rel} 顶层须为映射(单文档直解析)"
|
|
487
|
+
# 4) manifest.yaml 身份/lanes/台账断言。
|
|
488
|
+
mdoc = yaml.safe_load(assets["baseline/manifest.yaml"].decode("utf-8"))
|
|
489
|
+
assert mdoc["id"] == "BASELINE.PROJECT"
|
|
490
|
+
assert mdoc["schema_version"] == 1
|
|
491
|
+
assert mdoc["seed"] == {"tool": "pomaster init", "seed_version": BATCH,
|
|
492
|
+
"seed_manifest": "package://seeds/manifest.json"}
|
|
493
|
+
assert mdoc["status"] == "CURRENT"
|
|
494
|
+
assert mdoc["lanes"] == {"frontend": "./frontend", "backend": "./backend",
|
|
495
|
+
"data": "./data", "platform": "./platform"}
|
|
496
|
+
assert mdoc["unknowns"] == unknowns_ledger(), "unknowns 台账 ≠ stack.yaml 键集派生"
|
|
497
|
+
# 5) stack.yaml 键集 == 台账派生;值全 UNKNOWN(键序照 PRD §3 逐字)。
|
|
498
|
+
fe = yaml.safe_load(assets["baseline/frontend/stack.yaml"].decode("utf-8"))
|
|
499
|
+
be = yaml.safe_load(assets["baseline/backend/stack.yaml"].decode("utf-8"))
|
|
500
|
+
assert list(fe.keys()) == FE_STACK_KEYS and list(be.keys()) == BE_STACK_KEYS
|
|
501
|
+
assert all(v == "UNKNOWN" for v in fe.values())
|
|
502
|
+
assert all(v == "UNKNOWN" for v in be.values())
|
|
503
|
+
# 6) md 件节结构:每节带起步值行(UNKNOWN)。
|
|
504
|
+
for rel, data in assets.items():
|
|
505
|
+
if not rel.endswith(".md"):
|
|
506
|
+
continue
|
|
507
|
+
text = data.decode("utf-8")
|
|
508
|
+
n_sections = len([ln for ln in text.splitlines() if ln.startswith("## ")])
|
|
509
|
+
n_unknown = len([ln for ln in text.splitlines() if ln == "- 起步值:UNKNOWN"])
|
|
510
|
+
assert n_sections >= 1 and n_sections == n_unknown, \
|
|
511
|
+
f"{rel} 节/起步值不对账: {n_sections} vs {n_unknown}"
|
|
512
|
+
|
|
513
|
+
# ---- manifest 条目(自指指纹 pin)----
|
|
514
|
+
for rel in sorted(assets):
|
|
515
|
+
# lane = 播种分区词形(与 target 同源);baseline 根 manifest 条目取 "baseline"。
|
|
516
|
+
lane = "baseline" if rel == "baseline/manifest.yaml" else rel.split("/")[1]
|
|
517
|
+
data = assets[rel]
|
|
518
|
+
target = f".pomaster/{rel}"
|
|
519
|
+
b6d_targets.append(target)
|
|
520
|
+
b6d_entries.append({
|
|
521
|
+
"target": target,
|
|
522
|
+
"asset": rel,
|
|
523
|
+
"seed_version": BATCH,
|
|
524
|
+
"lane": lane,
|
|
525
|
+
"authoring": "new",
|
|
526
|
+
"source_path": DESIGN_SOURCE,
|
|
527
|
+
"source_sha256": hashlib.sha256(data).hexdigest(),
|
|
528
|
+
"source_bytes": len(data),
|
|
529
|
+
"porting_notes": list(NEW_AUTHORING_NOTES),
|
|
530
|
+
})
|
|
531
|
+
|
|
532
|
+
# manifest.json(107 条原样保留 + B6D 追加——单源合并分母 132)。
|
|
533
|
+
old_doc = json.loads(open(MANIFEST_PATH, encoding="utf-8").read())
|
|
534
|
+
assert old_doc["schema"] == MANIFEST_SCHEMA
|
|
535
|
+
old_entries = old_doc["entries"]
|
|
536
|
+
old_batches = old_doc.get("batches") or {}
|
|
537
|
+
kept_names = ("B6B-1", "B6B-2", "B6C")
|
|
538
|
+
kept_batches = {k: list(v) for k, v in old_batches.items() if k in kept_names}
|
|
539
|
+
assert set(kept_batches) == set(kept_names), "磁盘清单缺 B6b/B6c 批名单"
|
|
540
|
+
kept_targets = set()
|
|
541
|
+
for k in kept_names:
|
|
542
|
+
kept_targets |= set(kept_batches[k])
|
|
543
|
+
kept_entries = [e for e in old_entries if e["target"] in kept_targets]
|
|
544
|
+
assert len(kept_entries) == 107, f"B6b/B6c 条目数漂移: {len(kept_entries)}"
|
|
545
|
+
assert not (kept_targets & set(b6d_targets)), "B6D 目标与既有条目撞名"
|
|
546
|
+
batch_targets = dict(kept_batches)
|
|
547
|
+
batch_targets[BATCH] = b6d_targets
|
|
548
|
+
manifest_doc = {
|
|
549
|
+
"schema": MANIFEST_SCHEMA,
|
|
550
|
+
"batch": BATCH,
|
|
551
|
+
"batches": batch_targets,
|
|
552
|
+
"generated_by": "catalog/tools/seed_b6d_baseline.py",
|
|
553
|
+
"denominator": {
|
|
554
|
+
"batch_scope": BATCH_SCOPE,
|
|
555
|
+
"planted": len(kept_entries) + len(b6d_entries),
|
|
556
|
+
"planted_total": PLANTED_TOTAL,
|
|
557
|
+
"batch_new": len(b6d_entries),
|
|
558
|
+
},
|
|
559
|
+
"seed_semantics": "seed-once-missing-only(缺席才写 / 在座零触碰 / marker-free;"
|
|
560
|
+
"seeds.ts 单一实现;frontmatter 为 PRD §8.2 字段位减 id——"
|
|
561
|
+
"no-governed-id 默认,播种 spec 是项目可编辑自由文件;B6c 起 "
|
|
562
|
+
"BE 件含 vendor frontmatter 保留字段、stacks 件落 <slug> 子"
|
|
563
|
+
"目录——SEEDABLE_STORE_DIRS 显式 slug 登记;B6d 起 baseline "
|
|
564
|
+
"件为新著纯正文(无 frontmatter——yaml 直接可解析/Owner 填写"
|
|
565
|
+
"面零噪音;entry authoring=new,pin=资产自身字节指纹,装载器"
|
|
566
|
+
"自指校验;UNKNOWN 起步,「待填写」词形零移植)",
|
|
567
|
+
"authority_scope": "specs 面 mixed_required_and_advisory;baseline 面 "
|
|
568
|
+
"project_baseline_template(UNKNOWN 起步模板,非规则面)",
|
|
569
|
+
"entries": kept_entries + b6d_entries,
|
|
570
|
+
}
|
|
571
|
+
return assets, manifest_doc
|
|
572
|
+
|
|
573
|
+
|
|
574
|
+
def write_if_changed(path, data):
|
|
575
|
+
if os.path.isfile(path):
|
|
576
|
+
if open(path, "rb").read() == data:
|
|
577
|
+
return False
|
|
578
|
+
os.makedirs(os.path.dirname(path), exist_ok=True)
|
|
579
|
+
open(path, "wb").write(data)
|
|
580
|
+
return True
|
|
581
|
+
|
|
582
|
+
|
|
583
|
+
def main():
|
|
584
|
+
built_assets, manifest_doc = build_seed_assets()
|
|
585
|
+
outputs = {}
|
|
586
|
+
for rel, data in built_assets.items():
|
|
587
|
+
outputs[os.path.join(BASELINE_ASSET_DIR, *rel.split("/")[1:])] = data
|
|
588
|
+
outputs[MANIFEST_PATH] = (json.dumps(manifest_doc, ensure_ascii=False, indent=2)
|
|
589
|
+
+ "\n").encode("utf-8")
|
|
590
|
+
|
|
591
|
+
if "--verify" in sys.argv:
|
|
592
|
+
drifts = []
|
|
593
|
+
for path, data in outputs.items():
|
|
594
|
+
if not os.path.isfile(path):
|
|
595
|
+
drifts.append({"path": path, "error": "missing"})
|
|
596
|
+
elif open(path, "rb").read() != data:
|
|
597
|
+
drifts.append({"path": path, "error": "bytes_differ"})
|
|
598
|
+
if drifts:
|
|
599
|
+
for d in drifts:
|
|
600
|
+
print("DRIFT:", d)
|
|
601
|
+
sys.exit(1)
|
|
602
|
+
print(f"[seed_b6d_baseline] verify ok: {len(built_assets)} seeds + manifest.json"
|
|
603
|
+
f"(共 {len(manifest_doc['entries'])} 条,字节逐等)")
|
|
604
|
+
return
|
|
605
|
+
|
|
606
|
+
changed = 0
|
|
607
|
+
for path, data in sorted(outputs.items()):
|
|
608
|
+
if write_if_changed(path, data):
|
|
609
|
+
changed += 1
|
|
610
|
+
print("WROTE:", os.path.relpath(path, VNEXT))
|
|
611
|
+
print(f"[seed_b6d_baseline] ok: {len(outputs)} outputs({changed} changed / "
|
|
612
|
+
f"{len(outputs) - changed} unchanged);baseline={len(built_assets)} "
|
|
613
|
+
f"manifest_entries={len(manifest_doc['entries'])}"
|
|
614
|
+
f"(B6D +{manifest_doc['denominator']['batch_new']},"
|
|
615
|
+
f"总 {manifest_doc['denominator']['planted']})")
|
|
616
|
+
print("下一步:corepack pnpm test(分母 132 面断言)+ 全量门禁")
|
|
617
|
+
|
|
618
|
+
|
|
619
|
+
if __name__ == "__main__":
|
|
620
|
+
main()
|