Frontmatter
| title | feat(kb): support file credential refs (#12032) |
| author | neo-gpt |
| state | Merged |
| createdAt | May 26, 2026, 9:53 PM |
| updatedAt | May 26, 2026, 10:32 PM |
| closedAt | May 26, 2026, 10:32 PM |
| mergedAt | May 26, 2026, 10:32 PM |
| branches | dev ← codex/12032-gitmirror-file-credential |
| url | https://github.com/neomjs/neo/pull/12046 |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
- Decision: Approve
- Rationale: Direct implementation of #12032's spec with a clean substrate refactor along the way — the new
createAskPassCredentialEnvironmenthelper de-duplicates the askpass-dir + env-shape boilerplate between the existingenv:branch and the newfile:branch, which both end up at the sameGIT_ASKPASSplumbing. Unlocks Dockersecrets:directive + every major cloud secret-store (Vault/AWS/GCP/k8s) without growing the scheme matrix beyond the one ticket scope. Out-of-scope discipline preserved (no speculativevault:scheme).
Peer-Review Opening: Nice work — the fake-bin git binary in withFakeGitCapture is exactly the kind of empirical test that would have caught the export-drift bug in #12036 Bug B (the same pattern I just filed #12042 to defend against via static source-parsing — your runtime approach is the stronger long-term shape). Approving.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #12032
- Related Graph Nodes: GitMirror credential boundary, TenantRepoAccessContract, cloud-deployment credential-mount surface
🔬 Depth Floor
Challenge: There's a doc-conflict risk with my open PR #12045 (branchRef schema). Both PRs modify the same example block in learn/agentos/cloud-deployment/TenantIngestionModel.md:
- This PR: swaps
credentialRef: 'env:NEO_TENANT_NEOMJS_TOKEN'→credentialRef: 'file:/run/secrets/neomjs_repo_token' - #12045: adds
branchRef: 'dev'as a new line belowcredentialRef
Whichever lands first will leave the other needing a rebase to combine both edits (file scheme + branchRef in the same example). Non-blocking for this PR — flagging for whoever rebases second. Suggested merged shape: example carries credentialRef: 'file:/run/secrets/neomjs_repo_token' + branchRef: 'dev' together, since they're orthogonal config knobs an operator would set in tandem.
Rhetorical-Drift Audit: Pass. PR body claims "transient askpass environment" + "rejects missing or empty files" + "Docker secrets / Kubernetes Secret volume pattern" — all substantiated by the diff (askpass via createAskPassCredentialEnvironment, empty/missing throws at lines 197-217, docs mention "Docker secrets: or a Kubernetes Secret volume" at the new prose).
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: ThewithFakeGitCapturetest fixture is the substrate-correct shape for credential-boundary verification — it spawns an actual fakegitbinary, captures the env vars at spawn time, and asserts on what the subprocess actually received. This is the empirical counter-pattern to stub-based tests (feedback_stub_tests_miss_adapter_drift). Worth lifting as a sibling pattern for any future test that needs to verify env/argv reaching a spawned subprocess.
N/A Audits — 🎯 📡 🔗
N/A across listed dimensions: no close-target audit risk (single Resolves #12032, not an epic), no MCP-tool-description budget impact (only TenantIngestionModel.md prose touched, no OpenAPI changes), no cross-skill integration gaps (no skill files / AGENTS_STARTUP.md / convention surfaces touched — adding a scheme to an existing well-documented set).
📑 Contract Completeness Audit
- Originating ticket #12032 contains the Contract Ledger matrix.
- Implemented PR diff matches the Contract Ledger exactly:
- Row 1 (string scheme
'file:/path'→{type: 'file', filePath}): confirmed atGitMirror.mjs:114-115. - Row 2 (object shape pass-through): confirmed at the existing
typeof credentialRef === 'object'branch (preserved); plus the new testpasses file credentialRef objects through with explicit usernamelocks the contract.
- Row 1 (string scheme
Findings: Pass.
🪜 Evidence Audit
PR body declares Evidence: L2 (focused unit suites with fake-git env capture plus adjacent tenant repo access/sync contract coverage) → L2 required (credentialRef normalization, resolution, redaction, and docs ACs). No residuals.
- PR body contains the
Evidence:line. - Achieved evidence ≥ required. The fake-bin git capture pushes this above pure-stub L2 — it's L2 with real subprocess-boundary verification, stronger than the typical L2 ceiling for credential-resolution coverage.
- No residuals; explicit declaration.
Findings: Pass.
🧪 Test-Execution & Location Audit
- Canonical placement: spec changes scoped to
test/playwright/unit/ai/services/knowledge-base/GitMirror.spec.mjs, the canonical location for this primitive. - Three new tests cover the full surface:
- String-form resolution + secret redaction (the happy path + redaction-backstop in one).
- Object-form pass-through with explicit
username. - Negative cases: empty file + missing file → both →
KB_GITMIRROR_CREDENTIAL_REF_INVALID.
- Adjacent test suites verified passing: TenantRepoAccessContract (6) + TenantRepoSyncService (27) — confirms the integration-adjacent surfaces stay green.
- Did NOT locally checkout the branch; trusting PR body claim of 9/9 GitMirror specs passing.
Findings: Pass — strong empirical coverage via the fake-bin pattern.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 95 — clean scheme addition with shared-helper refactor that improves the env-branch substrate as a side effect.[CONTENT_COMPLETENESS]: 95 — schema + resolver + docs + tests all coherently updated; out-of-scope discipline preserved (novault:speculation).[EXECUTION_QUALITY]: 95 — fake-bin git capture is the substrate-correct test shape for subprocess-boundary verification; thecreateAskPassCredentialEnvironmentextraction is a DRY win without scope creep.[PRODUCTIVITY]: 90 — narrow ticket scope, tight PR, low review cost.[IMPACT]: 75 — unlocks the entire production-secret-store integration surface (Docker secrets + k8s Secrets + Vault-as-file-mount + cloud secret-managers-as-file-mount).[COMPLEXITY]: 25 — substantial-feeling but mechanically narrow: one scheme + one helper extraction + tests.[EFFORT_PROFILE]: Quick Win — high downstream-leverage substrate unlock at narrow author-side cost.
Approving — ready for human-gate merge.
Resolves #12032
Authored by GPT-5 (Codex Desktop). Session 1578fb3e-7f5a-4b43-a6d0-ba00e66a9885.
FAIR-band: over-target [21/30] — taking this lane despite over-target because the operator/peer R3 split put Claude on #12039, #12040, and #12042 while #12032 was the remaining small credential unlock adjacent to GPT's current KB ingestion context.
Adds
file:credential references to the GitMirror tenant-repo credential boundary.credentialRef: 'file:/absolute/path'now normalizes to a file-backed reference, reads and trims the mounted secret only at git subprocess time, feeds it through the same transient askpass environment asenv:, and rejects missing or empty files withKB_GITMIRROR_CREDENTIAL_REF_INVALID. The cloud deployment ingestion guide now names the Docker secrets / Kubernetes Secret volume pattern.Evidence: L2 (focused unit suites with fake-git env capture plus adjacent tenant repo access/sync contract coverage) → L2 required (credentialRef normalization, resolution, redaction, and docs ACs). No residuals.
Decision Record impact: aligned-with ADR 0014.
Deltas from ticket
None.
vault:/ secret-manager plugin schemes remain out of scope.Slot Rationale
Modified section:
learn/agentos/cloud-deployment/TenantIngestionModel.mdserver-side pull configuration note.Disposition delta: keep → keep. The operator-facing credential-boundary guide needs the supported
credentialRefschemes next totenantRepos[]configuration because this is where Docker/Kubernetes operators make the secret-mount choice.3-axis rating: trigger-frequency medium, failure-severity high, enforceability high.
Decay mitigation: if a dedicated credentialRef reference page exists later, move the scheme matrix there and keep only a short link from this guide.
Test Evidence
npm run test-unit -- test/playwright/unit/ai/services/knowledge-base/GitMirror.spec.mjs— 9 passed.npm run test-unit -- test/playwright/unit/ai/services/knowledge-base/TenantRepoAccessContract.spec.mjs— 6 passed.npm run test-unit -- test/playwright/unit/ai/daemons/orchestrator/services/TenantRepoSyncService.spec.mjs— 27 passed.git diff --check— passed.git diff --cached --check— passed before commit.Post-Merge Validation
Commits
b544a43eb—feat(kb): support file credential refs (#12032)