Repository navigation
Support authenticated HTTPS in the Versionkeeping publication executor #4
Description
Summary
The Versionkeeping publication planner accepts HTTPS push endpoints, but the executor's closed Git configuration clears every credential helper and sets noninteractive prompting. On a normal macOS checkout whose authenticated GitHub access comes from the system credential helper, planning succeeds while the guarded push cannot authenticate.
Observed while publishing PR nisavid/agents#39:
plan_git_publication.pyreturned a fast-forwardreadyplan with one outgoing commit, an exact existing-target lease, and no target-only commits.execute_git_publication.pyreturnedPOST_PUSH_STATE_UNKNOWNwithPUSH_FAILED.- Three independent rereads confirmed that the remote ref remained at the exact pre-push SHA, so no remote mutation occurred.
- The checkout uses an HTTPS origin and the system
osxkeychainhelper. The executor installs a higher-precedence emptycredential.helper,GIT_ASKPASS=false, andGIT_TERMINAL_PROMPT=0. - SSH is not an automatic fallback: the current host-key trust and key-authentication state may be intentionally absent.
Desired behavior
Provide an authenticated HTTPS publication route that preserves Versionkeeping's current safety properties:
- immutable source SHA and one exact branch-update refspec;
- exact existing/absent target lease;
- captured endpoint fingerprint and configuration digest;
- noninteractive operation with no credential bytes in arguments, output, plans, receipts, or repository configuration;
- no ambient executable Git configuration;
- one actuation attempt followed by exact remote verification;
- fail-closed behavior for unsupported credential providers.
Acceptance
- Define the trusted credential-provider boundary for authenticated HTTPS without reopening arbitrary command-valued helpers.
- Add applicable macOS credential-provider coverage on GitHub-hosted macOS CI and a provider-unavailable negative path. Use disposable test credentials where required; personal desktop-keychain or provider-session behavior unavailable on those runners remains explicitly unqualified and nonblocking, not a passing claim.
- Prove plans and receipts remain credential-free.
- Preserve the existing SSH and local-endpoint contracts.
- Run an independent Daybreak Blue review of the authentication and secret-handling design before implementation is accepted.
Independent-review handoff
Begin or resume this issue in a fresh evidence-reconciliation and independent Daybreak review thread that did not implement the candidate under review. If the current thread carries that implementation context, invoke handoff before review. Follow the coordinator's thread contract. Suggested skills: codex-security:security-diff-scan, codex-security:verify-fix, checkpointing-and-publishing-git-work, and publishing-reviewable-prs.
If review requires remediation, publish the exact findings and reviewed revision, invoke handoff, and move changes to a separate fresh implementation thread. Any changed candidate then returns through another handoff to a different fresh Daybreak thread for exact-revision re-review.
Every receiving thread must coordinate its revision, evidence inputs, and conclusions with Audit the Provingkit promotion and release chain and concurrent source-security work. No handoff transfers credentials, publication authority, or release authority.
Related pull request
I track PR #115 as a partial source correction to the authenticated HTTPS publication executor. The acceptance checklist remains unchanged, and live-provider behavior remains unqualified.
Activity
nisavid commentedon Aug 24, 2026
Implementation evidence refresh
The authenticated HTTPS implementation is merged in PR nisavid/agents#55 at
0ca226c6ced4229718d627fcbaa367d325c12ce6(reviewed headc5d7201). The cross-platform provider checks and credential-free plan/receipt behavior are present in that merged change.The issue remains open because the acceptance item requiring an independent Daybreak Blue review has not been completed here. No release eligibility or security approval is inferred from the merge or green checks; the remaining review is explicitly deferred to the Daybreak-capable follow-up lane.
nisavid commentedon Aug 31, 2026
Scout discrepancy (2026-08-31)
The issue's August 24 checkpoint says the independent Daybreak review was still incomplete, while merged PR nisavid/agents#55 states that an independent review of
5080ed6...c5d7201was clean. Those records do not identify the same durable review artifact, so the open issue cannot safely be treated as complete from the PR-body assertion alone.Keep this as a task under the release map until the exact reviewed revision and review evidence are linked here and the acceptance checklist can be reconciled. No reimplementation is implied by this graph repair.
nisavid commentedon Sep 16, 2026
I am coordinating the independent evidence reconciliation and Daybreak review of the authenticated HTTPS publication executor at published commit
089e62e306734d66187d74e7122d8ad17f418714, following the accepted preview publication. The review will reconcile the historical agents PR55 evidence with the current Provingkit source and address every acceptance item in this issue.The reviewer receives public source and public evidence only. It may run isolated, credential-free checks, while source edits, authenticated provider operations, real publication, and live-host actions remain outside the review. Any valid finding will carry its reviewed revision and evidence into a separate implementation handoff before a fresh independent review. The existing README recovery and live-rollout reservations remain with their owners.
nisavid commentedon Sep 17, 2026
I recovered the complete independent review of
089e62e306734d66187d74e7122d8ad17f418714, verified against its original SHA-256995b7b02b3295ce7397781c2e99f73df8f92deea0f53b0fc373198b92fd625b2. It reports two credential-boundary findings and a separate historical public-review provenance gap. The original temporary evidence artifacts are unavailable, so the fresh author must reproduce the findings rather than inherit their validation claims.I am handing remediation to a separate fresh Daybreak author against current public commit
147e1ddfc969b5119001488ce1556627d3b2449b. The intervening destination commit/DCO policy from PR #80 remains part of that candidate. I reconciled ownership with the preview coordinator: this issue retains its existing coordination claim, and there is no competing adapter/test/reference owner. PR #84's shared Kit-definition edit must be reconciled before publication of any resulting Versionkeeping identity change. The author may correct valid findings within this source boundary and must return any consequential unresolved policy choice. A different fresh reviewer must assess the resulting complete boundary before acceptance. No credential access, real provider operation, installation, or publication is delegated.Recovered independent review, unchanged
Authenticated HTTPS publication evidence reconciliation and independent review
The current Versionkeeping boundary at
089e62e306734d66187d74e7122d8ad17f418714is not clean against issue 4. The immutable-source, exact-lease, endpoint, single-attempt, postcheck, SSH/local, noninteractive, and hosted-provider controls are supported at their tested layers. Two current credential-boundary findings require revision: the default host-compatible HTTPS route executes ambient command-valued helpers without binding them into the reviewed configuration digest, and the credential preflight captures provider response bytes in the executor process. The historical PR 55 record also has a separate public-provenance gap: its body claims a clean Daybreak review, but the complete surveyed public review surfaces contain no Daybreak review artifact.This is a review result only. It does not close issue 4, accept the implementation, qualify a real credential provider or personal Mac, authorize publication, or start remediation.
Reviewed identity and public lineage
5695975350; supplied receipt SHA-25634e29b25c0ef0d1400e67df72cd7be92d18c5b8d5a8edc2597e2d5a77efe58dd; verified public body SHA-256d316b6c96d841921629c340f6598ce3bf159933d63ace2841b10e469414789fc.089e62e306734d66187d74e7122d8ad17f418714; treef22dc56cc332b9bf5e8da78f3d1c656dbee0cc51; parent8783281f165676d5202c455efc10018fb3b4ec07.914b9d6d2de42ccfacf9f354eac7181d4906de57b2637b508e6e2f69b430ad28.4f3442e270c8e194adac329d8d6b805a14e7ae06d5bc272d902e54c19d0b6960.release/provingkit/agents-commit-map.tsv:18maps agents merge0ca226c6ced4229718d627fcbaa367d325c12ce6to Provingkit extraction commit3eed97b75760ce371cb7a372190b89b767c02d39. Its adapter blobc8b4580d8d741f19e9262e98961315beffb12c48, publication-reference blob4e4163adf94c61e5631a490177d041a74aa881ec, and workflow blob49cfc12b92ac3c0be8120af223a0c10a62a5d4d5match PR 55's final public file records.public-evidence/reviewed-boundary-3eed-to-089e.patch, SHA-256b03f4d12f67e8f7c9e9f4875de03f11fea2e10fa45f5ac08958bbc207fc9657c.The reviewed commit is later preview-publication integration; the material HTTPS evolution is nevertheless in its frozen tree. Commit
82e59940a06ba2d130fe1df2c6dc6c1479bed51eintroduced the host-compatible default and credential preflight. Commitdf1603060acc0fe792e218b5cb9a37894a9a2fc2then preservedXDG_CONFIG_HOMEfor that profile.boundary-source-identities.tsvrecords the exact historical and current blobs.Historical review reconciliation
Agents PR 55 has base
5080ed6fcf7e9198919dace0c031acebd39ef1fb, final headc5d72018002f577a5c1058a305052d7ae5ce9866, and merge commit0ca226c6ced4229718d627fcbaa367d325c12ce6. Its body says an independent Daybreak review of5080ed6…c5d7201was clean.That prose is not backed by an exact public review artifact in the surveyed record:
c5d7201…is CodeRabbit review4998393876. The other exact-head records are comments from CodeRabbit, Greptile, andnisavid; none identifies a Daybreak reviewer or immutable Daybreak result.5498561428explicitly says the Daybreak acceptance item remained incomplete. Comment5498561527records the same discrepancy and rejects the PR-body assertion as sufficient evidence.Historical disposition: valid public-provenance gap. I did not use private transcripts to fill it. This fresh review binds the current Provingkit tree and must not be represented as retroactive proof for PR 55.
Current findings
F-001 — The default HTTPS route admits mutable ambient helper commands outside the reviewed digest
Severity: high. Status: valid finding. Patch-risk result: contradicted.
GitRepositorydefaults tohost-compatible(adapter.py:991–1010). That profile inheritsHOME,XDG_CONFIG_HOME, proxy state,SSH_AUTH_SOCK, and hostPATH(adapter.py:135–154,1047–1074), does not mask global or system Git configuration (adapter.py:1077–1107), and rejects HTTPS credential settings only from local and worktree scopes (adapter.py:1130–1150). Its broader inert-policy pass likewise restricts executable-config rejection to local and worktree scopes (adapter.py:1290–1312). The tests make this inheritance intentional:test_git_publication_adapter.py:453–480asserts that the host-compatible profile reads global Git configuration, while482–507proves only the hardened profile masks it.Source → control → sink:
HOMEorXDG_CONFIG_HOME, including command-valuedcredential.helper._configured_classescan seecredential.*, butenable_https_credentialspassesscopes={"local", "worktree"}and marks credentials enabled without selecting a trusted provider.git credential fillruns with that inherited configuration inensure_https_credentials; the same Git environment reaches endpoint probes and the branch-update command.The network-denied counterexample installs a synthetic global command helper under a synthetic
XDG_CONFIG_HOME. The unrestricted inventory seescredential.*; the HTTPS gate's selected scopes see an empty set. The default preflight accepts and executes the helper. Changing the global helper command leaves the reviewed digest unchanged because_config_digesthashes destination-selection fields, endpoint fingerprint, default branch, and the profile name, not the effective inherited configuration (adapter.py:2015–2047;execution.py:316–325).This directly contradicts issue 4's “no ambient executable Git configuration” requirement and its trusted-provider/fail-closed boundary. It also narrows what the documentation may claim:
publication-execution.md:82–90correctly says host-compatible inherits helpers, but92–100then describes ordinary publication as using closed platform-provider sets. ADR 0002 deliberately chooses compatibility (docs/adr/0002-host-compatible-git-operation-profiles.md:9–19); that choice cannot inherit the stronger issue 4 claim.The explicit hardened path is legitimate counterevidence to a broader “Versionkeeping cannot support guarded HTTPS” claim. It masks global/system configuration, clears ambient helpers, rejects all relevant scopes, selects an identity-checked platform provider, and fails closed when the provider is unsupported (
adapter.py:1077–1107,1151–1178). The defect is the default/claim/procedure boundary and the missing binding for inherited effective configuration, not the absence of any closed implementation.Required correction: make the closed profile an explicit invariant of any issue 4 publication plan and procedure, or make the authenticated route closed by construction; bind the effective provider/configuration identity or make ambient configuration irrelevant; and add a negative global/system command-helper test that proves no execution before any remote operation. Host-compatible publication may remain an explicitly weaker compatibility contract.
F-002 — The credential preflight captures provider response bytes in the executor
Severity: medium. Status: valid finding. Patch-risk result: contradicted.
ensure_https_credentialsinvokesgit credential fillwithstdout=subprocess.PIPE, stores the completed process, and evaluatesresult.stdout.strip()(adapter.py:1180–1212). Credential protocol output contains the selected username and credential. The synthetic counterexample records that the call used a pipe and that the result presented to the executor held nonempty provider output. It prints only booleans and never emits the fixture value.Source → control → sink:
CompletedProcess.stdoutin the executor process.I found no path that writes this value into arguments, plans, receipts, diagnostics, repository configuration, or the returned execution receipt, so this is not evidence of an external credential disclosure. It still contradicts the maintained statement that credential bytes “are never read by the planner or executor” (
publication-execution.md:140–142) and expands the sensitive in-memory boundary unnecessarily.Required correction: make availability probing return status only while discarding credential-protocol output outside the planner/executor, or remove the duplicate preflight and rely on the one guarded Git actuation's typed result without retry. Add a test that fails if the parent requests a pipe or receives provider bytes.
Supported controls and rejected counterclaims
<source SHA>:<full destination ref>(core.py:242–268;execution.py:187–223).test_source_sha_is_immutable_when_head_movespasses.--force-with-lease=<ref>:<exact SHA>; absent targets use--force-with-lease=<ref>:(core.py:247–266). The executor re-probes the exact target and rejects drift before actuation (execution.py:327–345). Present-drift, absent-creation, and exact-removal tests pass.--config-envalias (execution.py:291–307;adapter.py:1770–1805). Endpoint mutation and remote-name redirection tests pass. The claim that a reviewed remote name can redirect the push is rejected by this source and test evidence.GIT_ASKPASS,GIT_TERMINAL_PROMPT=0,GCM_INTERACTIVE=never, batch-mode SSH, closed editors, and timeouts are set (adapter.py:1052–1075). No interactive provider or external endpoint was invoked here.push_attemptedis set immediately before one_run_endpointpush; the executor then probes the exact ref. Post-actuation failures becomePOST_PUSH_STATE_UNKNOWNwithout retry (execution.py:349–391). Push failure, timeout, and verifier-failure tests each observe one call.ext, endpoint alias, and local execution tests pass. The claim that the implementation silently falls back from HTTPS to SSH is rejected: no such transition exists.Acceptance and focus matrix
/usr/bin/gitserves local file transports; platform identity logic and current hosted jobs cover GitHub runners. Sandbox root UID observation is the sole constructed identity adjustment.104754442199at the reviewed commit succeeded and exercises the hardened macOS provider path.stdout=PIPE; the issue 4 profile precondition is not enforced as procedure state.Validation results and constructed conditions
The rubric was frozen before source execution in
validation-rubric.md, SHA-256628d23e6f0fc380798ed6221925e9abe1209e8ae443d46c56ffece9f3f62d024.threat-model.mdrecords the assets, trust boundaries, attack paths, and authorization limit.Credential-free execution used
validation-artifacts/network-deny-exec, a locally compiled seccomp launcher that deniessocketandconnectwithENETUNREACHand carries the filter across Git subprocesses. Its direct probe returned errno 101. Processes began withenv -i, syntheticHOME, syntheticXDG_CONFIG_HOME, fixedPATH=/usr/bin:/bin, and no account or provider state.The source rejects
/usr/bin/git,/usr/bin/ssh, and otherwise-safe local ancestry in this harness because sandbox-owned root filesystem objects appear as UID 65534. The test runner therefore changes only that constructed observation: it admits the two fixed source-allowlisted executables and treats UID 65534 as root for local ancestry. It does not change copied candidate files, endpoint/configuration behavior, helper scope selection, plan construction, execution flow, or assertions. The counterexample uses the same fixed-executable identity adjustment. This condition means the local run does not independently qualify root-ownership detection; public source and hosted jobs supply that evidence.Numeric outcomes:
089e62e…:ubuntu-latest credential providerjob104754441757,macos-latest credential providerjob104754442199,windows-latest credential providerjob104754442126, andVersionkeeping source contractjob104754441698each show “This job succeeded.” The provider workflow has no path filter and pins checkout/setup actions; its tests run under the hardened profile becausePublicationExecutionTests.setUpforces it (test_git_publication_execution.py:245–264).revise; impacthigh; regression likelihoodcritical; regression protectionpartial; recoverabilitymanaged; confidencehigh.Excluded authority leaves exact limitations: no real helper invocation, credential generation, account/session/keychain inspection, external authentication, network connection, remote push, personal Mac contact, CI dispatch, provider/hardware access, source mutation, commit, push, tracker write, or acceptance operation. The GitHub-hosted macOS observation qualifies only that runner, workflow, tests, and reviewed revision. It does not qualify a desktop keychain's unlock, persistence, session, or live-consumer state.
Ralph review state
Cycle 1, final frozen revision
089e62e306734d66187d74e7122d8ad17f418714: not clean. F-001 and F-002 are valid current findings; HIST-001 is a separate historical provenance gap. No candidate changed after validation, so all selected focus results bind the same final revision. A second cycle would only repeat the same source and is not a completion criterion. Source edits and successors are outside this review; remediation requires a separate fresh author and then a different fresh reviewer on the remediated immutable revision.Procedure capture and consumer status
This review consumed the public
checkpointing-and-publishing-git-workprocedure at current blob534cd2f4745d363c328c4b961c11c4a779b5aa34and appliedcapturing-agent-proceduresto the method correction.method-correction.mdproposes the owner/source scope, closed-provider contract, verification, adaptation rule, and downstream consumers. No shared procedure was edited.Procedure disposition: valid finding for issue 4 authenticated HTTPS consumers. A remediation task should invoke the captured correction, update the owning Versionkeeping source/tests/prose, and produce a new immutable review input. This task is not rollout issue 70 or maintenance issue 72 and does not discharge their separate issue 69 procedure-consumer obligations.
Artifact index
source-manifest.json: reviewed revision, public archives, tree/blob reconciliation, extraction lineage, and boundary-patch identity.historical-evidence-summary.json: PR 55 public-review counts, exact-head approval/check identities, and issue 4 discrepancy pointers.boundary-source-identities.tsv: exact critical blobs at historical extraction and current review head.public-evidence/public-tree-blobs.tsvandpublic-evidence/public-source-git-blobs.tsv: complete public tree and extraction Git-blob manifests.public-evidence/public-source-file-sha256.txt: complete extracted-file SHA-256 manifest.evidence-manifest.tsv: SHA-256 and byte count for every retained public-evidence file.validation-artifacts/counterexamples.json,network-denial-probe.json,selected-tests.log, andstatic-compile.json: runnable validation receipts.patch-risk-assessment.json: validated codex-security patch-risk object.method-correction.md: captured reusable procedure correction proposal.commands.md: exact command shapes, numeric outcomes, and constructed conditions.artifact-digests.tsv: SHA-256 and byte count for every returned review artifact except itself; the handoff returns that manifest's own digest separately.The SHA-256 of these exact report bytes is returned alongside
report_markdown.md; it is intentionally not embedded in the file because embedding it would change the bytes.nisavid commentedon Sep 18, 2026
The guarded HTTPS source correction has a clean independent Daybreak review. It checks the reviewed configuration profile before credential activation or endpoint probing and makes credential preflight depend on status while discarding provider output. The accepted host-compatible/hardened distinction remains explicit; live provider behavior is still unqualified.
I integrated the seven reviewed files unchanged onto current main
9f703468fc7a634e63d890211b5c2e3c3e27f252and applied the coordinated Versionkeeping member-reference update, preserving every other Kit member. The local checkpoint iscb67369f0426c040700e69324a311a9b0bf92cdc. Its credential-free 164-test selection, 62 validator tests, Versionkeeping validation, source-disposition validation, and composite Kit validation pass. Seven provider/loopback methods remain excluded and one platform test is skipped.The independent source review SHA-256 is
2ce56fa471e3d0aa9dd290e57c1bf9f990ca2fedbf6bccf366c20bb1920b6900; the reviewed source-manifest SHA-256 ise54abc536c271f5f189b89b79408791013a47b0661ffa452c77002c8e761578a. Exact-byte integration and evidence continuity are under separate inspection before publication. This does not close the historical PR #55 evidence gap or qualify a live credential route.nisavid commentedon Sep 18, 2026
I published the reviewed HTTPS correction as draft #115 at
cb67369f0426c040700e69324a311a9b0bf92cdc. It rejects configuration-profile drift before credential activation or endpoint probing and makes credential preflight discard both output streams. The seven source-reviewed files are unchanged; integration adds only the prescribed Versionkeeping member-pointer update. #80 remains historical input.The source review and integration review have no unresolved findings within their stated scopes. On the committed candidate, I verified 163 provider-free owner tests with one platform skip, 62 Versionkeeping validator tests, 83 Kit tests, the three source validators, and the diff check. The independent PR-text review also completed cleanly; canonical publication audit and exact body readback passed.
The integration parent is
9f703468fc7a634e63d890211b5c2e3c3e27f252; the current PR base is3b8f3618a5899e1993eb45d259c3725ef1dd71fd. I have not validated their merge. Hosted checks are pending, and live-provider and personal macOS behavior remain unqualified. This is a draft source checkpoint; the issue’s remaining qualification and acceptance work stays open.