feat(auth): add a narrow ingest perimeter scope - #363
Merged
Conversation
Add the D62 ingest scope so browser credentials can upload one document without gaining read access or standing connector authority. Keep WRITE as the only scope that crosses route classes, exercise real signed credentials at the HTTP perimeter, and document the closed three-scope vocabulary.
This was referenced Sep 3, 2026
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.
Problem
D62 needs a browser to add one document without gaining either read access to memory or authority to create a standing connector. The perimeter previously had only
readandwrite, soPOST /ingestrequired the broad write scope.What this does
ingestperimeter scope and maps onlyPOST /ingestto itwriteas the full scope that also satisfiesingest; keepsreadandingestdisjointHow verified
uv run pytest src/tests/surfaces/test_route_scope.py src/tests/adapters/test_signed_token_auth.py src/tests/surfaces/test_openapi_export.py -q— 73 passed after rebaseuv run lint-importsuv run ruff check src/ benchmarks/uv run ruff format --check src/ benchmarks/uv run pyright src/ benchmarks/uv run python scripts/export_openapi.py -o openapi.json— 25 routes; no schema diffuv run pytest src/tests -q— 2,198 passed, 2 skipped, 1 failed locally after 1h58m; the failure is the pre-existing/out-of-scope macOS MIME assertiontest_sdk_pushes_lineage_metadata_to_e0(.mddetected asapplication/octet-stream). A focused rerun reproduced it. Per the package safety rule, this PR does not touch MIME routing or PR feat(e0): refuse an unroutable MIME at the E0 gate instead of dead-lettering it (D104) #342; Linux CI is the authoritative full-suite result.Docs
website/src/app/docs/configuration/page.mdxnow documents all three signed-credential scopes and their exact reach.Contributor agreement