universal-dev-standards 6.3.7 → 6.3.9
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/bundled/ai/standards/design-document-standards.ai.yaml +129 -1
- package/bundled/ai/standards/estimation-standards.ai.yaml +123 -1
- package/bundled/ai/standards/privacy-standards.ai.yaml +148 -2
- package/bundled/ai/standards/supply-chain-security-standards.ai.yaml +157 -9
- package/bundled/locales/zh-CN/CHANGELOG.md +18 -3
- package/bundled/locales/zh-CN/README.md +1 -1
- package/bundled/locales/zh-TW/CHANGELOG.md +18 -3
- package/bundled/locales/zh-TW/README.md +1 -1
- package/package.json +1 -4
- package/src/commands/check.js +18 -3
- package/src/commands/config.js +5 -1
- package/src/commands/deps.js +31 -1
- package/src/commands/update.js +16 -3
- package/src/utils/dependency-resolution.js +34 -2
- package/src/utils/integration-generator.js +130 -33
- package/src/utils/registry.js +45 -0
- package/standards-registry.json +7 -7
- package/src/schemas/standard.schema.json +0 -117
|
@@ -1,5 +1,133 @@
|
|
|
1
1
|
id: design-document-standards
|
|
2
2
|
meta:
|
|
3
3
|
version: "1.0.0"
|
|
4
|
-
updated: "2026-
|
|
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-
|
|
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.
|
|
4
|
-
updated: "2026-
|
|
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-
|
|
4
|
+
updated: "2026-08-07"
|
|
5
5
|
source: core/supply-chain-security-standards.md
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
|
|
13
|
-
|
|
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.
|
|
4
|
-
translation_version: 6.3.
|
|
5
|
-
last_synced: 2026-08-
|
|
3
|
+
source_version: 6.3.9
|
|
4
|
+
translation_version: 6.3.9
|
|
5
|
+
last_synced: 2026-08-09
|
|
6
6
|
status: current
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -17,6 +17,21 @@ status: current
|
|
|
17
17
|
|
|
18
18
|
## [Unreleased]
|
|
19
19
|
|
|
20
|
+
## [6.3.9] - 2026-08-09
|
|
21
|
+
|
|
22
|
+
### 修复
|
|
23
|
+
|
|
24
|
+
- **标准索引声明的数字與 sync 检查对不上,而两者描述的是同一份 manifest。** 6.3.8 让检查改為透過 registry 解析 manifest 项目;而索引区块仍直接声明 manifest 的 `installedStandards.length`。在一個真实项目上那是 78 對 70,差额正是 `MIGRATION-v6` §2 於 6.0.0 移除的八個机器可读标准——它们在兩個主版本之后仍声明於 manifest 中,因为 `uds update` 不会修剪它们。撇开检查不谈,七十八本来就是错的数字:它就写在「權威清單為 `.standards/manifest.json` 的 `standards` 字段」正上方——把读者指向这个差異的来源、仿佛那就解決了它——并且告訴 agent 去期待八個并不存在的文件。区块现在数的是解析得到文件的项目,其余在下方指名並说明它们为何还在,于是兩個数字都会出现,都不必靠推测。
|
|
25
|
+
|
|
26
|
+
## [6.3.8] - 2026-08-08
|
|
27
|
+
|
|
28
|
+
### 修复
|
|
29
|
+
|
|
30
|
+
- **`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」正是读者判定工具搞错、从此不再读它的方式。命令现在会说出找到的是什么、以及自己读的是哪一种格式。
|
|
31
|
+
- **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 一個也對不上,該標準就安靜地沒有對應。解析現在是一個匯出的函式,八個呼叫點共用,而解析不出的條目會列在清單下方回報,不會被印成路徑。
|
|
32
|
+
- **那個專門用來抓這種漂移的檢查,帶著同一個缺陷。** `AGENTS.md Standards Sync` 對一份七十項的 manifest 回報 `7/7`:`.ai.yaml` 過濾只留下七個 option 條目,七個都在,於是打勾——升級前六十三項標準不在區塊裡時打勾,升級後區塊裡有七個死路徑時也打勾。對它所量測對象的九成視而不見,而且全程綠燈。在同一個專案上現在是 67/67,而手動弄壞一個路徑會回報 66/67 並指名該檔。它需要的那份對照,早就建在它上方一百七十行處,註解甚至指名了那個案例。
|
|
33
|
+
- **產生器仍把 6.0.0 移除的路徑寫進採用者的指令檔。** `MIGRATION-v6` §2 移除了八個機器可讀標準,它們的執行期已移往採用層;三行 `Reference:` 與一筆 MUST 等級的任務對應仍指向 `.standards/workflow-enforcement.ai.yaml`。人類可讀的 `core/workflow-enforcement.md` 是刻意保留在上游的,但採用者收到的是 `.standards/` 而非 `core/`,所以它不是替代路徑——這幾行是刪除而非改指。控制該段落的判斷式比對的檔名,自 3.4.0 起沒有任何 manifest 持有,於是那段落對兩個仍宣告該標準的專案早已悄悄不再產生;現在兩種形式都比對。
|
|
34
|
+
|
|
20
35
|
## [6.3.7] - 2026-08-07
|
|
21
36
|
|
|
22
37
|
### Fixed
|
|
@@ -15,7 +15,7 @@ status: current
|
|
|
15
15
|
|
|
16
16
|
> **语言**: [English](../../README.md) | [繁體中文](../zh-TW/README.md) | 简体中文
|
|
17
17
|
|
|
18
|
-
**版本**: 6.3.
|
|
18
|
+
**版本**: 6.3.9 | **发布日期**: 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.
|
|
4
|
-
translation_version: 6.3.
|
|
5
|
-
last_synced: 2026-08-
|
|
3
|
+
source_version: 6.3.9
|
|
4
|
+
translation_version: 6.3.9
|
|
5
|
+
last_synced: 2026-08-09
|
|
6
6
|
status: current
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -17,6 +17,21 @@ status: current
|
|
|
17
17
|
|
|
18
18
|
## [Unreleased]
|
|
19
19
|
|
|
20
|
+
## [6.3.9] - 2026-08-09
|
|
21
|
+
|
|
22
|
+
### 修正
|
|
23
|
+
|
|
24
|
+
- **標準索引宣告的數字與 sync 檢查對不上,而兩者描述的是同一份 manifest。** 6.3.8 讓檢查改為透過 registry 解析 manifest 項目;而索引區塊仍直接宣告 manifest 的 `installedStandards.length`。在一個真實專案上那是 78 對 70,差額正是 `MIGRATION-v6` §2 於 6.0.0 移除的八個機器可讀標準——它們在兩個主版本之後仍宣告於 manifest 中,因為 `uds update` 不會修剪它們。撇開檢查不談,七十八本來就是錯的數字:它就寫在「權威清單為 `.standards/manifest.json` 的 `standards` 欄位」正上方——把讀者指向這個差異的來源、彷彿那就解決了它——並且告訴 agent 去期待八個並不存在的檔案。區塊現在數的是解析得到檔案的項目,其餘在下方指名並說明它們為何還在,於是兩個數字都會出現,都不必用推的。
|
|
25
|
+
|
|
26
|
+
## [6.3.8] - 2026-08-08
|
|
27
|
+
|
|
28
|
+
### 修正
|
|
29
|
+
|
|
30
|
+
- **`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」正是讀者判定工具搞錯、從此不再讀它的方式。指令現在會說出找到的是什麼、以及自己讀的是哪一種格式。
|
|
31
|
+
- **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 一個也對不上,該標準就安靜地沒有對應。解析現在是一個匯出的函式,八個呼叫點共用,而解析不出的條目會列在清單下方回報,不會被印成路徑。
|
|
32
|
+
- **那個專門用來抓這種漂移的檢查,帶著同一個缺陷。** `AGENTS.md Standards Sync` 對一份七十項的 manifest 回報 `7/7`:`.ai.yaml` 過濾只留下七個 option 條目,七個都在,於是打勾——升級前六十三項標準不在區塊裡時打勾,升級後區塊裡有七個死路徑時也打勾。對它所量測對象的九成視而不見,而且全程綠燈。在同一個專案上現在是 67/67,而手動弄壞一個路徑會回報 66/67 並指名該檔。它需要的那份對照,早就建在它上方一百七十行處,註解甚至指名了那個案例。
|
|
33
|
+
- **產生器仍把 6.0.0 移除的路徑寫進採用者的指令檔。** `MIGRATION-v6` §2 移除了八個機器可讀標準,它們的執行期已移往採用層;三行 `Reference:` 與一筆 MUST 等級的任務對應仍指向 `.standards/workflow-enforcement.ai.yaml`。人類可讀的 `core/workflow-enforcement.md` 是刻意保留在上游的,但採用者收到的是 `.standards/` 而非 `core/`,所以它不是替代路徑——這幾行是刪除而非改指。控制該段落的判斷式比對的檔名,自 3.4.0 起沒有任何 manifest 持有,於是那段落對兩個仍宣告該標準的專案早已悄悄不再產生;現在兩種形式都比對。
|
|
34
|
+
|
|
20
35
|
## [6.3.7] - 2026-08-07
|
|
21
36
|
|
|
22
37
|
### Fixed
|