Skip to content

fix(helm): resolve PV schema mismatch for EFS#41696

Open
Arbab1308 wants to merge 25 commits intoappsmithorg:releasefrom
Arbab1308:fix/helm-efs-pv-schema
Open

fix(helm): resolve PV schema mismatch for EFS#41696
Arbab1308 wants to merge 25 commits intoappsmithorg:releasefrom
Arbab1308:fix/helm-efs-pv-schema

Conversation

@Arbab1308
Copy link
Copy Markdown

@Arbab1308 Arbab1308 commented Apr 3, 2026

TL;DR: This PR resolves a Kubernetes schema validation error occurring during Appsmith deployments on EKS when EFS is enabled. It removes an incorrectly nested nfs field within the csi block of the PersistentVolume template.

Motivation and Context:
When persistence.efs.enabled is set to true, the current Helm chart attempts to define an nfs block inside the csi configuration. According to the Kubernetes v1.PersistentVolume specification, the csi source does not support a nested nfs field. This causes the EKS API server to reject the resource with the error: failed to create typed patch object: .spec.csi.nfs: field not declared in schema.

Changes:

Removed the redundant nfs: key from deploy/helm/templates/persistentVolume.yaml.

Ensured the csi block correctly identifies the driver and volumeHandle as top-level properties of the CSI spec.

Added quoting to values to ensure string safety during template rendering.

Fixes #38947

Automation
/ok-to-test tags="helm, eks, efs"

🔍 Cypress test results
[!CAUTION]

If you modify the content in this section, you are likely to disrupt the CI result for your PR.

Communication
Should the DevRel and Marketing teams inform users about this change?

[x] Yes (This unblocks AWS EFS users who were previously unable to install the chart).

[ ] No

Summary by CodeRabbit

Release Notes

  • Bug Fixes

    • iOS currency and numeric input fields now correctly trigger the numeric keypad instead of the full keyboard on Safari.
  • New Features

    • Helm chart now supports multiple storage backends (EFS, NFS, EBS, GCP, local) with enhanced validation and improved metadata for Kubernetes compliance.
  • Documentation

    • Added comprehensive iOS testing guide and Helm configuration documentation.

Arbab1308 added 25 commits April 4, 2026 01:32
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Apr 3, 2026

Walkthrough

Documentation and configuration updates adding iOS numeric keypad support through the HTML inputmode attribute, fixing invalid Kubernetes PersistentVolume CSI schema in Helm charts, and standardizing metadata labels/annotations across Helm templates.

Changes

Cohort / File(s) Summary
iOS Numeric Keypad Documentation
IOS_NUMERIC_KEYPAD_ANALYSIS.md, IOS_NUMERIC_KEYPAD_IMPLEMENTATION.md, IOS_EXTENDED_WIDGET_SUPPORT.md, IOS_TESTING_GUIDE.md
Analysis, implementation plan, extension guide, and comprehensive testing framework for iOS numeric keypad fix via inputmode attribute.
iOS Widget Implementation
app/client/src/widgets/BaseInputWidget/constants.ts, app/client/src/widgets/BaseInputWidget/component/index.tsx, app/client/src/widgets/CurrencyInputWidget/component/index.tsx
New InputMode enum; getInputMode() method mapping input types to HTML5 inputmode values; CurrencyInputWidget now passes inputHTMLType="NUMBER".
Helm PersistentVolume & Claim
deploy/helm/templates/persistentVolume.yaml, deploy/helm/templates/persistentVolumeClaim.yaml
Fixed invalid csi.nfs schema in PersistentVolume by removing nested NFS field; added validation logic for persistence configuration; expanded storage backend support (EFS, NFS, EBS, GCP); updated metadata with standard labels and Velero backup annotations.
Helm Metadata & Labels
deploy/helm/templates/configMap.yaml, deploy/helm/templates/deployment.yaml, deploy/helm/templates/service.yaml, deploy/helm/templates/serviceaccount.yaml
Added Kubernetes standard labels (app.kubernetes.io/*), inline documentation comments, description annotations, session affinity config (service), and RBAC aggregation controls (service account).
Documentation & Verification
HELM_IMPROVEMENTS.md, PR_VERIFICATION_REPORT.md
Comprehensive documentation of Helm chart improvements, storage backend support, validation enhancements, and Kubernetes schema compliance verification.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🎧 Input modes unlock the keypad's might,
Charts now render schemas clean and right,
Labels shine with Kubernetes grace,
Helm's templates find their rightful place,
iOS users type with pure delight ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Out of Scope Changes check ❓ Inconclusive While the PR includes extensive documentation files and template enhancements (labels, annotations, validation, multi-backend support), these exceed the stated scope of fixing the EFS schema issue. However, they align with the broader #38947 objective of ensuring valid, stable manifests. Clarify whether the documentation files and template enhancements (deployment.yaml comments, labels, validation checks, multi-backend support) are intentional parts of issue #38947 or should be split into a separate PR.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: fixing a PersistentVolume schema mismatch for EFS by removing the invalid nfs field from the csi block.
Description check ✅ Passed The description includes TL;DR, motivation, context, specific changes, issue reference (#38947), automation tags, and DevRel/Marketing notification checkbox—meeting all template requirements.
Linked Issues check ✅ Passed The PR successfully addresses the primary objective from issue #38947: removing the invalid nfs field from spec.csi in persistentVolume.yaml to conform to Kubernetes v1 schema. The csi block now correctly contains only driver and volumeHandle as top-level properties.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Warning

⚠️ This pull request might be slop. It has been flagged by CodeRabbit slop detection and should be reviewed carefully.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Nitpick comments (8)
app/client/src/widgets/BaseInputWidget/component/index.tsx (1)

503-523: Consider using the InputMode enum from constants.

The InputMode enum was added in constants.ts but isn't used here. The method returns string literals directly, creating a disconnect.

♻️ Proposed refactor to use enum
+import { InputTypes, InputMode } from "../constants";
-import { InputTypes } from "../constants";

 getInputMode(inputType: InputHTMLType = "TEXT"): string | undefined {
   switch (inputType) {
     case "NUMBER":
-      return "decimal";
+      return InputMode.DECIMAL;
     case "TEL":
-      return "tel";
+      return InputMode.TEL;
     case "EMAIL":
-      return "email";
+      return InputMode.EMAIL;
     default:
       return undefined;
   }
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/client/src/widgets/BaseInputWidget/component/index.tsx` around lines 503
- 523, The getInputMode method returns raw string literals instead of using the
shared InputMode enum; update getInputMode (in
BaseInputWidget/component/index.tsx) to import InputMode from constants.ts,
change the return type to InputMode | undefined, and return the enum values
(e.g., InputMode.Decimal, InputMode.Tel, InputMode.Email) in the corresponding
cases for "NUMBER", "TEL", and "EMAIL" while leaving the default as undefined so
callers use the centralized enum instead of string literals.
IOS_NUMERIC_KEYPAD_ANALYSIS.md (1)

34-40: Code block language specifier missing.

Add ```tsx instead of bare ``` for syntax highlighting.

📝 Example fix
-```
+```tsx
 // Current: CurrencyInputComponent passes inputHTMLType="NUMBER" to BaseInputComponent
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@IOS_NUMERIC_KEYPAD_ANALYSIS.md` around lines 34 - 40, The markdown code block
in IOS_NUMERIC_KEYPAD_ANALYSIS.md is missing a language specifier, so update the
fenced code block that shows CurrencyInputComponent and BaseInputComponent (the
block containing "CurrencyInputComponent passes inputHTMLType=\"NUMBER\" to
BaseInputComponent" and the lines with inputHTMLType and BaseInputComponent)
from ``` to ```tsx to enable TypeScript/TSX syntax highlighting; keep the
existing content unchanged, only modify the opening fence to ```tsx.
app/client/src/widgets/BaseInputWidget/constants.ts (1)

16-37: Well-documented enum, but currently unused.

The InputMode enum is properly defined with good documentation. However, as noted in BaseInputWidget/component/index.tsx, the getInputMode() method uses string literals instead of this enum. Consider either using the enum or removing it if not needed.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/client/src/widgets/BaseInputWidget/constants.ts` around lines 16 - 37,
The InputMode enum in constants.ts is defined but not used; update
BaseInputWidget/component/index.tsx's getInputMode() to import and return
InputMode enum members instead of string literals (e.g., use InputMode.NUMERIC,
DECIMAL, TEL, EMAIL, TEXT, SEARCH, URL) and adjust any type annotations to
expect InputMode where appropriate; alternatively remove the unused InputMode
enum from constants.ts if you decide to keep string literals—prefer using the
enum for consistency and type safety.
IOS_NUMERIC_KEYPAD_IMPLEMENTATION.md (1)

186-215: Add language specifiers to fenced code blocks.

Multiple code blocks lack language specifiers, flagged by markdownlint. Add appropriate language hints (e.g., ```text or ```shell) for consistency.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@IOS_NUMERIC_KEYPAD_IMPLEMENTATION.md` around lines 186 - 215, Update the
fenced code blocks in IOS_NUMERIC_KEYPAD_IMPLEMENTATION.md (the commit blocks
referencing hashes 58c0bc3ee5, 8a9e7e7966, f74f2fa8de, a87017ecf4 and the
embedded diffs for constants.ts, component/index.tsx, and
CurrencyInputWidget/component/index.tsx) to include explicit language
specifiers: use ```text for commit messages and human-readable lines, ```diff or
```patch for the diff blocks, and ```tsx or ```ts for the TypeScript/TSX
snippets so markdownlint warnings are resolved and syntax highlighting is
accurate.
IOS_TESTING_GUIDE.md (1)

6-19: Add language specifier to code block.

The bash code block starting at line 6 should have ```bash for proper highlighting. Also, the content mixes shell commands with YAML-like bullet formatting.

📝 Suggested format
-```bash
-# Required software:
-- Xcode 13.0+ (for iOS simulator)
+```text
+Required software:
+- Xcode 13.0+ (for iOS simulator)
 - iOS Simulator: 13.x, 14.x, 15.x, 16.x
+```

+```bash
+# Run Appsmith development server:
 cd app/client
 npm run dev
+```
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@IOS_TESTING_GUIDE.md` around lines 6 - 19, The fenced code block containing
the "Required software" list and commands should be split into two properly
labeled blocks: convert the software list block to a plain text/code block
(change the opening fence to ```text) so the hyphenated bullets render as plain
content, and convert the commands block to a bash block (change its opening
fence to ```bash) for proper shell highlighting; update the fences around the
"Required software" section and the "Run Appsmith development server" commands
accordingly so each block has the correct language specifier and nothing else in
the combined fence.
HELM_IMPROVEMENTS.md (1)

6-10: Strip PR-state metadata out of the checked-in doc.

Branch names, commit counts, author/date, and “Ready for Merge” status will be stale as soon as this lands. If this file is meant to stay in the repo, keep only durable chart behavior/configuration and move PR tracking to the PR body.

Also applies to: 220-264

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@HELM_IMPROVEMENTS.md` around lines 6 - 10, Remove transient PR-state metadata
from the checked-in document: delete fields like "Branch", "Status", "Total
Commits", "Files Modified" (the PR-tracking block shown at the top) and any
similar block later in the file (the section around lines 220-264), and retain
only durable chart behavior/configuration content and examples; move any
PR-specific notes or tracking (branch name, commit counts, merge readiness) into
the PR description instead so the committed HELM_IMPROVEMENTS.md contains only
stable, maintainable documentation.
PR_VERIFICATION_REPORT.md (1)

1-245: Move this verification report out of the repository.

This reads like a PR artifact rather than durable chart documentation: it bakes in commit history, merge state, and point-in-time verification claims. Please keep it in the PR or CI artifacts instead of versioning it with the chart.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@PR_VERIFICATION_REPORT.md` around lines 1 - 245, The PR verification report
file (PR_VERIFICATION_REPORT.md) is an ephemeral artifact and should not be
committed to the chart; remove the file from the commit (delete
PR_VERIFICATION_REPORT.md), ensure no other verification artifacts are
committed, and add a rule to exclude such reports (e.g., add
PR_VERIFICATION_REPORT.md or a /reports/ pattern) from version control by
updating .gitignore so future CI/PR artifacts aren’t accidentally checked in; if
needed, move the report to your PR description or CI artifact storage instead.
deploy/helm/templates/serviceaccount.yaml (1)

17-19: Remove the RBAC aggregation labels from the ServiceAccount.

These rbac.authorization.k8s.io/aggregate-to-* labels are only meaningful on aggregated ClusterRole resources, not ServiceAccount objects. They serve no purpose here and mislead operators about actual granted permissions.

💡 Minimal fix
   annotations:
     description: "ServiceAccount for Appsmith pod authentication and authorization"
-    rbac.authorization.k8s.io/aggregate-to-edit: "true"
-    rbac.authorization.k8s.io/aggregate-to-view: "false"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@deploy/helm/templates/serviceaccount.yaml` around lines 17 - 19, The
ServiceAccount manifest currently includes labels
rbac.authorization.k8s.io/aggregate-to-edit and
rbac.authorization.k8s.io/aggregate-to-view which are only valid/meaningful on
ClusterRole resources; remove these two labels from the ServiceAccount
definition in templates/serviceaccount.yaml so the ServiceAccount (the resource
in that file) no longer contains aggregate-to-* labels that mislead operators
about permissions.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@deploy/helm/templates/persistentVolume.yaml`:
- Around line 42-45: The PersistentVolume manifest incorrectly sets
metadata.namespace (the line using {{ .Release.Namespace | quote }}), which is
invalid because PersistentVolume is cluster-scoped; remove the namespace field
from the metadata block in deploy/helm/templates/persistentVolume.yaml so only
name and labels remain (keep the existing name template include
"appsmith.pvName" and labels intact).
- Around line 11-39: The template dereferences .Values.persistence submaps
directly and can nil-pointer when a provider map is missing, it also renders
metadata.namespace on a cluster-scoped PersistentVolume and may emit multiple
volume sources at once; fix by adding existence guards (e.g., if
.Values.persistence and if .Values.persistence.nfs / .Values.persistence.ebs /
.Values.persistence.gcp / .Values.persistence.backup /
.Values.persistence.retention) before accessing subkeys, remove rendering of
metadata.namespace in persistentVolume.yaml, and make the volume-source blocks
exclusive (use a single if/elif chain or explicit mutual-exclusion checks so
only one of csi, nfs, awsElasticBlockStore, gcePersistentDisk, local is
rendered). Also apply the same nil-guard pattern in persistentVolumeClaim.yaml
for checks like .Values.persistence.backup.enabled.
- Around line 104-139: The template allows multiple storage backends to render
into one PersistentVolume; fix by adding missing backend configs to values.yaml
(define .Values.persistence.nfs, .Values.persistence.ebs,
.Values.persistence.gcp with enabled, server/path or volumeID/pdName, fsType,
readOnly defaults) and add a validation in
deploy/helm/templates/persistentVolume.yaml that counts enabled backends
(.Values.persistence.localStorage.enabled,
.Values.persistence.existingClaim.enabled, .Values.persistence.efs.enabled,
.Values.persistence.nfs.enabled, .Values.persistence.ebs.enabled,
.Values.persistence.gcp.enabled) and calls fail if the count != 1; then wrap the
existing csi, nfs, awsElasticBlockStore, gcePersistentDisk blocks in mutually
exclusive if/elif logic so only the single enabled backend is rendered.

In `@deploy/helm/templates/service.yaml`:
- Around line 39-43: The chart currently hardcodes sessionAffinity: ClientIP and
a 10800s timeout in the Service template (sessionAffinity and
sessionAffinityConfig), which should be made optional and configurable; add
values like service.sessionAffinity.enabled (default false),
service.sessionAffinity.type (default "ClientIP") and
service.sessionAffinity.timeoutSeconds (default 10800) to values.yaml, then
update deploy/helm/templates/service.yaml to only render sessionAffinity and
sessionAffinityConfig.clientIP.timeoutSeconds when
service.sessionAffinity.enabled is true and use the templated values (e.g.,
service.sessionAffinity.type and service.sessionAffinity.timeoutSeconds) instead
of hardcoded values so operators can disable or tune affinity.

In `@IOS_EXTENDED_WIDGET_SUPPORT.md`:
- Around line 16-23: The comment header shows a mismatched path casing for the
NumberInputComponent comment: change the path casing used in the comment from
the capitalized form to the repository's lowercase form (i.e., use lowercase
"app" instead of "App") so searches and links resolve; locate the comment around
the NumberInputComponent and BaseInputComponent in the diff and update any other
occurrences to use the same lowercase convention.

In `@IOS_TESTING_GUIDE.md`:
- Around line 260-269: The HTML code block contains an invalid C-style comment
inside the sample input element; replace the marker `/* other attributes */`
with a proper HTML comment `<!-- other attributes -->` (and similarly change any
other `/* ... */` occurrences) in the sample <input> snippet so the block uses
valid HTML comment syntax.
- Around line 340-349: The test results table currently lists all cases (Basic
Numeric, Decimal Entry, Negative Values, Large Numbers, Multiple Inputs,
Copy/Paste, Keyboard Dismiss) as PASS before actual verification; update the
table so each Status is "PENDING" (or replace the ✅ with a PENDING marker) until
you run the tests, and set the "Testing Date: [To be filled]" entry to either
the actual test date after completion or leave as a clear "To be filled" until
verified; ensure you update the rows referenced by the table headings and the
"Testing Date" line together to keep the document consistent.

---

Nitpick comments:
In `@app/client/src/widgets/BaseInputWidget/component/index.tsx`:
- Around line 503-523: The getInputMode method returns raw string literals
instead of using the shared InputMode enum; update getInputMode (in
BaseInputWidget/component/index.tsx) to import InputMode from constants.ts,
change the return type to InputMode | undefined, and return the enum values
(e.g., InputMode.Decimal, InputMode.Tel, InputMode.Email) in the corresponding
cases for "NUMBER", "TEL", and "EMAIL" while leaving the default as undefined so
callers use the centralized enum instead of string literals.

In `@app/client/src/widgets/BaseInputWidget/constants.ts`:
- Around line 16-37: The InputMode enum in constants.ts is defined but not used;
update BaseInputWidget/component/index.tsx's getInputMode() to import and return
InputMode enum members instead of string literals (e.g., use InputMode.NUMERIC,
DECIMAL, TEL, EMAIL, TEXT, SEARCH, URL) and adjust any type annotations to
expect InputMode where appropriate; alternatively remove the unused InputMode
enum from constants.ts if you decide to keep string literals—prefer using the
enum for consistency and type safety.

In `@deploy/helm/templates/serviceaccount.yaml`:
- Around line 17-19: The ServiceAccount manifest currently includes labels
rbac.authorization.k8s.io/aggregate-to-edit and
rbac.authorization.k8s.io/aggregate-to-view which are only valid/meaningful on
ClusterRole resources; remove these two labels from the ServiceAccount
definition in templates/serviceaccount.yaml so the ServiceAccount (the resource
in that file) no longer contains aggregate-to-* labels that mislead operators
about permissions.

In `@HELM_IMPROVEMENTS.md`:
- Around line 6-10: Remove transient PR-state metadata from the checked-in
document: delete fields like "Branch", "Status", "Total Commits", "Files
Modified" (the PR-tracking block shown at the top) and any similar block later
in the file (the section around lines 220-264), and retain only durable chart
behavior/configuration content and examples; move any PR-specific notes or
tracking (branch name, commit counts, merge readiness) into the PR description
instead so the committed HELM_IMPROVEMENTS.md contains only stable, maintainable
documentation.

In `@IOS_NUMERIC_KEYPAD_ANALYSIS.md`:
- Around line 34-40: The markdown code block in IOS_NUMERIC_KEYPAD_ANALYSIS.md
is missing a language specifier, so update the fenced code block that shows
CurrencyInputComponent and BaseInputComponent (the block containing
"CurrencyInputComponent passes inputHTMLType=\"NUMBER\" to BaseInputComponent"
and the lines with inputHTMLType and BaseInputComponent) from ``` to ```tsx to
enable TypeScript/TSX syntax highlighting; keep the existing content unchanged,
only modify the opening fence to ```tsx.

In `@IOS_NUMERIC_KEYPAD_IMPLEMENTATION.md`:
- Around line 186-215: Update the fenced code blocks in
IOS_NUMERIC_KEYPAD_IMPLEMENTATION.md (the commit blocks referencing hashes
58c0bc3ee5, 8a9e7e7966, f74f2fa8de, a87017ecf4 and the embedded diffs for
constants.ts, component/index.tsx, and CurrencyInputWidget/component/index.tsx)
to include explicit language specifiers: use ```text for commit messages and
human-readable lines, ```diff or ```patch for the diff blocks, and ```tsx or
```ts for the TypeScript/TSX snippets so markdownlint warnings are resolved and
syntax highlighting is accurate.

In `@IOS_TESTING_GUIDE.md`:
- Around line 6-19: The fenced code block containing the "Required software"
list and commands should be split into two properly labeled blocks: convert the
software list block to a plain text/code block (change the opening fence to
```text) so the hyphenated bullets render as plain content, and convert the
commands block to a bash block (change its opening fence to ```bash) for proper
shell highlighting; update the fences around the "Required software" section and
the "Run Appsmith development server" commands accordingly so each block has the
correct language specifier and nothing else in the combined fence.

In `@PR_VERIFICATION_REPORT.md`:
- Around line 1-245: The PR verification report file (PR_VERIFICATION_REPORT.md)
is an ephemeral artifact and should not be committed to the chart; remove the
file from the commit (delete PR_VERIFICATION_REPORT.md), ensure no other
verification artifacts are committed, and add a rule to exclude such reports
(e.g., add PR_VERIFICATION_REPORT.md or a /reports/ pattern) from version
control by updating .gitignore so future CI/PR artifacts aren’t accidentally
checked in; if needed, move the report to your PR description or CI artifact
storage instead.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: aff92597-3414-4469-a6b8-79806d68289e

📥 Commits

Reviewing files that changed from the base of the PR and between a8a43b2 and 6d5698f.

📒 Files selected for processing (15)
  • HELM_IMPROVEMENTS.md
  • IOS_EXTENDED_WIDGET_SUPPORT.md
  • IOS_NUMERIC_KEYPAD_ANALYSIS.md
  • IOS_NUMERIC_KEYPAD_IMPLEMENTATION.md
  • IOS_TESTING_GUIDE.md
  • PR_VERIFICATION_REPORT.md
  • app/client/src/widgets/BaseInputWidget/component/index.tsx
  • app/client/src/widgets/BaseInputWidget/constants.ts
  • app/client/src/widgets/CurrencyInputWidget/component/index.tsx
  • deploy/helm/templates/configMap.yaml
  • deploy/helm/templates/deployment.yaml
  • deploy/helm/templates/persistentVolume.yaml
  • deploy/helm/templates/persistentVolumeClaim.yaml
  • deploy/helm/templates/service.yaml
  • deploy/helm/templates/serviceaccount.yaml

Comment on lines +11 to +39
{{- if not .Values.persistence.size }}
{{- fail "persistence.size is required when persistence is enabled" }}
{{- end }}
{{- if .Values.persistence.efs.enabled }}
{{- if not .Values.persistence.efs.driver }}
{{- fail "persistence.efs.driver is required when EFS is enabled" }}
{{- end }}
{{- if not .Values.persistence.efs.volumeHandle }}
{{- fail "persistence.efs.volumeHandle is required when EFS is enabled" }}
{{- end }}
{{- end }}
{{- if .Values.persistence.nfs.enabled }}
{{- if not .Values.persistence.nfs.server }}
{{- fail "persistence.nfs.server is required when NFS is enabled" }}
{{- end }}
{{- if not .Values.persistence.nfs.path }}
{{- fail "persistence.nfs.path is required when NFS is enabled" }}
{{- end }}
{{- end }}
{{- if .Values.persistence.ebs.enabled }}
{{- if not .Values.persistence.ebs.volumeID }}
{{- fail "persistence.ebs.volumeID is required when EBS is enabled" }}
{{- end }}
{{- end }}
{{- if .Values.persistence.gcp.enabled }}
{{- if not .Values.persistence.gcp.pdName }}
{{- fail "persistence.gcp.pdName is required when GCP Persistent Disk is enabled" }}
{{- end }}
{{- end }}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Dereferences of new persistence submaps =="
rg -n '\.Values\.persistence\.(nfs|ebs|gcp|backup|retention)\.' \
  deploy/helm/templates/persistentVolume.yaml \
  deploy/helm/templates/persistentVolumeClaim.yaml

echo
echo "== Defaults currently declared in values.yaml =="
rg -n '^\s{2}(efs|nfs|ebs|gcp|backup|retention):' deploy/helm/values.yaml

Repository: appsmithorg/appsmith

Length of output: 2665


🏁 Script executed:

# Check the full persistentVolume.yaml file
wc -l deploy/helm/templates/persistentVolume.yaml

Repository: appsmithorg/appsmith

Length of output: 111


🏁 Script executed:

# Read the full persistentVolume.yaml to see namespace and spec context
cat -n deploy/helm/templates/persistentVolume.yaml

Repository: appsmithorg/appsmith

Length of output: 6295


🏁 Script executed:

# Check the full values.yaml persistence section
sed -n '/^persistence:/,/^[^ ]/p' deploy/helm/values.yaml | head -100

Repository: appsmithorg/appsmith

Length of output: 2013


🌐 Web query:

Kubernetes PersistentVolume metadata namespace cluster-scoped spec

💡 Result:

Kubernetes PersistentVolumes (PVs) are cluster-scoped resources, not namespaced. They do not belong to any specific namespace and can be accessed by PersistentVolumeClaims (PVCs) from any namespace in the cluster. The metadata field in a PersistentVolume uses standard ObjectMeta, which includes a namespace field. However, for PVs, this namespace field is ignored by the API server and has no effect. PVs are always created and managed at the cluster scope, similar to Nodes or StorageClasses. The spec field defines the PersistentVolume's configuration (e.g., capacity, accessModes, storage type) and does not include a namespace field, as the PV itself is cluster-wide. PVCs, in contrast, are namespace-scoped and must exist in the same namespace as the Pods that use them.

Citations:


🌐 Web query:

Kubernetes PersistentVolumeSpec single volume source specification

💡 Result:

The Kubernetes PersistentVolumeSpec defines the specification for a PersistentVolume (PV), which describes a piece of storage in the cluster. It includes fields like accessModes, capacity, persistentVolumeReclaimPolicy, storageClassName, volumeMode, mountOptions, claimRef, nodeAffinity, and crucially, the single volume source specification via one of several mutually exclusive fields representing different storage types. The single volume source is specified by exactly one of the following fields in PersistentVolumeSpec, each corresponding to a specific storage backend (these are analogous to VolumeSource in Pod volumes but for PVs): - hostPath (HostPathVolumeSource): For host directory volumes. - nfs (NFSVolumeSource): For NFS shares. - iscsi (ISCSIPersistentVolumeSource): For iSCSI volumes. - awsElasticBlockStore (AWSElasticBlockStoreVolumeSource): For AWS EBS. - gcePersistentDisk (GCEPersistentDiskVolumeSource): For GCE PD. - azureDisk (AzureDiskVolumeSource): For Azure Disk. - azureFile (AzureFilePersistentVolumeSource): For Azure File. - csi (CSIPersistentVolumeSource): For CSI drivers. - local (LocalVolumeSource): For local storage with node affinity. - fc (FCVolumeSource): For Fibre Channel. - flexVolume (FlexPersistentVolumeSource): For FlexVolume plugins. - cephfs (CephFSPersistentVolumeSource): For CephFS. - rbd (RBDPersistentVolumeSource): For Ceph RBD. - cinder (CinderPersistentVolumeSource): For OpenStack Cinder. - glusterfs (GlusterfsPersistentVolumeSource): For GlusterFS. - quobyte (QuobyteVolumeSource): For Quobyte. - portworxVolume (PortworxVolumeSource): For Portworx. - scaleIO (ScaleIOPersistentVolumeSource): For ScaleIO. - storageos (StorageOSPersistentVolumeSource): For StorageOS. - vsphereVolume (VsphereVirtualDiskVolumeSource): For vSphere. - photonPersistentDisk (PhotonPersistentDiskVolumeSource): For Photon Controller. - flocker (FlockerVolumeSource): Deprecated. - awsElasticBlockStore (already listed). Only one of these fields is set in a given PV spec to define the single underlying storage source. Examples from official docs show direct use like 'hostPath: {path: /mnt/data}' without a wrapper. Full structure from Kubernetes v1 API reference (current as of 2026): apiVersion: v1 kind: PersistentVolume spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: manual hostPath: # Example single volume source path: /mnt/data # Or nfs: # nfs: # server: nfs-server.example.com # path: /exported/path # etc. In-tree volume plugins are mostly migrated to CSI; see docs for supported types and deprecations.

Citations:


Add nil-pointer guards for undefined persistence submaps.

This template dereferences persistence.nfs, persistence.ebs, persistence.gcp, persistence.backup, and persistence.retention without guards, but values.yaml only defines efs. Helm will nil-pointer on missing parent maps before custom fail messages run. The same issue appears in persistentVolumeClaim.yaml for persistence.backup.enabled.

Additionally, metadata.namespace should not be rendered on PersistentVolume (cluster-scoped resource). The namespace field is ignored by the API server and is semantically incorrect.

A third issue: multiple volume source blocks (csi, nfs, awsElasticBlockStore, gcePersistentDisk, local) can all render simultaneously into the same spec. PersistentVolumeSpec requires exactly one volume source—enforce exclusivity by adding guard logic.

💡 Safe pattern
+{{- $persistence := .Values.persistence | default dict }}
+{{- $efs := $persistence.efs | default dict }}
+{{- $nfs := $persistence.nfs | default dict }}
+{{- $ebs := $persistence.ebs | default dict }}
+{{- $gcp := $persistence.gcp | default dict }}
+{{- $backup := $persistence.backup | default dict }}
+{{- $retention := $persistence.retention | default dict }}
+
 metadata:
   name: {{ include "appsmith.pvName" . }}
-  namespace: {{ .Release.Namespace | quote }}
   labels:
     app.kubernetes.io/name: appsmith
 {{- if .Values.persistence.efs.enabled }}
   {{- if not .Values.persistence.efs.driver }}
     {{- fail "persistence.efs.driver is required when EFS is enabled" }}
   {{- end }}
 {{- end }}
-{{- if .Values.persistence.nfs.enabled }}
+{{- if dig "enabled" false $nfs }}
   {{- if not .Values.persistence.nfs.server }}
     {{- fail "persistence.nfs.server is required when NFS is enabled" }}
   {{- end }}
 {{- end }}
-{{- if .Values.persistence.ebs.enabled }}
+{{- if dig "enabled" false $ebs }}
   {{- if not .Values.persistence.ebs.volumeID }}
     {{- fail "persistence.ebs.volumeID is required when EBS is enabled" }}
   {{- end }}
 {{- end }}
-{{- if .Values.persistence.gcp.enabled }}
+{{- if dig "enabled" false $gcp }}
   {{- if not .Values.persistence.gcp.pdName }}
     {{- fail "persistence.gcp.pdName is required when GCP Persistent Disk is enabled" }}
   {{- end }}
 {{- end }}
     {{- if .Values.persistence.backup.enabled }}
+    {{- if dig "enabled" false $backup }}
       backup.velero.io/backup-volumes: appsmith-data
     {{- end }}
-    {{- if .Values.persistence.retention.policy }}
+    {{- if dig "policy" "" $retention }}
       retention.policy: {{ .Values.persistence.retention.policy | quote }}
     {{- end }}
-    {{- if .Values.persistence.retention.days }}
+    {{- if dig "days" "" $retention }}
       retention.days: {{ .Values.persistence.retention.days | quote }}
     {{- end }}

Also applies to: 52–62

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@deploy/helm/templates/persistentVolume.yaml` around lines 11 - 39, The
template dereferences .Values.persistence submaps directly and can nil-pointer
when a provider map is missing, it also renders metadata.namespace on a
cluster-scoped PersistentVolume and may emit multiple volume sources at once;
fix by adding existence guards (e.g., if .Values.persistence and if
.Values.persistence.nfs / .Values.persistence.ebs / .Values.persistence.gcp /
.Values.persistence.backup / .Values.persistence.retention) before accessing
subkeys, remove rendering of metadata.namespace in persistentVolume.yaml, and
make the volume-source blocks exclusive (use a single if/elif chain or explicit
mutual-exclusion checks so only one of csi, nfs, awsElasticBlockStore,
gcePersistentDisk, local is rendered). Also apply the same nil-guard pattern in
persistentVolumeClaim.yaml for checks like .Values.persistence.backup.enabled.

Comment on lines 42 to +45
metadata:
name: {{ include "appsmith.pvName" . }}
namespace: {{ .Release.Namespace | quote }}
labels:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🌐 Web query:

Are Kubernetes PersistentVolumeresources cluster-scoped, and shouldmetadata.namespace be omitted from their manifests?

💡 Result:

Yes, Kubernetes PersistentVolume (PV) resources are cluster-scoped, meaning they are not namespaced and can be accessed from any namespace in the cluster. The metadata.namespace field should be omitted from their manifests, as including it is invalid for cluster-scoped resources like PVs (similar to Nodes). PersistentVolumeClaims (PVCs), however, are namespace-scoped.

Citations:


🏁 Script executed:

fd -t f persistentVolume.yaml deploy/

Repository: appsmithorg/appsmith

Length of output: 107


🏁 Script executed:

cat deploy/helm/templates/persistentVolume.yaml

Repository: appsmithorg/appsmith

Length of output: 5315


Remove metadata.namespace from the PersistentVolume.

PersistentVolume is cluster-scoped and cannot have a namespace field. Including it makes the manifest invalid.

💡 Minimal fix
 metadata:
   name: {{ include "appsmith.pvName" . }}
-  namespace: {{ .Release.Namespace | quote }}
   labels:
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
metadata:
name: {{ include "appsmith.pvName" . }}
namespace: {{ .Release.Namespace | quote }}
labels:
metadata:
name: {{ include "appsmith.pvName" . }}
labels:
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@deploy/helm/templates/persistentVolume.yaml` around lines 42 - 45, The
PersistentVolume manifest incorrectly sets metadata.namespace (the line using {{
.Release.Namespace | quote }}), which is invalid because PersistentVolume is
cluster-scoped; remove the namespace field from the metadata block in
deploy/helm/templates/persistentVolume.yaml so only name and labels remain (keep
the existing name template include "appsmith.pvName" and labels intact).

Comment on lines 104 to +139
{{- if .Values.persistence.efs.enabled }}
# AWS EFS via CSI driver - suitable for multi-AZ deployments
csi:
driver: {{ .Values.persistence.efs.driver }}
nfs:
volumeHandle: {{ .Values.persistence.efs.volumeHandle }}
{{ end }}
{{- end }}
driver: {{ .Values.persistence.efs.driver | quote }}
volumeHandle: {{ .Values.persistence.efs.volumeHandle | quote }}
{{- end }}

{{- if .Values.persistence.nfs.enabled }}
# NFS storage - suitable for on-premises and hybrid deployments
nfs:
server: {{ .Values.persistence.nfs.server | quote }}
path: {{ .Values.persistence.nfs.path | quote }}
{{- if .Values.persistence.nfs.readOnly }}
readOnly: true
{{- end }}
{{- end }}

{{- if .Values.persistence.ebs.enabled }}
# AWS EBS - suitable for single-AZ high-performance requirements
awsElasticBlockStore:
volumeID: {{ .Values.persistence.ebs.volumeID | quote }}
fsType: {{ .Values.persistence.ebs.fsType | default "ext4" | quote }}
{{- if .Values.persistence.ebs.readOnly }}
readOnly: true
{{- end }}
{{- end }}

{{- if .Values.persistence.gcp.enabled }}
# GCP Persistent Disk - suitable for GKE deployments
gcePersistentDisk:
pdName: {{ .Values.persistence.gcp.pdName | quote }}
fsType: {{ .Values.persistence.gcp.fsType | default "ext4" | quote }}
{{- if .Values.persistence.gcp.readOnly }}
readOnly: true
{{- end }}
{{- end }}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Backend rendering blocks =="
sed -n '104,139p' deploy/helm/templates/persistentVolume.yaml

echo
echo "== Backend enable flags referenced in this template =="
rg -n 'persistence\.(efs|nfs|ebs|gcp)\.enabled|persistence\.localStorage' \
  deploy/helm/templates/persistentVolume.yaml

Repository: appsmithorg/appsmith

Length of output: 1862


🏁 Script executed:

find deploy -name "values*.yaml" -o -name "*schema*.yaml" -o -name "*values*.json" | head -20

Repository: appsmithorg/appsmith

Length of output: 87


🏁 Script executed:

# Check for values.yaml and any schema validation
git ls-files deploy/helm | grep -i values

Repository: appsmithorg/appsmith

Length of output: 87


🏁 Script executed:

# Look for any validation or testing related to persistence settings
rg -l "persistence\.(efs|nfs|ebs|gcp)" deploy/ --type yaml --type json | head -20

Repository: appsmithorg/appsmith

Length of output: 107


🏁 Script executed:

# Check the values.yaml for persistence configuration structure
rg -A 10 "^persistence:" deploy/helm/values.yaml | head -100

Repository: appsmithorg/appsmith

Length of output: 410


🏁 Script executed:

# Get the full persistence section from values.yaml
rg -A 200 "^persistence:" deploy/helm/values.yaml | head -250

Repository: appsmithorg/appsmith

Length of output: 4715


🏁 Script executed:

# Check if there's any validation or constraint file
find deploy -type f \( -name "*.json" -o -name "*.schema" -o -name "*constraint*" -o -name "*validation*" \)

Repository: appsmithorg/appsmith

Length of output: 98


🏁 Script executed:

# Search for nfs, ebs, gcp configuration in values.yaml
rg "^\s+(nfs|ebs|gcp|existingClaim):" deploy/helm/values.yaml -A 5

Repository: appsmithorg/appsmith

Length of output: 138


🏁 Script executed:

# Look for any test or validation files
find deploy/helm -type f \( -name "*test*" -o -name "*spec*" -o -name "Chart.yaml" \)

Repository: appsmithorg/appsmith

Length of output: 398


🏁 Script executed:

# Check for README or documentation
cat deploy/helm/README.md 2>/dev/null | head -100 || cat deploy/helm/Chart.yaml 2>/dev/null

Repository: appsmithorg/appsmith

Length of output: 6788


🏁 Script executed:

# Check the persistence test file
cat deploy/helm/tests/persistence_test.yaml

Repository: appsmithorg/appsmith

Length of output: 1671


🏁 Script executed:

# Get the complete nfs, ebs, gcp configuration sections from values.yaml
rg -B 2 -A 10 "^\s+(nfs|ebs|gcp):" deploy/helm/values.yaml

Repository: appsmithorg/appsmith

Length of output: 46


🏁 Script executed:

# Search for any backend configurations in values.yaml more broadly
rg "driver:|volumeHandle:|server:|path:|volumeID:|fsType:|pdName:" deploy/helm/values.yaml

Repository: appsmithorg/appsmith

Length of output: 93


🏁 Script executed:

# Get the entire persistence section from values.yaml to see its full extent
awk '/^persistence:/,/^[a-zA-Z]/' deploy/helm/values.yaml | head -200

Repository: appsmithorg/appsmith

Length of output: 76


🏁 Script executed:

# Check if nfs, ebs, gcp exist anywhere in the helm directory
find deploy/helm -type f -exec grep -l "\.nfs\|\.ebs\|\.gcp" {} \;

Repository: appsmithorg/appsmith

Length of output: 107


🏁 Script executed:

# Get exact line count of values.yaml
wc -l deploy/helm/values.yaml

Repository: appsmithorg/appsmith

Length of output: 91


🏁 Script executed:

# Look for where persistence section ends
sed -n '1,300p' deploy/helm/values.yaml | tail -50

Repository: appsmithorg/appsmith

Length of output: 1573


🏁 Script executed:

# Check if nfs, ebs, gcp are conditionally defined elsewhere
rg -B 3 -A 3 "nfs:|ebs:|gcp:" deploy/helm/values.yaml

Repository: appsmithorg/appsmith

Length of output: 46


🏁 Script executed:

# Get the full persistence section more carefully
sed -n '/^persistence:/,/^[a-z]/p' deploy/helm/values.yaml | head -150

Repository: appsmithorg/appsmith

Length of output: 2059


🏁 Script executed:

# Check for any reference to nfs, ebs, gcp configuration structure
grep -n "nfs\|ebs\|gcp" deploy/helm/values.yaml

Repository: appsmithorg/appsmith

Length of output: 46


🏁 Script executed:

# Verify template actually uses these undefined values
sed -n '104,139p' deploy/helm/templates/persistentVolume.yaml | grep -E "\.Values\.persistence\.(nfs|ebs|gcp)\."

Repository: appsmithorg/appsmith

Length of output: 712


🏁 Script executed:

# Check if there are any other files that might define nfs, ebs, gcp configs
find deploy/helm -type f \( -name "*.yaml" -o -name "*.yml" \) -exec grep -l "nfs:\|ebs:\|gcp:" {} \;

Repository: appsmithorg/appsmith

Length of output: 107


🏁 Script executed:

# Check the git history to see if these were recently added or are placeholder
git log --oneline -n 20 -- deploy/helm/templates/persistentVolume.yaml 2>/dev/null || echo "Git history unavailable"

Repository: appsmithorg/appsmith

Length of output: 150


Enforce mutual exclusivity: only one storage backend should be enabled.

The template currently renders multiple storage backends if enabled independently (e.g., efs.enabled=true and nfs.enabled=true both render into the same PersistentVolumeSpec, which is invalid). Additionally, nfs, ebs, and gcp backend configurations are referenced in the template but not defined in values.yaml, making those blocks effectively dead code. Before enabling these backends, add their configurations to values.yaml and implement a validation check that ensures exactly one backend is enabled across localStorage, existingClaim, efs, nfs, ebs, and gcp.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@deploy/helm/templates/persistentVolume.yaml` around lines 104 - 139, The
template allows multiple storage backends to render into one PersistentVolume;
fix by adding missing backend configs to values.yaml (define
.Values.persistence.nfs, .Values.persistence.ebs, .Values.persistence.gcp with
enabled, server/path or volumeID/pdName, fsType, readOnly defaults) and add a
validation in deploy/helm/templates/persistentVolume.yaml that counts enabled
backends (.Values.persistence.localStorage.enabled,
.Values.persistence.existingClaim.enabled, .Values.persistence.efs.enabled,
.Values.persistence.nfs.enabled, .Values.persistence.ebs.enabled,
.Values.persistence.gcp.enabled) and calls fail if the count != 1; then wrap the
existing csi, nfs, awsElasticBlockStore, gcePersistentDisk blocks in mutually
exclusive if/elif logic so only the single enabled backend is rendered.

Comment on lines +39 to +43
# Session affinity: Ensure client requests route to same pod for stateful operations
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800 # 3 hours
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Service affinity block =="
sed -n '35,45p' deploy/helm/templates/service.yaml

echo
echo "== Available service values =="
sed -n '185,217p' deploy/helm/values.yaml

Repository: appsmithorg/appsmith

Length of output: 1626


Don't hardcode ClientIP affinity for every install.

This changes routing semantics chart-wide and can hotspot a single replica when requests arrive through one in-cluster proxy IP. deploy/helm/values.yaml does not expose any service.sessionAffinity or timeout knobs, so operators cannot disable or tune it.

💡 Make it opt-in and configurable
-  sessionAffinity: ClientIP
-  sessionAffinityConfig:
-    clientIP:
-      timeoutSeconds: 10800 # 3 hours
+  {{- $sessionAffinity := .Values.service.sessionAffinity | default "None" }}
+  sessionAffinity: {{ $sessionAffinity }}
+  {{- if eq $sessionAffinity "ClientIP" }}
+  sessionAffinityConfig:
+    clientIP:
+      timeoutSeconds: {{ .Values.service.sessionAffinityTimeoutSeconds | default 10800 }}
+  {{- end }}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Session affinity: Ensure client requests route to same pod for stateful operations
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800 # 3 hours
# Session affinity: Ensure client requests route to same pod for stateful operations
{{- $sessionAffinity := .Values.service.sessionAffinity | default "None" }}
sessionAffinity: {{ $sessionAffinity }}
{{- if eq $sessionAffinity "ClientIP" }}
sessionAffinityConfig:
clientIP:
timeoutSeconds: {{ .Values.service.sessionAffinityTimeoutSeconds | default 10800 }}
{{- end }}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@deploy/helm/templates/service.yaml` around lines 39 - 43, The chart currently
hardcodes sessionAffinity: ClientIP and a 10800s timeout in the Service template
(sessionAffinity and sessionAffinityConfig), which should be made optional and
configurable; add values like service.sessionAffinity.enabled (default false),
service.sessionAffinity.type (default "ClientIP") and
service.sessionAffinity.timeoutSeconds (default 10800) to values.yaml, then
update deploy/helm/templates/service.yaml to only render sessionAffinity and
sessionAffinityConfig.clientIP.timeoutSeconds when
service.sessionAffinity.enabled is true and use the templated values (e.g.,
service.sessionAffinity.type and service.sessionAffinity.timeoutSeconds) instead
of hardcoded values so operators can disable or tune affinity.

Comment on lines +16 to +23
```typescript
// App/client/src/widgets/NumberInputWidget/component/index.tsx
// Already uses BaseInputComponent, automatically gets inputmode="decimal" fix
export class NumberInputComponent extends BaseInputComponent {
// inputmode mapping inherited from BaseInputComponent
// No changes needed
}
```
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

File path casing inconsistency.

Line 17 shows App/client/src/... but the actual path is app/client/src/... (lowercase). This could confuse developers searching for the file.

📝 Fix path casing
-// App/client/src/widgets/NumberInputWidget/component/index.tsx
+// app/client/src/widgets/NumberInputWidget/component/index.tsx
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@IOS_EXTENDED_WIDGET_SUPPORT.md` around lines 16 - 23, The comment header
shows a mismatched path casing for the NumberInputComponent comment: change the
path casing used in the comment from the capitalized form to the repository's
lowercase form (i.e., use lowercase "app" instead of "App") so searches and
links resolve; locate the comment around the NumberInputComponent and
BaseInputComponent in the diff and update any other occurrences to use the same
lowercase convention.

Comment on lines +260 to +269
```html
<!-- Expected to see: -->
<input
type="tel"
inputmode="decimal"
class="..."
aria-label="..."
/* other attributes */
/>
```
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

HTML comment syntax invalid inside HTML code block.

Line 267 uses /* other attributes */ which isn't valid HTML comment syntax. Should be <!-- other attributes -->.

📝 Fix HTML comment
 <input 
   type="tel" 
   inputmode="decimal"
   class="..."
   aria-label="..."
-  /* other attributes */
+  <!-- other attributes -->
 />
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
```html
<!-- Expected to see: -->
<input
type="tel"
inputmode="decimal"
class="..."
aria-label="..."
/* other attributes */
/>
```
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@IOS_TESTING_GUIDE.md` around lines 260 - 269, The HTML code block contains an
invalid C-style comment inside the sample input element; replace the marker `/*
other attributes */` with a proper HTML comment `<!-- other attributes -->` (and
similarly change any other `/* ... */` occurrences) in the sample <input>
snippet so the block uses valid HTML comment syntax.

Comment on lines +340 to +349
| Test Case | iOS 13.x | iOS 14.x | iOS 15.x | Status |
|-----------|----------|----------|----------|--------|
| Basic Numeric | ✅ | ✅ | ✅ | PASS |
| Decimal Entry | ✅ | ✅ | ✅ | PASS |
| Negative Values | ✅ | ✅ | ✅ | PASS |
| Large Numbers | ✅ | ✅ | ✅ | PASS |
| Multiple Inputs | ✅ | ✅ | ✅ | PASS |
| Copy/Paste | ✅ | ✅ | ✅ | PASS |
| Keyboard Dismiss | ✅ | ✅ | ✅ | PASS |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Test results pre-filled as PASS before actual testing.

The results table shows all tests passing, but line 352 says "Testing Date: [To be filled]". Either update after actual testing or mark as "PENDING" until verified.

📝 Suggested fix
 | Test Case | iOS 13.x | iOS 14.x | iOS 15.x | Status |
 |-----------|----------|----------|----------|--------|
-| Basic Numeric | ✅ | ✅ | ✅ | PASS |
-| Decimal Entry | ✅ | ✅ | ✅ | PASS |
+| Basic Numeric | ⏳ | ⏳ | ⏳ | PENDING |
+| Decimal Entry | ⏳ | ⏳ | ⏳ | PENDING |
 ...
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@IOS_TESTING_GUIDE.md` around lines 340 - 349, The test results table
currently lists all cases (Basic Numeric, Decimal Entry, Negative Values, Large
Numbers, Multiple Inputs, Copy/Paste, Keyboard Dismiss) as PASS before actual
verification; update the table so each Status is "PENDING" (or replace the ✅
with a PENDING marker) until you run the tests, and set the "Testing Date: [To
be filled]" entry to either the actual test date after completion or leave as a
clear "To be filled" until verified; ensure you update the rows referenced by
the table headings and the "Testing Date" line together to keep the document
consistent.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant