@hdwebsoft/hdcode-ai-darwin-x64 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/hdcode +0 -0
- package/bin/index.js.map +1 -1
- package/bin/worker.js.map +1 -1
- package/package.json +1 -1
- package/resources/agents/finder.md +1 -1
- package/resources/agents/mermaid.md +1 -1
- package/resources/opencode.json +2 -1
- package/resources/skills/hd-code-review/CODING_STANDARDS.md +14 -114
- package/resources/skills/hd-code-review/REVIEW_STANDARDS.md +76 -0
- package/resources/skills/hd-code-review/SKILL.md +314 -90
- package/resources/skills/hd-code-review/reference/review-checklist.md +104 -101
- package/resources/skills/hd-code-review/reference/stacks/apex.md +49 -0
- package/resources/skills/hd-code-review/reference/stacks/aura.md +39 -0
- package/resources/skills/hd-code-review/reference/stacks/cakephp.md +50 -0
- package/resources/skills/hd-code-review/reference/stacks/django.md +53 -0
- package/resources/skills/hd-code-review/reference/stacks/dotnet.md +52 -0
- package/resources/skills/hd-code-review/reference/stacks/expo.md +39 -0
- package/resources/skills/hd-code-review/reference/stacks/flutter.md +48 -0
- package/resources/skills/hd-code-review/reference/stacks/go.md +51 -0
- package/resources/skills/hd-code-review/reference/stacks/laravel.md +56 -0
- package/resources/skills/hd-code-review/reference/stacks/lwc.md +49 -0
- package/resources/skills/hd-code-review/reference/stacks/nodejs.md +51 -0
- package/resources/skills/hd-code-review/reference/stacks/php.md +52 -0
- package/resources/skills/hd-code-review/reference/stacks/python.md +50 -0
- package/resources/skills/hd-code-review/reference/stacks/react.md +51 -0
- package/resources/skills/hd-code-review/reference/stacks/reactnative.md +54 -0
- package/resources/skills/hd-code-review/reference/stacks/scala.md +48 -0
- package/resources/skills/hd-code-review/reference/stacks/visualforce.md +38 -0
- package/resources/skills/hd-code-review/reference/stacks/vuejs.md +52 -0
- package/resources/skills/hd-code-review/reference/stacks/wordpress.md +54 -0
- package/resources/skills/hd-daily-goals/SKILL.md +41 -9
- package/resources/skills/hd-daily-goals/reference/ticket-autofill.md +104 -0
- package/resources/skills/hd-daily-goals/reference/validation-rules.md +13 -0
- package/resources/skills/hd-daily-report/SKILL.md +70 -14
- package/resources/skills/hd-daily-report/reference/sample-report-qc.md +44 -0
- package/resources/skills/hd-daily-report/reference/sample-report.md +18 -15
- package/resources/skills/hd-daily-report/reference/validation-rules.md +28 -7
- package/resources/skills/hd-daily-viewer/SKILL.md +222 -0
- package/resources/skills/hd-docs-init/SKILL.md +33 -0
- package/resources/skills/hd-docs-parse/SKILL.md +2 -0
- package/resources/skills/hd-docs-parse/scripts/parse_document.py +6 -0
- package/resources/skills/hd-docs-sync/SKILL.md +65 -3
- package/resources/skills/hd-docs-sync/reference/doc-mapping.md +1 -0
- package/resources/skills/hd-help/SKILL.md +24 -0
- package/resources/skills/hd-help/reference/skill-map.md +122 -7
- package/resources/skills/hd-iso/SKILL.md +409 -0
- package/resources/skills/hd-iso/reference/iso-27001-requirements.md +166 -0
- package/resources/skills/hd-iso/reference/iso-9001-requirements.md +91 -0
- package/resources/skills/hd-iso/reference/role-profiles.md +115 -0
- package/resources/skills/hd-iso-ready/SKILL.md +146 -0
- package/resources/skills/hd-iso-sync/SKILL.md +217 -0
- package/resources/skills/hd-iso-sync/reference/frontmatter-schema.md +89 -0
- package/resources/skills/hd-iso-verify/SKILL.md +294 -0
- package/resources/skills/hd-issue-resolution/SKILL.md +20 -0
- package/resources/skills/hd-task/SKILL.md +12 -0
|
@@ -1,47 +1,13 @@
|
|
|
1
1
|
# Review Checklist — hd-code-review
|
|
2
2
|
|
|
3
|
-
Reference checklist used by Phase 4 (
|
|
4
|
-
Apply
|
|
3
|
+
Reference checklist used by Phase 4 (Tiered Review) of the `hd-code-review` skill.
|
|
4
|
+
Apply aspects in tier order. Tier 1 (blockers) runs first; Tier 2 (advisories) runs after the gate.
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
##
|
|
8
|
+
## Tier 1 — Blocker-Prone
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
When an aspect has no issues, output a single line:
|
|
13
|
-
|
|
14
|
-
```
|
|
15
|
-
✓ Aspect N (Name) — no issues
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
### Full format (failing aspect)
|
|
19
|
-
|
|
20
|
-
When an aspect has findings, output a finding block:
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
**Aspect N — Name** [🔴 Blocker / 🟡 Advisory]
|
|
24
|
-
- Finding 1: [description] — [file:line if known]
|
|
25
|
-
- Finding 2: [description] — [file:line if known]
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Use 🔴 for blockers (Changes Requested) and 🟡 for advisories (Approved with Comments).
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## Aspect 1 — Requirements Coverage
|
|
33
|
-
|
|
34
|
-
**Verdict impact:** 🔴 Blocker (if task context provided)
|
|
35
|
-
**N/A condition:** Skip entirely if no task context was provided (Path C in Phase 3). Note: `✓ Aspect 1 (Requirements Coverage) — N/A (no task context)`
|
|
36
|
-
|
|
37
|
-
**Questions to answer:**
|
|
38
|
-
|
|
39
|
-
- Does every requirement stated in the task appear addressed somewhere in the diff?
|
|
40
|
-
- Are there task items explicitly mentioned that are NOT touched by the diff?
|
|
41
|
-
- Does the diff do things clearly NOT in the task (scope creep beyond what was described)?
|
|
42
|
-
- Are acceptance criteria from the task verifiably satisfied by the changes?
|
|
43
|
-
|
|
44
|
-
**Blocker trigger:** Any task requirement present in context but absent from the diff.
|
|
10
|
+
Run these aspects first, in order. Print each result immediately after evaluating.
|
|
45
11
|
|
|
46
12
|
---
|
|
47
13
|
|
|
@@ -49,7 +15,6 @@ Use 🔴 for blockers (Changes Requested) and 🟡 for advisories (Approved with
|
|
|
49
15
|
|
|
50
16
|
**Verdict impact:** 🔴 Blocker
|
|
51
17
|
|
|
52
|
-
**Questions to answer:**
|
|
53
18
|
|
|
54
19
|
- Are there logic errors — wrong comparisons, inverted conditions, incorrect boolean logic?
|
|
55
20
|
- Off-by-one errors in loops, ranges, pagination, indices?
|
|
@@ -67,7 +32,6 @@ Use 🔴 for blockers (Changes Requested) and 🟡 for advisories (Approved with
|
|
|
67
32
|
|
|
68
33
|
**Verdict impact:** 🔴 Blocker
|
|
69
34
|
|
|
70
|
-
**Questions to answer:**
|
|
71
35
|
|
|
72
36
|
- What error paths are not handled? What happens when this function throws or returns an error?
|
|
73
37
|
- What edge cases were not considered: empty input, null input, zero, negative numbers, max-length strings, empty arrays, single-element collections?
|
|
@@ -81,39 +45,27 @@ Use 🔴 for blockers (Changes Requested) and 🟡 for advisories (Approved with
|
|
|
81
45
|
|
|
82
46
|
---
|
|
83
47
|
|
|
84
|
-
## Aspect
|
|
85
|
-
|
|
86
|
-
**Verdict impact:** 🟡 Advisory
|
|
87
|
-
|
|
88
|
-
**Questions to answer:**
|
|
89
|
-
|
|
90
|
-
- Is there a simpler algorithm or data structure that achieves the same result with less complexity?
|
|
91
|
-
- Does a utility or helper already exist in the codebase that could replace this implementation?
|
|
92
|
-
- **ALWAYS use Grep/Glob to verify before suggesting an alternative** — do not recommend something that is already present.
|
|
93
|
-
- Is there a library already imported in the project that handles this case?
|
|
94
|
-
- Is the solution over-engineered for the actual problem size or use case?
|
|
95
|
-
- Is there a more idiomatic way to express this in the language or framework being used?
|
|
96
|
-
|
|
97
|
-
**Advisory trigger:** A clearly better approach exists AND has been verified NOT already present via Grep/Glob.
|
|
98
|
-
|
|
99
|
-
> Rule: Do not suggest an alternative approach without first confirming with Grep/Glob that the pattern doesn't already exist in the codebase. Recommending something that's already there wastes the author's time.
|
|
100
|
-
|
|
101
|
-
---
|
|
48
|
+
## Aspect 7 — Security (quick pass)
|
|
102
49
|
|
|
103
|
-
|
|
50
|
+
**Verdict impact:** 🔴 Blocker for critical issues; 🟡 Advisory for lower severity
|
|
104
51
|
|
|
105
|
-
**Verdict impact:** 🟡 Advisory
|
|
106
52
|
|
|
107
|
-
|
|
53
|
+
- Is user input used in a database query without parameterization or ORM protection?
|
|
54
|
+
- Is there a new endpoint or action without an authentication check?
|
|
55
|
+
- Are secrets, API keys, or credentials hardcoded in the diff?
|
|
56
|
+
- Does a new dependency have known vulnerabilities (note for follow-up if suspected)?
|
|
57
|
+
- Is user input reflected into HTML, SQL, shell commands, or file paths without sanitization?
|
|
58
|
+
- Are there new file upload handlers without type/size validation?
|
|
108
59
|
|
|
109
|
-
|
|
110
|
-
-
|
|
111
|
-
-
|
|
112
|
-
-
|
|
113
|
-
- Is
|
|
114
|
-
-
|
|
60
|
+
**PII leak checks:**
|
|
61
|
+
- Is sensitive data (passwords, tokens, PII: email, phone, SSN, DOB, address) written to logs or debug output?
|
|
62
|
+
- Are real PII values hardcoded in test fixtures, seed files, or example data? (Use fake/generated data instead)
|
|
63
|
+
- Does a new or changed API response return more PII fields than the caller actually needs? (over-exposure)
|
|
64
|
+
- Is PII included in error messages or exception traces returned to clients?
|
|
65
|
+
- Is user-identifiable data embedded in URLs (query params, path segments) that could end up in server logs or browser history?
|
|
115
66
|
|
|
116
|
-
**
|
|
67
|
+
**Blocker trigger:** Critical issues — injection vectors, missing auth, hardcoded secrets, hardcoded real PII in test data, sensitive data in logs, API responses over-exposing PII.
|
|
68
|
+
**Advisory trigger:** Lower-severity observations that don't create an immediate exploit path (e.g., PII in internal error messages, borderline field exposure).
|
|
117
69
|
|
|
118
70
|
---
|
|
119
71
|
|
|
@@ -121,7 +73,6 @@ Use 🔴 for blockers (Changes Requested) and 🟡 for advisories (Approved with
|
|
|
121
73
|
|
|
122
74
|
**Verdict impact:** 🔴 Blocker (if changed behavior has no test coverage)
|
|
123
75
|
|
|
124
|
-
**Questions to answer:**
|
|
125
76
|
|
|
126
77
|
- Is every new behavior or changed behavior covered by at least one test?
|
|
127
78
|
- Are both happy path (success) and unhappy path (failure, error, rejection) tested?
|
|
@@ -135,30 +86,34 @@ Use 🔴 for blockers (Changes Requested) and 🟡 for advisories (Approved with
|
|
|
135
86
|
|
|
136
87
|
---
|
|
137
88
|
|
|
138
|
-
## Aspect
|
|
89
|
+
## Aspect 1 — Requirements Coverage
|
|
139
90
|
|
|
140
|
-
**Verdict impact:** 🔴 Blocker
|
|
91
|
+
**Verdict impact:** 🔴 Blocker (if task context provided)
|
|
92
|
+
**N/A condition:** Skip entirely if no task context was provided (Path C in Phase 3). Note: `✓ Aspect 1 (Requirements Coverage) — N/A (no task context)`
|
|
141
93
|
|
|
142
|
-
**Questions to answer:**
|
|
143
94
|
|
|
144
|
-
-
|
|
145
|
-
-
|
|
146
|
-
-
|
|
147
|
-
-
|
|
148
|
-
- Is user input reflected into HTML, SQL, shell commands, or file paths without sanitization?
|
|
149
|
-
- Are there new file upload handlers without type/size validation?
|
|
95
|
+
- Does every requirement stated in the task appear addressed somewhere in the diff?
|
|
96
|
+
- Are there task items explicitly mentioned that are NOT touched by the diff?
|
|
97
|
+
- Does the diff do things clearly NOT in the task (scope creep beyond what was described)?
|
|
98
|
+
- Are acceptance criteria from the task verifiably satisfied by the changes?
|
|
150
99
|
|
|
151
|
-
**
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
100
|
+
**Blocker trigger:** Any task requirement present in context but absent from the diff.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Aspect 11 — Completeness
|
|
105
|
+
|
|
106
|
+
**Verdict impact:** 🔴 Blocker (if task context provided)
|
|
107
|
+
**N/A condition:** Skip entirely if no task context was provided (Path C in Phase 3). Note: `✓ Aspect 11 (Completeness) — N/A (no task context)`
|
|
157
108
|
|
|
158
|
-
**Blocker trigger:** Critical issues — injection vectors, missing auth, hardcoded secrets, hardcoded real PII in test data, sensitive data in logs, API responses over-exposing PII.
|
|
159
|
-
**Advisory trigger:** Lower-severity observations that don't create an immediate exploit path (e.g., PII in internal error messages, borderline field exposure).
|
|
160
109
|
|
|
161
|
-
|
|
110
|
+
- Is every feature or fix mentioned in the task present in the diff — or is something described as done but missing?
|
|
111
|
+
- Are there TODO/FIXME comments in the diff that should have been resolved before submitting?
|
|
112
|
+
- Has documentation been updated if the change affects public-facing behavior, API contracts, or configuration?
|
|
113
|
+
- Are error messages, log messages, and user-facing text updated to reflect the new behavior?
|
|
114
|
+
- If the task described multiple sub-tasks or acceptance criteria, are all of them addressed?
|
|
115
|
+
|
|
116
|
+
**Blocker trigger:** A described deliverable from the task is absent from the diff. Unresolved TODOs that the task indicates should be complete.
|
|
162
117
|
|
|
163
118
|
---
|
|
164
119
|
|
|
@@ -166,7 +121,6 @@ Use 🔴 for blockers (Changes Requested) and 🟡 for advisories (Approved with
|
|
|
166
121
|
|
|
167
122
|
**Verdict impact:** Always flagged in a dedicated ⚠️ Breaking Changes block — even when the overall verdict is Approved.
|
|
168
123
|
|
|
169
|
-
**Questions to answer:**
|
|
170
124
|
|
|
171
125
|
- Has a public API signature changed (function name, parameter names/types/order, return type)?
|
|
172
126
|
- Has an existing contract or interface been violated (removed fields, renamed fields, changed types)?
|
|
@@ -176,7 +130,51 @@ Use 🔴 for blockers (Changes Requested) and 🟡 for advisories (Approved with
|
|
|
176
130
|
- Do other services, clients, or consumers need to update their code or config to work with this change?
|
|
177
131
|
- Has a publicly exported symbol been removed or renamed?
|
|
178
132
|
|
|
179
|
-
**Output:** Always write a dedicated `### ⚠️ Breaking Changes` block
|
|
133
|
+
**Output:** Always write a dedicated `### ⚠️ Breaking Changes` block immediately after evaluating, even if the overall verdict is Approved. If no breaking changes found, write: `No breaking changes detected.`
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Tier 2 — Advisory
|
|
138
|
+
|
|
139
|
+
Run after the Tier 1 gate. Print each result immediately after evaluating.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Aspect 4 — Better Approach
|
|
144
|
+
|
|
145
|
+
**Verdict impact:** 🟡 Advisory
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
- Is there a simpler algorithm or data structure that achieves the same result with less complexity?
|
|
149
|
+
- Does a utility or helper already exist in the codebase that could replace this implementation?
|
|
150
|
+
- **ALWAYS use Grep/Glob to verify before suggesting an alternative** — do not recommend something that is already present.
|
|
151
|
+
- Is there a library already imported in the project that handles this case?
|
|
152
|
+
- Is the solution over-engineered for the actual problem size or use case?
|
|
153
|
+
- Is there a more idiomatic way to express this in the language or framework being used?
|
|
154
|
+
- **API Design** *(when new HTTP endpoints are detected in the diff)*:
|
|
155
|
+
- HTTP verb appropriate for the operation? (`GET` for reads, `POST` for creates, `PUT`/`PATCH` for updates, `DELETE` for deletes — avoid verbs in URL paths)
|
|
156
|
+
- Status codes semantically correct? (e.g., `201` for resource creation, `204` for no-content, `400` vs `422` for client errors, `404` vs `403` for missing vs forbidden)
|
|
157
|
+
- Resource naming follows conventions? (nouns, plural, lowercase, consistent with existing routes)
|
|
158
|
+
- Pagination design consistent with existing API patterns? (cursor vs offset, same param names)
|
|
159
|
+
- Response schema consistent with existing endpoints? (same envelope structure, error format)
|
|
160
|
+
|
|
161
|
+
**Advisory trigger:** A clearly better approach exists AND has been verified NOT already present via Grep/Glob; or an API design smell is found on a new endpoint.
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Aspect 5 — Redundancy
|
|
166
|
+
|
|
167
|
+
**Verdict impact:** 🟡 Advisory
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
- Is logic copy-pasted from another location in the diff or existing codebase that should be extracted?
|
|
171
|
+
- Does logic from the diff duplicate something that already exists elsewhere? (Verify with Grep/Glob)
|
|
172
|
+
- Is there a utility function already in the codebase that does exactly this?
|
|
173
|
+
- Are variables assigned but never read?
|
|
174
|
+
- Is dead code introduced (unreachable branches, unused imports, unused parameters)?
|
|
175
|
+
- Are there repeated string or numeric literals that should be named constants?
|
|
176
|
+
|
|
177
|
+
**Advisory trigger:** Confirmed duplication or dead code identified in the diff.
|
|
180
178
|
|
|
181
179
|
---
|
|
182
180
|
|
|
@@ -184,7 +182,6 @@ Use 🔴 for blockers (Changes Requested) and 🟡 for advisories (Approved with
|
|
|
184
182
|
|
|
185
183
|
**Verdict impact:** 🟡 Advisory
|
|
186
184
|
|
|
187
|
-
**Questions to answer:**
|
|
188
185
|
|
|
189
186
|
- **Performance:** Does this change have a performance impact at scale? N+1 queries? Unindexed searches on large tables? Unnecessary serialization?
|
|
190
187
|
- **Operational:** Does this change require new environment variables, a specific deployment order, a migration to run first, or infrastructure changes?
|
|
@@ -192,6 +189,12 @@ Use 🔴 for blockers (Changes Requested) and 🟡 for advisories (Approved with
|
|
|
192
189
|
- **Data:** Does this change affect existing records — are there data migrations needed? Could it corrupt or invalidate existing data?
|
|
193
190
|
- **UX:** Does this change alter the behavior that existing users rely on, even if not technically a breaking API change?
|
|
194
191
|
- **Team / Dependencies:** Do other teams, services, or consumers need to be notified of this change? Does it create a hidden coupling?
|
|
192
|
+
- **Dependencies:** *(when new packages or libraries are added to the project)*
|
|
193
|
+
- Is the package necessary, or does an existing utility already cover this use case?
|
|
194
|
+
- Is the license compatible with the project? (e.g., GPL in a commercial product is a risk)
|
|
195
|
+
- Does adding this package introduce a circular dependency?
|
|
196
|
+
- Is the version pinned to a specific range — not floating (`*`, `latest`, or overly broad)?
|
|
197
|
+
- Is the package actively maintained and not abandoned or deprecated?
|
|
195
198
|
|
|
196
199
|
**Advisory trigger:** Any non-trivial implication that the reviewer or author may not have considered.
|
|
197
200
|
|
|
@@ -201,7 +204,6 @@ Use 🔴 for blockers (Changes Requested) and 🟡 for advisories (Approved with
|
|
|
201
204
|
|
|
202
205
|
**Verdict impact:** 🟡 Advisory by default; 🔴 Blocker if a policy in CODING_STANDARDS.md has `required: yes` and it is violated
|
|
203
206
|
|
|
204
|
-
**Questions to answer:**
|
|
205
207
|
|
|
206
208
|
- Are names clear, specific, and consistent with the conventions in CODING_STANDARDS.md?
|
|
207
209
|
- Is the code readable without needing an explanation — would a new team member understand what it does?
|
|
@@ -210,6 +212,7 @@ Use 🔴 for blockers (Changes Requested) and 🟡 for advisories (Approved with
|
|
|
210
212
|
- Feature flags (`required: yes`): is new user-facing code wrapped in a feature flag?
|
|
211
213
|
- Observability (`required: yes`): do new endpoints emit required metrics/traces?
|
|
212
214
|
- i18n (`required: yes`): are there hardcoded user-facing strings?
|
|
215
|
+
- a11y (`required: yes`): do new interactive UI elements have ARIA labels, alt text, and keyboard support?
|
|
213
216
|
- Are there anti-patterns from CODING_STANDARDS.md Section 2.3 present?
|
|
214
217
|
- Is there unnecessary complexity, confusing abstractions, or over-engineering?
|
|
215
218
|
|
|
@@ -218,17 +221,17 @@ Use 🔴 for blockers (Changes Requested) and 🟡 for advisories (Approved with
|
|
|
218
221
|
|
|
219
222
|
---
|
|
220
223
|
|
|
221
|
-
## Aspect
|
|
224
|
+
## Aspect 12 — Architecture & Design
|
|
222
225
|
|
|
223
|
-
**Verdict impact:**
|
|
224
|
-
**N/A condition:** Skip entirely if no task context was provided (Path C in Phase 3). Note: `✓ Aspect 11 (Completeness) — N/A (no task context)`
|
|
226
|
+
**Verdict impact:** 🟡 Advisory
|
|
225
227
|
|
|
226
|
-
**Questions to answer:**
|
|
227
228
|
|
|
228
|
-
-
|
|
229
|
-
- Are
|
|
230
|
-
-
|
|
231
|
-
-
|
|
232
|
-
-
|
|
229
|
+
- **SRP:** Does a new class, module, or component take on multiple unrelated responsibilities that could be split into smaller units?
|
|
230
|
+
- **Dependency Inversion:** Are concrete types hardcoded in places where an abstraction (interface, injected dependency) would decouple the code?
|
|
231
|
+
- **Layering:** Does the diff violate defined architectural layers? (e.g., business logic in a route handler, database calls in a domain model, presentation logic in a service)
|
|
232
|
+
- **Coupling:** Does the change introduce tight coupling between modules that should be independent? (e.g., direct cross-module imports instead of going through a defined interface or service boundary)
|
|
233
|
+
- **Circular dependencies:** Does a new import create or extend a module cycle?
|
|
234
|
+
- **Feature / domain boundaries:** Does the change import directly across feature or domain boundaries, bypassing defined service or facade layers?
|
|
235
|
+
- **File placement:** Are new files placed in the correct directory per the project's established conventions?
|
|
233
236
|
|
|
234
|
-
**
|
|
237
|
+
**Advisory trigger:** Any architectural smell detectable from reading the diff — layering violation, SRP breach, tight coupling, or boundary bypass.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Stack: Apex — Additional Review Checks
|
|
2
|
+
|
|
3
|
+
Injected when `.cls`, `.trigger`, or `.apex` files are detected in the diff
|
|
4
|
+
(or `tech_stack: apex` declared). Standalone preset — Apex is not a sub-framework.
|
|
5
|
+
Apply these checks IN ADDITION TO the universal checklist items.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Aspect 2 — Correctness (additional)
|
|
10
|
+
|
|
11
|
+
- SOQL or DML inside a `for` loop — governor limit violation (max 100 SOQL / 150 DML per transaction); bulkify by collecting IDs first, then query/DML outside the loop.
|
|
12
|
+
- `Database.query()` built via string concatenation of user-controlled input — dynamic SOQL without bind variables; use `:variable` bind syntax instead.
|
|
13
|
+
- Trigger logic written assuming `Trigger.new.size() == 1` — single-record assumption breaks bulk operations from data loads or API calls; process via collections.
|
|
14
|
+
- Test class missing `Test.startTest()` / `Test.stopTest()` around async operations (`@future`, `Queueable`, `Batch`) — async code does not execute, assertions run before results are available.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Aspect 3 — Possible Breakage (additional)
|
|
19
|
+
|
|
20
|
+
- Trigger without operation guards (`if (Trigger.isBefore && Trigger.isInsert)`) — runs on unintended DML events; add explicit event checks.
|
|
21
|
+
- Hard-coded record type IDs, custom setting values, or user IDs — values differ between orgs and sandboxes; query at runtime or use Custom Metadata.
|
|
22
|
+
- Missing `try/catch` around HTTP callouts — unhandled `CalloutException` rolls back the entire transaction and can corrupt partially-completed DML.
|
|
23
|
+
- HTTP (non-HTTPS) endpoint in `HttpRequest.setEndpoint()` or a Named Credential — TLS not enforced; AppExchange auto-fail; all external endpoints must use HTTPS with TLS 1.2+.
|
|
24
|
+
- Sensitive tokens or API keys passed as URL query parameters in callouts — values are logged in Salesforce debug logs and external server access logs; pass secrets in `Authorization` headers instead.
|
|
25
|
+
- Recursive trigger without a static boolean guard — an update inside a trigger re-fires the same trigger; add a static `alreadyRunning` flag to break the cycle.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Aspect 7 — Security (additional)
|
|
30
|
+
|
|
31
|
+
- Apex class missing explicit `with sharing` or `without sharing` declaration — sharing rules silently not enforced in ambiguous contexts; always declare intent.
|
|
32
|
+
- Dynamic SOQL string built from user-supplied input without bind variables — SOQL injection; use `String.escapeSingleQuotes()` at minimum, prefer bind variables.
|
|
33
|
+
- Field-level security (FLS) not checked before reading or writing sensitive fields — bypasses org permission model; use `Schema.SObjectField.getDescribe().isAccessible()` or `Security.stripInaccessible()`.
|
|
34
|
+
- Credentials, tokens, or secrets hardcoded in Apex — use Named Credentials or Protected Custom Metadata instead.
|
|
35
|
+
- CRUD permission not checked before DML — `SObjectType.isCreateable()` / `isUpdateable()` / `isDeletable()` not called before insert/update/delete; distinct from FLS and an AppExchange security review auto-fail.
|
|
36
|
+
- `without sharing` on a class that exposes `@AuraEnabled` or `@RestResource` methods — external callers (LWC, REST clients) bypass record-sharing rules; gateway classes must use `with sharing`.
|
|
37
|
+
- Hardcoded profile API names, permission set names, or role names used for access gating — subscriber orgs have different names; use Custom Permissions and `FeatureManagement.checkPermission()` instead.
|
|
38
|
+
- SOQL query missing `WITH SECURITY_ENFORCED` or `AccessLevel.USER_MODE` — these enforce CRUD+FLS in a single clause without manual field enumeration; preferred modern pattern alongside `Security.stripInaccessible()`.
|
|
39
|
+
- Sensitive data (API keys, credentials, tokens) stored in non-Protected Custom Settings or Custom Metadata — set visibility to "Protected"; implement a null getter and `transient private` variable so stored values are never echoed back to the UI.
|
|
40
|
+
- `e.getMessage()` or full exception detail surfaced directly to the UI (page message, JSON response) — leaks internal stack traces and file paths; log details server-side via `System.debug()`, return a generic message to the caller.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Aspect 10 — Code Quality (additional)
|
|
45
|
+
|
|
46
|
+
- Test methods with no `System.assert*` calls — phantom coverage; the method passes but validates nothing.
|
|
47
|
+
- `@isTest(SeeAllData=true)` on test class — breaks data isolation; tests depend on unpredictable org state; create test data explicitly.
|
|
48
|
+
- `System.debug()` calls left in production code paths — log bloat and potential PII leakage in debug logs; remove or guard with a log level check.
|
|
49
|
+
- Business logic scattered across multiple trigger files for the same object — centralise in a single trigger + handler class pattern per object.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Stack: Aura (Lightning Components) — Additional Review Checks
|
|
2
|
+
|
|
3
|
+
Injected when `.cmp`, `.app`, `.evt`, or `.intf` files are detected in the diff
|
|
4
|
+
(or `tech_stack: aura` declared). Standalone — does NOT depend on the `lwc` preset.
|
|
5
|
+
Apply these checks IN ADDITION TO the universal checklist items.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Aspect 2 — Correctness (additional)
|
|
10
|
+
|
|
11
|
+
- `component.get("v.attribute")` result used without a null check before property access — attribute may be unset or conditionally rendered; guard before chaining.
|
|
12
|
+
- Async server action callback code running outside `$A.getCallback()` — Aura framework execution context is lost in async scope; wrap all async callbacks with `$A.getCallback(function() { ... })`.
|
|
13
|
+
- `component.find("aura:id")` used without null check — returns `undefined` when the target element is inside an `aura:if` block that is currently `false`.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Aspect 3 — Possible Breakage (additional)
|
|
18
|
+
|
|
19
|
+
- Method called on a child component reference obtained via `component.find()` where the child uses `aura:if` — reference is `null` when condition is `false`; check before calling.
|
|
20
|
+
- `$A.enqueueAction` called inside a loop or rapid-fire event handler — queues one server request per iteration; batch records client-side first, then make a single server call.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Aspect 7 — Security (additional)
|
|
25
|
+
|
|
26
|
+
- `{!v.attribute}` bound to the `value` attribute of `aura:html` when the attribute contains user-supplied content — XSS; use `aura:text` for plain text or apply `{!HTMLENCODE(v.attribute)}`.
|
|
27
|
+
- `@AuraEnabled` Apex method on a class without explicit `with sharing` — sharing rules silently bypassed for the calling user context.
|
|
28
|
+
- External JS loaded via `<script src="https://...">` instead of a Static Resource + `ltng:require` — AppExchange auto-fail; external scripts can be compromised after the security review without Salesforce's knowledge.
|
|
29
|
+
- Third-party library bundled in a Static Resource with known CVEs (jQuery, Bootstrap, etc.) — run RetireJS or Snyk before submission; outdated JS libraries are the #2 most common AppExchange SR failure.
|
|
30
|
+
- CSS loaded via `<link href="...">` tag instead of `<ltng:require>` with a Static Resource — improper CSS load, flagged as a violation in the AppExchange security review.
|
|
31
|
+
- `LightningMessageChannel` component with `isExposed: true` — exposes the LMS channel API to all installed orgs; set to `false` unless cross-cloud communication is explicitly required and documented.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Aspect 10 — Code Quality (additional)
|
|
36
|
+
|
|
37
|
+
- Business logic (calculations, record manipulation, conditional rules) placed in the Aura client-side controller JS — move to Apex `@AuraEnabled` methods; JS controllers should only handle UI events and call server actions.
|
|
38
|
+
- Aura component duplicates functionality now available in a standard LWC base component (`lightning-datatable`, `lightning-record-form`, etc.) — flag as migration candidate.
|
|
39
|
+
- `console.log()` calls logging user or record data in the Aura controller — leaks PII in browser DevTools console; remove before production.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Stack: CakePHP — Additional Review Checks
|
|
2
|
+
|
|
3
|
+
Injected IN ADDITION to `php` preset when CakePHP signals are detected:
|
|
4
|
+
- `src/Controller/` paths in the diff
|
|
5
|
+
- `config/routes.php` in the diff
|
|
6
|
+
- `"cakephp/cakephp"` in `composer.json`
|
|
7
|
+
|
|
8
|
+
Contains CakePHP-specific checks only — PHP-level checks are in `php.md`.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Aspect 2 — Correctness (additional)
|
|
13
|
+
|
|
14
|
+
- `$this->request->getData()` used directly without going through Form validation — raw POST data bypasses CakePHP's validation rules; always validate through a Form or Table's `newEntity()` / `patchEntity()`.
|
|
15
|
+
- `Table::get($id)` without try/catch — throws `RecordNotFoundException` when the record does not exist; use `->find()->where()->first()` with a null check, or catch the exception.
|
|
16
|
+
- N+1: associations accessed in a loop without `contain()` — `foreach ($articles as $a) { $a->user->name; }` fires N+1 queries. Use `->contain(['Users'])` in the finder.
|
|
17
|
+
- Missing `$this->loadComponent('Security')` on controllers handling form submissions — CSRF token validation not active.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Aspect 3 — Possible Breakage (additional)
|
|
22
|
+
|
|
23
|
+
- Missing `$this->dbConnection->begin()` / `commit()` / `rollback()` around multi-table writes — partial failure leaves data inconsistent; wrap in a transaction.
|
|
24
|
+
- Shell / Command class doing heavy work without progress tracking — long-running CakePHP Console commands should use `$this->io->progressStart()` and handle signals (`SIGTERM`) for graceful shutdown.
|
|
25
|
+
- Missing `allowMethod()` in controller actions that should only accept POST/PUT — action accessible via GET, enabling CSRF bypass or unintended state changes.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Aspect 7 — Security (additional)
|
|
30
|
+
|
|
31
|
+
- Raw query via `$connection->execute()` with string interpolation — SQL injection. Use `->execute($sql, $params)` with bound parameters.
|
|
32
|
+
- `$this->request->getData()` values passed to `Table::query()` or `->where()` without allowlist — column/value injection risk.
|
|
33
|
+
- Missing `$this->Security->requireSecure()` on actions handling sensitive data — ensures HTTPS is enforced.
|
|
34
|
+
- `HtmlHelper::scriptBlock()` / `HtmlHelper::tag()` with user content and no escaping — XSS; pass `['escape' => true]` or pre-escape values.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Aspect 10 — Code Quality (additional)
|
|
39
|
+
|
|
40
|
+
- Fat controller: complex query building, business rules, or multi-model operations directly in controller actions — extract to Table finders, Behaviors, or Service classes.
|
|
41
|
+
- Direct `TableRegistry::getTableLocator()->get()` deep in domain code — use dependency injection via constructor or `$this->fetchTable()` for testability.
|
|
42
|
+
- Missing validation rules in Table `validationDefault()` for new fields — new columns without validation are silently accepted with any value.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Aspect 12 — Architecture & Design (additional)
|
|
47
|
+
|
|
48
|
+
- Business logic in View templates — CakePHP Views should only format and display data; move logic to Cells, Helpers, or ViewBuilder.
|
|
49
|
+
- Behavior added to a Table without checking for method/event conflicts with existing behaviors — Behaviors share the Table's event system; duplicate event names cause silent overwrites.
|
|
50
|
+
- Direct cross-plugin model access without going through the plugin's public API — creates tight inter-plugin coupling; access other plugins via their exposed service or facade.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Stack: Django — Additional Review Checks
|
|
2
|
+
|
|
3
|
+
Injected INTO ADDITION to `python` preset when Django path signals are detected in the diff
|
|
4
|
+
(views.py, models.py, urls.py, serializers.py, migrations/, or `tech_stack: django` declared).
|
|
5
|
+
Contains Django-specific checks only — Python-level checks are in `python.md`.
|
|
6
|
+
Apply these checks IN ADDITION TO the universal checklist items and `python.md` checks.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Aspect 2 — Correctness (additional)
|
|
11
|
+
|
|
12
|
+
- `Model.objects.get()` without `try/except ObjectDoesNotExist` (or `DoesNotExist`) — raises an unhandled exception when no record matches. Use `.filter().first()` or catch the exception explicitly.
|
|
13
|
+
- N+1 query: accessing a ForeignKey or ManyToMany field inside a loop without `select_related` / `prefetch_related` — each iteration fires an extra SQL query. Verify with Django Debug Toolbar or query logging.
|
|
14
|
+
- QuerySet evaluated multiple times — `qs = Model.objects.all(); count = len(qs); for obj in qs:` re-evaluates the query. Cache with `list(qs)` or use `.count()` for counting.
|
|
15
|
+
- `update()` or `bulk_create()` bypass model `save()` signals and validators — ensure this is intentional and explicitly documented.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Aspect 3 — Possible Breakage (additional)
|
|
20
|
+
|
|
21
|
+
- FK or reverse relation accessed in a loop without `select_related`/`prefetch_related` — silent N+1 that passes in tests but degrades under load.
|
|
22
|
+
- `FileField`/`ImageField` upload handler without file size and MIME type validation — DoS via large uploads or unexpected file types.
|
|
23
|
+
- Unguarded `Model.objects.all().delete()` or bulk delete without a `WHERE` clause — accidental full-table wipe.
|
|
24
|
+
- Missing database migration after model field changes — `makemigrations` was not run; deployment will fail or data integrity breaks.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Aspect 7 — Security (additional)
|
|
29
|
+
|
|
30
|
+
- Raw SQL with string formatting — `Model.objects.raw(f"SELECT * FROM app_model WHERE id={id}")` or `cursor.execute("... WHERE id=" + str(id))` — SQL injection. Use `%s` parameters: `cursor.execute("... WHERE id=%s", [id])`.
|
|
31
|
+
- Missing `@login_required` / `LoginRequiredMixin` / `PermissionRequiredMixin` on views that should be authenticated.
|
|
32
|
+
- `@csrf_exempt` without a justification comment — CSRF protection disabled without documented reason.
|
|
33
|
+
- `mark_safe()` applied to user-generated content — XSS vector. Only use `mark_safe()` on strings you fully control.
|
|
34
|
+
- `DEBUG = True` in a settings file that is not clearly dev-only — exposes stack traces and internal config to users.
|
|
35
|
+
- `ALLOWED_HOSTS = ['*']` in non-dev settings — allows HTTP Host header injection.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Aspect 10 — Code Quality (additional)
|
|
40
|
+
|
|
41
|
+
- Fat view: business logic (calculations, external API calls, complex conditionals) directly in a view function/class — move to model methods, managers, or a service/use-case layer.
|
|
42
|
+
- `request.POST['key']` accessed directly without form validation — use Django Forms or DRF Serializers to validate and sanitize input at the boundary.
|
|
43
|
+
- Model class missing `__str__` — Django admin and shell repr become meaningless.
|
|
44
|
+
- `CharField`/`TextField` without `max_length` (or without justification for `TextField`) — missing constraint documentation.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Aspect 12 — Architecture & Design (additional)
|
|
49
|
+
|
|
50
|
+
- Business logic in views instead of model methods, managers, or a service layer — Django's "fat models, thin views" convention; for larger apps, extract to a service/use-case layer.
|
|
51
|
+
- Direct cross-app model imports bypassing a defined service boundary — tight coupling between apps; consider using signals, service functions, or an API contract between apps.
|
|
52
|
+
- Django Signals used for synchronous, in-request business logic — signals make control flow hard to trace, test, and debug; reserve for genuinely decoupled, post-action side effects.
|
|
53
|
+
- Missing `Meta.indexes` on fields used frequently in `.filter()`, `.order_by()`, or JOIN conditions — becomes a performance bottleneck as data grows.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Stack: .NET — Additional Review Checks
|
|
2
|
+
|
|
3
|
+
Injected into Phase 4 aspects when `tech_stack: dotnet` is declared in `docs/REVIEW_STANDARDS.md`.
|
|
4
|
+
Apply these checks IN ADDITION TO the universal checklist items for each aspect.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Aspect 2 — Correctness (additional)
|
|
9
|
+
|
|
10
|
+
- `async void` method — always wrong outside event handlers; swallows exceptions silently. Use `async Task`.
|
|
11
|
+
- `Task.Result` or `.Wait()` on async code in a synchronous context — deadlock risk in ASP.NET/WPF sync contexts. Use `await` or `ConfigureAwait(false)`.
|
|
12
|
+
- `==` / `!=` on non-primitive reference types — may compare references, not values. Verify `.Equals()` override or pattern matching is appropriate.
|
|
13
|
+
- Unchecked arithmetic in financial/measurement code — use `checked { }` or `decimal` for precision-sensitive ops.
|
|
14
|
+
- Struct mutability via method call on a copy (value semantics trap).
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Aspect 3 — Possible Breakage (additional)
|
|
19
|
+
|
|
20
|
+
- `IDisposable` not wrapped in `using` / `using var` — file handles, DB connections, `HttpClient`, `Stream`, `DbContext` must always be disposed.
|
|
21
|
+
- `CancellationToken` not propagated through async call chains — callers pass tokens that are silently dropped.
|
|
22
|
+
- `ThreadAbortException` catch blocks — no-op in .NET 5+; code relying on it will never trigger.
|
|
23
|
+
- Nullable reference types (NRT) warnings suppressed with `!` (null-forgiving operator) without verification.
|
|
24
|
+
- `Task` returned from `async` method not `await`-ed by caller — fire-and-forget without intent.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Aspect 7 — Security (additional)
|
|
29
|
+
|
|
30
|
+
- `FromSqlRaw` / `ExecuteSqlRaw` in EF Core with string interpolation or concatenation — SQL injection. Use `FromSqlInterpolated` or `SqlParameter`.
|
|
31
|
+
- Missing `[ValidateAntiForgeryToken]` on state-changing MVC POST actions.
|
|
32
|
+
- `[AllowAnonymous]` added without explicit review comment justifying it.
|
|
33
|
+
- Hardcoded connection strings or secrets — must use environment variables or secrets manager.
|
|
34
|
+
- `JsonSerializer` / `XmlSerializer` deserializing untrusted input without size limits — DoS via large payloads.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Aspect 10 — Code Quality (additional)
|
|
39
|
+
|
|
40
|
+
- `var` hiding non-obvious types (e.g., `var result = service.DoThing()` — what type is `result`?). Only acceptable when type is evident from the right-hand side.
|
|
41
|
+
- `dynamic` usage without justification comment.
|
|
42
|
+
- Controller action methods containing business logic — should delegate to services.
|
|
43
|
+
- `string.Format` / concatenation where interpolation or `StringBuilder` is cleaner.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Aspect 12 — Architecture & Design (additional)
|
|
48
|
+
|
|
49
|
+
- Captive dependency: scoped or transient service injected into a singleton — lifetime mismatch causes state corruption.
|
|
50
|
+
- Business logic in EF Core entity classes — entities should be data containers; logic belongs in domain/service layer.
|
|
51
|
+
- Direct `DbContext` usage in controllers bypassing repository or service layer.
|
|
52
|
+
- `static` state in ASP.NET components — not thread-safe under concurrent requests.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Stack: Expo — Additional Review Checks
|
|
2
|
+
|
|
3
|
+
Injected IN ADDITION to `reactnative` preset when Expo signals are detected:
|
|
4
|
+
- `expo` dependency in `package.json`
|
|
5
|
+
- `app.json` / `app.config.js` / `app.config.ts` in the diff
|
|
6
|
+
- `expo-*` package imports
|
|
7
|
+
|
|
8
|
+
Contains Expo-specific checks only. All React Native and React checks also apply.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Aspect 2 — Correctness (additional)
|
|
13
|
+
|
|
14
|
+
- Expo SDK API used that is deprecated or removed in the declared `sdkVersion` — check the Expo changelog; silent runtime failures or missing modules after upgrade.
|
|
15
|
+
- `expo-camera`, `expo-location`, `expo-contacts` etc. used without requesting permissions first — crashes or returns null on first use without the permission request flow.
|
|
16
|
+
- `expo-notifications` `addNotificationReceivedListener` / `addNotificationResponseReceivedListener` called without storing the subscription for removal.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Aspect 3 — Possible Breakage (additional)
|
|
21
|
+
|
|
22
|
+
- OTA update (EAS Update) pushing JS changes that depend on a new native module not yet in the installed binary — managed workflow OTA cannot add native code; requires a new app store build. Changes to `app.json` plugins, new `expo-*` packages with native code, or `expo-modules-core` usage require a full build.
|
|
23
|
+
- `expo-file-system` paths hardcoded as absolute — file system paths differ between simulators, devices, and OS versions; always use `FileSystem.documentDirectory` or `FileSystem.cacheDirectory` as a base.
|
|
24
|
+
- `Constants.manifest` / `Constants.expoConfig` accessed in bare workflow without checking for null — returns null in bare workflow outside Expo Go.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Aspect 7 — Security (additional)
|
|
29
|
+
|
|
30
|
+
- Secrets placed in `app.json` `extra` field or `app.config.js` `extra` — the `extra` block is embedded in the app manifest, which is readable from the installed app. Use EAS Secrets or server-side env vars for sensitive values.
|
|
31
|
+
- `EXPO_PUBLIC_` prefixed environment variables — like `NEXT_PUBLIC_`, these are bundled into the JS and visible to anyone who extracts the app bundle. Never use this prefix for secrets.
|
|
32
|
+
- `expo-web-browser` `openAuthSessionAsync` redirect URL not validated — open redirect if the callback URL is user-controlled.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Aspect 9 — Implication Assessment (additional)
|
|
37
|
+
|
|
38
|
+
- Adding a new `expo-*` plugin with native code while in managed workflow — requires a new EAS build and app store submission; cannot be delivered via OTA update. Flag this explicitly as a deployment implication.
|
|
39
|
+
- `expo-updates` `checkForUpdateAsync` / `fetchUpdateAsync` called on every app launch without a rollback strategy — a bad OTA update can brick the app for all users; ensure a rollback or forced update mechanism is in place.
|