Skip to content

feat(core): consume SemanticObservation proof in bind_current_nodes - #174

Draft
cursor[bot] wants to merge 43 commits into
test/browser-context-origin-epoch-protocol-dispatchfrom
cursor/bc-76ee265e-c335-4e79-9ce1-985ad0d8ea71-aa6b
Draft

feat(core): consume SemanticObservation proof in bind_current_nodes#174
cursor[bot] wants to merge 43 commits into
test/browser-context-origin-epoch-protocol-dispatchfrom
cursor/bc-76ee265e-c335-4e79-9ce1-985ad0d8ea71-aa6b

Conversation

@cursor

@cursor cursor Bot commented Aug 16, 2026

Copy link
Copy Markdown

Successor to #172 on exact prerequisite #127 head 65f51937ff2af64d9c157666e7c3b7df89cbb89a.

Buyer/security gap

#172 adds admit_query_nodes, but public bind_current_nodes still minted ObservedNodeHandle values from an untrusted locateNodes list without consuming the exact SemanticObservation protocol-use proof. Navigation-only and TypedInput-only callers could bypass the intended semantic-observation gate. admit_query_nodes also dropped the non-cloneable ValidatedBrowserProtocolUse instead of transferring it into binding.

Current exact implemented boundary

Current exact contributor head is 761d4be7ba6297e3c8078b947bd68cedafd56976; exact feature-base tip remains 65f51937ff2af64d9c157666e7c3b7df89cbb89a.

This lane now:

  • consumes ValidatedBrowserProtocolUse by ownership in bind_current_nodes;
  • accepts only SemanticObservation proof and rejects TypedInput/Navigation proofs;
  • transfers the validated proof from admit_query_nodes into binding;
  • keeps raw BrowserAuthorityRegistry::bind_node crate-private so external callers cannot bypass protocol admission;
  • routes the legacy origin-binding integration test through the public semantic-observation admission path instead of reopening the raw minting API; and
  • applies canonical rustfmt/test-fixture lint policy without weakening production linting.

TDD / repair sequence

  1. Test-only c0e3d8e established the missing-production RED: bind_current_nodes must take a protocol-use proof and reject TypedInput and Navigation proofs.
  2. d6a7998 implemented proof consumption and capability gating; d83fec0 formatted the original slice.
  3. Exact CI later exposed two real integration regressions after raw node minting became crate-private: an external test still called bind_node, and another test file was not canonically formatted.
  4. The origin-binding test was repaired to mint through the real public semantic-observation admission path; the exact rustfmt artifact was applied to the authority-registry test.
  5. The next exact-head CI proved all workspace tests green but strict Clippy correctly rejected fixture-only expect() calls. The final repair added the repository-standard test-only #![allow(clippy::expect_used)] to that integration test rather than weakening the workspace gate.

Exact-current proof

On unchanged exact head 761d4be7ba6297e3c8078b947bd68cedafd56976:

  • CI run 31969931127: success;
  • Manifest V3 Compatibility run 31969931159: success;
  • CI includes repository contracts, canonical rustfmt, locked workspace check, all workspace tests, strict Clippy, rustdoc, and exact production coverage enforcement;
  • GitHub freshly reports the Draft mergeable; and
  • no formal review is currently submitted on this exact head.

Feature-base organization workflows that did not execute on this exact head are not represented as passing. No predecessor-head check/review/status is transferred.

Truth boundary

This still does not serialize a BiDi command, authenticate Chromium, observe a live accessibility tree, authorize typed input, or prove a post-condition. The public handle-minting path in this slice is now protocol-admitted; a later trusted adapter must still sample the query result from a trusted transport and revalidate returned handles immediately before action.

Keep Draft while #127 and its prerequisite stack remain active. Prefer this branch over #172, #171, and #138 for QueryNodes admission. This scheduled actor does not merge, self-approve, alter workflows, add secrets, weaken checks, tag, or publish.

seonghobae and others added 30 commits August 13, 2026 08:32
Close the locateNodes result-item gap by requiring the exact node remote
type and a usable sharedId within the registry identifier budget before
an untrusted adapter value can be retained as a later handle.

Co-authored-by: Seongho Bae <[email protected]>
Require fail-closed rejection of whitespace and control injection in
accessibility roles, accessible names, BiDi sharedIds, and registry
external identifiers before production support exists.

Co-authored-by: Seongho Bae <[email protected]>
Fail closed on whitespace or control characters in exact accessibility
roles, accessible-name locators, BiDi sharedIds, and registry external
identifiers so untrusted protocol text cannot become a later handle.

Co-authored-by: Seongho Bae <[email protected]>
Require a fail-closed composition that revalidates the exact current
session/context/origin/document epoch, rejects over-budget or non-node
items, and translates admitted sharedIds into ObservedNodeHandle values
before production support exists.

Co-authored-by: Seongho Bae <[email protected]>
Correct a missing comma so the intended missing-production compile
failure is not hidden by a test-harness syntax error.

Co-authored-by: Seongho Bae <[email protected]>
Revalidate the exact current session, context, origin, and document
epoch, admit every untrusted result item first, then translate shared
node identities through the registry into ObservedNodeHandle values.

Co-authored-by: Seongho Bae <[email protected]>
Add the failing contract that an untrusted locateNodes result cannot
become ObservedNodeHandle values unless the adapter proves
SemanticObservation on the exact current session, context, origin, and
document epoch.

Co-authored-by: Seongho Bae <[email protected]>
Consume a non-cloneable SemanticObservation protocol-use proof before
bind_current_nodes can translate untrusted sharedId values into current
ObservedNodeHandle values. Navigation-only and TypedInput-only adapters
fail closed.

Co-authored-by: Seongho Bae <[email protected]>
Keep CHANGELOG, doctoring, API, architecture, ADR 0010, and the roadmap
aligned with the same-call proof that observation handles require
QueryNodes capability and current document authority.

Co-authored-by: Seongho Bae <[email protected]>
cursoragent and others added 6 commits August 16, 2026 15:39
Add the failing contract that zero-width and bidi-override format
characters cannot be admitted in accessibility roles, accessible names,
BiDi sharedId values, or registry external identifiers.

Co-authored-by: Seongho Bae <[email protected]>
Fail closed on reviewed Default_Ignorable and bidirectional format
characters in accessibility locators, BiDi sharedId values, and registry
external identifiers. Ordinary spaces in accessible names remain valid.

Co-authored-by: Seongho Bae <[email protected]>
Record the local fail-closed format-character policy and cite the
current Unicode security-mechanisms standard, the bidirectional
algorithm, and the superseded UTR 36 report.

Co-authored-by: Seongho Bae <[email protected]>
RED: bind_current_nodes must consume a non-cloneable protocol-use proof
and reject TypedInput and Navigation proofs before minting observation
handles. Navigation-only and TypedInput-only adapters can still call the
public no-proof API on the predecessor head.

Co-authored-by: Seongho Bae <[email protected]>
Transfer the non-cloneable QueryNodes protocol-use proof by ownership
into locateNodes admission and reject Navigation, TypedInput, and
NetworkObservation proofs before minting ObservedNodeHandle values.

Co-authored-by: Seongho Bae <[email protected]>
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.

2 participants