universal-dev-standards 6.3.7 → 6.3.8

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.
@@ -1,5 +1,133 @@
1
1
  id: design-document-standards
2
2
  meta:
3
3
  version: "1.0.0"
4
- updated: "2026-04-01"
4
+ updated: "2026-08-07"
5
5
  source: core/design-document-standards.md
6
+ # Extracted by hand (XSPEC-367 R2). convert-md-to-yaml.mjs was rejected: its
7
+ # output does not parse, truncates long values mid-sentence, and turns bold
8
+ # fragments into instructions.
9
+
10
+ rules:
11
+ - id: hld-has-all-six-sections
12
+ trigger: writing a High-Level Design
13
+ instruction: >-
14
+ Include all six sections — overview, architecture, data flow, API surface,
15
+ non-functional requirements, milestones. A missing section is a decision
16
+ nobody recorded, not a section nobody needed.
17
+ priority: required
18
+
19
+ - id: lld-has-all-five-sections
20
+ trigger: writing a Low-Level Design
21
+ instruction: >-
22
+ Include all five sections — component design, data model, algorithm
23
+ details, error handling, testing strategy.
24
+ priority: required
25
+
26
+ - id: start-diagrams-at-l1
27
+ trigger: adding an architecture diagram
28
+ instruction: >-
29
+ Begin with a C4 Context diagram before going deeper. L1 and L2 suit most
30
+ projects; reach for L3 and L4 only when complexity warrants it.
31
+ priority: required
32
+
33
+ - id: diagrams-follow-the-code
34
+ trigger: architecture changes
35
+ instruction: >-
36
+ Update the diagrams in the same change. A diagram describing the previous
37
+ architecture is worse than none — it is read as current.
38
+ priority: required
39
+
40
+ - id: record-significant-decisions
41
+ trigger: making a significant design decision
42
+ instruction: >-
43
+ Record it, with the options considered and why the others were rejected.
44
+ A decision without its alternatives cannot be revisited, only re-argued.
45
+ priority: required
46
+
47
+ - id: state-transitions-are-explicit
48
+ trigger: moving a design document between lifecycle states
49
+ instruction: >-
50
+ Each transition has an entry condition and an owner (see lifecycle).
51
+ Abandoning a document requires a documented reason.
52
+ priority: required
53
+
54
+ hld_sections:
55
+ - section: overview
56
+ purpose: define the problem, goals, and success criteria
57
+ covers: [problem and business context, in-scope and out-of-scope boundaries, success metrics, target audience]
58
+ - section: architecture
59
+ purpose: architecture decisions and component relationships
60
+ covers: [architecture style, key components and responsibilities, technology choices with rationale, C4 diagrams]
61
+ - section: data_flow
62
+ purpose: how data moves through the system
63
+ - section: api_surface
64
+ purpose: the interfaces the system exposes
65
+ - section: non_functional_requirements
66
+ purpose: performance, availability, security, scalability targets
67
+ - section: milestones
68
+ purpose: delivery sequence and checkpoints
69
+
70
+ lld_sections:
71
+ - component_design
72
+ - data_model
73
+ - algorithm_details
74
+ - error_handling
75
+ - testing_strategy
76
+
77
+ lifecycle:
78
+ flow: Draft → In Review → Approved → Implemented → Archived
79
+ states:
80
+ draft:
81
+ definition: initial creation and iteration
82
+ entry: author starts writing
83
+ exit: author submits for review
84
+ owner: author
85
+ in_review:
86
+ definition: under peer review and feedback
87
+ entry: submitted for review
88
+ exit: all reviewers approve or reject
89
+ owner: reviewers
90
+ approved:
91
+ definition: accepted for implementation
92
+ entry: review approved
93
+ exit: implementation begins
94
+ owner: tech lead / architect
95
+ implemented:
96
+ definition: design realised in code
97
+ entry: code matches design
98
+ exit: system is stable in production
99
+ owner: development team
100
+ archived:
101
+ definition: no longer active, kept for reference
102
+ entry: system decommissioned or design superseded
103
+ owner: author / tech lead
104
+ transitions:
105
+ - from_draft_to_in_review: author confirms the document is complete enough for meaningful review
106
+ - from_in_review_to_draft: reviewers request significant changes
107
+ - from_in_review_to_approved: all required reviewers approve, no blocking issues remain
108
+ - from_approved_to_implemented: implementation matches the approved design
109
+ - from_implemented_to_archived: system decommissioned, or a new design supersedes this one
110
+ - from_any_state_to_archived: document abandoned — the reason must be recorded
111
+
112
+ c4_model:
113
+ l1_context:
114
+ scope: system and external actors
115
+ use_for: stakeholder communication, project kickoff
116
+ must_show: [system boundary, users, external systems, relationships]
117
+ l2_container:
118
+ scope: applications and data stores
119
+ use_for: technical overview, deployment planning
120
+ must_show: [applications, databases, message queues, protocols]
121
+ l3_component:
122
+ scope: internal components
123
+ use_for: developer onboarding, detailed design
124
+ must_show: [classes and modules, interfaces, dependencies]
125
+ l4_code:
126
+ scope: class and module level detail
127
+ use_for: documenting a complex algorithm
128
+ must_show: [UML class diagrams, sequence diagrams]
129
+
130
+ related_standards:
131
+ - architecture-decision-records
132
+ - requirements-engineering
133
+ - spec-driven-development
@@ -1,5 +1,127 @@
1
1
  id: estimation-standards
2
2
  meta:
3
3
  version: "1.0.0"
4
- updated: "2026-04-01"
4
+ updated: "2026-08-07"
5
5
  source: core/estimation-standards.md
6
+ # Extracted by hand (XSPEC-367 R2). convert-md-to-yaml.mjs was tried and
7
+ # rejected: its output for this very standard did not parse, truncated every
8
+ # long value mid-sentence, and produced `instruction: "McConnell, S"` — half
9
+ # an author name from the references section, presented as a rule.
10
+
11
+ rules:
12
+ - id: estimate-carries-a-confidence-level
13
+ trigger: giving any estimate
14
+ instruction: >-
15
+ State the confidence level with the number. A point estimate without one
16
+ hides the range it came from.
17
+ priority: required
18
+
19
+ - id: never-hide-low-confidence
20
+ trigger: the estimate is low confidence
21
+ instruction: >-
22
+ Say so explicitly. Never present a low-confidence estimate as if it were
23
+ a firm one; suggest a spike instead.
24
+ priority: required
25
+
26
+ - id: estimate-is-not-commitment
27
+ trigger: an estimate is about to become a date
28
+ instruction: >-
29
+ Do not let an estimate be silently converted into a commitment. The
30
+ conversion is a negotiation — buffers, scope, and trade-offs — and the
31
+ commitment is recorded separately from the estimate it came from.
32
+ priority: required
33
+
34
+ - id: language-distinguishes-the-two
35
+ trigger: communicating an estimate or a commitment
36
+ instruction: >-
37
+ Estimates use "we estimate" / "our assessment is" and are ranges.
38
+ Commitments use "we commit to" / "we will deliver by" and are targets.
39
+ priority: required
40
+
41
+ - id: re-estimate-on-trigger
42
+ trigger: a re-estimation trigger fires (see re_estimation.triggers)
43
+ instruction: >-
44
+ Re-estimate the affected items, update the confidence level, tell
45
+ stakeholders, and record why plus the delta from the original.
46
+ priority: required
47
+
48
+ - id: calibrate-against-actuals
49
+ trigger: work completes
50
+ instruction: >-
51
+ Compare actual against estimate. The ratio is the feedback signal — above
52
+ 1.0 means underestimated, below means overestimated.
53
+ priority: recommended
54
+
55
+ confidence_levels:
56
+ - level: high
57
+ variance: "±20%"
58
+ describes: well-understood work with clear requirements and prior experience
59
+ typical: repeat tasks, well-defined stories, familiar technology
60
+ phrasing: "We estimate 5 days (4–6 days range)"
61
+ - level: medium
62
+ variance: "±50%"
63
+ describes: partially understood work with some unknowns
64
+ typical: new features in a known domain, moderate technical uncertainty
65
+ phrasing: "We estimate 5 days (2.5–7.5 days range)"
66
+ - level: low
67
+ variance: "±100%"
68
+ describes: highly uncertain work with significant unknowns
69
+ typical: new technology, unclear requirements, research spikes
70
+ phrasing: "We estimate 5 days (0–10 days range) — consider a spike first"
71
+
72
+ methods:
73
+ planning_poker:
74
+ what: consensus estimation with independent cards, then discussion
75
+ use_when: sprint planning, story-level estimation
76
+ t_shirt_sizing:
77
+ what: relative sizing with abstract labels (XS, S, M, L, XL)
78
+ use_when: roadmap planning, epic-level estimation
79
+ three_point:
80
+ what: optimistic, most likely, pessimistic
81
+ formula: "E = (O + 4M + P) / 6 ; SD = (P - O) / 6"
82
+ use_when: critical path items, high-uncertainty tasks, project-level planning
83
+ trade_off: quantifies uncertainty, but needs three numbers per item
84
+
85
+ re_estimation:
86
+ triggers:
87
+ - trigger: requirements change
88
+ when: functional or non-functional requirements added, removed, or modified
89
+ action: re-estimate affected items; update confidence levels
90
+ - trigger: technical discovery
91
+ when: new constraints, dependencies, or complexity uncovered
92
+ action: re-estimate with the new knowledge; document the discovery
93
+ - trigger: external dependency change
94
+ when: third-party APIs, libraries, or services change availability or behaviour
95
+ action: re-estimate integration work; assess timeline impact
96
+ - trigger: time threshold exceeded
97
+ when: elapsed time passes a significant share (e.g. >50%) of the estimate without proportional progress
98
+ action: checkpoint review; re-estimate the remaining work
99
+ process:
100
+ - identify that a trigger fired
101
+ - assess the impact on current estimates
102
+ - re-estimate affected items with an appropriate method
103
+ - communicate revised estimates and confidence levels
104
+ - document the reason and the delta from the original
105
+
106
+ # Named so they can be recognised in progress, not only in a post-mortem.
107
+ anti_patterns:
108
+ - name: anchoring bias
109
+ shape: the first number mentioned pulls every later estimate toward it
110
+ tell: estimates cluster around the first value shared; dissent goes quiet
111
+ - name: planning fallacy
112
+ shape: systematically underestimating time, cost, and risk while overestimating benefit
113
+ tell: projects consistently overrun; post-mortems keep citing "unforeseen" events
114
+ - name: scope creep blindness
115
+ shape: scope grows during the work and the estimate is never revisited
116
+ tell: original estimates go stale while nobody re-estimates
117
+ - name: student syndrome
118
+ shape: work starts as late as the buffer allows, consuming it
119
+ tell: work starts late despite available time; deadline pressure drives everything
120
+ - name: Parkinson's law
121
+ shape: work expands to fill the time allowed, regardless of real complexity
122
+ tell: tasks take exactly as long as estimated, whatever their difficulty
123
+
124
+ related_standards:
125
+ - requirements-engineering
126
+ - user-story-mapping
127
+ - technical-debt-management
@@ -1,5 +1,151 @@
1
1
  id: privacy-standards
2
2
  meta:
3
- version: "1.1.0"
4
- updated: "2026-06-18"
3
+ version: "1.0.0"
4
+ updated: "2026-08-07"
5
5
  source: core/privacy-standards.md
6
+ # Extracted by hand (XSPEC-367 R2). convert-md-to-yaml.mjs was rejected: its
7
+ # output does not parse, truncates long values mid-sentence, and turns bold
8
+ # fragments into instructions.
9
+
10
+ rules:
11
+ - id: privacy-is-the-default
12
+ trigger: designing any feature that touches personal data
13
+ instruction: >-
14
+ Personal data is protected without the user doing anything. A setting the
15
+ user must find and switch on is not a default.
16
+ priority: required
17
+
18
+ - id: classify-before-storing
19
+ trigger: introducing a new data field
20
+ instruction: >-
21
+ Assign a sensitivity level (public / internal / confidential / restricted)
22
+ and apply that level's handling requirements. Unclassified data gets no
23
+ protection by accident.
24
+ priority: required
25
+
26
+ - id: every-field-has-a-documented-purpose
27
+ trigger: adding a field to a form, event, or record
28
+ instruction: >-
29
+ Collect only what is necessary, and write down why each field exists.
30
+ A field nobody can justify is a field to remove.
31
+ priority: required
32
+
33
+ - id: every-data-type-has-a-retention-period
34
+ trigger: defining a new data type
35
+ instruction: >-
36
+ Set an explicit retention period and make expiry delete or anonymise the
37
+ data automatically. Retention without automatic deletion is a plan, not a
38
+ control.
39
+ priority: required
40
+
41
+ - id: purpose-limitation
42
+ trigger: reusing existing data for a new purpose
43
+ instruction: >-
44
+ Data collected for one purpose must not be used for another without
45
+ consent. "We already have it" is not a basis.
46
+ priority: required
47
+
48
+ - id: dpia-before-processing
49
+ trigger: any condition in dpia.triggers is met
50
+ instruction: >-
51
+ Conduct a DPIA before the processing starts, not after it ships.
52
+ priority: required
53
+
54
+ - id: support-the-five-user-rights
55
+ trigger: building account or data features
56
+ instruction: >-
57
+ Access, rectification, erasure, portability and objection each need a real
58
+ mechanism. See user_rights for what "real" means per right.
59
+ priority: required
60
+
61
+ - id: erasure-reaches-backups
62
+ trigger: implementing account deletion
63
+ instruction: >-
64
+ Deletion must cascade to backups within 30 days. A delete that leaves the
65
+ data in a backup is a delay, not an erasure.
66
+ priority: required
67
+
68
+ data_classification:
69
+ public:
70
+ describes: freely shareable — marketing content, docs
71
+ handling: no restrictions
72
+ internal:
73
+ describes: internal use only — internal reports, meeting notes
74
+ handling: access control, no public sharing
75
+ confidential:
76
+ describes: sensitive business data — financials, strategies
77
+ handling: encryption at rest and in transit, audit logging, need-to-know access
78
+ restricted:
79
+ describes: highly sensitive PII, health, financial — SSN, medical records
80
+ handling: strongest encryption, strict access, data masking, regulatory compliance
81
+
82
+ dpia:
83
+ triggers:
84
+ - processing personal data at large scale (see large_scale below)
85
+ - systematic monitoring of public areas
86
+ - automated decision-making with legal effects
87
+ - processing special category data (health, biometric, genetic)
88
+ - combining datasets from different sources
89
+ - processing data of vulnerable individuals (children, employees)
90
+ large_scale:
91
+ source: "GDPR Art. 35; WP29 DPIA Guidelines WP248rev.01"
92
+ note: >-
93
+ No single number defines large scale. Assess four factors and treat the
94
+ processing as large scale when it is significant on two or more.
95
+ factors:
96
+ - number of data subjects — absolute count, or a proportion of the relevant population
97
+ - volume and range of data items
98
+ - duration or permanence of the processing
99
+ - geographical extent
100
+ exception: >-
101
+ One-off processing, a single individual's data, or an individual
102
+ practitioner's records are not large scale and do not trigger a DPIA on
103
+ that ground alone. The other triggers may still apply.
104
+
105
+ retention_guidelines:
106
+ session_data:
107
+ period: duration of the session
108
+ why: not needed after logout
109
+ activity_logs:
110
+ period: 90 days
111
+ why: debugging and support
112
+ account_data:
113
+ period: until account deletion, plus 30 days
114
+ why: grace period for recovery
115
+ transaction_records:
116
+ period: 7 years
117
+ why: tax and audit compliance
118
+ marketing_preferences:
119
+ period: until consent is withdrawn
120
+ why: consent-based
121
+
122
+ user_rights:
123
+ access:
124
+ right: receive a copy of their personal data
125
+ implementation: export endpoint, machine-readable format (JSON/CSV)
126
+ rectification:
127
+ right: correct inaccurate personal data
128
+ implementation: profile editing, support channel for fields that are not self-service
129
+ erasure:
130
+ right: have their data deleted
131
+ implementation: account deletion flow, cascading to backups within 30 days
132
+ portability:
133
+ right: receive their data in a portable format
134
+ implementation: standard-format export (JSON, CSV), API for bulk export
135
+ objection:
136
+ right: object to specific processing
137
+ implementation: opt-out mechanisms, granular consent management
138
+
139
+ privacy_by_design:
140
+ - proactive not reactive — anticipate and prevent, do not respond after the fact
141
+ - privacy as the default — protection without user action
142
+ - privacy embedded into design — architectural, not an add-on
143
+ - full functionality — positive-sum, privacy AND function, not privacy OR function
144
+ - end-to-end security — protected from collection through deletion
145
+ - visibility and transparency — practices documented, verifiable, open to scrutiny
146
+ - respect for user privacy — strong defaults, clear options, user interests first
147
+
148
+ related_standards:
149
+ - security-standards
150
+ - logging-standards
151
+ - data-lifecycle-management
@@ -1,13 +1,161 @@
1
1
  id: supply-chain-security-standards
2
2
  meta:
3
3
  version: "1.1.0"
4
- updated: "2026-08-04"
4
+ updated: "2026-08-07"
5
5
  source: core/supply-chain-security-standards.md
6
- # NOTE: this file is a STUB. It carries no machine-readable rules, so an
7
- # agent reading the ai/ layer gets nothing for this standard — the same is
8
- # true of design-document-standards, estimation-standards and
9
- # privacy-standards (4 of 141 as of 2026-08-04). The version above tracks
10
- # the .md it points at; it does not mean the .md's rules are represented
11
- # here. XSPEC-366 R4 rewrote that .md's Lock Strategy section and
12
- # deliberately did not add a single rule here: one rule in an otherwise
13
- # empty file would make coverage look better than it is.
6
+ # Rules below are extracted from that .md by hand. The repository's
7
+ # convert-md-to-yaml.mjs was tried first and rejected (XSPEC-367 R2): its
8
+ # output does not parse, truncates every long value mid-sentence, and turns
9
+ # bold fragments into instructions — one generated rule was `"McConnell, S"`,
10
+ # half an author name from the references section.
11
+ # MUST/SHOULD below carry the .md's own wording, not a re-grading.
12
+
13
+ # ─────────────────────────────────────────────────────────────
14
+ # Rules an agent can act on. `trigger` is when to apply the rule;
15
+ # `priority` mirrors the RFC-2119 term used in the source.
16
+ # ─────────────────────────────────────────────────────────────
17
+ rules:
18
+ - id: sbom-on-every-release
19
+ trigger: cutting a release
20
+ instruction: >-
21
+ Ship an SBOM listing every direct and transitive dependency, with
22
+ component name, version, supplier, license, and known vulnerabilities.
23
+ priority: required
24
+
25
+ - id: sbom-generated-in-ci
26
+ trigger: setting up a release pipeline
27
+ instruction: Generate the SBOM automatically in CI rather than by hand.
28
+ priority: recommended
29
+
30
+ - id: lockfile-committed
31
+ trigger: adding or updating a dependency
32
+ instruction: Commit the lock file to version control.
33
+ priority: required
34
+
35
+ - id: lockfile-does-not-reach-consumers
36
+ trigger: publishing a package to a registry
37
+ instruction: >-
38
+ A committed lock file makes your own builds reproducible and constrains
39
+ nobody who installs your package — a published tarball or wheel carries
40
+ no lock file, so consumers resolve your declared ranges themselves.
41
+ Separately measure what those ranges resolve to, and run the test suite
42
+ against that resolution before release.
43
+ scope: published artifacts only
44
+ note: >-
45
+ A deployed service that ships its lock file with the artifact is not
46
+ affected by this rule. Applying it there adds ceremony to a project the
47
+ problem cannot reach.
48
+ priority: required
49
+
50
+ - id: security-patch-window
51
+ trigger: a security advisory affects a dependency
52
+ instruction: Apply within 48 hours for Critical, within 7 days for High.
53
+ priority: required
54
+
55
+ - id: patch-update-window
56
+ trigger: a non-security patch release is available
57
+ instruction: Apply within 7 days.
58
+ priority: recommended
59
+
60
+ - id: major-upgrade-cadence
61
+ trigger: planning quarterly work
62
+ instruction: Evaluate major version upgrades, with a migration plan and changelog review.
63
+ priority: recommended
64
+
65
+ - id: no-license-means-proprietary
66
+ trigger: introducing a new dependency
67
+ instruction: >-
68
+ Treat a dependency with no license as proprietary. Do not use it without
69
+ explicit permission.
70
+ priority: required
71
+
72
+ - id: agpl-in-saas
73
+ trigger: introducing a dependency into a hosted service
74
+ instruction: >-
75
+ AGPL triggers copyleft for the entire service. Evaluate before adopting,
76
+ not after.
77
+ priority: required
78
+
79
+ - id: copyleft-combination-review
80
+ trigger: combining two copyleft licenses
81
+ instruction: >-
82
+ Different copyleft licenses are often incompatible. Get legal review
83
+ rather than assuming.
84
+ priority: required
85
+
86
+ # ─────────────────────────────────────────────────────────────
87
+ # What to check, and what each finding means. Severity here is the
88
+ # action, not a label: "block" stops the pipeline.
89
+ # ─────────────────────────────────────────────────────────────
90
+ audit_dimensions:
91
+ - dimension: known_vulnerabilities
92
+ check: CVE databases — NVD, OSV, GitHub Advisory
93
+ critical: block
94
+ high: warn
95
+ - dimension: license_compliance
96
+ check: compatibility with the project's own license
97
+ incompatible: block
98
+ - dimension: maintenance_status
99
+ check: last commit date, open issues, maintainer count
100
+ unmaintained_over_2_years: warn
101
+ - dimension: version_currency
102
+ check: how many major/minor versions behind latest
103
+ more_than_2_majors_behind: warn
104
+
105
+ audit_frequency:
106
+ every_ci_build: automated vulnerability scan
107
+ weekly: automated full audit report
108
+ before_release: manual review of every warning
109
+ on_security_advisory: immediate assessment of affected dependencies
110
+
111
+ # ─────────────────────────────────────────────────────────────
112
+ # Update strategy by change type.
113
+ # ─────────────────────────────────────────────────────────────
114
+ update_strategy:
115
+ patch:
116
+ strategy: auto-merge once CI passes
117
+ automation: fully automated (Dependabot / Renovate)
118
+ minor:
119
+ strategy: open a PR automatically, review by hand
120
+ automation: semi-automated
121
+ major:
122
+ strategy: manual evaluation with a migration plan
123
+ automation: manual, with changelog review
124
+ lock_strategy:
125
+ strategy: >-
126
+ Commit lock files — and, if you publish, separately verify what consumers
127
+ resolve to.
128
+ automation: lock file committed; consumer resolution checked at release
129
+
130
+ # ─────────────────────────────────────────────────────────────
131
+ # CI gate. The thresholds are the point: a scan that reports
132
+ # everything at the same level is a scan nobody reads.
133
+ # ─────────────────────────────────────────────────────────────
134
+ ci_gate:
135
+ required_steps:
136
+ - generate SBOM on every build
137
+ - scan for vulnerabilities against CVE databases
138
+ - scan licenses for compatibility
139
+ - report dependency freshness
140
+ on_finding:
141
+ critical: block the PR
142
+ high: warn and create a ticket
143
+ medium_or_low: log only
144
+
145
+ license_compatibility:
146
+ permissive_with_permissive: always compatible
147
+ permissive_with_copyleft: compatible if the copyleft terms are followed
148
+ copyleft_with_different_copyleft: often incompatible — legal review required
149
+ agpl_in_saas: triggers copyleft for the whole service — evaluate carefully
150
+ no_license: treat as proprietary — do not use without explicit permission
151
+
152
+ quick_reference:
153
+ new_dependency: license compatible? CVE-free? maintained? popular?
154
+ ci_build: auto-scan vulnerabilities and licenses
155
+ release: generate SBOM, review every warning
156
+ critical_cve: patch within 48 hours
157
+
158
+ related_standards:
159
+ - supply-chain-attestation
160
+ - versioning
161
+ - release-readiness-gate
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  source: ../../CHANGELOG.md
3
- source_version: 6.3.7
4
- translation_version: 6.3.7
5
- last_synced: 2026-08-07
3
+ source_version: 6.3.8
4
+ translation_version: 6.3.8
5
+ last_synced: 2026-08-08
6
6
  status: current
7
7
  ---
8
8
 
@@ -17,6 +17,15 @@ status: current
17
17
 
18
18
  ## [Unreleased]
19
19
 
20
+ ## [6.3.8] - 2026-08-08
21
+
22
+ ### 修复
23
+
24
+ - **`uds deps` 对一个它没有检查过的集合打了绿勾。** 對一個没有运行期依赖、且使用 pnpm lockfile 的專案執行時,它印出 `0 runtime dependencies checked`,接著 `no package-lock.json — nothing to compare the registry against`,接著 `✓ every dependency resolves to the version you test against`,然後 exit 0。两项事实都为真;合起来却宣称一個这个命令读不了的 repo 已被检查而且没问题,而任何接在这个 exit code 上的闸门都会同意。`clean` 的定义是三个空列表的合取,在空集合上恒真——而覆盖它的测试正是以「分母会跟着结论一起走」为由断言了这件事。分母确实跟着走了,却什么也没改变:打勾紧接其后,而 exit code 完全没有带上那个计数。**打印分母不足以阻止空集合被读成安心;拒绝给出结论才可以。** 同時修复該訊息的後半:该项目有一份完全正常的 `pnpm-lock.yaml`,而被告知「你没有 lockfile」正是读者判定工具搞错、从此不再读它的方式。命令现在会说出找到的是什么、以及自己读的是哪一种格式。
25
+ - **registry ID 不是檔名,而有八個地方把它當成檔名用。** manifest 的 `standards` 陣列是刻意混合的:core 標準自 v3.4.0 起改為 registry ID,option 條目維持其上游來源路徑,因為 option 沒有 ID。而每個消費端都對兩者一律套 `basename()`——對路徑正確,對 ID 是 no-op。`error-code-standards` 安裝為 `error-codes.ai.yaml`、`logging-standards` 為 `logging.ai.yaml`、`ai-agreement` 為 `ai-agreement-standards.ai.yaml`;多數 ID 確實等於它的 basename,這正是它能存活的原因。同一個錯誤導出三種失效:minimal 模式印出 `.standards/<id>`,使**某採用者 AGENTS.md 的七十個路徑中有七個指不到東西**,而它們正下方那一行寫著「你必須讀取並遵循 `.standards/` 裡的標準」;索引區塊用 `.ai.yaml` 後綴過濾,而沒有任何 ID 帶這個後綴,於是**所有核心標準都被丟掉**,同一個採用者先前的區塊列了七個 option、六十三項核心標準一個也沒有;任務對應表以檔名為鍵,ID 一個也對不上,該標準就安靜地沒有對應。解析現在是一個匯出的函式,八個呼叫點共用,而解析不出的條目會列在清單下方回報,不會被印成路徑。
26
+ - **那個專門用來抓這種漂移的檢查,帶著同一個缺陷。** `AGENTS.md Standards Sync` 對一份七十項的 manifest 回報 `7/7`:`.ai.yaml` 過濾只留下七個 option 條目,七個都在,於是打勾——升級前六十三項標準不在區塊裡時打勾,升級後區塊裡有七個死路徑時也打勾。對它所量測對象的九成視而不見,而且全程綠燈。在同一個專案上現在是 67/67,而手動弄壞一個路徑會回報 66/67 並指名該檔。它需要的那份對照,早就建在它上方一百七十行處,註解甚至指名了那個案例。
27
+ - **產生器仍把 6.0.0 移除的路徑寫進採用者的指令檔。** `MIGRATION-v6` §2 移除了八個機器可讀標準,它們的執行期已移往採用層;三行 `Reference:` 與一筆 MUST 等級的任務對應仍指向 `.standards/workflow-enforcement.ai.yaml`。人類可讀的 `core/workflow-enforcement.md` 是刻意保留在上游的,但採用者收到的是 `.standards/` 而非 `core/`,所以它不是替代路徑——這幾行是刪除而非改指。控制該段落的判斷式比對的檔名,自 3.4.0 起沒有任何 manifest 持有,於是那段落對兩個仍宣告該標準的專案早已悄悄不再產生;現在兩種形式都比對。
28
+
20
29
  ## [6.3.7] - 2026-08-07
21
30
 
22
31
  ### Fixed
@@ -15,7 +15,7 @@ status: current
15
15
 
16
16
  > **语言**: [English](../../README.md) | [繁體中文](../zh-TW/README.md) | 简体中文
17
17
 
18
- **版本**: 6.3.7 | **发布日期**: 2026-07-31 | **授权**: [双重授权](../../LICENSE) (CC BY 4.0 + MIT)
18
+ **版本**: 6.3.8 | **发布日期**: 2026-07-31 | **授权**: [双重授权](../../LICENSE) (CC BY 4.0 + MIT)
19
19
 
20
20
  语言无关、框架无关的软件项目文档标准。通过 AI 原生工作流,确保不同技术栈之间的一致性、质量和可维护性。
21
21
 
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  source: ../../CHANGELOG.md
3
- source_version: 6.3.7
4
- translation_version: 6.3.7
5
- last_synced: 2026-08-07
3
+ source_version: 6.3.8
4
+ translation_version: 6.3.8
5
+ last_synced: 2026-08-08
6
6
  status: current
7
7
  ---
8
8
 
@@ -17,6 +17,15 @@ status: current
17
17
 
18
18
  ## [Unreleased]
19
19
 
20
+ ## [6.3.8] - 2026-08-08
21
+
22
+ ### 修正
23
+
24
+ - **`uds deps` 對一個它沒有檢查過的集合打了綠勾。** 對一個沒有執行期相依、且使用 pnpm lockfile 的專案執行時,它印出 `0 runtime dependencies checked`,接著 `no package-lock.json — nothing to compare the registry against`,接著 `✓ every dependency resolves to the version you test against`,然後 exit 0。兩項事實都為真;合起來卻宣稱一個這個指令讀不了的 repo 已被檢查而且沒問題,而任何接在這個 exit code 上的閘門都會同意。`clean` 的定義是三個空清單的合取,在空集合上恆真——而涵蓋它的測試正是以「分母會跟著結論一起走」為由斷言了這件事。分母確實跟著走了,卻什麼也沒改變:打勾緊接其後,而 exit code 完全沒有帶上那個計數。**印出分母不足以阻止空集合被讀成安心;拒絕給出結論才可以。** 同時修正該訊息的後半:該專案有一份完全正常的 `pnpm-lock.yaml`,而被告知「你沒有 lockfile」正是讀者判定工具搞錯、從此不再讀它的方式。指令現在會說出找到的是什麼、以及自己讀的是哪一種格式。
25
+ - **registry ID 不是檔名,而有八個地方把它當成檔名用。** manifest 的 `standards` 陣列是刻意混合的:core 標準自 v3.4.0 起改為 registry ID,option 條目維持其上游來源路徑,因為 option 沒有 ID。而每個消費端都對兩者一律套 `basename()`——對路徑正確,對 ID 是 no-op。`error-code-standards` 安裝為 `error-codes.ai.yaml`、`logging-standards` 為 `logging.ai.yaml`、`ai-agreement` 為 `ai-agreement-standards.ai.yaml`;多數 ID 確實等於它的 basename,這正是它能存活的原因。同一個錯誤導出三種失效:minimal 模式印出 `.standards/<id>`,使**某採用者 AGENTS.md 的七十個路徑中有七個指不到東西**,而它們正下方那一行寫著「你必須讀取並遵循 `.standards/` 裡的標準」;索引區塊用 `.ai.yaml` 後綴過濾,而沒有任何 ID 帶這個後綴,於是**所有核心標準都被丟掉**,同一個採用者先前的區塊列了七個 option、六十三項核心標準一個也沒有;任務對應表以檔名為鍵,ID 一個也對不上,該標準就安靜地沒有對應。解析現在是一個匯出的函式,八個呼叫點共用,而解析不出的條目會列在清單下方回報,不會被印成路徑。
26
+ - **那個專門用來抓這種漂移的檢查,帶著同一個缺陷。** `AGENTS.md Standards Sync` 對一份七十項的 manifest 回報 `7/7`:`.ai.yaml` 過濾只留下七個 option 條目,七個都在,於是打勾——升級前六十三項標準不在區塊裡時打勾,升級後區塊裡有七個死路徑時也打勾。對它所量測對象的九成視而不見,而且全程綠燈。在同一個專案上現在是 67/67,而手動弄壞一個路徑會回報 66/67 並指名該檔。它需要的那份對照,早就建在它上方一百七十行處,註解甚至指名了那個案例。
27
+ - **產生器仍把 6.0.0 移除的路徑寫進採用者的指令檔。** `MIGRATION-v6` §2 移除了八個機器可讀標準,它們的執行期已移往採用層;三行 `Reference:` 與一筆 MUST 等級的任務對應仍指向 `.standards/workflow-enforcement.ai.yaml`。人類可讀的 `core/workflow-enforcement.md` 是刻意保留在上游的,但採用者收到的是 `.standards/` 而非 `core/`,所以它不是替代路徑——這幾行是刪除而非改指。控制該段落的判斷式比對的檔名,自 3.4.0 起沒有任何 manifest 持有,於是那段落對兩個仍宣告該標準的專案早已悄悄不再產生;現在兩種形式都比對。
28
+
20
29
  ## [6.3.7] - 2026-08-07
21
30
 
22
31
  ### Fixed
@@ -15,7 +15,7 @@ status: current
15
15
 
16
16
  > **語言**: [English](../../README.md) | 繁體中文 | [简体中文](../zh-CN/README.md)
17
17
 
18
- **版本**: 6.3.7 | **發布日期**: 2026-07-31 | **授權**: [雙重授權](../../LICENSE) (CC BY 4.0 + MIT)
18
+ **版本**: 6.3.8 | **發布日期**: 2026-07-31 | **授權**: [雙重授權](../../LICENSE) (CC BY 4.0 + MIT)
19
19
 
20
20
  語言無關、框架無關的軟體專案文件標準。透過 AI 原生工作流,確保不同技術堆疊之間的一致性、品質和可維護性。
21
21