Skip to content

Proposal: Probe-Based Authentication Dispatch - #2

Open
rossigee wants to merge 2 commits into
container-registry:mainfrom
rossigee:proposal/probe-based-auth-dispatch
Open

Proposal: Probe-Based Authentication Dispatch#2
rossigee wants to merge 2 commits into
container-registry:mainfrom
rossigee:proposal/probe-based-auth-dispatch

Conversation

@rossigee

@rossigee rossigee commented Jul 22, 2026

Copy link
Copy Markdown

Summary

Proposes replacing Harbor's single-backend auth_mode config switch with per-backend Match() probing, so the dispatcher tries backends in priority order instead of trusting one exclusive mode string.

This was originally proposed directly as code upstream on goharbor/harbor (#23458, recreated as #23483), which was closed without merge for being too large and lacking prior design discussion. This proposal retargets the same idea at container-registry/harbor-next, where the implementation has since been split into four independent, reviewable PRs:

Opening as a draft for early feedback before requesting formal review.

Test plan

N/A — design proposal document only, no code changes.


Summary by cubic

Adds the Probe-Based Authentication Dispatch proposal to replace Harbor’s single auth_mode with per-backend Match() probing and ordered fallback, preventing lockouts and enabling flexible multi-backend auth. The doc also covers fixes for locked-user handling, correct /v2 Basic vs Bearer challenges, and per-user registry proxy credential passthrough with per-scope token caching, with links to the split PRs in container-registry/harbor-next.

  • Refinements
    • Clarified OIDC→DB fallback behavior.
    • Specified token cache key (user+registry/service+repo scope+actions).
    • Documented unauthenticated proxy handling (no token reuse).
    • Probe the requested repository path (not generic /v2/) and tightened action scoping.

Written for commit 232aa74. Summary will update on new commits.

Review in cubic

@coderabbitai

coderabbitai Bot commented Jul 22, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Changes

Repository Metadata Updates

Layer / File(s) Summary
Metadata corrections
ADOPTERS.md, MAINTAINERS.md
Corrects adopter link text and updates Orlin Vasilev’s affiliation from SUSE to SAP.

Arm64 Harbor Support

Layer / File(s) Summary
Arm64 build and publishing proposal
proposals/arm64-support-harbor.md
Documents Arm64 CI enablement, multi-architecture image publishing, binary requirements, testing, and rollout phases.

AI Model Processor

Layer / File(s) Summary
AI artifact processing and APIs
proposals/new/AI-model-processor.md
Defines AI artifact recognition, metadata processing, UI changes, manifest handling, and README, LICENSE, and files APIs.

Proxy Cache Repository Filtering

Layer / File(s) Summary
Proxy cache filtering contract and enforcement
proposals/new/filter_repository_proxycache.md
Defines opt-in repository filters, matching and validation, proxy enforcement, API/UI changes, logging, and compatibility behavior.

Proxy Cache Authentication Path Prefix

Layer / File(s) Summary
Path-aware authentication probe
proposals/new/fix-proxy-cache-auth-path-prefix.md
Describes preserving registry path prefixes during authentication probes and the associated tests.

Garbage Collection Performance

Layer / File(s) Summary
Digest-based tag landing and GC behavior
proposals/new/gc_perf_enhancement.md
Proposes digest-based backend requests for tagged manifests and optional deletion skipping for existing tag links.

Proxy Cache Referrers API

Layer / File(s) Summary
Referrers proxy flow and accessory source tracking
proposals/new/proxy_cache_referer_api.md
Defines upstream referrer retrieval, caching, fallback, merging, pagination, and accessory source tracking.

Single Active Replication

Layer / File(s) Summary
Single active policy execution
proposals/new/single-active-replication.md
Defines a policy option, skipped executions when another execution is running, database storage, and API payloads.

Playwright UI E2E Migration

Layer / File(s) Summary
Playwright execution and migration plan
proposals/new/ui-e2e-migrate-playwright.md
Documents Playwright containers, execution commands, filtering, debugging artifacts, orchestration, and migration phases.

Valkey Runtime Migration

Layer / File(s) Summary
Valkey phase-one runtime and build migration
proposals/new/valkey.md
Defines the Redis-to-Valkey runtime swap, image and build updates, compatibility requirements, testing, and deferred work.

Probe-Based Authentication Dispatch

Layer / File(s) Summary
Authentication matching and registry probes
proposals/probe-based-auth-dispatch.md
Defines per-backend matching, authentication fallback, registry probing, token caching, and locked-user handling.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly and concisely summarizes the main design proposal about probe-based authentication dispatch.
Description check ✅ Passed The description matches the proposal and accurately explains the intended auth dispatch change and related split PRs.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
✨ Simplify code
  • Create PR with simplified code

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.

@gitar-bot

gitar-bot Bot commented Jul 22, 2026

Copy link
Copy Markdown

Gitar is working

Gitar

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Note

Due to the large number of review comments, Critical severity comments were prioritized as inline comments.

🟠 Major comments (29)
proposals/new/proxy_cache_referer_api.md-87-87 (1)

87-87: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Do not treat all existing accessory records as local.

The merge logic filters by source, but defaulting every migrated row to local misclassifies previously cached upstream accessories and can produce duplicates or incorrect provenance indefinitely. Preserve an unknown state, derive provenance where possible, or make merging digest-based and independent of this backfill assumption.

Also applies to: 140-146

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/proxy_cache_referer_api.md` at line 87, Update the accessory
migration/backfill and merge logic around the source field so existing records
are not all classified as "local". Preserve an "unknown" source when provenance
cannot be determined, derive the actual source where available, and ensure
upstream/local merging does not duplicate records or rely on the incorrect
backfill assumption; apply the same correction to the related logic at the
referenced merge section.
proposals/new/proxy_cache_referer_api.md-104-111 (1)

104-111: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Define pagination over the merged result, not only on the last upstream page.

Appending local referrers to the final upstream page means clients that stop after the first page never see local entries. The implementation must merge, deduplicate, order, and paginate the combined result while preserving correct Link metadata.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/proxy_cache_referer_api.md` around lines 104 - 111, Implement
ProxyReferrerMiddleware pagination over the complete merged referrer set rather
than appending local referrers only to the upstream’s final page. After
retrieving upstream or cached referrers, merge and deduplicate them with local
referrers, apply the requested ordering and pagination to the combined result,
and generate Link metadata from the merged pagination state.
proposals/probe-based-auth-dispatch.md-111-122 (1)

111-122: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Preserve the registry path prefix in the auth probe. GET /v2/ only works for root-mounted registries; path-prefixed endpoints need <configured-prefix>/v2/ (or equivalent URL-path derivation) or proxy auth will fail the same way as the path-prefix bug in proposals/new/fix-proxy-cache-auth-path-prefix.md.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/probe-based-auth-dispatch.md` around lines 111 - 122, Update the
Registry Proxy Auth Probe request path to derive and preserve the configured
registry path prefix, issuing the probe against <configured-prefix>/v2/ (or the
equivalent URL-path derivation) instead of always using /v2/. Keep the existing
Bearer, Basic, and anonymous response handling unchanged.
proposals/probe-based-auth-dispatch.md-104-109 (1)

104-109: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Bind cached tokens to the authenticated principal and action scope. In proposals/probe-based-auth-dispatch.md:104-109, 219-222, repository-only caching can let two users on the same repo share a token, and repo-level scoping still mixes pull/push/delete permissions. Include the principal and requested actions in the cache key, or spell out why token sharing is safe.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/probe-based-auth-dispatch.md` around lines 104 - 109, Update the
token-caching guidance in the “Registry Proxy User Credential Passthrough”
section and its corresponding section to bind cached tokens to the authenticated
principal, repository scope, and requested actions. Ensure pull, push, and
delete permissions cannot share a cache entry across users or action scopes, or
explicitly document why such sharing is safe.
proposals/new/proxy_cache_referer_api.md-134-138 (1)

134-138: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Fix the migration SQL syntax. IF NOT EXISTS must follow ADD COLUMN in PostgreSQL; this form will fail as written.

Proposed correction
-ALTER TABLE artifact_accessory IF NOT EXISTS ADD COLUMN source VARCHAR(64) DEFAULT 'local' NOT NULL;
+ALTER TABLE artifact_accessory ADD COLUMN IF NOT EXISTS source VARCHAR(64) NOT NULL DEFAULT 'local';
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/proxy_cache_referer_api.md` around lines 134 - 138, Update the
artifact_accessory ALTER TABLE statement so IF NOT EXISTS follows ADD COLUMN,
preserving the source column definition, default value, and NOT NULL constraint.
proposals/new/proxy_cache_referer_api.md-113-127 (1)

113-127: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Expose the upstream status in ListReferrers. The middleware needs to distinguish 404 from other failures to honor the passthrough/fallback behavior, so return the HTTP status explicitly or wrap the error in a typed status-bearing error.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/proxy_cache_referer_api.md` around lines 113 - 127, Update the
default RegistryClient.ListReferrers implementation to expose the upstream HTTP
status, either by returning it explicitly or by wrapping failures in the
established typed status-bearing error; preserve successful index and header
results while allowing callers to distinguish 404 from other failures for
passthrough/fallback handling.
proposals/new/fix-proxy-cache-auth-path-prefix.md-1-1 (1)

1-1: 🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

Make the registry auth probe path-prefix-aware.

The /v2/ probe breaks registries served under a URL prefix.

  • proposals/new/fix-proxy-cache-auth-path-prefix.md#49-63: derive the auth probe prefix from the configured registry URL instead of splitting on the first /v2/.
  • proposals/probe-based-auth-dispatch.md#111-122: build the probe from the configured endpoint too; hardcoding GET /v2/ will miss the prefix for proxy-backed registries.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/fix-proxy-cache-auth-path-prefix.md` at line 1, Update the
proposal’s auth probe guidance to derive the probe path prefix from the
configured registry URL/endpoint, rather than splitting at the first “/v2/” or
hardcoding “GET /v2/”. Apply this consistently to the registry auth probe and
probe-based auth dispatch sections so proxy-backed registries with URL path
prefixes are addressed.
proposals/new/fix-proxy-cache-auth-path-prefix.md-49-63 (1)

49-63: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Don't split on the first /v2/ segment
A registry path prefix can also contain /v2/, so strings.Index can pick the wrong boundary and build the auth probe against the wrong URL. Derive the prefix from the configured endpoint instead, and add a regression test with a prefix like /artifactory/v2/docker-virtual.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/fix-proxy-cache-auth-path-prefix.md` around lines 49 - 63,
Update the auth probe URL construction in the authorizer flow to derive the
registry path prefix from the configured endpoint rather than splitting the
outgoing request path at the first “/v2/” occurrence. Preserve prefixes
containing “/v2/”, such as “/artifactory/v2/docker-virtual”, and add a
regression test covering that configured endpoint and the resulting probe URL.
proposals/probe-based-auth-dispatch.md-54-62 (1)

54-62: 🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

Define the backend order and fallthrough criteria.
In the dispatch section, priority order is still underspecified, and Fail → continue in the OIDC flow doesn’t separate invalid credentials from transient backend outages. Spell out the exact backend precedence and only continue on recoverable/unavailable errors; rejected credentials should stop the chain.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/probe-based-auth-dispatch.md` around lines 54 - 62, Clarify the
dispatch section by explicitly listing the backend precedence used by the
dispatcher. Define fallthrough so only recoverable or unavailable backend errors
continue to the next backend, while invalid or rejected credentials terminate
dispatch and return the authentication failure; preserve fatal Match() errors as
immediate failures.
proposals/new/gc_perf_enhancement.md-40-43 (1)

40-43: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Define atomicity and recovery for tag persistence versus the backend push.

The database write and digest-based registry PUT are separate operations. If the database succeeds first and the backend push fails, Harbor can expose a tag pointing to a nonexistent digest; if the backend succeeds and the database write fails, the manifest becomes orphaned. “Consistency at the DB level” does not solve this cross-system failure window. Specify rollback/compensating deletion, idempotent retry, reconciliation, and the success-response ordering before claiming no breaking changes.

Also applies to: 67-71

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/gc_perf_enhancement.md` around lines 40 - 43, Define the
atomicity and recovery protocol for tag persistence and the digest-based backend
PUT in the Harbor proxy flow. Specify operation ordering before returning
success, compensating deletion or rollback for partial failures, idempotent
retries, and reconciliation for unresolved states; update the claims about
consistency and breaking changes to reflect these guarantees.
proposals/new/single-active-replication.md-98-117 (1)

98-117: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Use the actual API paths in the examples.

The repository contract documents /api/replication/policies and /api/replication/policies/:id, while these examples omit the /api prefix. Document the externally routed paths to avoid implementing or testing the wrong endpoints.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/single-active-replication.md` around lines 98 - 117, Update the
Create Policy and Update Policy REST examples to use the repository’s externally
routed paths: `/api/replication/policies` and `/api/replication/policies/1`,
preserving the existing request bodies.
proposals/new/single-active-replication.md-56-58 (1)

56-58: 🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift

Make the single-active check atomic.

The proposed check-then-create flow is only best effort: two Core instances can both observe no running execution and then both create active executions. Checking only running also leaves queued/pending executions outside the exclusion. Use an atomic database claim/lock or equivalent coordination mechanism, and explicitly define which execution states count as active.

Also applies to: 73-76

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/single-active-replication.md` around lines 56 - 58, Update the
single-active replication design to use an atomic database claim/lock or
equivalent coordination mechanism around execution creation, preventing
concurrent Core instances from both claiming the same policy. Explicitly define
the execution states considered active, including queued/pending states as
appropriate, and ensure the claim is released when the execution finishes or is
cancelled.
proposals/new/single-active-replication.md-81-94 (1)

81-94: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Define a non-null default for the new column.

ADD COLUMN ... boolean leaves existing policies as NULL, which conflicts with the stated default of unchecked and makes legacy records ambiguous. Use NOT NULL DEFAULT FALSE or specify an explicit backfill and how NULL is handled by the ORM/API.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/single-active-replication.md` around lines 81 - 94, Update the
single_active_replication schema migration and Policy model behavior so the new
field is non-null and defaults to false for existing and newly created policies.
Use a NOT NULL DEFAULT FALSE column definition, ensuring ORM/API handling
preserves false rather than allowing NULL.
proposals/new/single-active-replication.md-41-44 (1)

41-44: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Clarify whether overlapping executions are skipped or deferred.

Lines 41–44 say a task will wait until the current replication finishes, but lines 73–76 create a record marked skipped. A skipped execution is permanently dropped, not delayed. Define the intended behavior and document whether a later retry or scheduler run is guaranteed.

Also applies to: 73-76

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/single-active-replication.md` around lines 41 - 44, Clarify the
Single Active Replication behavior consistently: specify whether overlapping
replication tasks are deferred until the active task finishes or permanently
skipped when the execution record is marked skipped. Update the descriptions
around the option behavior and the skipped-record flow so they state the exact
outcome, including whether a later retry or scheduler run is guaranteed.
proposals/new/AI-model-processor.md-87-89 (1)

87-89: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Clarify that these are new API endpoints.

The proposal says no new APIs are needed, but then introduces new /additions/readme, /additions/license, and /additions/files routes. Treat these as a new API surface and document route registration, authorization, compatibility, and error behavior, or explain precisely how they extend an existing API.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/AI-model-processor.md` around lines 87 - 89, Update the API
section of the proposal to explicitly classify the /additions/readme,
/additions/license, and /additions/files routes as new API endpoints,
documenting their registration, authorization, compatibility, and error
behavior; alternatively, precisely explain how each route extends the existing
artifact “addition” API.
proposals/new/AI-model-processor.md-261-335 (1)

261-335: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Make the files-list response a valid, unambiguous JSON contract.

The prose says the endpoint returns a JSON object, but the example is an array and contains trailing commas, so it is not valid JSON. Choose one response shape, remove the trailing commas, and define the semantics of recursive directories and size.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/AI-model-processor.md` around lines 261 - 335, Update the
files-list response contract in the documented endpoint section to choose and
consistently describe either an object or array shape, matching the example and
prose. Remove all trailing commas so the example is valid JSON, and explicitly
define recursive directory representation and the meaning and units of file size
for entries returned by the endpoint.
proposals/new/AI-model-processor.md-20-22 (1)

20-22: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Define the supported Model Spec versions and fallback behavior. The proposal says manifests may differ by spec version, but it never states which versions are supported or how Harbor should handle unknown/unsupported artifacts. Spell out version detection, parser dispatch, and whether parsing fails or degrades for mismatched inputs.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/AI-model-processor.md` around lines 20 - 22, Update the
proposal’s AI model metadata parsing section to define the supported Model Spec
versions, how the manifest version is detected, and how parsing is dispatched to
the appropriate version-specific parser. Specify Harbor’s behavior for unknown
or unsupported versions, including whether it rejects parsing or falls back to
degraded handling.
proposals/new/AI-model-processor.md-178-195 (1)

178-195: 🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

Define safe tar extraction semantics. README and LICENSE are described as *.tar layers, but the API returns plain text. Specify which archive member is read, how duplicate or missing members are handled, accepted encodings, size limits, and how path-traversal/symlink entries are rejected for untrusted artifacts.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/AI-model-processor.md` around lines 178 - 195, Expand the
README API specification to define safe extraction from the identified tar
layer: select the exact README member, specify behavior for duplicate or missing
members, document accepted text encodings and response size limits, and reject
path-traversal or symlink entries when processing untrusted artifacts. Anchor
these rules to the README layer characteristics and GET endpoint while
preserving the documented status codes.
proposals/arm64-support-harbor.md-59-61 (1)

59-61: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Define the offline installer architecture contract.

An offline installer cannot resolve a registry manifest tag without access to the registry. Choose and document whether bundles contain both architectures or whether installation detects the host architecture and selects a per-architecture image set.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/arm64-support-harbor.md` around lines 59 - 61, Clarify the offline
installer contract in the architecture and packaging guidance: specify whether
each bundle includes both amd64 and arm64 images or whether installation detects
the host architecture and selects a per-architecture image set. Ensure the
documented approach does not rely on resolving unified registry manifest tags
without registry access, and align the offline installer package instructions
with that choice.
proposals/arm64-support-harbor.md-75-85 (1)

75-85: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Resolve the Trivy Adapter build classification.

The proposal describes the Trivy Adapter both as a binary fetched by Dockerfile.binary and as an adapter built from source with GOARCH. These are different build contracts; specify the exact source, build, and artifact flow before implementation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/arm64-support-harbor.md` around lines 75 - 85, Clarify the Trivy
Adapter entry in the Binary Dependencies section by choosing and documenting one
build contract: identify whether the adapter binary is fetched from an upstream
release or compiled from source, then specify its source location, GOARCH-aware
build step, and resulting artifact flow through Dockerfile.binary. Remove or
revise the conflicting classification so the proposal presents a single
unambiguous flow.
proposals/new/ui-e2e-migrate-playwright.md-275-283 (1)

275-283: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Make sequential execution effective inside the container.

The Docker commands do not pass CI, so process.env.CI may be unset and workers becomes Playwright’s default rather than 1. That reintroduces the Docker-daemon and port-collision problems this section says it prevents. Pass -e CI=true, or invoke --workers=1 explicitly.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/ui-e2e-migrate-playwright.md` around lines 275 - 283, Update
the documented Docker test commands in the Playwright migration configuration so
containerized runs explicitly enforce sequential execution, either by passing
CI=true into the container or by adding Playwright’s --workers=1 option. Keep
the existing playwright.config.ts CI-based behavior unchanged for other
environments.
proposals/new/ui-e2e-migrate-playwright.md-52-55 (1)

52-55: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Remove hardcoded credentials from the image and examples.

COSIGN_PASSWORD, the NSS database password, and Harbor passwords are committed as Harbor12345; the first two are also baked into image layers. This contradicts the credential-safety claim at Lines 288-290. Use CI secret injection or ephemeral test credentials, and never publish literal passwords in runnable commands.

Also applies to: 109-112, 127-133, 151-159

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/ui-e2e-migrate-playwright.md` around lines 52 - 55, Remove all
literal Harbor12345 credentials from the Dockerfile and examples, including
COSIGN_PASSWORD, NSS database, and Harbor password values. Update the affected
commands and environment configuration to consume CI-injected secrets or
generate ephemeral test credentials at runtime, ensuring no password is baked
into image layers or shown in runnable examples.
proposals/new/ui-e2e-migrate-playwright.md-114-115 (1)

114-115: 🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

Clarify the Docker isolation model.

Mounting /var/run/docker.sock uses the host Docker daemon and gives the container effective control over it; VOLUME /var/lib/docker does not create Docker-in-Docker. Either document this trust boundary and remove the misleading volume, or run a genuinely isolated daemon in a dedicated test runner.

Also applies to: 127-128

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/ui-e2e-migrate-playwright.md` around lines 114 - 115, Clarify
the Docker isolation model in the Docker setup: remove the misleading
`/var/lib/docker` volume unless a genuinely isolated Docker daemon is started,
and document that mounting `/var/run/docker.sock` uses the host daemon and
grants the container effective control over it. Apply the same correction to the
corresponding setup at the other referenced location.
proposals/new/ui-e2e-migrate-playwright.md-288-300 (1)

288-300: 🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

Add artifact redaction and retention controls.

Environment-variable injection and GitHub masking do not make screenshots, videos, traces, or network artifacts safe by themselves. Since this proposal explicitly captures browser and request/response evidence, define redaction, access control, retention, and cleanup requirements before enabling these artifacts in CI. (playwright.dev)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/ui-e2e-migrate-playwright.md` around lines 288 - 300, Expand
the Credential Safety section around the Playwright defineConfig artifact
settings to specify redaction of sensitive data, restricted access to captured
artifacts, explicit retention limits, and CI cleanup requirements. Ensure these
controls apply to screenshots, videos, traces, and network/request-response
evidence before enabling artifact capture, rather than relying only on
environment variables and GitHub masking.
proposals/new/ui-e2e-migrate-playwright.md-30-30 (1)

30-30: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Install or explicitly exclude every CLI required by the proposal.

The Dockerfile installs docker, curl, and jq, but not helm, cosign, notation, or oras; the commented COPY does not provide them either. Any migrated test invoking those tools will fail inside the image.

Also applies to: 90-97

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/ui-e2e-migrate-playwright.md` at line 30, Update the proposed
container image setup to install every CLI required by the migration—helm,
cosign, notation, and oras in addition to docker, curl, and jq—or explicitly
remove those tools from the proposal and any dependent tests. Ensure the active
Dockerfile commands, rather than the commented COPY, provide all CLIs that
migrated tests invoke.
proposals/new/ui-e2e-migrate-playwright.md-80-83 (1)

80-83: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Use HTTPS and a scoped keyring for the Chrome repo Remove --no-check-certificate, avoid the plain-HTTP Google repo, and import the signing key into a dedicated keyring with signed-by instead of apt-key.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/ui-e2e-migrate-playwright.md` around lines 80 - 83, Update the
Chrome repository setup command to remove wget’s --no-check-certificate, fetch
the signing key over HTTPS into a dedicated keyring, and configure the
repository URL with HTTPS plus the matching signed-by option. Remove the apt-key
usage and ensure the keyring directory and file are created as needed before
apt-get update.
proposals/new/ui-e2e-migrate-playwright.md-46-46 (1)

46-46: 🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

Use a supported, pinned toolchain. ubuntu:20.04 and Node 20 are outside Playwright’s current support matrix (Ubuntu 22.04+ and Node 22/24/26), so this image will be off-matrix; switch to a supported base image and pin npm/Playwright versions instead of npm@latest to keep CI reproducible.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/ui-e2e-migrate-playwright.md` at line 46, Update the proposed
Playwright toolchain around the Ubuntu base image and Node setup to use a
currently supported Ubuntu release and supported Node version, then replace
npm@latest and any unpinned Playwright dependency with explicitly pinned
versions. Keep the resulting image and package versions reproducible and within
Playwright’s support matrix.
proposals/new/valkey.md-105-108 (1)

105-108: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Gate in-place volume reuse on a versioned migration procedure.

The proposal promises an upgrade that reuses the existing data volume before identifying the bundled Redis version and target Valkey version. Valkey documents compatible persistence formats for Redis OSS <=7.2, but Redis CE 7.4+ data files are not compatible; physical migration also requires quiescing writers, taking a snapshot, and validating the restored dataset. (valkey.io)

Make this conditional on an explicit source/target version matrix, backup and rollback steps, and verification of both cache data and job queues. Otherwise remove “reusing the existing data volume” from the supported Phase 1 upgrade path.

Suggested wording
-- In-place upgrade from a prior Harbor release that used internal `redis-photon`, reusing the existing data volume.
+- In-place upgrade only for explicitly validated Redis/Valkey version pairs, after backup, writer quiescence, and restore verification; otherwise use the documented logical migration or cache reset path.

Also applies to: 187-194

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/valkey.md` around lines 105 - 108, Revise the Phase 1 upgrade
claims in the proposal to make existing data-volume reuse conditional on an
explicit source/target Redis and Valkey version matrix, including compatibility
boundaries. Add required writer quiescence, backup/snapshot, restore validation,
rollback, and verification steps for cache data and job queues; otherwise remove
the in-place volume reuse scenario from the supported upgrade paths.

Source: MCP tools

proposals/new/valkey.md-58-66 (1)

58-66: 🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift

Provide a transition plan for the image rename.

Changing goharbor/redis-photon to goharbor/valkey-photon breaks exact-image references in air-gapped bundles, mirrors, custom compose files, admission policies, and deployment automation, even though Harbor’s logical configuration keys remain named redis. Publish a temporary compatibility tag/alias or explicitly document this as an operational breaking change with a preflight and migration procedure.

Also applies to: 80-86

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/valkey.md` around lines 58 - 66, Add a transition plan to the
image-rename proposal covering exact-image references in air-gapped bundles,
mirrors, custom compose files, admission policies, and deployment automation.
Specify either a temporary compatibility alias from goharbor/redis-photon to
goharbor/valkey-photon or clearly document the rename as an operational breaking
change, including preflight checks and migration steps while preserving Harbor
configuration keys named redis.
🟡 Minor comments (6)
proposals/new/filter_repository_proxycache.md-91-95 (1)

91-95: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Correct the doublestar example.

^library/** is not a valid equivalent of the stated doublestar pattern: the leading ^ is treated literally and can cause every repository to be rejected. Use library/**, or change the kind to regex and use ^library/.*$.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/filter_repository_proxycache.md` around lines 91 - 95, Correct
the proxy_cache_filter example by removing the leading ^ while keeping
proxy_cache_filter_kind set to doublestar, so the pattern is library/**. Do not
use regex syntax unless also changing the filter kind to regex.
proposals/new/gc_perf_enhancement.md-125-129 (1)

125-129: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the typo in the future-work list.

Change “Code impletation bases on the proposed mentioned above” to a grammatically correct sentence such as “Implement the code based on the proposal above.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/gc_perf_enhancement.md` around lines 125 - 129, Correct the
first item under the “Future Work” section by replacing the misspelled,
ungrammatical wording with a clear sentence such as “Implement the code based on
the proposal above.”

Source: Linters/SAST tools

proposals/new/single-active-replication.md-9-9 (1)

9-9: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the proposal wording and typos.

Correct adds an option to adds an option, use Non-Goals, capitalize the sentence beginning with if, and fix shceduled-replication to scheduled-replication.

Also applies to: 33-33, 58-58, 113-113

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/single-active-replication.md` at line 9, Correct the proposal
wording and typos: change “adds an option,” rename “Non-goals” to “Non-Goals,”
capitalize the sentence beginning with “if,” and replace every occurrence of
“shceduled-replication” with “scheduled-replication,” including the referenced
sections.

Source: Linters/SAST tools

proposals/new/single-active-replication.md-53-60 (1)

53-60: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use proposed, not completed, terminology.

This PR is a design proposal with no implementation changes, but this section says features were “Added” and “Implemented.” Rename the section to “Proposed Changes” and use future tense to avoid implying that the UI, schema, and runtime behavior already exist.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/single-active-replication.md` around lines 53 - 60, Rename the
“Changes Made” section to “Proposed Changes” and rewrite its bullets in future
tense, including the UI checkbox, best-effort execution check, single-active
behavior, policy model flag, and database column, so the proposal does not imply
these changes are implemented.
proposals/arm64-support-harbor.md-111-117 (1)

111-117: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Fix the matrix example syntax. arch:amd64 and arch:arm64 need a space after :; otherwise the include entries won’t define arch as intended.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/arm64-support-harbor.md` around lines 111 - 117, Correct the
strategy matrix entries by adding a space after the colon in both arch mappings,
changing the include values to valid YAML key-value syntax while preserving
their existing amd64 and arm64 values.
proposals/new/ui-e2e-migrate-playwright.md-135-140 (1)

135-140: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Persist the HTML report volume.

This command mounts /app/test-results but runs the HTML reporter, whose default output is /app/playwright-report; the report will disappear when the container exits. Mount /app/playwright-report or set PLAYWRIGHT_HTML_OUTPUT_DIR to the mounted directory. (playwright.dev)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/ui-e2e-migrate-playwright.md` around lines 135 - 140, Update
the “Run tests with HTML report” Docker command so the Playwright HTML report
output at /app/playwright-report persists after the container exits, either by
mounting that path to a host directory or by setting PLAYWRIGHT_HTML_OUTPUT_DIR
to the existing mounted test-results directory.
🧹 Nitpick comments (2)
proposals/new/valkey.md (2)

70-76: 🩺 Stability & Availability | 🔵 Trivial | 🏗️ Heavy lift

Expand the runtime acceptance matrix beyond installation success.

The compatibility claim depends on more than preserving redis.conf paths. Test the actual entrypoint, health checks, password authentication, persistence/restart behavior, shutdown signals, CLI references, and Harbor jobservice queue processing with the pinned Valkey image.

Also applies to: 101-108

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/valkey.md` around lines 70 - 76, Expand the phase 1 runtime
acceptance criteria to test the pinned valkey-photon image beyond installation:
verify the entrypoint, health checks, password authentication, persistence
across restart, shutdown signal handling, CLI references, and Harbor jobservice
queue processing. Add these scenarios to the acceptance matrix while preserving
the documented compatibility expectations and image/process naming.

23-27: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Scope the licensing rationale to Harbor’s exact Redis version.

The proposal should distinguish Redis OSS <=7.2 (BSD-3-Clause) from Redis 7.4/8.x licensing; current Redis also offers AGPLv3 from Redis 8 onward. Tie the decision to the exact version Harbor currently bundles and the target licensing requirements, rather than describing the upstream runtime generically. (redis.io)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@proposals/new/valkey.md` around lines 23 - 27, The licensing rationale in the
Valkey migration proposal should identify the exact Redis version Harbor
currently bundles and scope the license comparison to that version. Distinguish
Redis OSS ≤7.2 under BSD-3-Clause from Redis 7.4 and 8.x licensing, including
AGPLv3 availability from Redis 8 onward, and connect the migration decision to
Harbor’s target licensing requirements rather than describing Redis generically.

Source: MCP tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Major comments:
In `@proposals/arm64-support-harbor.md`:
- Around line 59-61: Clarify the offline installer contract in the architecture
and packaging guidance: specify whether each bundle includes both amd64 and
arm64 images or whether installation detects the host architecture and selects a
per-architecture image set. Ensure the documented approach does not rely on
resolving unified registry manifest tags without registry access, and align the
offline installer package instructions with that choice.
- Around line 75-85: Clarify the Trivy Adapter entry in the Binary Dependencies
section by choosing and documenting one build contract: identify whether the
adapter binary is fetched from an upstream release or compiled from source, then
specify its source location, GOARCH-aware build step, and resulting artifact
flow through Dockerfile.binary. Remove or revise the conflicting classification
so the proposal presents a single unambiguous flow.

In `@proposals/new/AI-model-processor.md`:
- Around line 87-89: Update the API section of the proposal to explicitly
classify the /additions/readme, /additions/license, and /additions/files routes
as new API endpoints, documenting their registration, authorization,
compatibility, and error behavior; alternatively, precisely explain how each
route extends the existing artifact “addition” API.
- Around line 261-335: Update the files-list response contract in the documented
endpoint section to choose and consistently describe either an object or array
shape, matching the example and prose. Remove all trailing commas so the example
is valid JSON, and explicitly define recursive directory representation and the
meaning and units of file size for entries returned by the endpoint.
- Around line 20-22: Update the proposal’s AI model metadata parsing section to
define the supported Model Spec versions, how the manifest version is detected,
and how parsing is dispatched to the appropriate version-specific parser.
Specify Harbor’s behavior for unknown or unsupported versions, including whether
it rejects parsing or falls back to degraded handling.
- Around line 178-195: Expand the README API specification to define safe
extraction from the identified tar layer: select the exact README member,
specify behavior for duplicate or missing members, document accepted text
encodings and response size limits, and reject path-traversal or symlink entries
when processing untrusted artifacts. Anchor these rules to the README layer
characteristics and GET endpoint while preserving the documented status codes.

In `@proposals/new/fix-proxy-cache-auth-path-prefix.md`:
- Line 1: Update the proposal’s auth probe guidance to derive the probe path
prefix from the configured registry URL/endpoint, rather than splitting at the
first “/v2/” or hardcoding “GET /v2/”. Apply this consistently to the registry
auth probe and probe-based auth dispatch sections so proxy-backed registries
with URL path prefixes are addressed.
- Around line 49-63: Update the auth probe URL construction in the authorizer
flow to derive the registry path prefix from the configured endpoint rather than
splitting the outgoing request path at the first “/v2/” occurrence. Preserve
prefixes containing “/v2/”, such as “/artifactory/v2/docker-virtual”, and add a
regression test covering that configured endpoint and the resulting probe URL.

In `@proposals/new/gc_perf_enhancement.md`:
- Around line 40-43: Define the atomicity and recovery protocol for tag
persistence and the digest-based backend PUT in the Harbor proxy flow. Specify
operation ordering before returning success, compensating deletion or rollback
for partial failures, idempotent retries, and reconciliation for unresolved
states; update the claims about consistency and breaking changes to reflect
these guarantees.

In `@proposals/new/proxy_cache_referer_api.md`:
- Line 87: Update the accessory migration/backfill and merge logic around the
source field so existing records are not all classified as "local". Preserve an
"unknown" source when provenance cannot be determined, derive the actual source
where available, and ensure upstream/local merging does not duplicate records or
rely on the incorrect backfill assumption; apply the same correction to the
related logic at the referenced merge section.
- Around line 104-111: Implement ProxyReferrerMiddleware pagination over the
complete merged referrer set rather than appending local referrers only to the
upstream’s final page. After retrieving upstream or cached referrers, merge and
deduplicate them with local referrers, apply the requested ordering and
pagination to the combined result, and generate Link metadata from the merged
pagination state.
- Around line 134-138: Update the artifact_accessory ALTER TABLE statement so IF
NOT EXISTS follows ADD COLUMN, preserving the source column definition, default
value, and NOT NULL constraint.
- Around line 113-127: Update the default RegistryClient.ListReferrers
implementation to expose the upstream HTTP status, either by returning it
explicitly or by wrapping failures in the established typed status-bearing
error; preserve successful index and header results while allowing callers to
distinguish 404 from other failures for passthrough/fallback handling.

In `@proposals/new/single-active-replication.md`:
- Around line 98-117: Update the Create Policy and Update Policy REST examples
to use the repository’s externally routed paths: `/api/replication/policies` and
`/api/replication/policies/1`, preserving the existing request bodies.
- Around line 56-58: Update the single-active replication design to use an
atomic database claim/lock or equivalent coordination mechanism around execution
creation, preventing concurrent Core instances from both claiming the same
policy. Explicitly define the execution states considered active, including
queued/pending states as appropriate, and ensure the claim is released when the
execution finishes or is cancelled.
- Around line 81-94: Update the single_active_replication schema migration and
Policy model behavior so the new field is non-null and defaults to false for
existing and newly created policies. Use a NOT NULL DEFAULT FALSE column
definition, ensuring ORM/API handling preserves false rather than allowing NULL.
- Around line 41-44: Clarify the Single Active Replication behavior
consistently: specify whether overlapping replication tasks are deferred until
the active task finishes or permanently skipped when the execution record is
marked skipped. Update the descriptions around the option behavior and the
skipped-record flow so they state the exact outcome, including whether a later
retry or scheduler run is guaranteed.

In `@proposals/new/ui-e2e-migrate-playwright.md`:
- Around line 275-283: Update the documented Docker test commands in the
Playwright migration configuration so containerized runs explicitly enforce
sequential execution, either by passing CI=true into the container or by adding
Playwright’s --workers=1 option. Keep the existing playwright.config.ts CI-based
behavior unchanged for other environments.
- Around line 52-55: Remove all literal Harbor12345 credentials from the
Dockerfile and examples, including COSIGN_PASSWORD, NSS database, and Harbor
password values. Update the affected commands and environment configuration to
consume CI-injected secrets or generate ephemeral test credentials at runtime,
ensuring no password is baked into image layers or shown in runnable examples.
- Around line 114-115: Clarify the Docker isolation model in the Docker setup:
remove the misleading `/var/lib/docker` volume unless a genuinely isolated
Docker daemon is started, and document that mounting `/var/run/docker.sock` uses
the host daemon and grants the container effective control over it. Apply the
same correction to the corresponding setup at the other referenced location.
- Around line 288-300: Expand the Credential Safety section around the
Playwright defineConfig artifact settings to specify redaction of sensitive
data, restricted access to captured artifacts, explicit retention limits, and CI
cleanup requirements. Ensure these controls apply to screenshots, videos,
traces, and network/request-response evidence before enabling artifact capture,
rather than relying only on environment variables and GitHub masking.
- Line 30: Update the proposed container image setup to install every CLI
required by the migration—helm, cosign, notation, and oras in addition to
docker, curl, and jq—or explicitly remove those tools from the proposal and any
dependent tests. Ensure the active Dockerfile commands, rather than the
commented COPY, provide all CLIs that migrated tests invoke.
- Around line 80-83: Update the Chrome repository setup command to remove wget’s
--no-check-certificate, fetch the signing key over HTTPS into a dedicated
keyring, and configure the repository URL with HTTPS plus the matching signed-by
option. Remove the apt-key usage and ensure the keyring directory and file are
created as needed before apt-get update.
- Line 46: Update the proposed Playwright toolchain around the Ubuntu base image
and Node setup to use a currently supported Ubuntu release and supported Node
version, then replace npm@latest and any unpinned Playwright dependency with
explicitly pinned versions. Keep the resulting image and package versions
reproducible and within Playwright’s support matrix.

In `@proposals/new/valkey.md`:
- Around line 105-108: Revise the Phase 1 upgrade claims in the proposal to make
existing data-volume reuse conditional on an explicit source/target Redis and
Valkey version matrix, including compatibility boundaries. Add required writer
quiescence, backup/snapshot, restore validation, rollback, and verification
steps for cache data and job queues; otherwise remove the in-place volume reuse
scenario from the supported upgrade paths.
- Around line 58-66: Add a transition plan to the image-rename proposal covering
exact-image references in air-gapped bundles, mirrors, custom compose files,
admission policies, and deployment automation. Specify either a temporary
compatibility alias from goharbor/redis-photon to goharbor/valkey-photon or
clearly document the rename as an operational breaking change, including
preflight checks and migration steps while preserving Harbor configuration keys
named redis.

In `@proposals/probe-based-auth-dispatch.md`:
- Around line 111-122: Update the Registry Proxy Auth Probe request path to
derive and preserve the configured registry path prefix, issuing the probe
against <configured-prefix>/v2/ (or the equivalent URL-path derivation) instead
of always using /v2/. Keep the existing Bearer, Basic, and anonymous response
handling unchanged.
- Around line 104-109: Update the token-caching guidance in the “Registry Proxy
User Credential Passthrough” section and its corresponding section to bind
cached tokens to the authenticated principal, repository scope, and requested
actions. Ensure pull, push, and delete permissions cannot share a cache entry
across users or action scopes, or explicitly document why such sharing is safe.
- Around line 54-62: Clarify the dispatch section by explicitly listing the
backend precedence used by the dispatcher. Define fallthrough so only
recoverable or unavailable backend errors continue to the next backend, while
invalid or rejected credentials terminate dispatch and return the authentication
failure; preserve fatal Match() errors as immediate failures.

---

Minor comments:
In `@proposals/arm64-support-harbor.md`:
- Around line 111-117: Correct the strategy matrix entries by adding a space
after the colon in both arch mappings, changing the include values to valid YAML
key-value syntax while preserving their existing amd64 and arm64 values.

In `@proposals/new/filter_repository_proxycache.md`:
- Around line 91-95: Correct the proxy_cache_filter example by removing the
leading ^ while keeping proxy_cache_filter_kind set to doublestar, so the
pattern is library/**. Do not use regex syntax unless also changing the filter
kind to regex.

In `@proposals/new/gc_perf_enhancement.md`:
- Around line 125-129: Correct the first item under the “Future Work” section by
replacing the misspelled, ungrammatical wording with a clear sentence such as
“Implement the code based on the proposal above.”

In `@proposals/new/single-active-replication.md`:
- Line 9: Correct the proposal wording and typos: change “adds an option,”
rename “Non-goals” to “Non-Goals,” capitalize the sentence beginning with “if,”
and replace every occurrence of “shceduled-replication” with
“scheduled-replication,” including the referenced sections.
- Around line 53-60: Rename the “Changes Made” section to “Proposed Changes” and
rewrite its bullets in future tense, including the UI checkbox, best-effort
execution check, single-active behavior, policy model flag, and database column,
so the proposal does not imply these changes are implemented.

In `@proposals/new/ui-e2e-migrate-playwright.md`:
- Around line 135-140: Update the “Run tests with HTML report” Docker command so
the Playwright HTML report output at /app/playwright-report persists after the
container exits, either by mounting that path to a host directory or by setting
PLAYWRIGHT_HTML_OUTPUT_DIR to the existing mounted test-results directory.

---

Nitpick comments:
In `@proposals/new/valkey.md`:
- Around line 70-76: Expand the phase 1 runtime acceptance criteria to test the
pinned valkey-photon image beyond installation: verify the entrypoint, health
checks, password authentication, persistence across restart, shutdown signal
handling, CLI references, and Harbor jobservice queue processing. Add these
scenarios to the acceptance matrix while preserving the documented compatibility
expectations and image/process naming.
- Around line 23-27: The licensing rationale in the Valkey migration proposal
should identify the exact Redis version Harbor currently bundles and scope the
license comparison to that version. Distinguish Redis OSS ≤7.2 under
BSD-3-Clause from Redis 7.4 and 8.x licensing, including AGPLv3 availability
from Redis 8 onward, and connect the migration decision to Harbor’s target
licensing requirements rather than describing Redis generically.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: dc686b9e-fed6-4259-acf4-80c1d32f5ae3

📥 Commits

Reviewing files that changed from the base of the PR and between 6ed942a and 01b4059.

⛔ Files ignored due to path filters (18)
  • presentations/deep_dive/Harbor Maintainer Talk - KubeCon EU 2026.pdf is excluded by !**/*.pdf
  • presentations/introduction/Harbor Lightning Talk - KubeCon + CloudNativeCon Europe 2026.pdf is excluded by !**/*.pdf
  • presentations/introduction/Harbor_ KubeCon INDIA 2025 Lightning Talk.pdf is excluded by !**/*.pdf
  • proposals/images/ai-model/ai-model-processor.png is excluded by !**/*.png
  • proposals/images/ai-model/file-open.png is excluded by !**/*.png
  • proposals/images/ai-model/files.png is excluded by !**/*.png
  • proposals/images/ai-model/license.png is excluded by !**/*.png
  • proposals/images/ai-model/readme.png is excluded by !**/*.png
  • proposals/images/ai-model/summary.png is excluded by !**/*.png
  • proposals/images/arm64/harbor-multiarch-arm64-amd64.png is excluded by !**/*.png
  • proposals/images/gc-perf/gc_after.png is excluded by !**/*.png
  • proposals/images/gc-perf/gc_pervious.png is excluded by !**/*.png
  • proposals/images/gc-perf/gc_tag_del_checkbox.png is excluded by !**/*.png
  • proposals/images/gc-perf/push_with_digest.png is excluded by !**/*.png
  • proposals/images/gc-perf/push_with_digest_flow.png is excluded by !**/*.png
  • proposals/images/gc-perf/push_with_tag.png is excluded by !**/*.png
  • proposals/images/gc-perf/push_with_tag_flow.png is excluded by !**/*.png
  • proposals/new/images/filter_repository_proxycache_ui.png is excluded by !**/*.png
📒 Files selected for processing (12)
  • ADOPTERS.md
  • MAINTAINERS.md
  • proposals/arm64-support-harbor.md
  • proposals/new/AI-model-processor.md
  • proposals/new/filter_repository_proxycache.md
  • proposals/new/fix-proxy-cache-auth-path-prefix.md
  • proposals/new/gc_perf_enhancement.md
  • proposals/new/proxy_cache_referer_api.md
  • proposals/new/single-active-replication.md
  • proposals/new/ui-e2e-migrate-playwright.md
  • proposals/new/valkey.md
  • proposals/probe-based-auth-dispatch.md

@rossigee
rossigee force-pushed the proposal/probe-based-auth-dispatch branch from 01b4059 to 94adb6d Compare July 22, 2026 09:09
@rossigee
rossigee force-pushed the proposal/probe-based-auth-dispatch branch from 94adb6d to 9adf15c Compare July 22, 2026 09:12
@rossigee
rossigee marked this pull request as ready for review July 22, 2026 09:14

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

All reported issues were addressed

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread proposals/probe-based-auth-dispatch.md Outdated
Comment thread proposals/probe-based-auth-dispatch.md Outdated
Comment thread proposals/probe-based-auth-dispatch.md Outdated
Comment thread proposals/probe-based-auth-dispatch.md Outdated
Comment thread proposals/probe-based-auth-dispatch.md Outdated
…uthenticated request handling, action scoping, and /v2 probe

Signed-off-by: Ross Golder <ross@golder.org>
@rossigee
rossigee force-pushed the proposal/probe-based-auth-dispatch branch from 51bb288 to 232aa74 Compare July 22, 2026 09:45
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