@starci/skills 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/INDEX.md +3 -1
- package/INDEX.vi.md +3 -1
- package/README.md +6 -1
- package/README.vi.md +6 -1
- package/knowledge/ui/presentation/INDEX.md +5 -0
- package/knowledge/ui/presentation/INDEX.vi.md +1 -0
- package/knowledge/ui/presentation/radius.md +183 -0
- package/knowledge/ui/presentation/radius.vi.md +182 -0
- package/operators/INDEX.md +5 -5
- package/operators/INDEX.vi.md +5 -5
- package/operators/architecture-decide/operator.md +27 -4
- package/operators/architecture-decide/operator.vi.md +23 -4
- package/operators/architecture-decide/self-test.mjs +18 -1
- package/operators/architecture-decide/validate.mjs +29 -1
- package/operators/backend-source-apply/operator.md +197 -182
- package/operators/backend-source-apply/operator.vi.md +190 -178
- package/operators/backend-source-apply/self-test.mjs +257 -257
- package/operators/backend-source-apply/validate.mjs +240 -240
- package/operators/business-decide/self-test.mjs +2 -1
- package/operators/business-decide/validate.mjs +3 -0
- package/operators/content-generate/self-test.mjs +1 -1
- package/operators/frontend-direction-decide/self-test.mjs +1 -1
- package/operators/frontend-presentation-resolve/operator.md +6 -0
- package/operators/frontend-presentation-resolve/operator.vi.md +6 -0
- package/operators/frontend-presentation-resolve/self-test.mjs +6 -5
- package/operators/frontend-presentation-resolve/validate.mjs +30 -6
- package/operators/frontend-source-apply/operator.md +3 -1
- package/operators/frontend-source-apply/operator.vi.md +3 -1
- package/operators/frontend-source-apply/self-test.mjs +1 -1
- package/operators/frontend-surface-audit/self-test.mjs +1 -1
- package/operators/git-publish/self-test.mjs +1 -1
- package/operators/platform-operate/self-test.mjs +1 -1
- package/operators/quality-verify/operator.md +5 -1
- package/operators/quality-verify/operator.vi.md +5 -1
- package/operators/quality-verify/self-test.mjs +15 -2
- package/operators/quality-verify/validate.mjs +21 -1
- package/operators/release-deploy/self-test.mjs +235 -235
- package/operators/uat-verify/operator.md +20 -6
- package/operators/uat-verify/operator.vi.md +21 -7
- package/operators/uat-verify/self-test.mjs +6 -5
- package/operators/uat-verify/validate.mjs +10 -4
- package/operators/workspace-bind/operator.md +18 -4
- package/operators/workspace-bind/operator.vi.md +16 -4
- package/operators/workspace-bind/self-test.mjs +3 -1
- package/operators/workspace-bind/validate.mjs +1 -0
- package/package.json +1 -1
- package/readiness/initialization/workspaces/local-route.schema.json +1 -1
- package/resources/orchestrator.json +14 -8
- package/routing.json +2 -1
- package/scripts/validate-request.mjs +12 -1
- package/scripts/validate-response.mjs +14 -3
- package/scripts/validate-step.mjs +2 -1
- package/scripts/validate-workflows.mjs +8 -1
- package/templates/kinds/architecture-decision.contract.json +1 -0
- package/templates/kinds/architecture-decision.skeleton.md +6 -0
- package/templates/kinds/backend-source-application.contract.json +1 -1
- package/templates/kinds/backend-source-application.skeleton.md +1 -1
- package/templates/kinds/frontend-presentation-resolution.contract.json +1 -1
- package/templates/kinds/frontend-presentation-resolution.skeleton.md +1 -0
- package/templates/kinds/mutations.schema.json +65 -65
- package/templates/kinds/route.schema.json +4 -2
- package/templates/kinds/stack-model.schema.json +23 -1
- package/templates/kinds/workspace-route-binding.contract.json +2 -2
- package/templates/step/response.schema.json +10 -0
- package/templates/step/state.schema.json +205 -0
- package/workflows/README.md +3 -0
- package/workflows/README.vi.md +3 -0
- package/workflows/backend-feature.json +26 -5
- package/workflows/content-unit.json +4 -1
- package/workflows/frontend-new-surface.json +15 -5
- package/workflows/frontend-reconstruct.json +10 -4
- package/workflows/frontend-refine.json +10 -4
- package/workflows/frontend-with-uat.json +15 -3
- package/workflows/full-feature.json +31 -8
- package/workflows/release.json +7 -1
|
@@ -1,185 +1,197 @@
|
|
|
1
|
-
# backend.source.apply
|
|
2
|
-
|
|
3
|
-
## Việc
|
|
4
|
-
|
|
5
|
-
Cài đặt một kết quả backend bên trong một contract mutation đã đóng băng, theo đúng họ anh em quan
|
|
6
|
-
sát được, và trả về biên nhận conformance cùng proof đo được cho thấy ranh giới không bị nới ra.
|
|
7
|
-
|
|
8
|
-
## Contract đóng băng trước lần ghi đầu tiên
|
|
9
|
-
|
|
10
|
-
Contract tới dưới dạng Đầu vào `architecture-decision`, có fingerprint và đã đóng. Các operation,
|
|
11
|
-
writer, store, ranh giới giao dịch, kiểu idempotency và migration mà nó liệt kê là tập đầy đủ mà phần
|
|
12
|
-
cài đặt được chạm, và operator này chỉ trả lời một câu hỏi cho mỗi operation: đoạn code đang tồn tại
|
|
13
|
-
có làm đúng điều contract nói không, và phép đo nào cho thấy điều đó. Các operation không phải một
|
|
14
|
-
Yêu cầu, vì việc một người gõ lại contract vào request chính là cách contract và phần cài đặt lặng lẽ
|
|
15
|
-
tách nhau; bước 3 đọc chúng từ đầu vào đã đóng băng và ghi lại vào `response/data/mutations.json`. Ba
|
|
16
|
-
điều cấm gánh phần đó, và mỗi điều được cưỡng chế chứ không phải khuyên. Một operation, writer, store,
|
|
17
|
-
giao dịch, migration hay event nằm ngoài contract là `CONTRACT_WIDENED`, trả về cho chủ contract trước
|
|
18
|
-
mọi lần ghi vào sản phẩm. Một file ngoài trần file được sửa là `OWNER_CONFLICT`, kể cả khi thay đổi ở
|
|
19
|
-
đó chỉ một dòng. Một quy ước mà không pattern anh em nào đã ràng công bố thì bị từ chối và ghi lại là
|
|
20
|
-
`NEW_CONVENTION_REFUSED`, còn một khía cạnh không có pattern nào cả là `PATTERN_UNBOUND`. Phát hiện
|
|
21
|
-
giữa chừng rằng kết quả cần một ranh giới rộng hơn là cách kết thúc dự kiến của operator này, không
|
|
22
|
-
phải sự nhụt chí: chủ contract mở lại và đóng băng lại, rồi cùng kết quả ấy được cài đặt lại theo
|
|
23
|
-
fingerprint mới. Với tay ra ngoài danh sách không phải là thay đổi nhỏ hơn việc mở lại contract; nó là
|
|
24
|
-
cùng một thay đổi nhưng không có dấu vết.
|
|
25
|
-
|
|
26
|
-
## Không bao giờ ghi lên nhánh của người
|
|
27
|
-
|
|
28
|
-
Operator này không bao giờ ghi lên nhánh mà một người đang checkout. Orchestrator chuẩn bị một git
|
|
29
|
-
worktree riêng của checkout được route trên nhánh phiên `session/<sessionId>`, cắt từ head đã đóng
|
|
30
|
-
băng, và bước 3 ghi ở đó chứ không ở đâu khác, dưới một lease độc quyền trên `@workspaces/be`. Bước
|
|
31
|
-
cuối commit toàn bộ tập ghi đã khai đúng một lần, ghi sha ấy vào `response.json.commits`, và nêu cùng
|
|
32
|
-
sha ấy trong `response/data/mutations.json` ở trường `commit`, cạnh `base` nó xuất phát và `branch` nó
|
|
33
|
-
sống trên đó; `response/changes.md` nói đúng bước chuyển ấy ở hàng Binding, `@workspaces/be` tại
|
|
34
|
-
`<base>` → `<sha>` trên `session/<sessionId>`. Một commit, vì một bước mà công việc tới dưới dạng nhiều
|
|
35
|
-
commit thì bước sau không pin được trong request của nó, còn một lần ghi chưa commit thì không pin
|
|
36
|
-
được chút nào. Ở đây không push và không merge gì cả: `git.publish` merge nhánh phiên vào nhánh đích,
|
|
37
|
-
và nó là operator duy nhất nói chuyện với remote.
|
|
38
|
-
|
|
39
|
-
## Chế độ dry ghi bản kế hoạch, không ghi cây
|
|
40
|
-
|
|
41
|
-
`mode` quyết lượt chạy này có chạm vào checkout hay không. Dưới `apply`, operator điền contract,
|
|
42
|
-
commit một lần, và mọi điều bên dưới đúng y như đã viết. Dưới `dry`, nó vẫn đọc, vẫn ràng, vẫn chiếu
|
|
43
|
-
đúng như vậy, rồi dừng ngay sau bản kế hoạch: `response/data/mutations.json` mang những operation nó
|
|
44
|
-
sẽ điền và những file nó sẽ chạm, với `commit` rỗng và không hash sau, `response.json` không ghi
|
|
45
|
-
commit nào, và không một byte nào tới `@workspaces/be`. Nhánh vẫn kết thúc `done`, vì một bản kế
|
|
46
|
-
hoạch làm thật thà là một câu trả lời trọn vẹn cho một câu hỏi về kế hoạch; `changes.md` của nó liệt
|
|
47
|
-
mọi path đã định là `unchanged`, đúng như cây làm việc đang cho thấy, và nêu thay đổi nó sẽ làm ở cột
|
|
48
|
-
`Why`. Một lượt dry không đo gì cả, nên nó không mang bản ghi conformance và không mang bản ghi
|
|
49
|
-
proof: không thể đo một facet trên đoạn code chưa từng được viết, và một bản kế hoạch mà ship kèm
|
|
50
|
-
phán quyết thì không phân biệt nổi với một lần cài đặt thật.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
là
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
|
113
|
-
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
|
121
|
-
|
|
|
122
|
-
| `
|
|
123
|
-
| `
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
|
1
|
+
# backend.source.apply
|
|
2
|
+
|
|
3
|
+
## Việc
|
|
4
|
+
|
|
5
|
+
Cài đặt một kết quả backend bên trong một contract mutation đã đóng băng, theo đúng họ anh em quan
|
|
6
|
+
sát được, và trả về biên nhận conformance cùng proof đo được cho thấy ranh giới không bị nới ra.
|
|
7
|
+
|
|
8
|
+
## Contract đóng băng trước lần ghi đầu tiên
|
|
9
|
+
|
|
10
|
+
Contract tới dưới dạng Đầu vào `architecture-decision`, có fingerprint và đã đóng. Các operation,
|
|
11
|
+
writer, store, ranh giới giao dịch, kiểu idempotency và migration mà nó liệt kê là tập đầy đủ mà phần
|
|
12
|
+
cài đặt được chạm, và operator này chỉ trả lời một câu hỏi cho mỗi operation: đoạn code đang tồn tại
|
|
13
|
+
có làm đúng điều contract nói không, và phép đo nào cho thấy điều đó. Các operation không phải một
|
|
14
|
+
Yêu cầu, vì việc một người gõ lại contract vào request chính là cách contract và phần cài đặt lặng lẽ
|
|
15
|
+
tách nhau; bước 3 đọc chúng từ đầu vào đã đóng băng và ghi lại vào `response/data/mutations.json`. Ba
|
|
16
|
+
điều cấm gánh phần đó, và mỗi điều được cưỡng chế chứ không phải khuyên. Một operation, writer, store,
|
|
17
|
+
giao dịch, migration hay event nằm ngoài contract là `CONTRACT_WIDENED`, trả về cho chủ contract trước
|
|
18
|
+
mọi lần ghi vào sản phẩm. Một file ngoài trần file được sửa là `OWNER_CONFLICT`, kể cả khi thay đổi ở
|
|
19
|
+
đó chỉ một dòng. Một quy ước mà không pattern anh em nào đã ràng công bố thì bị từ chối và ghi lại là
|
|
20
|
+
`NEW_CONVENTION_REFUSED`, còn một khía cạnh không có pattern nào cả là `PATTERN_UNBOUND`. Phát hiện
|
|
21
|
+
giữa chừng rằng kết quả cần một ranh giới rộng hơn là cách kết thúc dự kiến của operator này, không
|
|
22
|
+
phải sự nhụt chí: chủ contract mở lại và đóng băng lại, rồi cùng kết quả ấy được cài đặt lại theo
|
|
23
|
+
fingerprint mới. Với tay ra ngoài danh sách không phải là thay đổi nhỏ hơn việc mở lại contract; nó là
|
|
24
|
+
cùng một thay đổi nhưng không có dấu vết.
|
|
25
|
+
|
|
26
|
+
## Không bao giờ ghi lên nhánh của người
|
|
27
|
+
|
|
28
|
+
Operator này không bao giờ ghi lên nhánh mà một người đang checkout. Orchestrator chuẩn bị một git
|
|
29
|
+
worktree riêng của checkout được route trên nhánh phiên `session/<sessionId>`, cắt từ head đã đóng
|
|
30
|
+
băng, và bước 3 ghi ở đó chứ không ở đâu khác, dưới một lease độc quyền trên `@workspaces/be`. Bước
|
|
31
|
+
cuối commit toàn bộ tập ghi đã khai đúng một lần, ghi sha ấy vào `response.json.commits`, và nêu cùng
|
|
32
|
+
sha ấy trong `response/data/mutations.json` ở trường `commit`, cạnh `base` nó xuất phát và `branch` nó
|
|
33
|
+
sống trên đó; `response/changes.md` nói đúng bước chuyển ấy ở hàng Binding, `@workspaces/be` tại
|
|
34
|
+
`<base>` → `<sha>` trên `session/<sessionId>`. Một commit, vì một bước mà công việc tới dưới dạng nhiều
|
|
35
|
+
commit thì bước sau không pin được trong request của nó, còn một lần ghi chưa commit thì không pin
|
|
36
|
+
được chút nào. Ở đây không push và không merge gì cả: `git.publish` merge nhánh phiên vào nhánh đích,
|
|
37
|
+
và nó là operator duy nhất nói chuyện với remote.
|
|
38
|
+
|
|
39
|
+
## Chế độ dry ghi bản kế hoạch, không ghi cây
|
|
40
|
+
|
|
41
|
+
`mode` quyết lượt chạy này có chạm vào checkout hay không. Dưới `apply`, operator điền contract,
|
|
42
|
+
commit một lần, và mọi điều bên dưới đúng y như đã viết. Dưới `dry`, nó vẫn đọc, vẫn ràng, vẫn chiếu
|
|
43
|
+
đúng như vậy, rồi dừng ngay sau bản kế hoạch: `response/data/mutations.json` mang những operation nó
|
|
44
|
+
sẽ điền và những file nó sẽ chạm, với `commit` rỗng và không hash sau, `response.json` không ghi
|
|
45
|
+
commit nào, và không một byte nào tới `@workspaces/be`. Nhánh vẫn kết thúc `done`, vì một bản kế
|
|
46
|
+
hoạch làm thật thà là một câu trả lời trọn vẹn cho một câu hỏi về kế hoạch; `changes.md` của nó liệt
|
|
47
|
+
mọi path đã định là `unchanged`, đúng như cây làm việc đang cho thấy, và nêu thay đổi nó sẽ làm ở cột
|
|
48
|
+
`Why`. Một lượt dry không đo gì cả, nên nó không mang bản ghi conformance và không mang bản ghi
|
|
49
|
+
proof: không thể đo một facet trên đoạn code chưa từng được viết, và một bản kế hoạch mà ship kèm
|
|
50
|
+
phán quyết thì không phân biệt nổi với một lần cài đặt thật. Một lượt dry cũng không được cấp `@tools/sourcewrite` lẫn
|
|
51
|
+
`@tools/git`, vì một chế độ không ghi gì thì không cần công cụ nào ghi được; phần cấp quyền và đoạn
|
|
52
|
+
này nói cùng một điều nên chúng không thể trôi khỏi nhau. Đó cũng là lý do một lượt dry không bao
|
|
53
|
+
giờ là lượt thoả contract — nó là cách đọc trước tập ghi trước khi trả giá cho nó, không phải một
|
|
54
|
+
cách áp dụng rẻ hơn.
|
|
55
|
+
|
|
56
|
+
## Backend không bao giờ bịa hành vi nghiệp vụ
|
|
57
|
+
|
|
58
|
+
Mỗi operation dẫn các quyết định đã duyệt mà nó cài đặt. Một quyết định đã duyệt không phải con số
|
|
59
|
+
operator này được tự đặt: nó là một `dimension` của ma trận phủ thuộc head nghiệp vụ đã ràng, địa chỉ
|
|
60
|
+
bằng chính định danh kebab của dimension ấy, và fingerprint của ma trận đi cùng lời dẫn để người đọc
|
|
61
|
+
sau biết ma trận nào đã duyệt nó. Một lời dẫn nêu thứ mà ma trận đã ràng không mang thì không phải một
|
|
62
|
+
lần duyệt, nó là một phỏng đoán có nhãn. Khi đoạn code tới chỗ câu trả lời phụ thuộc
|
|
63
|
+
vào một luật nghiệp vụ chưa ai duyệt, nhánh dừng với `BUSINESS_AUTHORITY_MISSING` và nêu tên câu hỏi
|
|
64
|
+
còn mở. Nó không chọn cách đọc dễ dãi, không bắt chước feature bên cạnh tình cờ làm gì, và không chọn
|
|
65
|
+
nhánh nào làm test xanh. Đây là luật gánh nặng nhất của operator, vì một luật nghiệp vụ đoán ra mà qua
|
|
66
|
+
được test của chính nó thì không phân biệt nổi với một luật đã duyệt một khi đã ship. Vì vậy một biên
|
|
67
|
+
nhận đã cài đặt không thể mang finding `BUSINESS_QUESTION_RAISED`: nêu câu hỏi rồi vẫn cài đặt chính
|
|
68
|
+
là mâu thuẫn mà phép kiểm này sinh ra để bắt.
|
|
69
|
+
|
|
70
|
+
## Pattern anh em là nguồn quy ước duy nhất
|
|
71
|
+
|
|
72
|
+
Các pattern đã ràng nêu một họ cho mỗi khía cạnh, và phần cài đặt bắt chước họ mà codebase đang công
|
|
73
|
+
bố chứ không phải họ mà nó nhớ: command handler theo họ mà tầng mutation đang dùng, exception dẫn xuất
|
|
74
|
+
từ định danh exception đã công bố, truy cập entity qua entity manager chính được tiêm, migration dưới
|
|
75
|
+
datasource chính. Hai họ cùng ràng cho một khía cạnh nghĩa là không họ nào được ràng, và đoán họ từ
|
|
76
|
+
trí nhớ chính là cách một kiểu nhà thứ hai lọt vào codebase mà không ai để ý.
|
|
77
|
+
|
|
78
|
+
## Conformance là đo được, không phải khẳng định
|
|
79
|
+
|
|
80
|
+
Một bản ghi conformance không có bằng chứng chỉ là một câu nói về đoạn code, và một câu nói không mâu
|
|
81
|
+
thuẫn nổi với code. Mỗi facet đã khai của mỗi operation có file riêng,
|
|
82
|
+
`response/data/conformance/<operationId>.<facet>.json`, nên một facet không ai đo là một file thiếu
|
|
83
|
+
chứ không phải một dòng thiếu bên trong một file trông vẫn đầy đủ. Bằng chứng là thứ người đọc sau
|
|
84
|
+
dùng để phản đối biên nhận này, nên nó bắt buộc cho mọi facet, kể cả những facet đã qua. Cùng lý lẽ ấy
|
|
85
|
+
khiến một proof phải mang câu lệnh, mã thoát và output trong
|
|
86
|
+
`response/data/proofs/<operationId>.<kind>.json`: câu lệnh nói đã chạy gì và kết quả nói cái gì trả
|
|
87
|
+
về, còn mỗi thứ đứng một mình đều có thể do người chưa chạy gì viết ra. Một proof không chạy được
|
|
88
|
+
không bao giờ trở thành khẳng định rằng hành vi vẫn ổn, và một proof hỏng chặn biên nhận chứ không
|
|
89
|
+
được phân loại lại. Mỗi file bị chạm mang một bản ghi thay đổi kèm loại và hash trước/sau, vì một file
|
|
90
|
+
sửa mà hai hash bằng nhau ghi lại một mutation không hề xảy ra.
|
|
91
|
+
|
|
92
|
+
## Ranh giới
|
|
93
|
+
|
|
94
|
+
Operator chỉ ghi source sản phẩm bên trong trần file được sửa, chỉ bên trong worktree nhánh phiên của
|
|
95
|
+
`@workspaces/be`, và ghi mọi thứ khác vào `response/` của nhánh mình: `response.md`,
|
|
96
|
+
`response/changes.md`, `response/data/mutations.json`, một bản ghi conformance cho mỗi facet đã khai,
|
|
97
|
+
một bản ghi proof cho mỗi proof đã khai, và `response.json`. Nó không bao giờ thêm một operation,
|
|
98
|
+
writer, store, giao dịch, migration hay event mà contract đóng băng không mang, không quyết một luật
|
|
99
|
+
nghiệp vụ mà thẩm quyền đã duyệt không nói, không đưa vào một quy ước mà không pattern anh em nào công
|
|
100
|
+
bố, không làm yếu, bỏ qua, chặn hay thay thế một proof đã khai để một lượt chạy thành xanh, không sửa
|
|
101
|
+
contract, thẩm quyền nghiệp vụ hay một file ngoài trần được sửa, không commit quá một lần, không ghi
|
|
102
|
+
lên nhánh mà người đang checkout, không push, merge hay tag gì, không tuyên bố conformance mà không
|
|
103
|
+
nêu bằng chứng đã đo nó, và không ghi phán quyết chất lượng, thị giác hay UAT; đó là những việc khác
|
|
104
|
+
với cổng riêng của chúng.
|
|
105
|
+
|
|
106
|
+
Khi đầu vào `model` có mặt, nó là thẩm quyền của lượt chạy này và head đã publish chỉ còn là dòng dõi:
|
|
107
|
+
một chuỗi vừa mô hình hoá xong một head không được quyết ngược lại một lời hứa cũ hơn chỉ vì lần
|
|
108
|
+
publish bị giữ lại. Khi nó vắng, head đã publish là thẩm quyền.
|
|
109
|
+
|
|
110
|
+
## Context
|
|
111
|
+
|
|
112
|
+
| Alias | Bind | Bắt buộc |
|
|
113
|
+
| --- | --- | --- |
|
|
114
|
+
| `@worktrees/businesses/<featureId>` | head nghiệp vụ đã publish, nguồn duy nhất của hành vi nghiệp vụ; chỉ là bằng chứng khi phiên mang đầu vào `model` | có |
|
|
115
|
+
| `@knowledge/patterns/be` | các họ anh em mà thay đổi này bắt chước, mỗi khía cạnh một họ; nguồn quy ước hợp lệ duy nhất | có |
|
|
116
|
+
| `@workspaces/be` | checkout backend được route ở head đóng băng, chỉ ghi trên worktree nhánh phiên của nó | có |
|
|
117
|
+
|
|
118
|
+
## Đầu vào
|
|
119
|
+
|
|
120
|
+
| Kind | Từ đâu | Bắt buộc |
|
|
121
|
+
| --- | --- | --- |
|
|
122
|
+
| `architecture-decision` | `architecture.decide`; contract mutation đã đóng băng mà phần cài đặt điền vào và không được nới, và là nguồn của mọi operation lượt chạy này thuật lại | có |
|
|
123
|
+
| `model` | `business.decide`; head mà nhánh đó đã mô hình hoá, khi nó chưa được publish | không |
|
|
124
|
+
| `backend-source-application` | một lượt chạy trước của `backend.source.apply` cho cùng kết quả; lịch sử hồi quy, vắng mặt ở lần đầu | không |
|
|
125
|
+
|
|
126
|
+
## Yêu cầu
|
|
127
|
+
|
|
128
|
+
| Field | Kiểu | Mặc định | Hỏi |
|
|
129
|
+
| --- | --- | --- | --- |
|
|
130
|
+
| `featureId` | id | — | Feature mà head nghiệp vụ đã publish của nó quyết hành vi này |
|
|
131
|
+
| `outcome` | prompt | — | Một thứ duy nhất đang được cài đặt, bằng lời của người dùng |
|
|
132
|
+
| `mutableFileRefs` | list | — | Những file duy nhất mà source sản phẩm được ghi vào |
|
|
133
|
+
| `mode` | choice | apply | `apply` điền contract rồi commit, `dry` chỉ phát bản kế hoạch và không ghi gì |
|
|
134
|
+
| `resume` | token | null | Token của nhánh bị chặn khi vào lại sau một mã dừng |
|
|
135
|
+
|
|
136
|
+
## Các bước
|
|
137
|
+
|
|
138
|
+
| # | Bước | Tham số | Đọc | Ghi | Dừng với |
|
|
139
|
+
| --- | --- | --- | --- | --- | --- |
|
|
129
140
|
| 1 | Kiểm gate và chạy lại | `resume`, `mode` | `request/request.json`, đầu vào `backend-source-application` nếu có, @workspaces/be ở head đóng băng | — | `INVALID_INPUT`, `SOURCE_DRIFT`, `NO_PROGRESS` |
|
|
130
|
-
| 2 | Ràng thẩm quyền, contract và pattern | `featureId` | @worktrees/businesses/<featureId> ở head đã publish, đầu vào `architecture-decision` làm contract đóng băng
|
|
141
|
+
| 2 | Ràng thẩm quyền, contract và pattern | `featureId` | đầu vào `model` khi có, nếu không thì @worktrees/businesses/<featureId> ở head đã publish, đầu vào `architecture-decision` làm contract đóng băng và làm nguồn `operations` của nó, @knowledge/patterns/be mỗi khía cạnh một pattern | — | `CONTRACT_UNFROZEN`, `BUSINESS_AUTHORITY_MISSING`, `PATTERN_UNBOUND` |
|
|
131
142
|
| 3 | Điền từng operation của contract, trên nhánh phiên | `mutableFileRefs` | @knowledge/patterns/be cho từng khía cạnh, @workspaces/be trong trần được sửa | @workspaces/be/branch/session trong trần được sửa, dưới một lease độc quyền, @tools/sourcewrite | `CONTRACT_WIDENED`, `OWNER_CONFLICT` |
|
|
132
143
|
| 4 | Đối chiếu mọi mutation với contract đóng băng và ghi nó kèm hash trước và sau | `mode` | @workspaces/be, các file bị chạm và contract đóng băng | `response/data/mutations.json` | — |
|
|
133
144
|
| 5 | Kiểm lại snapshot đã lưu khi đọc | — | @workspaces/be, snapshot đã lưu, @knowledge/patterns/be cho các luật trôi sau nó | — | — |
|
|
134
145
|
| 6 | Chứng minh từng facet đã khai | — | @workspaces/be, phép đo đứng sau mỗi facet | `response/data/conformance/<operationId>.<facet>.json` | — |
|
|
135
146
|
| 7 | Chạy từng proof đã khai | — | @workspaces/be, câu lệnh đã pin của mỗi kiểu proof đã khai | `response/data/proofs/<operationId>.<proofKind>.json`, @tools/shell | `PROOF_UNAVAILABLE` |
|
|
136
147
|
| 8 | Commit tập ghi đúng một lần, viết biên nhận và phát | `outcome` | mọi thứ ở trên | @workspaces/be/branch/session thành một commit, `response/changes.md`, `response/response.md`, `response/response.json`, @tools/git | — |
|
|
137
|
-
|
|
138
|
-
Dưới `mode = dry`, bước 3 chiếu phần điền lên các path đã khai mà không ghi lấy một path nào, bước 4
|
|
139
|
-
ghi bản chiếu ấy thành kế hoạch với commit rỗng và không hash sau, bước 5 tới 7 không có gì để đo nên
|
|
140
|
-
không phát ra gì, và bước 8 phát biên nhận cùng bản ghi thay đổi mà không có commit. Dưới `apply`,
|
|
141
|
-
mọi bước chạy đúng như đã viết. Head được route được kiểm lại ngay trước lần ghi sản phẩm đầu tiên, nên trôi head phát hiện ở đó dừng
|
|
142
|
-
nhánh trước khi có gì được ghi. Điền một operation là viết transport, phần kiểm tra hợp lệ, phần kiểm
|
|
143
|
-
quyền, phần truy cập dữ liệu và các đường lỗi vào writer đã khai cùng những file mà thay đổi thực sự
|
|
144
|
-
đòi; nó từ chối to và sớm chứ không im lặng bỏ rơi một trường hợp, ném ra exception mà pattern định
|
|
145
|
-
danh exception công bố trước khi có dòng nào hay checkout ngoài nào được tạo. Khi kết quả lưu một
|
|
146
|
-
workflow, phiên, giỏ, bản nháp hay snapshot khác, tính dùng được lại được cưỡng chế ở nơi nó được
|
|
147
|
-
đọc, đối chiếu phía server, theo thứ tự ổn định, với chỉ mục ánh xạ lại nguyên tử và một trạng thái
|
|
148
|
-
kết thúc tường minh khi không còn gì để làm, và được ghi là `SNAPSHOT_REVALIDATED`. Chạy lại thì bắt
|
|
149
|
-
đầu lại từ bước 1, chỉ dùng lại quan sát có fingerprint không đổi, và tiêu thụ đúng phần delta; một
|
|
150
|
-
quyết định nghiệp vụ đã duyệt tới dưới dạng một fingerprint thẩm quyền mới, vì cùng một fingerprint
|
|
151
|
-
không thể cho một câu trả lời khác.
|
|
152
|
-
|
|
153
|
-
## Đầu ra
|
|
154
|
-
|
|
155
|
-
| Kind | File | Kiểu | Bắt buộc |
|
|
156
|
-
| --- | --- | --- | --- |
|
|
157
|
-
| `backend-source-application` | `response/response.md` | md | có |
|
|
158
|
-
| `changes` | `response/changes.md` | md | có |
|
|
159
|
-
| `mutations` | `response/data/mutations.json` | data | có |
|
|
160
|
-
| `conformance` | `response/data/conformance/<operationId>.<facet>.json` | data | không |
|
|
161
|
-
| `proof` | `response/data/proofs/<operationId>.<proofKind>.json` | data | không |
|
|
162
|
-
|
|
163
|
-
## Dừng
|
|
164
|
-
|
|
165
|
-
| Code | Xử lý |
|
|
166
|
-
| --- | --- |
|
|
167
|
-
| `INVALID_INPUT` | terminate |
|
|
168
|
-
| `SOURCE_DRIFT` | terminate |
|
|
169
|
-
| `NO_PROGRESS` | terminate |
|
|
170
|
-
| `CONTRACT_UNFROZEN` | terminate |
|
|
171
|
-
| `CONTRACT_WIDENED` | terminate |
|
|
172
|
-
| `BUSINESS_AUTHORITY_MISSING` | terminate |
|
|
173
|
-
| `OWNER_CONFLICT` | terminate |
|
|
174
|
-
| `PATTERN_UNBOUND` | terminate |
|
|
175
|
-
| `PROOF_UNAVAILABLE` | terminate |
|
|
176
|
-
|
|
177
|
-
## Kế tiếp
|
|
178
|
-
|
|
179
|
-
| Khi | Operator |
|
|
180
|
-
| --- | --- |
|
|
181
|
-
| contract đã điền xong và các cổng mà bản ghi thay đổi nêu tên phải chạy | `quality.verify` |
|
|
182
|
-
| lời hứa phải được đối chiếu với source đã giao | `business.decide` |
|
|
183
|
-
| contract đã điền xong và một bề mặt frontend phải tiêu thụ nó | `frontend.direction.decide` |
|
|
184
|
-
| một file cần sửa nằm ngoài trần ghi được route | `workspace.bind` |
|
|
185
|
-
| một proof đã khai không chạy được trong môi trường này | `platform.operate` |
|
|
148
|
+
|
|
149
|
+
Dưới `mode = dry`, bước 3 chiếu phần điền lên các path đã khai mà không ghi lấy một path nào, bước 4
|
|
150
|
+
ghi bản chiếu ấy thành kế hoạch với commit rỗng và không hash sau, bước 5 tới 7 không có gì để đo nên
|
|
151
|
+
không phát ra gì, và bước 8 phát biên nhận cùng bản ghi thay đổi mà không có commit. Dưới `apply`,
|
|
152
|
+
mọi bước chạy đúng như đã viết. Head được route được kiểm lại ngay trước lần ghi sản phẩm đầu tiên, nên trôi head phát hiện ở đó dừng
|
|
153
|
+
nhánh trước khi có gì được ghi. Điền một operation là viết transport, phần kiểm tra hợp lệ, phần kiểm
|
|
154
|
+
quyền, phần truy cập dữ liệu và các đường lỗi vào writer đã khai cùng những file mà thay đổi thực sự
|
|
155
|
+
đòi; nó từ chối to và sớm chứ không im lặng bỏ rơi một trường hợp, ném ra exception mà pattern định
|
|
156
|
+
danh exception công bố trước khi có dòng nào hay checkout ngoài nào được tạo. Khi kết quả lưu một
|
|
157
|
+
workflow, phiên, giỏ, bản nháp hay snapshot khác, tính dùng được lại được cưỡng chế ở nơi nó được
|
|
158
|
+
đọc, đối chiếu phía server, theo thứ tự ổn định, với chỉ mục ánh xạ lại nguyên tử và một trạng thái
|
|
159
|
+
kết thúc tường minh khi không còn gì để làm, và được ghi là `SNAPSHOT_REVALIDATED`. Chạy lại thì bắt
|
|
160
|
+
đầu lại từ bước 1, chỉ dùng lại quan sát có fingerprint không đổi, và tiêu thụ đúng phần delta; một
|
|
161
|
+
quyết định nghiệp vụ đã duyệt tới dưới dạng một fingerprint thẩm quyền mới, vì cùng một fingerprint
|
|
162
|
+
không thể cho một câu trả lời khác.
|
|
163
|
+
|
|
164
|
+
## Đầu ra
|
|
165
|
+
|
|
166
|
+
| Kind | File | Kiểu | Bắt buộc |
|
|
167
|
+
| --- | --- | --- | --- |
|
|
168
|
+
| `backend-source-application` | `response/response.md` | md | có |
|
|
169
|
+
| `changes` | `response/changes.md` | md | có |
|
|
170
|
+
| `mutations` | `response/data/mutations.json` | data | có |
|
|
171
|
+
| `conformance` | `response/data/conformance/<operationId>.<facet>.json` | data | không |
|
|
172
|
+
| `proof` | `response/data/proofs/<operationId>.<proofKind>.json` | data | không |
|
|
173
|
+
|
|
174
|
+
## Dừng
|
|
175
|
+
|
|
176
|
+
| Code | Xử lý |
|
|
177
|
+
| --- | --- |
|
|
178
|
+
| `INVALID_INPUT` | terminate |
|
|
179
|
+
| `SOURCE_DRIFT` | terminate |
|
|
180
|
+
| `NO_PROGRESS` | terminate |
|
|
181
|
+
| `CONTRACT_UNFROZEN` | terminate |
|
|
182
|
+
| `CONTRACT_WIDENED` | terminate |
|
|
183
|
+
| `BUSINESS_AUTHORITY_MISSING` | terminate |
|
|
184
|
+
| `OWNER_CONFLICT` | terminate |
|
|
185
|
+
| `PATTERN_UNBOUND` | terminate |
|
|
186
|
+
| `PROOF_UNAVAILABLE` | terminate |
|
|
187
|
+
|
|
188
|
+
## Kế tiếp
|
|
189
|
+
|
|
190
|
+
| Khi | Operator |
|
|
191
|
+
| --- | --- |
|
|
192
|
+
| contract đã điền xong và các cổng mà bản ghi thay đổi nêu tên phải chạy | `quality.verify` |
|
|
193
|
+
| lời hứa phải được đối chiếu với source đã giao | `business.decide` |
|
|
194
|
+
| contract đã điền xong và một bề mặt frontend phải tiêu thụ nó | `frontend.direction.decide` |
|
|
195
|
+
| một file cần sửa nằm ngoài trần ghi được route | `workspace.bind` |
|
|
196
|
+
| một proof đã khai không chạy được trong môi trường này | `platform.operate` |
|
|
197
|
+
| bản kế hoạch được làm ra dưới mode dry và một người quyết có trả giá cho nó hay không | `user` |
|