Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1a812ef58d
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d6b4c12bb2
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 76aa2bc56c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 97ba536fb7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Address 4 parity gaps flagged in PR #28 review (chatgpt-codex-connector): 1. Downgrade missing-track Applies finding to warning (was error). importService.runStrictBuildValidations() pushes no-track to warnings[], not errors[], so lint must not block users for a valid payload. 2. Align metadata unsafe-char pattern with containsUnsafeNameCharacters(). Old UNSAFE_PATTERN (/[<>"'&\x00-\x1F]/) flagged apostrophes/ampersands as errors when the actual validator only rejects slashes/backslashes/ellipsis. New STRICT_UNSAFE_PATTERN = /[\\/]|\.\.\./ 3. Reject non-SVG HTTP URLs in Icons sheet lint (P1). payloadBuilder.isSvgUrl() requires .svg in the URL; any other HTTP URL returns null from parseIconSource() and is silently dropped during build. Now emits an error for HTTP URLs without .svg, not a false-pass. 4. Use Categories icon-id column (col F) for cross-sheet collision checks. buildIconsFromSheet() uses the "icon id" column when present, overriding the category ID. Collision detection now reads col F and falls back to categoryId, avoiding false positives/negatives when icon id ≠ category id.
|
@codex review |
…check checkTranslationSourceOverwrites() was calling setLintNote() which unconditionally overwrites any existing note and severity styling. validateTranslationSheetConsistency() runs before it and may write critical (bright-red/white-text) annotations on the same cells. Switch to appendLintNote() so source-overwrite warnings are appended to — not replaced over — existing critical mismatch styling. Closes Codex review finding (PR #28, line 2310).
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 05218c601b
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
- checkForDuplicates: use clearLintArtifacts() to remove stale lint notes alongside backgrounds, preventing false-positive re-runs - lintIconsSheet: restrict Drive URL check to /file/d/ format only, matching payloadBuilder.isGoogleDriveLink() and preventing open?id= links from passing lint while being silently dropped during build - checkIconIdNormalization: read 6 cols and use col-F icon-id override (mirroring buildIconsFromSheet), add parseIconSource guard to skip rows the builder ignores, add Math.max column guard to avoid range errors on narrow sheets
Address 4 parity gaps flagged in PR #28 review (chatgpt-codex-connector): 1. Downgrade missing-track Applies finding to warning (was error). importService.runStrictBuildValidations() pushes no-track to warnings[], not errors[], so lint must not block users for a valid payload. 2. Align metadata unsafe-char pattern with containsUnsafeNameCharacters(). Old UNSAFE_PATTERN (/[<>"'&\x00-\x1F]/) flagged apostrophes/ampersands as errors when the actual validator only rejects slashes/backslashes/ellipsis. New STRICT_UNSAFE_PATTERN = /[\\/]|\.\.\./ 3. Reject non-SVG HTTP URLs in Icons sheet lint (P1). payloadBuilder.isSvgUrl() requires .svg in the URL; any other HTTP URL returns null from parseIconSource() and is silently dropped during build. Now emits an error for HTTP URLs without .svg, not a false-pass. 4. Use Categories icon-id column (col F) for cross-sheet collision checks. buildIconsFromSheet() uses the "icon id" column when present, overriding the category ID. Collision detection now reads col F and falls back to categoryId, avoiding false positives/negatives when icon id ≠ category id.
…check checkTranslationSourceOverwrites() was calling setLintNote() which unconditionally overwrites any existing note and severity styling. validateTranslationSheetConsistency() runs before it and may write critical (bright-red/white-text) annotations on the same cells. Switch to appendLintNote() so source-overwrite warnings are appended to — not replaced over — existing critical mismatch styling. Closes Codex review finding (PR #28, line 2310).
- checkForDuplicates: use clearLintArtifacts() to remove stale lint notes alongside backgrounds, preventing false-positive re-runs - lintIconsSheet: restrict Drive URL check to /file/d/ format only, matching payloadBuilder.isGoogleDriveLink() and preventing open?id= links from passing lint while being silently dropped during build - checkIconIdNormalization: read 6 cols and use col-F icon-id override (mirroring buildIconsFromSheet), add parseIconSource guard to skip rows the builder ignores, add Math.max column guard to avoid range errors on narrow sheets
eb6a85c to
a2eed87
Compare
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a2eed871d1
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
This comment was marked as outdated.
This comment was marked as outdated.
Address 4 parity gaps flagged in PR #28 review (chatgpt-codex-connector): 1. Downgrade missing-track Applies finding to warning (was error). importService.runStrictBuildValidations() pushes no-track to warnings[], not errors[], so lint must not block users for a valid payload. 2. Align metadata unsafe-char pattern with containsUnsafeNameCharacters(). Old UNSAFE_PATTERN (/[<>"'&\x00-\x1F]/) flagged apostrophes/ampersands as errors when the actual validator only rejects slashes/backslashes/ellipsis. New STRICT_UNSAFE_PATTERN = /[\\/]|\.\.\./ 3. Reject non-SVG HTTP URLs in Icons sheet lint (P1). payloadBuilder.isSvgUrl() requires .svg in the URL; any other HTTP URL returns null from parseIconSource() and is silently dropped during build. Now emits an error for HTTP URLs without .svg, not a false-pass. 4. Use Categories icon-id column (col F) for cross-sheet collision checks. buildIconsFromSheet() uses the "icon id" column when present, overriding the category ID. Collision detection now reads col F and falls back to categoryId, avoiding false positives/negatives when icon id ≠ category id.
…check checkTranslationSourceOverwrites() was calling setLintNote() which unconditionally overwrites any existing note and severity styling. validateTranslationSheetConsistency() runs before it and may write critical (bright-red/white-text) annotations on the same cells. Switch to appendLintNote() so source-overwrite warnings are appended to — not replaced over — existing critical mismatch styling. Closes Codex review finding (PR #28, line 2310).
- checkForDuplicates: use clearLintArtifacts() to remove stale lint notes alongside backgrounds, preventing false-positive re-runs - lintIconsSheet: restrict Drive URL check to /file/d/ format only, matching payloadBuilder.isGoogleDriveLink() and preventing open?id= links from passing lint while being silently dropped during build - checkIconIdNormalization: read 6 cols and use col-F icon-id override (mirroring buildIconsFromSheet), add parseIconSource guard to skip rows the builder ignores, add Math.max column guard to avoid range errors on narrow sheets
e9c5aa5 to
a368a7d
Compare
Address 4 parity gaps flagged in PR #28 review (chatgpt-codex-connector): 1. Downgrade missing-track Applies finding to warning (was error). importService.runStrictBuildValidations() pushes no-track to warnings[], not errors[], so lint must not block users for a valid payload. 2. Align metadata unsafe-char pattern with containsUnsafeNameCharacters(). Old UNSAFE_PATTERN (/[<>"'&\x00-\x1F]/) flagged apostrophes/ampersands as errors when the actual validator only rejects slashes/backslashes/ellipsis. New STRICT_UNSAFE_PATTERN = /[\\/]|\.\.\./ 3. Reject non-SVG HTTP URLs in Icons sheet lint (P1). payloadBuilder.isSvgUrl() requires .svg in the URL; any other HTTP URL returns null from parseIconSource() and is silently dropped during build. Now emits an error for HTTP URLs without .svg, not a false-pass. 4. Use Categories icon-id column (col F) for cross-sheet collision checks. buildIconsFromSheet() uses the "icon id" column when present, overriding the category ID. Collision detection now reads col F and falls back to categoryId, avoiding false positives/negatives when icon id ≠ category id.
…check checkTranslationSourceOverwrites() was calling setLintNote() which unconditionally overwrites any existing note and severity styling. validateTranslationSheetConsistency() runs before it and may write critical (bright-red/white-text) annotations on the same cells. Switch to appendLintNote() so source-overwrite warnings are appended to — not replaced over — existing critical mismatch styling. Closes Codex review finding (PR #28, line 2310).
- checkForDuplicates: use clearLintArtifacts() to remove stale lint notes alongside backgrounds, preventing false-positive re-runs - lintIconsSheet: restrict Drive URL check to /file/d/ format only, matching payloadBuilder.isGoogleDriveLink() and preventing open?id= links from passing lint while being silently dropped during build - checkIconIdNormalization: read 6 cols and use col-F icon-id override (mirroring buildIconsFromSheet), add parseIconSource guard to skip rows the builder ignores, add Math.max column guard to avoid range errors on narrow sheets
3d6c505 to
6d5bf69
Compare
- lintIconsSheet: skip fully blank rows (builder ignores them too) - Invalid type: replace bare setInvalidCellBackground with setLintNote for consistent hover diagnostics - lintMetadataSheet: remove redundant seenKeys.add in duplicate branch
Twenty-Ninth-Round Review Analysis (commit 1b59c92)Analyzed the 14 unresolved review threads. 1 actionable, 13 by-design/recurring. Fixes Applied (3 findings)
By Design / Not in Scope (11 findings)
All fixes pass |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1b59c9258b
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…lationSlugs The function filtered out blank cells before computing row indices, so i+2 no longer mapped to the correct sheet row when blanks were present. This caused lint warnings to be written to wrong cells. Fix: iterate raw values in-place with continue (matching the pattern in checkTranslationSourceOverwrites) so the array index always corresponds to the physical sheet row. Thread: PRRT_kwDONCSAJs59S7Gl
Thirtieth-Round Review Analysis (commit 7b63e39)Analyzed the 11 unresolved review threads. 1 actionable, 10 by-design/recurring. Fixes Applied (1 finding)
Already Aligned (1 finding)
By Design / Not in Scope (9 findings)
All fixes pass |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7b63e395d2
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
The pre-flight clearing in validateAppliesColumn() covered two note prefixes on the body range but omitted the third prefix written per data row: 'Applies value contains semicolons or other non-comma delimiters'. When the Applies column was present on run 1 (delimiter warnings written to data cells) and renamed/removed on run 2, those notes persisted indefinitely because the function returned early before reaching clearLintArtifacts(appliesRange). Added the missing clearRangeLintNoteLinesWithPrefix call.
…sets processTranslations() initialized messages only from Category Translations languages. When other sheets (Detail Label, etc.) had additional languages, writes to messages[lang] would crash with undefined. Now unions all languages across all sheets before initializing messages. Also fixes locale variant lowercasing in translationHeaderResolver: unknown locale tags like pt-BR were returned as pt-br. Now preserves BCP 47 casing.
Comment claimed the variable tracked non-empty values regardless of validity, but code only sets it when isValid is true. Renamed to seenValidPrimaryLanguage and updated comment to match actual behavior.
The GAS-side locale regex in normalizePrimaryLanguageLocaleCode rejected
valid UN M.49 numeric region subtags like es-419, while the package's
validateBcp47 (via bcp-47-normalize + unM49 checks) accepted them. This
created a lint parity gap where the spreadsheet linter would flag a locale
that the builder would successfully build.
Update the regex from /^[a-z]{2,3}(-[a-z]{2,3})?$/i to also accept 3-digit
numeric subtags: /^[a-z]{2,3}(-[a-z]{2,3}|-\d{3})?$/i.
This aligns the GAS linter with the package builder's BCP-47 validation.
Closes capy-ai thread PRRT_kwDONCSAJs59j6yC.
…LanguageInA1 validatePrimaryLanguageInA1() already clears A1 artifacts at line 2003. The duplicate clear at the call site was redundant and fragile — if a future lint phase writes to A1 between the two calls, the inner clear would wipe it.
|
Capy auto-review is paused for this organization because the monthly auto-review limit has been reached. Increase the limit or turn it off in billing settings to resume automatic reviews. |
Summary
Expand spreadsheet linting diagnostics to achieve full parity with the plugin's actual export/build behavior, closing high-impact gaps across Categories, Details, Metadata, Translations, and Icons sheets.
Context
The existing linting system (
src/lint.ts) only covered basic validation — duplicate names, required fields, and simple type checking. Many conditions that cause build failures or silent data loss during config export were invisible to users until they hit "Generate Config". This implementation aligns lint diagnostics with the real workflows used by the export pipeline (payloadBuilder.ts) and strict validation (importService.ts).Plan:
plans/2026-04-12-linting-edge-case-gaps-v5.1.mdChanges
Phase 1 — Lint infrastructure and artifact lifecycle
setLintNote()(standardized severity-based note writer),clearLintArtifacts()(combined clearing helper),inspectRawIds()(pre-cleanup whitespace detection)Phase 2 — Categories and Details build-parity checks
Phase 3 — Field-reference, option, and type parity
normalizeFieldTokens()from builder for consistent delimiter handling (commas, semicolons, newlines, bullets, fullwidth punctuation)parseCanonicalOptions()mirrors builder'sparseOptions()(first-colon value:label split)Phase 4 — Locale, Metadata, and translation parity
validateLanguageName()/[;,,、]/)Phase 5 — Icon workflow and Icons sheet coverage
lintIconsSheet()validates the Icons sheet (missing/duplicate IDs, unsupported formats).svg/.pngsuffixesPhase 6 — Strict-validation advisory parity
Phase 7 — UI summary and regression coverage
testFieldTokenParity(),testCanonicalOptionParity(),testTranslationDelimiterParity()Severity Matrix
#FFC7CEbackground + red font#FFF2CCbackground + orange font#FFFFCCbackgroundTesting
runPhase7ParityTests()Files Changed
src/lint.ts— +1,791 / -232 lines (primary implementation, all 7 phases)Greptile Summary
This PR expands the spreadsheet linting system across 7 phases to achieve build-parity with the export pipeline, closing high-impact diagnostic gaps in Categories, Details, Metadata, Translation, and Icons sheets. It also fixes a blank-type defaulting bug in
payloadBuilder.ts(|| "text"→|| "").setLintNote/appendLintNote/clearLintArtifactshelpers with severity-based styling and prefix-scoped clearing; all per-column clearing inlintSheetnow includesclearRangeLintNoteLinesWithPrefixso stale notes are removed on re-lint.lintIconsSheet()with cross-sheet collision detection.appendLintNote; Drive icon info cached at module level to avoid redundant API calls.Confidence Score: 5/5
Safe to merge — all previously flagged blocking issues have been addressed and no new functional defects were found.
All prior review cycle issues are resolved: blank-type defaulting is fixed in both payloadBuilder.ts and the lint metrics builder, appendLintNote is used consistently to prevent note overwrites, checkDuplicateTranslationSlugs is now wired in, Drive icon MIME handling is correct, and validateSheetConsistency clears only data rows. The two remaining findings are a dead filter constant and a minor mismatch between the completion alert text and the actual version key behaviour — neither affects runtime correctness.
No files require special attention; src/lint.ts carries the bulk of the change but is well-structured and the critical call-ordering constraints are consistently applied.
Important Files Changed
Flowchart
%%{init: {'theme': 'neutral'}}%% flowchart TD A[lintAllSheets] --> B[lintCategoriesSheet] A --> C[lintDetailsSheet] A --> D[lintIconsSheet] A --> E[checkCrossSheetIconCollisions] A --> F[checkInlineSvgSizes] A --> G[lintTranslationSheets] A --> H[collectStrictLintMetrics] A --> I[checkTranslationPayloadSizes] A --> J[lintMetadataSheet] A --> K[checkTotalEntityCounts] B --> B1[validatePrimaryLanguageInA1] B --> B2[lintSheet - cols A,B,C] B --> B3[validateCategoryIcons] B --> B4[checkDuplicateCategoryIds - col E] B --> B5[checkSlugCollisions - col A] B --> B6[validateAppliesColumn - col D] B --> B7[checkManualIdHygiene - col E] C --> C1[lintSheet - cols A-F] C --> C2[checkUnreferencedDetails] C --> C3[checkDuplicateDetailIds - col E] C --> C4[checkSlugCollisions - col A] C --> C5[checkManualIdHygiene - col E] G --> G1[validateTranslationHeaders] G --> G2[validateTranslationSheetConsistency] G --> G3[checkTranslationSourceOverwrites] G --> G4[checkDuplicateTranslationSlugs]Prompt To Fix All With AI
Reviews (78): Last reviewed commit: "chore: stop tracking generated codesight..." | Re-trigger Greptile