docs: move and rewrite the image tagging guidance [OD-707] - #2757
Merged
claudiacodacy merged 9 commits intoSep 22, 2026
Merged
claudiacodacy merged 9 commits into
claudiacodacy merged 9 commits into
Conversation
The tagging trade-off sat in an admonition below the tag list, four screens from where the decision is made, and framed the 1,000-tag cap as housekeeping. - Add "How tagging affects your findings" before the setup section, with the rolling-vs-per-release comparison and the consequences the old admonition omitted: dismissals, owners and SLA clocks reset on every new tag. - State what the cap actually does. Reaching it makes Codacy reject image tags it has not seen before, while existing tags carry on being scanned, so the release you just shipped silently stops being covered. Verified against ContainersDAO.scala:70-77 and reference.conf:115. - Add worked pipeline examples for both strategies. Every command was executed, not just written. - Correct two false bullets in the CI/CD section: nothing is detected or picked up automatically, you upload the image and tag you name. The new "#how-tagging-affects-your-findings" anchor is the target the Container Scanning designs link to from the manual setup caption and from all three tag-limit banners. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Contributor
Up to standards ✅🟢 Issues
|
Contributor
|
Overall readability score: 54.1 (🟢 +0.12)
View detailed metrics🟢 - Shows an increase in readability
Averages:
View metric targets
|
Contributor
There was a problem hiding this comment.
Pull Request Overview
No merge-blocking issues were identified. Codacy reports the PR as up to standards, with no new issues or coverage findings. The recommended documentation validation scenarios are not represented by automated tests.
Test suggestions
- Verify the tagging comparison explains rolling and per-release findings behavior, including dismissals, owners, SLA/MTTR, and historical tracking.
- Verify the 1,000-tag limit behavior is documented, including acceptance of existing tags, rejection of unseen tags, and deletion guidance.
- Verify the rolling-tag CI/CD example aliases the built image locally before running upload-sbom.
- Verify the per-release CI/CD example uploads the versioned image tag and explains tag cleanup.
- Verify outdated automatic-detection and automatic-tag-pickup claims are removed or corrected.
- Verify manual upload guidance links to the tagging strategy section.
Prompt proposal for missing tests
Consider implementing these tests if applicable:
1. Verify the tagging comparison explains rolling and per-release findings behavior, including dismissals, owners, SLA/MTTR, and historical tracking.
2. Verify the 1,000-tag limit behavior is documented, including acceptance of existing tags, rejection of unseen tags, and deletion guidance.
3. Verify the rolling-tag CI/CD example aliases the built image locally before running upload-sbom.
4. Verify the per-release CI/CD example uploads the versioned image tag and explains tag cleanup.
5. Verify outdated automatic-detection and automatic-tag-pickup claims are removed or corrected.
6. Verify manual upload guidance links to the tagging strategy section.
Low confidence findings
- Consider adding automated documentation or snippet validation for the tagging guidance so future edits cannot regress the documented workflows and behavior.
TIP Improve review quality by adding custom instructions
TIP How was this review? Give us feedback
Match the convention in codacy-api/examples/uploading-dast-results.md: "Replace the placeholders with your own values" followed by a description list, with the Git provider values in a table. Only gh/gl/bb are listed. The DAST table also carries ghe/gle/bbe, but codacy-cli-v2 documents three values for -p (upload_sbom.go:54), so the enterprise rows are not copied across. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Mirrors codacy-api/examples/uploading-dast-results.md, so container scanning gets the same shape App scanning has: the feature page keeps the concepts, a "!!! note" links out to the API example. Covers uploadImageSbom, listImageTags and deleteImageTag. Delete is worth documenting now because it is the only way to stay under the 1,000-tag cap in CI today: the Cloud CLI's --delete --keep-latest is still an open PR. Contract read from the generated client (SbomService.ts:227-280, :286-345, :395-440) and the handler (SbomFilesHandler.uploadImageSbom): multipart sbom/imageName/tag with optional repositoryName and environment, 204 on success, 400 for the ContainerSbomError family. The cap rejection is not one of those errors, so it falls through to the generic handler rather than the 409 the swagger declares. The page tells readers to match on the message instead of the status. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
codacy-cloud-cli#49, #50 and #52 have merged and ship as 1.12.0 in the pending release PR #54, so the commands are real and the docs no longer have to route everything through the API. codacy-cloud-cli/index.md gains two sections: - "Manage container images" — images, image, --tag, --upload, --delete, and the 100/1000 limit defaults. - "Keep container image tags under the organization limit" — --delete --keep-latest, --dry-run, the JSON shape, and the per-image vs organization-wide caveat the command warns about. container-scanning.md's per-release example now runs the cleanup before the upload, which is the order the backend forces: at the cap the upload is rejected, so cleaning up afterwards strands the organization there. Surface read from src/commands/image.ts and images.ts on origin/main, not from the changeset prose. Token handling confirmed at src/utils/auth.ts:171. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…[OD-707] Two gaps, both raised against the bfi-finance thread in #product-help: that organization is carrying ~1.5M container findings on ~970 of its 1,000 image tags, and nothing in the docs told them what to do about it. "If your pipeline already produces an SBOM" adds the Cloud CLI upload for both strategies, which the mockups draw as a tab but this page only mentioned in passing. No docker tag alias is needed there: --upload attaches a file to a tag and never resolves the image. "Reducing findings on an image that already has many tags" is the recovery path. Switching the tag a pipeline uploads to does nothing on its own, because the tags already stored keep their findings and keep being scanned nightly. Deleting a tag is what removes them: verified through RemovedImageTag -> RemovedImageTagWriterStream -> itemsDAO.deleteContainerScanItemsByImageTag, which deletes rather than closes, and does so asynchronously. Both new sections carry a token pointer, so the snippet harness is clean on every block: the recovery reader arrives from a support conversation rather than from step 1 of the setup page. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
joanasteodoro
approved these changes
Sep 22, 2026
Vale blocks in CI — it runs through reviewdog against the diff, so the lines this PR adds have to be clean even though the files around them are not. I had left the contraction errors on the grounds that Vale is advisory, which docs-edit says but CI does not. .vale.ini settles the underlying conflict with voice.md: the "do not" style is explicitly scoped to the agent instruction files, and docs/** is expected to contract. Also replaces an inline `codacy images gh <organization>` with a fenced block. IgnoredScopes covers code, but the <organization> token inside the span still tripped Vale.Terms and Vale.Spelling in CI, and the fenced form matches the rest of the section anyway. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Both options pointed at #example-pipeline-steps, which covers both, so neither bullet led anywhere specific. The two examples are now sibling #### headings with pinned ids, and each option links to its own. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1.12.0 shipped the commands but 404s on any namespaced image name, which is the usual shape. codacy-cloud-cli#55 fixes the path encoding and publishes as 1.12.1 in the pending release PR #56, so that is the floor the examples here need. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
claudiacodacy
enabled auto-merge (squash)
September 22, 2026 13:53
claudiacodacy
deleted the
docs-move-and-rewrite-the-image-tagging-guidance-and-state-od-707
branch
September 22, 2026 13:54
This branch was previously deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes OD-707. Docs half of OD-679; the wording tracks the final mockups in Figma section
22034:10"Deliverable".docs/security/container-scanning.mddocs/codacy-cloud-cli/index.mddocs/codacy-api/examples/uploading-container-image-sboms.mduploading-dast-results.mdmkdocs.ymlWhat was wrong
The tagging trade-off lived in an
!!! importantblock below the tag list — four screens from where the tag is actually chosen. It omitted the painful consequence (dismissals, owners and SLA clocks reset on every new tag) and framed the 1,000-tag cap as housekeeping.The tagging guidance
New
## How tagging affects your findingssection, placed before the setup instructions. Carries the comparison table from the issue and the two options in the same words the product uses — "One list, kept up to date" / "A separate list per release".### What the image tag limit does. The cap does not reject uploads, it rejects image tags Codacy has not seen before. An org on a rolling tag can sit at 1,000/1,000 indefinitely and never notice; an org tagging per release stops being scanned on its next release while the stale tags keep being scanned, and the only signal is the pipeline error. Read fromContainersDAO.scala:70-77(the write tries anUPDATEfirst and raises only when it touches zero rows) andreference.conf:115.Two false bullets corrected in the CI/CD section: "Images pushed through your pipeline are automatically detected" and "New tags are picked up as they're published". Nothing is detected or picked up — you upload the image and tag you name.
The Cloud CLI container image commands
#49, #50 and #52 have merged and ship as 1.12.0 in the pending release PR #54.
codacy-cloud-cli/index.mdgains two sections:codacy images,codacy image,--tag,--upload,--delete, and the 100/1000 limit defaults.--delete --keep-latest,--dry-run, the--output jsonshape, and the per-image vs organization-wide caveat the command itself warns about.Surface read from
src/commands/image.tsandimages.tsonorigin/main, not from the changeset prose; token handling confirmed atsrc/utils/auth.ts:171.The per-release pipeline example now cleans up before it uploads, which is the order the backend forces: at the cap the upload is rejected, so cleaning up afterwards strands the organization there.
Worked examples
Every command was executed, not just written:
init—bash <(curl …)leaves nocodacy-cli.shbehind, so the next line dies;upload-sbomrefuses withoutinit. The error text on the page is quoted from a real run:No configuration file was found, execute init command first.;docker tagbefore a rolling upload —upload-sbomshells out totrivy image, which silently falls back to the registry, so without the alias a pipeline that built1.4.2scans whatever stale:prodthe registry holds.Structure: consistent with App scanning
app-scanning.mdkeeps concepts and UI, and links out tocodacy-api/examples/*for the runnable API calls. Container scanning now has the same shape:codacy-cloud-cli/index.mdandcodacy-analysis-cli/index.mddocument CLI usage;!!! notelinks out to the new API example page, exactly asapp-scanning.mddoes for ZAP;The provider table lists only
gh/gl/bb. The DAST one also carriesghe/gle/bbe, but both CLIs document three values, so the enterprise rows were not copied across.Things found while writing this
The cap does not return the 409 the swagger declares.
SbomFilesHandler.uploadImageSbommaps theContainerSbomErrorfamily to 400 and everything else to 500.InsertConflict— the cap — is not in that family, so it falls through to the generic branch and is indistinguishable from a server fault. The API page tells readers to match on the messageOrganization has reached the maximum limit of 1000 image SBOMsinstead. Relevant to OD-691, which is specced to add a typed rejection error.Every container-scanning docs link in the SPA is currently broken. They point at
organizations/managing-security-and-risk/#cicd-integrationand#container-scanning. #2756 split that page, and the redirect sends them to/security/— which has neither anchor, so readers land at the top of the Security overview. Confirmed against the built site.#dashboardsurvives because it was pinned. Needs an FE change incodacy-spa; a redirect cannot rescue a fragment.For the bfi-finance conversation
Added after the #product-help thread: that organization is carrying roughly 1.5M container findings across about 970 of its 1,000 image tags, and nothing here told them what to do about it. Two sections close that:
### Reducing findings on an image that already has many tags— the recovery path, which is what a customer already in this position needs. The load-bearing point is that switching the tag your pipeline uploads to does nothing on its own: the tags already stored keep their own findings and keep being scanned every night, so the count does not move until the tags go. Deleting a tag is what removes them — verified throughRemovedImageTag→RemovedImageTagWriterStream→itemsDAO.deleteContainerScanItemsByImageTag, which deletes rather than closes, asynchronously. The section walks through list →--dry-run→ delete, and says to start by finding which images hold the tags, since it is usually a small number of them.#### If your pipeline already produces an SBOM— the Cloud CLI upload for both strategies. The mockups draw this as a tab; this page previously only mentioned--uploadin passing. Worth noting it needs nodocker tagalias, because--uploadattaches the file you name to the tag you name and never resolves the image.Link targets this gives the product
https://docs.codacy.com/security/container-scanning/#how-tagging-affects-your-findingshttps://docs.codacy.com/security/container-scanning/#cicd-integrationhttps://docs.codacy.com/security/container-scanning/https://docs.codacy.com/codacy-api/examples/uploading-container-image-sboms/Checks
mkdocs build --strict— clean, no warnings (validation.anchors: warn).#how-tagging-affects-your-findings,#cicd-integration,#container-scanning,#keep-latest; cross-page links toapi-tokens/#account-api-tokens,using-the-codacy-api/#using-paginationandcodacy-cloud-cli/#keep-latestresolve with their fragments.mkdocs.ymlnav.<!--NOTEheader on the pages touched; no shared includes; no inbound anchor links in-repo; no existing heading reworded, so no anchor retired and no redirect needed. No Self-hosted claim added.SbomService.ts:227-280,:286-345,:395-440) and the Scala handler.initrequirement were executed.docker tagitself was not run (no Docker daemon on this machine) — everything downstream of it was.Microsoft.Contractionson consequence statements about the tag limit. Kept deliberately —.claude/reference/voice.mdsays to avoid contractions in exactly those sentences. Vale is advisory here.Left alone
codacy-cloud-cli/index.mdhas a pre-existing block,codacy issue gh my-org my-repo <issueId>, that is not valid shell —<issueId>parses as a redirect. Predates this PR.## How our container image scanning Worksheading has a stray capital W..jsonwhile it also accepts.xml.Sequencing
The Cloud CLI sections describe 1.12.0, which publishes when codacy-cloud-cli#54 merges. Worth holding this until that release is on npm, or the version note will point at something
npm installcannot get yet.🤖 Generated with Claude Code