Say a remote obsync has never reached, and an origin that authenticates differently - #52
Merged
Merged
Conversation
…es differently
A vault whose own `origin` was an ssh URL under an `https://` OBSYNC_REPO
committed for an hour and pushed nothing, and said one line about it: the
startup line. Three separate things made that silence, and this fixes all
three.
The network half fails before the push, so nothing was ever attempted and
§9's never-pushed state was never reached; a fetch that fails is an aborted
run, which reports nothing above debug; and an unreachable remote is healthy
until the 24h ceiling. A deployment nobody has ever seen work therefore reads
exactly like one with nothing to do, for a day.
* A network half that has never once got all the way through says so, once,
at the persistence threshold, and says so again when the remote finally
answers. A WARN and not a verdict: the health surface is deliberately
untouched, because an unreachable remote is healthy until the ceiling
whatever obsync says about it, and an unhealthy container invites the
restart §7 refuses on a remote that is merely down.
* Gate 5 goes on comparing host and path alone — that is right, and a
mounted deploy key under an https OBSYNC_REPO syncs perfectly. What the
scheme decides is named instead: the credential path, which is a
credential file, key material, or nothing. An origin whose credential path
differs from the configured remote's is one WARN at bootstrap, and refuses
nothing.
* obsync says what it resolved beside what it was told: one INFO line
carrying the origin's scheme and normalised pair, and the tracked branch.
OBSYNC_REPO is read for the clone and for gate 5, and every fetch and push
goes to the vault's own origin — so an operator was otherwise reading a
URL obsync may never have contacted. The normalised pair and never the URL
itself, because an operator may put a token in an origin.
Also documents the folder question that came with it: git records files, so a
folder with no notes in it is not something any git can carry, and obsync will
not write a .gitkeep into a human's vault to hide that.
The three tests asserting that a run which changed nothing says nothing now
read the log with bootstrap's own line taken off. §9's quiet is a property of
a run, and bootstrap is not one — the startup line it sits beside was already
excluded from that buffer.
Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01VeCuDU56kAB5yuJ3N9jZyp
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A vault whose own
originwas an ssh URL under anhttps://OBSYNC_REPOcommitted for an hour, pushed nothing, and said one line about it — the startup line. Found while diagnosing a real deployment.Three separate things made that silence, and this fixes all three.
Why it was silent
stateNeverPushedis never reached.debugalone (internal/loop/tier.go:149).internal/status/status.go:175).So a deployment nobody has ever seen work reads exactly like one with nothing to do, for a day.
And gate 5 passed it: the comparison discards the scheme by design, so
[email protected]:owner/vault.gitandhttps://github.com/owner/vault.gitare the same(host, path)pair. That is right about where bytes go and blind to how obsync authenticates.What changed
TestAVaultWaitingOnADownRemoteHasNotAttemptedAPushstill passes unchanged.config.CredentialPath— a credential file, key material, or nothing. An origin whose credential path differs from the configured remote's is one WARN at bootstrap and refuses nothing: a mounted deploy key under anhttps://OBSYNC_REPOsyncs perfectly, andTestAnOriginSwappedFromHttpsToSshIsTheSameRepoAndNotAFreezestill passes unchanged.Plus the folder question that came with it: git records files, so a folder with no notes in it is not something any git can carry. Measured, documented in
README.mdanddocs/operations.md, and obsync will not write a.gitkeepinto a human's vault to hide it.Declared surface
Unchanged. No new variable, no subcommand, no change to the health contract or to what obsync writes into the vault.
docs/interface.mdis untouched.Verification
Run in the image the Dockerfile pins, plus
golangci-lintat the version CI pins:go test ./...— ok, full suite;-count=5on the new tests and the two closest existing ones.go vet ./...,gofmt -l .— clean.golangci-lint run ./...— 0 issues.🤖 Generated with Claude Code
https://claude.ai/code/session_01VeCuDU56kAB5yuJ3N9jZyp