Repository navigation
Limit content screening intake to uploads and apply metadata edits directly (layer 2 of 4) - #1629
Merged
Paul Lizer (paullizer) merged 3 commits intoOct 3, 2026
Conversation
…rectly Layer 2 of 4 for microsoft#1621, stacked on microsoft#1628. - Mark documents SimpleChat generates (agent uploads and published artifacts) with a server-managed screening_exemption field set in create_document before the initial screening marker is chosen. Exempt documents without a marker are never enrolled, prepared, scanned or picked up by scan jobs. User uploads, chat uploads saved to a workspace and File Sync are still screened. - Remove the publication screening reservation and its consume latch. Approval admits a destination without a screening marker or with an available release. - Apply metadata edits and model-generated metadata directly instead of queueing a metadata rescan, keep the source-format rename rule, stop comparing the metadata fingerprint in release proof and recovery, and stop rewriting a screened release blob's metadata on tag edits. - Bump VERSION to 0.261.230 and update release notes, framework, guide and API docs; add the upload-only intake fix document and tests. Refs microsoft#1621 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
… edits The full functional comparison against the base branch found three tests that still asserted the removed behavior: - test_content_screening_history: a release proof that doesn't match the content still leaves only the screening status; metadata edited after a release now stays available. - test_group_document_fixture_parity / test_public_document_fixture_parity: a released screened document's metadata change returns the ordinary updated receipt (200) instead of queued (202). Also records the base-branch comparison in the fix documentation. Refs microsoft#1621 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Metadata edits now apply directly, so a metadata save never gets a queued (202) receipt. This finishes that change in the client and the tests: - documentOperations.ts accepts a metadata save only when the receipt is updated with HTTP 200; any other receipt, including a legacy queued 202 one, is unconfirmed and keeps the draft. - DocumentExplorer.tsx drops the queued branch that removed the document from the list and showed "Screening is queued"; a confirmed save shows "Metadata saved." and the document stays listed and available. - The group and public metadata routes drop their unreachable 202 branch. - The group and public UI fixtures no longer build a queued receipt. - test_queued_metadata_acknowledgement_keeps_saved_content_held_for_screening becomes test_screened_metadata_edit_applies_directly_and_keeps_the_document_available, and the malformed-receipt test gains a legacy-queued-202 case that fails against the old explorer. - Docs: V2 group document management, the fix doc and the release notes. VERSION stays 0.261.230. Refs microsoft#1621 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
This was referenced Oct 3, 2026
Merged
Paul Lizer (paullizer)
merged commit Oct 3, 2026
4b5346c
into
microsoft:paullizer-workspace-knowledge-holds
2 checks passed
Paul Lizer (paullizer)
added a commit
to paullizer/simplechat
that referenced
this pull request
Oct 3, 2026
Brings in paullizer-workspace-knowledge-holds at 4b5346c, which now includes the upload-only screening intake (0.261.230). Conflicts: VERSION stays 0.261.231, and the 0.261.231 release notes sit above 0.261.230 and 0.261.229. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Paul Lizer (paullizer)
added a commit
that referenced
this pull request
Oct 3, 2026
Brings in #1630 (Run as approval only when someone else authored the revision), which the base branch released as 0.261.229. Layer 1 also used 0.261.229, so its release notes move into the v0.261.230 section alongside layer 2 (#1629, already merged into this branch). Merging this pull request takes the base from 0.261.229 to 0.261.230 and delivers both layers. VERSION stays 0.261.230. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Paul Lizer (paullizer)
added a commit
to paullizer/simplechat
that referenced
this pull request
Oct 3, 2026
Bring in the upload-only intake changes that merged into paullizer-workspace-knowledge-holds. Conflict resolution: - config.py: keep VERSION 0.261.232. - release_notes.md: keep the 0.261.232 section above 0.261.230. - review-screened-documents.md: keep version 0.261.232 and layer 2's two new troubleshooting rows, with the workspace-attachment row from 3b. - test_content_screening_history.py: Version 0.261.232 with both notes. - CONTENT_SCREENING_FRAMEWORK.md: scope and documentation-version lines now credit 0.261.230 for intake and 0.261.232 for container access. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Paul Lizer (paullizer)
added a commit
that referenced
this pull request
Oct 3, 2026
Leave the framework's documentation-version line and existing coverage paragraph intact for layer 2 (#1629), and add the 0.261.232 notes beside them. Fold the guide's new scope sentence into its own section. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Paul Lizer (paullizer)
deleted the
paullizer-screening-upload-only-intake
branch
October 3, 2026 18:51
14 of 24 tasks
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.
Summary
chat_uploadworkspace documents) or File Sync. Generated documents (files the SimpleChat agent action saves, and artifacts published into a workspace) get a server-managedscreening_exemption: {"reason": "generated", "version": 1}field when the version is created, beforeinitial_document_markerruns. They get no screening marker, process normally while screening is on, and scan jobs skip them (screening_not_required). Clients can't set the field:reject_screening_fieldsrefuses anyscreening*key,update_documentrefuses it, and responses never include it. A document that already has a screening marker stays screened._consume_publication_reservation,consume_artifact_publication_screening_scanand the reservation, enrollment and consumption code in publication and readiness. Approval now hands a publication straight to processing. A destination without a screening marker counts as screening-complete, and the destination access check stays. A destination held by screening before this version can't be approved; the requester cancels and requests publication again.queue_metadata_rescanis replaced byvalidate_screened_metadata_update, so a rename still can't change a screened file's extension. The release proof, publication checkpoint and scan-job match no longer comparemetadata_fingerprint. The group and public metadata APIs return onlyupdated(200); their routes no longer have aqueued(202) branch. The V2 Documents explorer no longer handles aqueuedreceipt. Before, that path removed the document from the list and showed "Screening is queued". Now a save is confirmed only by anupdated200 receipt, and any other receipt keeps the draft. Tag edits on a screened document no longer rewrite the released blob's metadata, which would break the ETag-pinned release.Linked issue
Refs #1621
Layer 2 of 4 in the #1621 stack, stacked on #1628 (
paullizer-workspace-knowledge-holds).Release Notes & Latest Features
Is this visible to end users?
Is this admin-facing (Admin Settings, governance, deployment, config)?
Should this become a Latest Feature card?
Screenshot needed for the card?
Version bump
application/single_app/config.pyVERSIONthird segment bumped, or not needed because this is docs-only (0.261.229 → 0.261.230)deployers/version.txtbumped, or not needed becausedeployers/was not changedTesting / validation
The global interpreter can't collect these tests (cryptography 50 with pyOpenSSL 25.3, and Flask 2.2.5 with Werkzeug 3.1.4). Every Python command below ran in a venv overlay: system site packages plus cryptography 46.0.7, Flask 3.1.3, Werkzeug 3.1.6 and Flask-Session 0.8.0.
python -m pytest functional_tests/test_content_screening_upload_only_intake.py -q: passed, 127 passed. With the application changes reverted and only the tests applied: 22 failed, 3 errors, 102 passed. The cases that pass either way are the existing client guards, the readiness check and the import check.python -m pytest <file> -q -rfEon each of the 259functional_testsfiles at base66a29bd60and ated2a15a0d, the branch before the V2 follow-up. No new failures. The functional suites that the follow-up commit8fc81b523touches were re-run afterwards; those results are listed below.test_tabular_row_orchestration_scale.pytimes out at the same test on both branches.python -m pytest <file> -q), branch result vs base:test_content_screening_jobs.py: 112 passed (base: 112 passed).test_content_screening_pipeline.py: 26 passed, 6 failed. The base has the same 6 failures, from the_format_vision_analysis_blockharness.test_content_screening_history.py: 11 passed (base: 10 passed).test_group_document_management.py: 238 passed (base: 237 passed).test_public_document_publication.py: 59 passed (base: 63 passed). 8 reservation-latch cases were removed and 4 hold and no-reservation cases were added.test_group_document_fixture_parity.py: 103 passed (base: 103 passed).test_public_document_fixture_parity.py: 63 passed (base: 63 passed).test_group_document_publication.py: 127 passed.test_public_document_management.py: 205 passed.test_analysis_artifact_publication.py: 53 passed.test_orchestration_artifact_publication.py: 13 passed.test_group_document_publication_screening_bootstrap.pytested only the removed reservation and was deleted. Its import check moved to the new file.8fc81b523, after the V2 follow-up changed the UI fixtures and the two metadata routes (python -m pytest <file> -q), all passed:test_group_context_fixture_parity.py: 230 passed.test_public_context_fixture_parity.py: 252 passed.test_group_document_fixture_parity.py: 103 passed.test_public_document_fixture_parity.py: 63 passed.test_group_document_management.py: 238 passed.test_public_document_management.py: 205 passed.test_group_screening_fixture_parity.py: 35 passed.test_content_screening_upload_only_intake.py: 127 passed.8fc81b523, all passed:python functional_tests/route_tests/test_route_blueprint_policy_inventory.py: 11/11.python functional_tests/route_tests/test_route_unauthenticated_policy_contract.py: 6/6.python functional_tests/route_tests/test_route_policy_test_coverage.py: 2/2.application/v2_uiafternpm ci:npm run typecheck: passed.npm run build: passed. The only warning is the existing chunk-size warning.python -m pytest <file> -q), run against the built SPA with local Playwright,PYTHONPATH=ui_tests\fixturesandPLAYWRIGHT_SERVICE_URLunset:ui_tests/test_v2_group_document_management.py: passed, 58 passed. This includes the rewrittentest_screened_metadata_edit_applies_directly_and_keeps_the_document_availableand the newlegacy-queued-202case intest_malformed_metadata_success_never_discards_the_draft.legacy-queued-202, because the old explorer accepted the receipt and closed the dialog.updated. The parity tests above pin the server'supdatedreceipt.ui_tests/test_v2_public_documents.py: passed, 67 passed.ui_tests/test_v2_personal_document_scope.py: passed, 12 passed.ui_tests/test_v2_group_document_collaboration.py: passed, 33 passed.ui_tests/test_v2_group_documents.py: passed, 30 passed.ui_tests/test_v2_content_screening.py: 35 passed, 1 failed. The failure istest_admin_policy_is_discoverable_and_editable_before_citations_are_enabled, on the admin screening settings page. It fails the same way against a build of the base branch's V2 source.python -m pytest ui_tests/test_content_screening_classic.py -q, run locally withPLAYWRIGHT_SERVICE_URLunset: 46 passed, 3 failed. The failures are the 3 known base failures:test_classic_policy_prerequisites_fail_closedandtest_classic_disable_new_scans_preserves_review_holds[True/False].8fc81b523:python scripts/build_docs_inventory.py: the only change todocs/_data/app_surface.ymlwas line endings, restored withgit checkout -- docs/_data/app_surface.yml.python functional_tests/test_docs_app_surface_coverage.py: passed, 7/7.python functional_tests/test_docs_site_quality.py: passed, 6/6.66a29bd60..8fc81b523), all passed:python scripts/check_xss_sinks.py --base-sha 66a29bd60 --head-sha HEAD <38 changed files>: 28 files checked.python scripts/check_broken_access_control.py --base-sha 66a29bd60 --head-sha HEAD <38 changed files>: 26 files checked.python scripts/check_swagger_routes.py application/single_app/route_backend_group_documents.py application/single_app/route_backend_public_document_management.py: 2 changed route files checked.Known limitation: a metadata edit made through the API while a document is still held is replaced by the inspected copy when the document is released. The workspace interfaces don't offer metadata edits on held documents.
Documentation
### **(v0.261.230)**under Breaking Changes, above v0.261.229.CONTENT_SCREENING_FRAMEWORK.mdGROUP_DOCUMENT_MANAGEMENT_APIS.mdPUBLIC_DOCUMENT_MANAGEMENT_APIS.mdGROUP_DOCUMENT_COLLABORATION_APIS.mdPUBLIC_DOCUMENT_ARTIFACT_APPROVAL_APIS.mdDOCUMENT_PROVENANCE.mdV2_GROUP_DOCUMENT_MANAGEMENT.mddocs/guides/review-screened-documents.mddocs/explanation/fixes/UPLOAD_ONLY_SCREENING_INTAKE_FIX.md.Security checklist
@swagger_route(security=get_auth_security()): no new routes. The two changed metadata routes keep their decorators and only lose the unreachable 202 branch;check_swagger_routes.pypassed.sanitize_settings_for_user(): no settings responses changed.static/v2. No new dependencies or external scripts.is_public_document_fieldkeeps it out of responses.