@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.
Files changed (75) hide show
  1. package/INDEX.md +3 -1
  2. package/INDEX.vi.md +3 -1
  3. package/README.md +6 -1
  4. package/README.vi.md +6 -1
  5. package/knowledge/ui/presentation/INDEX.md +5 -0
  6. package/knowledge/ui/presentation/INDEX.vi.md +1 -0
  7. package/knowledge/ui/presentation/radius.md +183 -0
  8. package/knowledge/ui/presentation/radius.vi.md +182 -0
  9. package/operators/INDEX.md +5 -5
  10. package/operators/INDEX.vi.md +5 -5
  11. package/operators/architecture-decide/operator.md +27 -4
  12. package/operators/architecture-decide/operator.vi.md +23 -4
  13. package/operators/architecture-decide/self-test.mjs +18 -1
  14. package/operators/architecture-decide/validate.mjs +29 -1
  15. package/operators/backend-source-apply/operator.md +197 -182
  16. package/operators/backend-source-apply/operator.vi.md +190 -178
  17. package/operators/backend-source-apply/self-test.mjs +257 -257
  18. package/operators/backend-source-apply/validate.mjs +240 -240
  19. package/operators/business-decide/self-test.mjs +2 -1
  20. package/operators/business-decide/validate.mjs +3 -0
  21. package/operators/content-generate/self-test.mjs +1 -1
  22. package/operators/frontend-direction-decide/self-test.mjs +1 -1
  23. package/operators/frontend-presentation-resolve/operator.md +6 -0
  24. package/operators/frontend-presentation-resolve/operator.vi.md +6 -0
  25. package/operators/frontend-presentation-resolve/self-test.mjs +6 -5
  26. package/operators/frontend-presentation-resolve/validate.mjs +30 -6
  27. package/operators/frontend-source-apply/operator.md +3 -1
  28. package/operators/frontend-source-apply/operator.vi.md +3 -1
  29. package/operators/frontend-source-apply/self-test.mjs +1 -1
  30. package/operators/frontend-surface-audit/self-test.mjs +1 -1
  31. package/operators/git-publish/self-test.mjs +1 -1
  32. package/operators/platform-operate/self-test.mjs +1 -1
  33. package/operators/quality-verify/operator.md +5 -1
  34. package/operators/quality-verify/operator.vi.md +5 -1
  35. package/operators/quality-verify/self-test.mjs +15 -2
  36. package/operators/quality-verify/validate.mjs +21 -1
  37. package/operators/release-deploy/self-test.mjs +235 -235
  38. package/operators/uat-verify/operator.md +20 -6
  39. package/operators/uat-verify/operator.vi.md +21 -7
  40. package/operators/uat-verify/self-test.mjs +6 -5
  41. package/operators/uat-verify/validate.mjs +10 -4
  42. package/operators/workspace-bind/operator.md +18 -4
  43. package/operators/workspace-bind/operator.vi.md +16 -4
  44. package/operators/workspace-bind/self-test.mjs +3 -1
  45. package/operators/workspace-bind/validate.mjs +1 -0
  46. package/package.json +1 -1
  47. package/readiness/initialization/workspaces/local-route.schema.json +1 -1
  48. package/resources/orchestrator.json +14 -8
  49. package/routing.json +2 -1
  50. package/scripts/validate-request.mjs +12 -1
  51. package/scripts/validate-response.mjs +14 -3
  52. package/scripts/validate-step.mjs +2 -1
  53. package/scripts/validate-workflows.mjs +8 -1
  54. package/templates/kinds/architecture-decision.contract.json +1 -0
  55. package/templates/kinds/architecture-decision.skeleton.md +6 -0
  56. package/templates/kinds/backend-source-application.contract.json +1 -1
  57. package/templates/kinds/backend-source-application.skeleton.md +1 -1
  58. package/templates/kinds/frontend-presentation-resolution.contract.json +1 -1
  59. package/templates/kinds/frontend-presentation-resolution.skeleton.md +1 -0
  60. package/templates/kinds/mutations.schema.json +65 -65
  61. package/templates/kinds/route.schema.json +4 -2
  62. package/templates/kinds/stack-model.schema.json +23 -1
  63. package/templates/kinds/workspace-route-binding.contract.json +2 -2
  64. package/templates/step/response.schema.json +10 -0
  65. package/templates/step/state.schema.json +205 -0
  66. package/workflows/README.md +3 -0
  67. package/workflows/README.vi.md +3 -0
  68. package/workflows/backend-feature.json +26 -5
  69. package/workflows/content-unit.json +4 -1
  70. package/workflows/frontend-new-surface.json +15 -5
  71. package/workflows/frontend-reconstruct.json +10 -4
  72. package/workflows/frontend-refine.json +10 -4
  73. package/workflows/frontend-with-uat.json +15 -3
  74. package/workflows/full-feature.json +31 -8
  75. 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. Đó cũng do một lượt dry không bao
51
- giờ lượt thoả contract cách đọc trước tập ghi trước khi trả giá cho nó, không phải một
52
- cách áp dụng rẻ hơn.
53
-
54
- ## Backend không bao giờ bịa hành vi nghiệp vụ
55
-
56
- Mỗi operation dẫn các quyết định đã duyệt nó cài đặt. Khi đoạn code tới chỗ câu trả lời phụ thuộc
57
- 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
58
- còn mở. 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ì, không chọn
59
- nhánh nào làm test xanh. Đâyluật gánh nặng nhất của operator, một luật nghiệp vụ đoán ra qua
60
- được test của chính thì không phân biệt nổi với một luật đã duyệt một khi đã ship. vậy một biên
61
- 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
62
- mâu thuẫn phép kiểm này sinh ra để bắt.
63
-
64
- ## Pattern anh em nguồn quy ước duy nhất
65
-
66
- Các pattern đã ràng nêu một họ cho mỗi khía cạnh, phần cài đặt bắt chước họ codebase đang công
67
- bố chứ không phải họ nhớ: command handler theo họ tầng mutation đang dùng, exception dẫn xuất
68
- từ định danh exception đã công bố, truy cập entity qua entity manager chính được tiêm, migration dưới
69
- 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ừ
70
- trí nhớ chínhcách một kiểu nhà thứ hai lọt vào codebase mà không ai để ý.
71
-
72
- ## Conformance đo được, không phải khẳng định
73
-
74
- Một bản ghi conformance không bằng chứng chỉ một câu nói về đoạn code, một câu nói không mâu
75
- thuẫn nổi với code. Mỗi facet đã khai của mỗi operation file riêng,
76
- `response/data/conformance/<operationId>.<facet>.json`, nên một facet không ai đo một file thiếu
77
- 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
78
- dùng để phản đối biên nhận này, nên bắt buộc cho mọi facet, kể cả những facet đã qua. Cùng lý lẽ ấy
79
- khiến một proof phải mang câu lệnh, mã thoát và output trong
80
- `response/data/proofs/<operationId>.<kind>.json`: câu lệnh nói đã chạy kết quả nói cái gì trả
81
- về, còn mỗi thứ đứng một mình đều thể do người chưa chạy gì viết ra. Một proof không chạy được
82
- 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
83
- đượ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 hash trước/sau, một file
84
- sửa hai hash bằng nhau ghi lại một mutation không hề xảy ra.
85
-
86
- ## Ranh giới
87
-
88
- 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
89
- `@workspaces/be`, ghi mọi thứ khác vào `response/` của nhánh mình: `response.md`,
90
- `response/changes.md`, `response/data/mutations.json`, một bản ghi conformance cho mỗi facet đã khai,
91
- một bản ghi proof cho mỗi proof đã khai, và `response.json`. Nó không bao giờ thêm một operation,
92
- writer, store, giao dịch, migration hay event mà contract đóng băng không mang, không quyết một luật
93
- 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
94
- 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
95
- 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
96
- lên nhánh người đang checkout, không push, merge hay tag gì, không tuyên bố conformance mà không
97
- nêu bằng chứng đã đo nó, không ghi phán quyết chất lượng, thị giác hay UAT; đó những việc khác
98
- với cổng riêng của chúng.
99
-
100
- ## Context
101
-
102
- | Alias | Bind | Bắt buộc |
103
- | --- | --- | --- |
104
- | `@worktrees/businesses/<featureId>` | head nghiệp vụ đã publish, nguồn duy nhất của hành vi nghiệp vụ | có |
105
- | `@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ó |
106
- | `@workspaces/be` | checkout backend được route head đóng băng, chỉ ghi trên worktree nhánh phiên của | có |
107
-
108
- ## Đầu vào
109
-
110
- | Kind | Từ đâu | Bắt buộc |
111
- | --- | --- | --- |
112
- | `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 | có |
113
- | `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 |
114
-
115
- ## Yêu cầu
116
-
117
- | Field | Kiểu | Mặc định | Hỏi |
118
- | --- | --- | --- | --- |
119
- | `featureId` | id | — | Feature mà head nghiệp vụ đã publish của nó quyết hành vi này |
120
- | `outcome` | prompt | | Một thứ duy nhất đang được cài đặt, bằng lời của người dùng |
121
- | `mutableFileRefs` | list | | Những file duy nhất mà source sản phẩm được ghi vào |
122
- | `mode` | choice | apply | `apply` điền contract rồi commit, `dry` chỉ phát bản kế hoạch không ghi |
123
- | `resume` | token | null | Token của nhánh bị chặn khi vào lại sau một dừng |
124
-
125
- ## Các bước
126
-
127
- | # | Bước | Tham số | Đọc | Ghi | Dừng với |
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`, một chế độ không ghi thì không cần công cụ nào ghi được; phần cấp quyền đ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 cài đặt. Một quyết định đã duyệt không phải con số
59
+ operator này được tự đặt: 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, 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ứ ma trận đã ràng không mang thì không phải một
62
+ lần duyệt, nó một phỏng đoán 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ở. 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 thì không phân biệt nổi với một luật đã duyệt một khi đã ship. 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
+ mâu thuẫn phép kiểm này sinh ra để bắt.
69
+
70
+ ## Pattern anh em 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, 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 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 đ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,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 file riêng,
82
+ `response/data/conformance/<operationId>.<facet>.json`, nên một facet không ai đo 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 thứ người đọc sau
84
+ dùng để phản đối biên nhận này, 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, 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 hash trước/sau, một file
90
+ sửa 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`, 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, `response.json`. 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 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` mặt, thẩm quyền của lượt chạy này head đã publish chỉ còn 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 không được nới, nguồn của mọi operation lượt chạy này thuật lại | có |
123
+ | `model` | `business.decide`; head nhánh đó đã hình hoá, khi 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, @knowledge/patterns/be mỗi khía cạnh một pattern | — | `CONTRACT_UNFROZEN`, `BUSINESS_AUTHORITY_MISSING`, `PATTERN_UNBOUND` |
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` |