pomaster 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/COMMERCIAL_LICENSE.md +35 -0
  2. package/LICENSE +83 -0
  3. package/README.md +396 -0
  4. package/SECURITY.md +22 -0
  5. package/TRADEMARKS.md +12 -0
  6. package/catalog/candidates/candidates-draft.json +198 -0
  7. package/catalog/candidates/rejected.json +422 -0
  8. package/catalog/catalog-lock.draft.json +822 -0
  9. package/catalog/gates/gate.be.api.contract_checks.json +138 -0
  10. package/catalog/gates/gate.be.chg.contract_change_checks.json +138 -0
  11. package/catalog/gates/gate.chg.prechange_checks.json +155 -0
  12. package/catalog/gates/gate.web.api.request_checks.json +149 -0
  13. package/catalog/gates/gate.web.grid.checks.json +149 -0
  14. package/catalog/knowledge/knowledge.api.example_stable_error_code.json +80 -0
  15. package/catalog/knowledge/knowledge.chg.example_compat_window.json +87 -0
  16. package/catalog/knowledge/knowledge.chg.example_prop_migration.json +87 -0
  17. package/catalog/knowledge/knowledge.fp.api.field_drift_no_contract.json +83 -0
  18. package/catalog/knowledge/knowledge.fp.api.per_page_http_client.json +83 -0
  19. package/catalog/knowledge/knowledge.fp.be.contract_drift.json +87 -0
  20. package/catalog/knowledge/knowledge.fp.chg.page_local_padding.json +88 -0
  21. package/catalog/knowledge/knowledge.fp.grid.global_td_width.json +87 -0
  22. package/catalog/knowledge/knowledge.web.api.example_get_entity_list.json +83 -0
  23. package/catalog/knowledge/knowledge.web.grid.example_column_preset.json +83 -0
  24. package/catalog/policies/authority.be.api_contract_ownership.json +77 -0
  25. package/catalog/policies/authority.be.contract_ownership.json +73 -0
  26. package/catalog/policies/authority.chg.change_owners.json +75 -0
  27. package/catalog/policies/authority.web.api.request_owners.json +82 -0
  28. package/catalog/policies/authority.web.grid.ownership.json +78 -0
  29. package/catalog/policies/policy.api.backward_compat_defaults.json +83 -0
  30. package/catalog/policies/policy.api.contract_impl_consistency.json +81 -0
  31. package/catalog/policies/policy.api.no_informal_contract.json +82 -0
  32. package/catalog/policies/policy.arch.decision_tradeoff_record.json +78 -0
  33. package/catalog/policies/policy.cache.lifecycle_definition.json +79 -0
  34. package/catalog/policies/policy.chg.affect_templates.json +79 -0
  35. package/catalog/policies/policy.chg.breaking_versioning.json +81 -0
  36. package/catalog/policies/policy.chg.compat_migration_rollback.json +82 -0
  37. package/catalog/policies/policy.chg.deprecate_before_delete.json +82 -0
  38. package/catalog/policies/policy.chg.fix_at_root_cause_level.json +78 -0
  39. package/catalog/policies/policy.chg.observable_evolution.json +78 -0
  40. package/catalog/policies/policy.chg.prechange_consumer_scan.json +83 -0
  41. package/catalog/policies/policy.chg.staged_rollout.json +79 -0
  42. package/catalog/policies/policy.chg.sync_contract_docs_tests.json +81 -0
  43. package/catalog/policies/policy.conflict.priority_ladder.json +79 -0
  44. package/catalog/policies/policy.dep.admission_six_dimension_check.json +84 -0
  45. package/catalog/policies/policy.dep.change_surface_review.json +82 -0
  46. package/catalog/policies/policy.dep.introduction_review.json +83 -0
  47. package/catalog/policies/policy.derived.single_implementation.json +77 -0
  48. package/catalog/policies/policy.obs.correlation_context_minimum.json +81 -0
  49. package/catalog/policies/policy.obs.rum_dimension_whitelist.json +77 -0
  50. package/catalog/policies/policy.proc.pre_code_declaration.json +78 -0
  51. package/catalog/policies/policy.rel.pre_release_confirmation.json +77 -0
  52. package/catalog/policies/policy.role.domain_decision_authority.json +77 -0
  53. package/catalog/policies/policy.sec.third_party_execution_register.json +78 -0
  54. package/catalog/policies/policy.spec.admission_criteria.json +79 -0
  55. package/catalog/policies/policy.spec.derived_view_regeneration.json +79 -0
  56. package/catalog/policies/policy.spec.draft_not_baseline.json +77 -0
  57. package/catalog/policies/policy.spec.file_structure_contract.json +76 -0
  58. package/catalog/policies/policy.spec.metadata_required.json +76 -0
  59. package/catalog/policies/policy.spec.post_dev_backfill_classify.json +74 -0
  60. package/catalog/policies/policy.spec.procedural_record_not_surrogate.json +76 -0
  61. package/catalog/policies/policy.spec.semantic_identity.json +77 -0
  62. package/catalog/policies/policy.spec.unresolved_ledger_gate.json +79 -0
  63. package/catalog/policies/policy.stack.no_implicit_selection.json +77 -0
  64. package/catalog/policies/policy.tool.scoped_scan_boundary.json +78 -0
  65. package/catalog/policies/policy.web.api.auth_app_client_split.json +93 -0
  66. package/catalog/policies/policy.web.api.client_change_impact.json +86 -0
  67. package/catalog/policies/policy.web.api.domain_api_only.json +84 -0
  68. package/catalog/policies/policy.web.api.error_normalization.json +82 -0
  69. package/catalog/policies/policy.web.api.generated_client.json +82 -0
  70. package/catalog/policies/policy.web.api.late_result_guard.json +80 -0
  71. package/catalog/policies/policy.web.api.mutation_idempotency.json +84 -0
  72. package/catalog/policies/policy.web.api.no_network_optimism.json +82 -0
  73. package/catalog/policies/policy.web.api.query_cancel_stale_drop.json +80 -0
  74. package/catalog/policies/policy.web.api.request_infrastructure.json +95 -0
  75. package/catalog/policies/policy.web.api.retry_discipline.json +87 -0
  76. package/catalog/policies/policy.web.api.session_recovery_split.json +94 -0
  77. package/catalog/policies/policy.web.api.single_http_client.json +88 -0
  78. package/catalog/policies/policy.web.api.single_loading_source.json +81 -0
  79. package/catalog/policies/policy.web.api.transport_vs_business.json +81 -0
  80. package/catalog/policies/policy.web.api.trusted_endpoint_source.json +82 -0
  81. package/catalog/policies/policy.web.api.typed_domain_naming.json +79 -0
  82. package/catalog/policies/policy.web.arch.layer_isolation.json +376 -0
  83. package/catalog/policies/policy.web.arch.naming_conventions.json +207 -0
  84. package/catalog/policies/policy.web.arch.public_api_barrel.json +134 -0
  85. package/catalog/policies/policy.web.chg.controlled_change_triggers.json +79 -0
  86. package/catalog/policies/policy.web.copy.suppression_ledger_discipline.json +78 -0
  87. package/catalog/policies/policy.web.grid.column_schema_fields.json +78 -0
  88. package/catalog/policies/policy.web.grid.config_isolation.json +78 -0
  89. package/catalog/policies/policy.web.grid.freeze_key_columns.json +77 -0
  90. package/catalog/policies/policy.web.grid.interaction_registry.json +80 -0
  91. package/catalog/policies/policy.web.grid.keyboard_clipboard.json +79 -0
  92. package/catalog/policies/policy.web.grid.schema_driven_shell.json +81 -0
  93. package/catalog/policies/policy.web.grid.schema_versioning.json +78 -0
  94. package/catalog/policies/policy.web.grid.server_ops_virtualization.json +81 -0
  95. package/catalog/policies/policy.web.grid.shell_change_matrix.json +76 -0
  96. package/catalog/policies/policy.web.grid.width_fix_ladder.json +79 -0
  97. package/catalog/policies/policy.web.perf.budget_skeleton.json +110 -0
  98. package/catalog/policies/policy.web.style.ownership_matrix.json +207 -0
  99. package/catalog/policies/policy.web.track.consent_lifecycle.json +78 -0
  100. package/catalog/policies/policy.web.track.privacy_default_deny.json +81 -0
  101. package/catalog/policies/policy.web.track.stable_event_keys.json +78 -0
  102. package/catalog/policies/policy.web.uiux.provider_evidence_not_business_truth.json +86 -0
  103. package/catalog/projection-presets/registry-tree.yaml +307 -0
  104. package/catalog/sensors/sensor.browser.deterministic.json +53 -0
  105. package/catalog/sensors/sensor.browser.interactive.json +58 -0
  106. package/catalog/sensors/sensor.build.static.json +45 -0
  107. package/catalog/sensors/sensor.contract.conformance.json +47 -0
  108. package/catalog/sensors/sensor.performance.budget.json +46 -0
  109. package/catalog/sensors/sensor.production.metric.json +44 -0
  110. package/catalog/tools/apply_human_review_pilot_0001.py +488 -0
  111. package/catalog/tools/materialize_batch4_uplift.py +776 -0
  112. package/catalog/tools/materialize_catalog_pilot.py +784 -0
  113. package/dist/bin.js +52362 -0
  114. package/legal/THIRD_PARTY_NOTICES.md +336 -0
  115. package/package.json +36 -0
@@ -0,0 +1,307 @@
1
+ # ==============================================================================
2
+ # projection preset: registry-tree —— 注册表树投影预设(配置骨架 / CONFIG SKELETON)
3
+ # ==============================================================================
4
+ # 【架构声明】本预设产出的目录是「可再生投影」(directory = projection, not fact):
5
+ # - Canonical State(.pomaster/truth/objects/** + .pomaster/state/truth-index.json)
6
+ # 是唯一事实源;投影目录里每一个字节都可由 State 重算——「目录存在 ≠ 事实存在」
7
+ # 这一历史病灶的化解方式就是「目录 = 投影」:熟悉的结构,不再说谎的状态。
8
+ # - 单向流:State → 渲染器 → 投影文件;投影文件永不作为任何 compiler / 对象摄入
9
+ # 的输入,修改事实的唯一入口是 State(走 Transition + Authority)。
10
+ # 【byte-stable 再生契约】硬约束全文见 docs/registry-tree-projection-preset.md(§1.2 不变量 /
11
+ # §5 再生成契约):同一 State 两次渲染必须字节全等;投影文件禁带 generated_at 类
12
+ # 墙钟字段,新鲜度只由 State rev / inputsFingerprint 推导渲染;渲染前检测到投影
13
+ # 文件与期望产物不一致(疑似人手改)→ WARN + 指引「去改 State」,不阻断。
14
+ # 【本文件是什么】配置骨架——只声明投影预设的「映射与约束」,不含任何渲染逻辑。
15
+ # 渲染器是后续砖(D25④),依赖 reconcile/compact 管线,自然落点 P0.5 / 纳管线 M5。
16
+ # 决议来源:D25(.trellis/tasks/08-27-pomaster-vnext-control-plane/prd.md,用户决议 2026-08-28)
17
+ # 词表纪律:source_families 只引用 vocab-lock prefixes_v0 已登记前缀;未登记处显式
18
+ # TODO(vocab-pr) 只登记不执行(FROZEN 词表零改动)。
19
+ # ==============================================================================
20
+
21
+ preset:
22
+ name: registry-tree
23
+ kind: projection_preset
24
+ status: DRAFT
25
+ decision: D25
26
+ contract_doc: docs/registry-tree-projection-preset.md
27
+ description_zh: >-
28
+ 把 Canonical State 编译渲染成消费项目在旧 PoMaster 时代熟悉的目录骨架
29
+ (outputs/frontend/10_planned、30_generated/page-specs、handoffs、bp,
30
+ 以及 spec 分类法 → catalog lanes 的归位映射),保持完成纳管的项目对旧结构的
31
+ 视觉与工具链熟悉度,同时不复活「目录存在 ≠ 事实存在」的病灶。
32
+ enabled: false # 契约 §7:默认关闭,纳管项目按需启用(Minimum Sufficient Governance——未承载旧资产的新项目不背遗产骨架)
33
+ state_source: # 唯一事实源(A1:一对象一文件)
34
+ objects_root: .pomaster/truth/objects/
35
+ index: .pomaster/state/truth-index.json
36
+ vocab_lock: packages/schemas/assets/vocab-lock.draft.yaml # prefixes_v0 白名单来源
37
+ renderer:
38
+ status: not_yet_built # 后续砖(D25④);本文件只锁映射与约束
39
+ ownership: pending # kernel 扩展 vs 独立 reporter 包 → 渲染器砖设计会话裁决(契约 §9.5)
40
+ depends_on: [reconcile, compact] # 管线就绪后才有稳定输入;落点 P0.5 / 纳管线 M5
41
+ project_overrides: # 契约 §7:逐项目可覆盖,覆盖项集中进项目配置(有 Authority 记录),禁散落各工具(C7)
42
+ allowed: [legacy_root_path, registry_grouping, numbering_semantics_level, render_templates]
43
+
44
+ regeneration_contract: # 契约 §1.2 + §5(渲染器砖任何实现或重构的验收底线,违反即 bug)
45
+ invariants:
46
+ - canonical_state_single_source_of_truth # §1.2-1
47
+ - one_way_flow_state_to_projection # §1.2-2:投影永不作为摄入输入
48
+ - fully_regenerable_byte_identical # §1.2-3:删除任何投影文件后同 State 重渲可字节级还原
49
+ - byte_stable_zero_wall_clock # §1.2-4(A4/D24)
50
+ - zero_manual_maintenance_tax # §1.2-5:人永不编辑投影产物
51
+ - renderer_pure_derivation # §1.2-6:不写 store、不产生治理事实、不进 truth-index、不分配 seq/rev
52
+ triggers: [reconcile_delta, compact_truth_update, explicit_command]
53
+ short_circuit: same_state_zero_write # 同 State 重放(inputsFingerprint 相等)→ 零写入(A4)
54
+ golden_obligation:
55
+ rule: 固定 State snapshot 下连续两次渲染字节全等,且与 checked-in 期望产物 diff 为空
56
+ location: tests/golden/
57
+ adversarial_case: DEF-POM-002(manifest 内墙钟致幂等崩坏)固定为对抗组反例
58
+ write_discipline: staged_write_with_rollback # 失败回滚;清理路径禁凭存在性推断删除原件(staged-replace 事故教训)
59
+ failure_mode: keep_last_consistent_state # 渲染失败禁半写状态;差异进 reconcile 差异报告
60
+ absence_semantics: explicit_absence # 源对象缺失 → 显式占位块/差异报告条目;not_configured ≠ passed;禁静默留空
61
+ freshness_fields: [rev, inputsFingerprint] # 投影文件头允许的确定性字段
62
+ wall_clock_fields: forbidden
63
+ stale_policy: warn_and_regen # 手改检测 → WARN + 指引去改 State,不阻断;下次渲染覆盖
64
+
65
+ numbering_semantics: # 契约 §3:编号前缀 = 目录内的阶段语义(D25②:编号即投影阶段的视觉语言)
66
+ machine_rule: 编号不是任何机器判卷依据——机器按对象四轴判状态,编号只服务人类阅读惯性
67
+ prefixes:
68
+ "00":
69
+ stage: input
70
+ meaning_zh: 原始输入(sources 登记)
71
+ state_anchor: sources[].type ∈ {bp_blueprint, prototype_walkthrough, research_evidence}
72
+ status: pending_owner_confirmation # 实测补全(frontend 与 bp 均有 00_input);D25 只冻结 10/30(契约 §9.6)
73
+ "10":
74
+ stage: planned
75
+ meaning_zh: 规划投影
76
+ state_anchor: lifecycle ∈ {PROPOSED, CURRENT} 对象的规划态视图
77
+ frozen_by: D25
78
+ observed_subdirs: [10_planned, 10_working] # working = 交互进行中
79
+ "20":
80
+ stage: interaction_verification
81
+ meaning_zh: 交互/核验中间带
82
+ state_anchor: evidence 轴 IMPLEMENTED → VERIFIED 的核验视图
83
+ status: pending_owner_confirmation # 实测补全(20_verified);语义定稿待 Owner 裁决后回填(契约 §9.6)
84
+ "30":
85
+ stage: generated
86
+ meaning_zh: 编译视图(跨对象聚合渲染的阅读面)
87
+ state_anchor: 跨对象聚合编译视图
88
+ frozen_by: D25
89
+ bp_side: # bp/ 侧三档与上表同构:输入 → 加工 → 发布
90
+ "00": input
91
+ "10": working
92
+ "30": publish
93
+
94
+ spec_taxonomy_to_catalog_lanes: # 契约 §4(D25③):老 spec 分类法 → catalog lane 组织
95
+ boundary: >-
96
+ 这是「目录组织层面」的归位映射,不是把协议正文原样搬家——协议正文必须经
97
+ Semantic Decomposition 拆为 policy/knowledge/gate_recipe 条目(§92-93
98
+ 「禁止格式迁移」禁令不因本表松动)。
99
+ mappings:
100
+ - legacy_layer: .trellis/spec/frontend/
101
+ observed_files: 46
102
+ catalog_lane: web
103
+ targets: [catalog/policies/, catalog/gates/]
104
+ id_family_examples: ["POLICY.WEB.*", "GATE.WEB.*", "AUTHORITY.WEB.*"]
105
+ semantics: 前端可执行规范 → LANE_POLICY / GATE_RECIPE
106
+ - legacy_layer: .trellis/spec/backend/(含 stacks/)
107
+ observed_files: 62
108
+ catalog_lane: be
109
+ targets: [catalog/policies/, catalog/gates/]
110
+ stacks_target: catalog/technologies/ # Tech Profile(D17 首发顺序 Python/FastAPI → Java → Node)
111
+ id_family_examples: ["POLICY.BE.*", "GATE.BE.*", "AUTHORITY.BE.*"]
112
+ semantics: 后端可执行规范 → LANE_POLICY / GATE_RECIPE
113
+ - legacy_layer: .trellis/spec/guides/
114
+ observed_files: 7
115
+ targets: [catalog/knowledge/]
116
+ id_family_examples: ["KNOWLEDGE.*", "KNOWLEDGE.FP.*"]
117
+ semantics: 思维清单 → knowledge_entry;advisory 永不 FAIL gate(x-advisory-gate-semantics 已固化)
118
+ - legacy_layer: spec manifest(分层 index)
119
+ observed_files: 1
120
+ targets: [catalog/catalog-lock.draft.json, 目录索引]
121
+ semantics: 分层入口的机器对应物 = catalog-lock read-side 指纹(D24:升级 diff + 防篡改抽验),不是散文 manifest
122
+ inherited_semantics:
123
+ per_layer_index_md: 由 catalog-lock + Router(Triage 判档)承接
124
+ guides_always_included: 由 knowledge 条目的触发注入(ADVISORY 区)承接
125
+
126
+ output_projection_groups: # 契约 §2:目录映射(组级声明;逐文件 assignment 归渲染器砖)
127
+ group_switching: 每组可单独开关(契约 §7);E3 在 PERMIT.* 登记词汇前缀前强制 disabled
128
+ core: # D25② 点名
129
+ - id: P1
130
+ legacy_path: outputs/frontend/10_planned/*.yaml
131
+ observed: 48 份顶层 registry/plan YAML(12 编号 plan 文档 + 36 名称键 registry/事实源,合计约 66,606 行)
132
+ rule: one_yaml_file_per_registry
133
+ enabled_by_default: true
134
+ source_families: ["CAPABILITY.", "COMPONENT.", "API_REQ.", "ERR.", "FIELD.", "PAGE.", "KNOWLEDGE.", "POLICY.", "DENOMINATOR.", "KEYBINDING."]
135
+ notes:
136
+ - registry 文件名保持老名(视觉熟悉);文件内条目按对象 id 确定性排序;YAML 输出确定性序列化(键序固定)
137
+ - 逐 registry ↔ 对象族归属表由渲染器砖按 A1 单对象文件反聚合填充
138
+ - id: P2
139
+ legacy_path: outputs/frontend/10_planned/screen-blueprints/*.yaml
140
+ observed: "39 份 screen-blueprint(约 8,681 行;自带 status: DRAFT 与 unresolved 数组)"
141
+ rule: one_file_per_page_with_four_axis_header
142
+ enabled_by_default: true
143
+ source_families: ["PAGE."]
144
+ notes:
145
+ - "文件头渲染四轴(lifecycle/confidence/evidence/change)+ unresolved: 数组——继承老 blueprint 的诚实缺席语义"
146
+ - id 主拼写 canonical,aliases: 渲染老形态(PAGE-TASK-STEP-* / PAGE-APP-* 经 alias 双向链,A6 考古方向)
147
+ - id: P3
148
+ legacy_path: outputs/frontend/30_generated/page-specs/*.md
149
+ observed: 39 份编译 page-spec MD(约 12,962 行,均 ~330 行/页)
150
+ rule: compiled_reading_view_21_sections
151
+ enabled_by_default: true
152
+ source_families: ["PAGE.", "CAPABILITY.", "API_REQ.", "ERR.", "FIELD.", "KEYBINDING."]
153
+ notes:
154
+ - 章节两态显式标注——(引用)绑定既有对象稳定 id、不重写正文;(占位)无派生数据、以 TODO/引导注记占位(占位是诚实缺席,不是伪造内容)
155
+ - 必须继承老头注「本文档是编译视图……本 MD 仅供人/AI 阅读,不作为其他 compiler 的输入」
156
+ - B4 口径:旧编译器维护至 M5 就绪即冻结;中间以本 preset 影子版 diff 校准
157
+ - id: P4
158
+ legacy_path: outputs/handoffs/frontend-to-backend/
159
+ observed: FRONTEND-TO-BACKEND.md + candidate-openapi.yaml(881 行)+ contract.yaml(1,593 行)+ source/ + sync-receipts/
160
+ rule: contract_aggregate_plus_openapi_candidate
161
+ enabled_by_default: true
162
+ source_families: ["API_REQ."]
163
+ notes:
164
+ - 契约表与候选 OpenAPI 从 contract_operation 对象族渲染;保留老权属标签语义「frontend proposal — not a backend baseline」
165
+ - sync-receipts 由对账差异报告渲染(与 reconcile 共用同一对账结果,不另立真相)
166
+ - id: P5
167
+ legacy_path: outputs/handoffs/frontend-to-bp/
168
+ observed: TECHNICAL-FEEDBACK.md + bp-response-template.md
169
+ rule: feedback_view
170
+ enabled_by_default: true
171
+ source_families: ["CHANGE.", "KNOWLEDGE."]
172
+ notes:
173
+ - 技术反馈从裁决链(change_object.decision_refs)与挑战记录渲染
174
+ - decision_refs 目标形态 DECISION.* 前缀未入 prefixes_v0 → TODO(vocab-pr)(契约 §9.3)
175
+ - id: P6
176
+ legacy_path: outputs/bp/{00_input,10_working,30_publish}/
177
+ observed: source-register;01_background-card … 07_business-readiness 七份工作件;bp-blueprint.yaml
178
+ rule: bp_pipeline_view
179
+ enabled_by_default: true
180
+ source_families: ["DENOMINATOR."]
181
+ notes:
182
+ - 输入→加工→发布三段保持老目录形态;输入侧登记 sources[].type=bp_blueprint 的 source 对象与 DENOMINATOR. 覆盖分母
183
+ - bp 侧对象族 kind 粒度(business_model / claim-register / gap-register 等)未入 truth_bodies 十类 → TODO(vocab-pr)(契约 §9.2);首版按 business_rule + change_object 保守渲染
184
+ observed_pending_owner: # 契约 §2.2:实测存在、D25 未点名——诚实登记,待 Owner 裁决是否纳入首版(契约 §9.4)
185
+ - id: E1
186
+ legacy_path: outputs/frontend/00_input/
187
+ observed: blueprint-baseline.yaml、decision-deltas/、technical-audit-findings.yaml
188
+ rule: input_registry_view
189
+ enabled_by_default: null # pending owner decision
190
+ source_families: [] # sources[].type ∈ {bp_blueprint, prototype_walkthrough, research_evidence} 的输入登记视图;与 P6 的 00_input 同构
191
+ - id: E2
192
+ legacy_path: outputs/frontend/10_working/ 与 20_verified/
193
+ observed: 03_technical-assessment(working);08_current-state、performance-test-results(verified)
194
+ rule: verification_band_view
195
+ enabled_by_default: null
196
+ source_families: [] # evidence 轴 IMPLEMENTED → VERIFIED 的中间带视图
197
+ - id: E3
198
+ legacy_path: outputs/frontend/10_planned/authorizations/*.yaml
199
+ observed: frontend-prepare-30.p2.yaml(Component Gap 授权)
200
+ rule: authorization_ledger_view
201
+ enabled_by_default: false # 强制 disabled:PERMIT.* 前缀未入 prefixes_v0(契约 §9.1),登记前不得启用
202
+ source_families: [] # 目标族 PERMIT.* → TODO(vocab-pr)
203
+ - id: E4
204
+ legacy_path: outputs/frontend/30_generated/FRONTEND-PREDEVELOPMENT-CONFIRMATION.md
205
+ observed: 开发前确认聚合视图
206
+ rule: aggregate_checklist_view
207
+ enabled_by_default: null
208
+ source_families: [] # 跨对象聚合 checklist,可与 P3 同批渲染
209
+ explicitly_not_projected: # 契约 §2.3:显式不投影(写明为何缺席)
210
+ - legacy_path: outputs/.pomaster/transactions/
211
+ reason: 事务簿记是控制面内部状态,vNext 对应物是 store state/journal.jsonl(kernel-api §1/§9);机器簿记残渣不侵入人类阅读视图(P9 簿记分离)
212
+ - legacy_path: outputs/archive/
213
+ reason: 历史快照,纳管时一次性归档,非活投影
214
+
215
+ observed_legacy_files:
216
+ # 【观察记录,非 assignment】本节以「observed legacy files + 少量 family 锚点」收录
217
+ # 旧 PoMaster 时代消费项目的目录位形(只读实测:MASTer_master,2026-08-28 复核,
218
+ # 同契约证据基线 research/masters-evidence-03-artifact-vs-reality.md)。
219
+ # 逐文件 → 对象族的完整归属表是渲染器砖(D25④)的活,本预设不做 assignment;
220
+ # family_anchors 只锚定契约已点名的置信映射,其余归属由渲染器砖填充。
221
+ # 口径注:老 PoMaster 包(治理工具侧)的 schema/协议名(interaction-contract-registry、
222
+ # ai-coding-forbidden-rules、form-governance、grid-governance、error-to-ui-state 等)
223
+ # 属 Semantic Decomposition 收编对象(契约 §4 边界),不是消费项目 outputs 的投影
224
+ # 对象,不入本清单。
225
+ observation:
226
+ consumer_project: MASTer_master(Vue3 + element-plus + ag-grid 整车成本分析前端)
227
+ outputs_totals: 209 文件 / 4.80MB
228
+ evidence_ref: .trellis/tasks/08-27-pomaster-vnext-control-plane/research/masters-evidence-03-artifact-vs-reality.md
229
+ directory_skeleton: # 12 个目录位形
230
+ - outputs/frontend/00_input/(含 decision-deltas/)
231
+ - outputs/frontend/10_planned/(顶层 48 份 registry/plan YAML)
232
+ - outputs/frontend/10_planned/screen-blueprints/(39 份)
233
+ - outputs/frontend/10_planned/authorizations/(E3)
234
+ - outputs/frontend/10_working/
235
+ - outputs/frontend/20_verified/
236
+ - outputs/frontend/30_generated/(含 FRONTEND-PREDEVELOPMENT-CONFIRMATION.md)
237
+ - outputs/frontend/30_generated/page-specs/(39 份编译 MD)
238
+ - outputs/handoffs/frontend-to-backend/(含 source/、sync-receipts/)
239
+ - outputs/handoffs/frontend-to-bp/
240
+ - outputs/bp/(00_input / 10_working / 30_publish 三档)
241
+ - outputs/.pomaster/transactions/ 与 outputs/archive/(显式不投影组)
242
+ top_level_registry_plan_files: # 10_planned 顶层 48 份 = 12 编号 plan 文档 + 36 名称键 registry/事实源
243
+ numbered_plan_documents: # 12 份(编号阶段语义见 numbering_semantics)
244
+ - 00_lifecycle
245
+ - 01_domain-projection
246
+ - 02_process-task-interface
247
+ - 03_technical-assessment
248
+ - 04_bp-feedback-register
249
+ - 05_engineering-decisions
250
+ - 06_traceability-plan
251
+ - 07_readiness
252
+ - 08_uiux-functional-spec
253
+ - 09_implementation-plan
254
+ - 10_action-responsibility-matrix
255
+ - 11_predevelopment-confirmation
256
+ registries_and_factsources: # 36 份名称键文件(老名保持,见 P1)
257
+ - action-placement-registry
258
+ - api-error-mapping
259
+ - api-requirement-registry
260
+ - application-page-registry
261
+ - application-shell-registry
262
+ - architecture-constraints
263
+ - bp-business-contract
264
+ - business-rule-registry
265
+ - calculation-registry
266
+ - component-registry
267
+ - component-selection-register
268
+ - data-model-registry
269
+ - dependency-registry
270
+ - directory-layout
271
+ - field-semantic-registry
272
+ - formatter-registry
273
+ - http-client-policy
274
+ - implementation-boundary-plan
275
+ - issue-register
276
+ - migration-ledger
277
+ - mock-contract
278
+ - navigation-structure
279
+ - navigation-transition-registry
280
+ - negative-constraint
281
+ - page-anatomy-registry
282
+ - page-readiness-registry
283
+ - page-template-registry
284
+ - pattern-registry
285
+ - performance-budget
286
+ - request-classification
287
+ - state-machine-registry
288
+ - state-ownership-matrix
289
+ - style-ownership-registry
290
+ - test-fixture-plan
291
+ - uiux-provider-overlay
292
+ - vendor-adapter-registry
293
+ family_anchors: # 少量置信锚点(契约 §2 点名);其余逐文件归属由渲染器砖填充
294
+ component-registry: ["COMPONENT.", "CAPABILITY."] # GRID.* 经 alias 收编(A6)
295
+ api-requirement-registry: ["API_REQ."]
296
+ page-readiness-registry: ["PAGE."] # 四轴就绪度
297
+ screen-blueprints: ["PAGE."] # PAGE-TASK-STEP-* / PAGE-APP-* alias 考古
298
+ page-specs: ["PAGE.", "CAPABILITY.", "API_REQ.", "ERR.", "FIELD.", "KEYBINDING."]
299
+ handoffs-frontend-to-backend: ["API_REQ."] # contract_operation 聚合
300
+ business-rule-registry: kind:business_rule # TODO(vocab-pr):bp 侧 kind 粒度见契约 §9.2
301
+ other_observed_forms:
302
+ screen-blueprints: "39 份,自带 status: DRAFT 与 unresolved 数组(诚实缺席语义,P2 继承)"
303
+ page-specs: 39 份编译 MD(30_generated 42 文件),头注声明「编译视图,不作为 compiler 输入」(P3 继承)
304
+ handoffs: 13 文件(FRONTEND-TO-BACKEND.md、candidate-openapi.yaml、contract.yaml、source/、sync-receipts/;TECHNICAL-FEEDBACK.md、bp-response-template.md)
305
+ bp: 10 文件(00_input/source-register;10_working/01_background-card … 07_business-readiness 七份工作件;30_publish/bp-blueprint.yaml)
306
+ inputs: 00_input/blueprint-baseline.yaml、technical-audit-findings.yaml、decision-deltas/(E1)
307
+ transactions: outputs/.pomaster/transactions/ 下 3 份 TX-*/journal.json(显式不投影)
@@ -0,0 +1,53 @@
1
+ {
2
+ "x-vocab-pr": {
3
+ "status": "vocab_pr_candidate",
4
+ "finding": "SENSOR. 前缀不在 prefixes_v0 15 前缀闭包内(closed-world:未登记前缀解析即 FATAL);且 kind='sensor_capability' 不在 kinds_registry.truth_bodies",
5
+ "proposal": "词汇表 PR 登记 SENSOR. 前缀与 sensor_capability kind;备选落法:sensor capability 住 catalog/sensors/ 非 truth 对象层,身份只作 catalog 物料标识(沿 catalog/gates/gate.web.api.request_checks.json 的 GATE. 先例;裁决 8(2026-09-01)D6=A:SENSOR.<DOMAIN>.<KIND> 点族词形照研究侧推荐实施)",
6
+ "open_enum_registration": "本条目消费的开放枚举(PRD §6.4 明言不要求立即成为 Closed-world Core Vocab;pending vocab PR → TODO(vocab-pr-0005)):surfaces=USER_SURFACE/INTERACTION_STATE/RUNTIME_SIGNAL/RESOURCE_BEHAVIOR;side_effect_class=INTERACTIVE_REVERSIBLE;evidence_types=test_report/console_observation/network_observation;availability_probe.surface=toolDetectors",
7
+ "locked_vocab_untouched": true
8
+ },
9
+ "id": "SENSOR.BROWSER.DETERMINISTIC",
10
+ "kind": "sensor_capability",
11
+ "title_zh": "浏览器确定性回归 Sensor(Playwright 通道)",
12
+ "statement_zh": "经 @playwright/test 官方 JSONReport 对用户界面做确定性回归观察:官方报告全量重算 + console/network 双维度完整性强制(缺维=not_run);与 MCP 交互腿互不替代(§6.6)、互不牵连(两腿两记录,无聚合 verdict 位)。",
13
+ "surfaces": [
14
+ "USER_SURFACE",
15
+ "INTERACTION_STATE",
16
+ "RUNTIME_SIGNAL",
17
+ "RESOURCE_BEHAVIOR"
18
+ ],
19
+ "operations": [
20
+ "launch_or_attach",
21
+ "navigate",
22
+ "click",
23
+ "type",
24
+ "snapshot",
25
+ "screenshot",
26
+ "inspect_console",
27
+ "inspect_network"
28
+ ],
29
+ "side_effect_class": "INTERACTIVE_REVERSIBLE",
30
+ "evidence_types": [
31
+ "test_report",
32
+ "console_observation",
33
+ "network_observation"
34
+ ],
35
+ "implementations": [
36
+ "playwright"
37
+ ],
38
+ "availability_probe": {
39
+ "surface": "toolDetectors",
40
+ "keys": [
41
+ "playwright"
42
+ ],
43
+ "note": "声明式引用(四克制:防第二套探测机制)——可执行性永远归 gauntlet-lite toolDetectors 单一探测面(detectPlaywright);doctor 呈现行=playwright(B3-1/D22①)。键闭包由 tests/integration/sensor-capability-catalog.spec.ts 交叉测试守。"
44
+ },
45
+ "fallback": [],
46
+ "fallback_note": "空数组=显式登记无降级(§6.6 明言 Browser MCP 与 Playwright 不是互相替代);@playwright/test 缺席 → not_run 显式,禁静默。",
47
+ "x-source-anchors": {
48
+ "adapter": "packages/gauntlet-lite/src/playwright-adapter.ts + playwright-leg.ts(确定性腿:官方 JSONReport 词形解析)",
49
+ "doctor_row": "packages/cli/src/doctor.ts playwright 探针行",
50
+ "detector": "packages/gauntlet-lite/src/index.ts toolDetectors.playwright(15 探测器单一事实源)"
51
+ },
52
+ "x-prd": "POMaster-vNext-PRD-v0.5.2 §6.5 + §14 P1-5;裁决 8(2026-09-01)D6=A/D7=A"
53
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "x-vocab-pr": {
3
+ "status": "vocab_pr_candidate",
4
+ "finding": "SENSOR. 前缀不在 prefixes_v0 15 前缀闭包内(closed-world:未登记前缀解析即 FATAL);且 kind='sensor_capability' 不在 kinds_registry.truth_bodies",
5
+ "proposal": "词汇表 PR 登记 SENSOR. 前缀与 sensor_capability kind;备选落法:sensor capability 住 catalog/sensors/ 非 truth 对象层,身份只作 catalog 物料标识(沿 catalog/gates/gate.web.api.request_checks.json 的 GATE. 先例;裁决 8(2026-09-01)D6=A:SENSOR.<DOMAIN>.<KIND> 点族词形照研究侧推荐实施)",
6
+ "open_enum_registration": "本条目消费的开放枚举(PRD §6.4 明言不要求立即成为 Closed-world Core Vocab;pending vocab PR → TODO(vocab-pr-0005)):surfaces=USER_SURFACE/INTERACTION_STATE/BOUNDARY_IO/RUNTIME_SIGNAL/RESOURCE_BEHAVIOR;side_effect_class=INTERACTIVE_REVERSIBLE;availability_probe.surface=toolDetectors",
7
+ "locked_vocab_untouched": true
8
+ },
9
+ "id": "SENSOR.BROWSER.INTERACTIVE",
10
+ "kind": "sensor_capability",
11
+ "title_zh": "浏览器交互诊断 Sensor(MCP 通道)",
12
+ "statement_zh": "对运行中的用户界面做交互式诊断观察:进入/导航/点击/输入/快照/截图/网络与控制台检查/性能追踪。本条目只登记能力不绑定具体工具(§6.5 原则:POMaster reasons about capability / Runtime binds concrete tool——项目 Truth 禁写死 MCP);证据字节由编排方入 evidence pack,本条目为纯能力描述物料(§92.2:Catalog 不是第二套 Project Truth)。",
13
+ "surfaces": [
14
+ "USER_SURFACE",
15
+ "INTERACTION_STATE",
16
+ "BOUNDARY_IO",
17
+ "RUNTIME_SIGNAL",
18
+ "RESOURCE_BEHAVIOR"
19
+ ],
20
+ "operations": [
21
+ "launch_or_attach",
22
+ "navigate",
23
+ "click",
24
+ "type",
25
+ "snapshot",
26
+ "screenshot",
27
+ "inspect_network",
28
+ "inspect_console",
29
+ "performance_trace"
30
+ ],
31
+ "side_effect_class": "INTERACTIVE_REVERSIBLE",
32
+ "evidence_types": [
33
+ "accessibility_snapshot",
34
+ "screenshot",
35
+ "network_observation",
36
+ "console_observation",
37
+ "performance_trace"
38
+ ],
39
+ "implementations": [
40
+ "chrome-devtools-mcp",
41
+ "playwright"
42
+ ],
43
+ "availability_probe": {
44
+ "surface": "toolDetectors",
45
+ "keys": [
46
+ "chromeDevtoolsMcp"
47
+ ],
48
+ "note": "声明式引用(四克制:防第二套探测机制)——可执行性永远归 gauntlet-lite toolDetectors 单一探测面;doctor 呈现行=chrome_devtools_mcp(D22 一键引导)。键闭包由 tests/integration/sensor-capability-catalog.spec.ts 交叉测试守。"
49
+ },
50
+ "fallback": [],
51
+ "fallback_note": "空数组=显式登记无降级(§6.6 明言 Browser MCP 与 Playwright 不是互相替代:MCP 适合探索/交互诊断,Playwright 适合确定性回归);未来 Sensor Resolution(P0.5-4)如需降级语义再扩。",
52
+ "x-source-anchors": {
53
+ "adapter": "packages/gauntlet-lite/src/browser-adapter.ts(MCP 交互腿 adapter:握手 smoke + 证据三件套判卷)",
54
+ "doctor_row": "packages/cli/src/doctor.ts chrome_devtools_mcp 探针行(D22 探测 + 一键引导)",
55
+ "detector": "packages/gauntlet-lite/src/index.ts toolDetectors.chromeDevtoolsMcp(15 探测器单一事实源)"
56
+ },
57
+ "x-prd": "POMaster-vNext-PRD-v0.5.2 §6.5 例文逐字 + §14 P1-5;裁决 8(2026-09-01)D6=A/D7=A"
58
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "x-vocab-pr": {
3
+ "status": "vocab_pr_candidate",
4
+ "finding": "SENSOR. 前缀不在 prefixes_v0 15 前缀闭包内(closed-world:未登记前缀解析即 FATAL);且 kind='sensor_capability' 不在 kinds_registry.truth_bodies",
5
+ "proposal": "词汇表 PR 登记 SENSOR. 前缀与 sensor_capability kind;备选落法:sensor capability 住 catalog/sensors/ 非 truth 对象层,身份只作 catalog 物料标识(沿 catalog/gates/gate.web.api.request_checks.json 的 GATE. 先例;裁决 8(2026-09-01)D6=A:SENSOR.<DOMAIN>.<KIND> 点族词形照研究侧推荐实施)",
6
+ "open_enum_registration": "本条目消费的开放枚举(PRD §6.4 明言不要求立即成为 Closed-world Core Vocab;pending vocab PR → TODO(vocab-pr-0005)):surfaces=STRUCTURAL_REALITY;side_effect_class=SANDBOXED_EXECUTION(新登记值:观察动作在沙箱内执行被测代码,副作用限于可丢弃产物);evidence_types=build_result/type_check_result/test_report;availability_probe.surface=gateAdapters(新登记引用面)",
7
+ "locked_vocab_untouched": true
8
+ },
9
+ "id": "SENSOR.BUILD.STATIC",
10
+ "kind": "sensor_capability",
11
+ "title_zh": "构建·类型·Lint Sensor(BUILD 门禁三机判)",
12
+ "statement_zh": "对代码与工程结构做确定性机判观察:typecheck/build/test 归一化腿(vitest 官方 JSON + pytest JUnit XML,判卷锚=报告重算,asserted/recomputed 孪生)。诚实边界:PRD P1-5 词形含 Lint,但仓内 BUILD adapter 现无 lint 执行腿——lint_scan 不虚登 operations,待执行腿落地后追加(禁提前登记未实现能力)。",
13
+ "surfaces": [
14
+ "STRUCTURAL_REALITY"
15
+ ],
16
+ "operations": [
17
+ "build",
18
+ "typecheck",
19
+ "test_run"
20
+ ],
21
+ "side_effect_class": "SANDBOXED_EXECUTION",
22
+ "evidence_types": [
23
+ "build_result",
24
+ "type_check_result",
25
+ "test_report"
26
+ ],
27
+ "implementations": [
28
+ "vitest",
29
+ "pytest"
30
+ ],
31
+ "availability_probe": {
32
+ "surface": "gateAdapters",
33
+ "keys": [
34
+ "build"
35
+ ],
36
+ "note": "声明式引用(四克制:防第二套探测机制)——BUILD 无独立 toolDetectors 键(vitest/pytest 探测在 build-adapter.detect 内联于 adapter 契约),可执行性归 gauntlet-lite gateAdapters.build 单一登记面(index.ts gateAdapters registry)。键闭包由 tests/integration/sensor-capability-catalog.spec.ts 交叉测试守。"
37
+ },
38
+ "fallback": [],
39
+ "fallback_note": "空数组=显式登记无降级;vitest/pytest 双腿互不替代(runner 由 prepare 按探测选择,缺席 not_configured 显式)。",
40
+ "x-source-anchors": {
41
+ "adapter": "packages/gauntlet-lite/src/build-adapter.ts + pytest-leg.ts(typecheck/build/test 归一化腿)",
42
+ "registry": "packages/gauntlet-lite/src/index.ts gateAdapters.build(adapter registry 单一登记面)"
43
+ },
44
+ "x-prd": "POMaster-vNext-PRD-v0.5.2 §6.4 STRUCTURAL_REALITY + §14 P1-5;裁决 8(2026-09-01)D6=A/D7=A"
45
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "x-vocab-pr": {
3
+ "status": "vocab_pr_candidate",
4
+ "finding": "SENSOR. 前缀不在 prefixes_v0 15 前缀闭包内(closed-world:未登记前缀解析即 FATAL);且 kind='sensor_capability' 不在 kinds_registry.truth_bodies",
5
+ "proposal": "词汇表 PR 登记 SENSOR. 前缀与 sensor_capability kind;备选落法:sensor capability 住 catalog/sensors/ 非 truth 对象层,身份只作 catalog 物料标识(沿 catalog/gates/gate.web.api.request_checks.json 的 GATE. 先例;裁决 8(2026-09-01)D6=A:SENSOR.<DOMAIN>.<KIND> 点族词形照研究侧推荐实施)",
6
+ "open_enum_registration": "本条目消费的开放枚举(PRD §6.4 明言不要求立即成为 Closed-world Core Vocab;pending vocab PR → TODO(vocab-pr-0005)):surfaces=BOUNDARY_IO/STRUCTURAL_REALITY;side_effect_class=SANDBOXED_EXECUTION;evidence_types=contract_diff/contract_test_report;availability_probe.surface=toolDetectors",
7
+ "locked_vocab_untouched": true
8
+ },
9
+ "id": "SENSOR.CONTRACT.CONFORMANCE",
10
+ "kind": "sensor_capability",
11
+ "title_zh": "契约 Sensor(CONTRACT 门禁双口径)",
12
+ "statement_zh": "对系统边界契约做机判观察:P22 双口径(operation_id 存在性对账 + oasdiff breaking-change diff 执行腿)+ schemathesis property-based 加强腿(官方退出码契约 0/1/2 × NDJSON 事件流重算双锚 + 零生成用例零分母闸)。观察面为 BOUNDARY_IO(contract result)与 STRUCTURAL_REALITY(contract diff)。",
13
+ "surfaces": [
14
+ "BOUNDARY_IO",
15
+ "STRUCTURAL_REALITY"
16
+ ],
17
+ "operations": [
18
+ "contract_diff",
19
+ "contract_conformance_check"
20
+ ],
21
+ "side_effect_class": "SANDBOXED_EXECUTION",
22
+ "side_effect_note": "oasdiff 腿为静态只读 diff;schemathesis 加强腿向被测服务注入 property-based 流量(副作用限于测试环境)——取两腿并集的诚实上限。",
23
+ "evidence_types": [
24
+ "contract_diff",
25
+ "contract_test_report"
26
+ ],
27
+ "implementations": [
28
+ "oasdiff",
29
+ "schemathesis"
30
+ ],
31
+ "availability_probe": {
32
+ "surface": "toolDetectors",
33
+ "keys": [
34
+ "oasdiff",
35
+ "schemathesis"
36
+ ],
37
+ "note": "声明式引用(四克制:防第二套探测机制)——可执行性永远归 gauntlet-lite toolDetectors 单一探测面;doctor 呈现行=oasdiff / schemathesis 各自独立(缺席各带各的安装路标,不聚合)。键闭包由 tests/integration/sensor-capability-catalog.spec.ts 交叉测试守。"
38
+ },
39
+ "fallback": [],
40
+ "fallback_note": "空数组=显式登记无降级;oasdiff(diff 腿)与 schemathesis(property-based 加强腿)是两口径并存非互备。",
41
+ "x-source-anchors": {
42
+ "adapter": "packages/gauntlet-lite/src/contract-adapter.ts + oasdiff-leg.ts + schemathesis-leg.ts",
43
+ "doctor_row": "packages/cli/src/doctor.ts oasdiff / schemathesis 探针行",
44
+ "detector": "packages/gauntlet-lite/src/index.ts toolDetectors.oasdiff / toolDetectors.schemathesis(15 探测器单一事实源)"
45
+ },
46
+ "x-prd": "POMaster-vNext-PRD-v0.5.2 §6.4 BOUNDARY_IO/STRUCTURAL_REALITY + §14 P1-5;裁决 8(2026-09-01)D6=A/D7=A"
47
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "x-vocab-pr": {
3
+ "status": "vocab_pr_candidate",
4
+ "finding": "SENSOR. 前缀不在 prefixes_v0 15 前缀闭包内(closed-world:未登记前缀解析即 FATAL);且 kind='sensor_capability' 不在 kinds_registry.truth_bodies",
5
+ "proposal": "词汇表 PR 登记 SENSOR. 前缀与 sensor_capability kind;备选落法:sensor capability 住 catalog/sensors/ 非 truth 对象层,身份只作 catalog 物料标识(沿 catalog/gates/gate.web.api.request_checks.json 的 GATE. 先例;裁决 8(2026-09-01)D6=A:SENSOR.<DOMAIN>.<KIND> 点族词形照研究侧推荐实施)",
6
+ "open_enum_registration": "本条目消费的开放枚举(PRD §6.4 明言不要求立即成为 Closed-world Core Vocab;pending vocab PR → TODO(vocab-pr-0005)):surfaces=RESOURCE_BEHAVIOR;side_effect_class=SANDBOXED_EXECUTION;evidence_types=lighthouse_report/web_vitals_metrics;availability_probe.surface=toolDetectors",
7
+ "locked_vocab_untouched": true
8
+ },
9
+ "id": "SENSOR.PERFORMANCE.BUDGET",
10
+ "kind": "sensor_capability",
11
+ "title_zh": "性能 Sensor(PERFORMANCE 双 runner)",
12
+ "statement_zh": "对性能与资源事实(RESOURCE_BEHAVIOR)做双 runner 观察:lighthouse 实验室腿(官方 LHR 词形解析,对账 types/lhr/*.d.ts)∥ web-vitals 字段腿(官方 Metric 词形解析,对账 src/types/base.ts);两腿两记录,无聚合 verdict 位,互不牵连(B3-3:对接 §29 性能预算字段,判卷字段集=schema 派生禁发明)。",
13
+ "surfaces": [
14
+ "RESOURCE_BEHAVIOR"
15
+ ],
16
+ "operations": [
17
+ "performance_trace",
18
+ "field_metrics_sample"
19
+ ],
20
+ "side_effect_class": "SANDBOXED_EXECUTION",
21
+ "side_effect_note": "lighthouse 实验室腿拉起受控浏览器对目标页采样;web-vitals 字段腿为只读采集——取双 runner 的诚实上限。",
22
+ "evidence_types": [
23
+ "lighthouse_report",
24
+ "web_vitals_metrics"
25
+ ],
26
+ "implementations": [
27
+ "lighthouse",
28
+ "web-vitals"
29
+ ],
30
+ "availability_probe": {
31
+ "surface": "toolDetectors",
32
+ "keys": [
33
+ "lighthouse",
34
+ "webVitals"
35
+ ],
36
+ "note": "声明式引用(四克制:防第二套探测机制)——可执行性永远归 gauntlet-lite toolDetectors 单一探测面;doctor 呈现行=lighthouse / web_vitals 双探针独立呈现不聚合(实验室判卷面/字段数据判卷面)。键闭包由 tests/integration/sensor-capability-catalog.spec.ts 交叉测试守。"
37
+ },
38
+ "fallback": [],
39
+ "fallback_note": "空数组=显式登记无降级;lighthouse(实验室面)与 web-vitals(字段面)是双 runner 并存非互备(B3-3)。",
40
+ "x-source-anchors": {
41
+ "adapter": "packages/gauntlet-lite/src/performance-adapter.ts + performance-leg.ts(双独立 adapter + runPerformanceGateLegs)",
42
+ "doctor_row": "packages/cli/src/doctor.ts lighthouse / web_vitals 探针行",
43
+ "detector": "packages/gauntlet-lite/src/index.ts toolDetectors.lighthouse / toolDetectors.webVitals(15 探测器单一事实源)"
44
+ },
45
+ "x-prd": "POMaster-vNext-PRD-v0.5.2 §6.4 RESOURCE_BEHAVIOR + §14 P1-5;裁决 8(2026-09-01)D6=A/D7=A"
46
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "x-vocab-pr": {
3
+ "status": "vocab_pr_candidate",
4
+ "finding": "SENSOR. 前缀不在 prefixes_v0 15 前缀闭包内(closed-world:未登记前缀解析即 FATAL);且 kind='sensor_capability' 不在 kinds_registry.truth_bodies",
5
+ "proposal": "词汇表 PR 登记 SENSOR. 前缀与 sensor_capability kind;备选落法:sensor capability 住 catalog/sensors/ 非 truth 对象层,身份只作 catalog 物料标识(沿 catalog/gates/gate.web.api.request_checks.json 的 GATE. 先例;裁决 8(2026-09-01)D6=A:SENSOR.<DOMAIN>.<KIND> 点族词形照研究侧推荐实施)",
6
+ "open_enum_registration": "本条目消费的开放枚举(PRD §6.4 明言不要求立即成为 Closed-world Core Vocab;pending vocab PR → TODO(vocab-pr-0005)):surfaces=PRODUCTION_REALITY;side_effect_class=READ_ONLY(§6.4:Production Observation 默认不得产生业务写副作用);evidence_types=control_band_evaluation/breach_evidence/production_observation;availability_probe.surface=kernel(新登记引用面)",
7
+ "locked_vocab_untouched": true
8
+ },
9
+ "id": "SENSOR.PRODUCTION.METRIC",
10
+ "kind": "sensor_capability",
11
+ "title_zh": "生产指标·控制带 Sensor(POB 台账)",
12
+ "statement_zh": "对生产环境事实(PRODUCTION_REALITY:SLO/error budget/control band/production metric/incident log)做只读观察:kernel production POB 台账(observations/breaches/challenges,POB-<12hex> 内容寻址 id)+ 控制带判定面(registerControlBand/evaluateControlBand)。§6.4 纪律:Production Observation 默认不得产生业务写副作用。",
13
+ "surfaces": [
14
+ "PRODUCTION_REALITY"
15
+ ],
16
+ "operations": [
17
+ "control_band_evaluate",
18
+ "observation_record_read",
19
+ "breach_read"
20
+ ],
21
+ "side_effect_class": "READ_ONLY",
22
+ "evidence_types": [
23
+ "control_band_evaluation",
24
+ "breach_evidence",
25
+ "production_observation"
26
+ ],
27
+ "implementations": [
28
+ "@pomaster/kernel:production"
29
+ ],
30
+ "availability_probe": {
31
+ "surface": "kernel",
32
+ "keys": [
33
+ "production_control_band"
34
+ ],
35
+ "note": "声明式引用(四克制:防第二套探测机制)——生产观察面是 kernel 数据面(POB 台账)而非外部工具,无 toolDetectors/gateAdapters 键;引用键闭包=kernel SENSOR_KERNEL_SURFACE_KEYS 常量(loadCatalogSensors fail-closed 校验),可执行性归 kernel production.ts 既有读取面。闭包由 tests/integration/sensor-capability-catalog.spec.ts 交叉测试守。"
36
+ },
37
+ "fallback": [],
38
+ "fallback_note": "空数组=显式登记无降级;POB 台账缺席 → 观察缺席显式呈现(禁静默当空)。",
39
+ "x-source-anchors": {
40
+ "kernel": "packages/kernel/src/production.ts(POB 台账 + ControlBand 判定:registerControlBand/evaluateControlBand/listBreaches 等)",
41
+ "prd_face": "PRD §6.4 PRODUCTION_REALITY 既有实现面(P34 控制带)"
42
+ },
43
+ "x-prd": "POMaster-vNext-PRD-v0.5.2 §6.4 PRODUCTION_REALITY + §14 P1-5;裁决 8(2026-09-01)D6=A/D7=A"
44
+ }