Skip to content

feat: require every v2 interface to declare who serves it - #10

Closed
lr00rl wants to merge 1 commit into
feat/plugin-service-backingfrom
feat/require-declared-backing
Closed

feat: require every v2 interface to declare who serves it#10
lr00rl wants to merge 1 commit into
feat/plugin-service-backingfrom
feat/require-declared-backing

Conversation

@lr00rl

@lr00rl lr00rl commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Stacked on #8 (feat/plugin-service-backing). Merge after the re-signed plugin manifests are deployed — see the ordering note below.

With the official manifests re-signed to declare their backing (vpn-core#2, netguard#2, wireguard#2, sub-store#2, template#2), the host no longer needs to infer anything — so the inference is gone.

What changes

  • A v2 manifest that declares no backing is now rejected at load.
  • The Publisher == "latticenet" heuristic is deleted from the dispatch path. Who serves a method is settled entirely by the signed manifest, and by nothing else.

Why reject rather than infer

A silently-inferred service fails somewhere downstream, at call time, with an error describing a symptom rather than a cause. Refusing the manifest names the real problem — this plugin never said who serves its methods — and it fails closed, so a plugin cannot be loaded on a promise nobody checked.

⚠️ Deployment ordering (both directions)

This is a two-sided compatibility break, and it is symmetric:

  • A server with this change refuses a manifest that predates backing.
  • A server without backing support refuses a manifest that carries it (the loader uses DisallowUnknownFieldsjson: unknown field "backing").

Both fail closed — the plugin does not load — so neither direction degrades silently. But the sequence is: deploy the server (#8, which accepts both), then the re-signed plugins, then this.

Test plan

  • go vet ./internal/... clean
  • go test ./internal/plugin/ ./internal/server/ -race — green (736s under load)
  • TestBackingValidation extended: a v2 interface with no backing is rejected
  • v2 fixtures across internal/plugin and internal/server updated to declare backing — the fixture churn is the proof that the rule now binds

https://claude.ai/code/session_01FzYExyy6G7Cb7QpXoUEY78

With the official manifests re-signed to declare their backing, the host no
longer needs to infer anything, so the inference is gone.

A v2 manifest that declares no backing is now rejected at load rather than
resolved by guesswork. That is deliberately louder than the alternative: a
silently-inferred service fails somewhere downstream, at call time, with an
error that describes a symptom rather than the cause. Refusing the manifest
outright names the real problem — this plugin never said who serves its methods
— and it fails closed, so a plugin cannot be loaded on a promise nobody checked.

The publisher-string heuristic goes with it. Who serves a method is now settled
entirely by the signed manifest, and by nothing else.

Deployment order matters: a server carrying this change refuses a manifest that
predates `backing`, and a server that predates `backing` refuses a manifest that
carries it (the loader disallows unknown fields). Ship the server first, then the
re-signed plugins.

Tests: go vet clean; internal/plugin and internal/server green.
@lr00rl

lr00rl commented Jul 26, 2026

Copy link
Copy Markdown
Contributor Author

[ack] — zeus review, Olympus TASK-0001 item 2 (stacked half) (2026-07-26)

Clean deletion of the inference path; undeclared-backing v2 manifests rejected at load with a cause-naming error. The two-sided deployment order was executed against production 2026-07-15 (additive #8 server → re-signed plugins → this). Standing constraints now on record in Olympus: fresh nodes bootstrapping from pre-backing bundles fail closed (correct), and a server rollback past #8 strands every re-signed plugin — rollback floor is alpha-0.2.2.

Evidence: contained in integration (86422a1); full -race -cover green. Disposition: close-with-landing-commit per rules/01 §8.5.

@lr00rl

lr00rl commented Jul 26, 2026

Copy link
Copy Markdown
Contributor Author

Closed as landed — zeus, operator-approved sweep (2026-07-26, rules/01 §8.5): commit 0f2dba9 contained in integration (86422a1). [ack] verdict above; rollback floor alpha-0.2.2 on record. Closing, not rejecting.

@lr00rl lr00rl closed this Jul 26, 2026
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