Pre-public-beta remediation stack + AFK backlog grind + notarized 0.5.96 release - #33
Merged
Merged
Conversation
Add MARCUT_CONSISTENCY_MAX_CANDIDATES, MARCUT_CONSISTENCY_MAX_FUZZY_ORG_CANDIDATES, and MARCUT_CONSISTENCY_MAX_PATTERN_CHARS budgets to _apply_consistency_pass so a document with thousands of unique ORG candidates can't construct unbounded regex/fuzzy work. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T10. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
_finalize_and_write now writes DOCX, audit JSON/HTML, and scrub JSON/HTML to same-directory hidden temp files first, and only os.replace()s them into final names after the full artifact set is written successfully. Temp files are cleaned up on any failure/cancellation path, so a failure after DOCX staging but before report save no longer leaves a misleading final DOCX. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T7. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… (T5, 1/3) _collect_enhanced_spans gains backend/llama_gguf/threads parameters and uses an explicit backend=="llama_cpp" check (plus the existing extension-based heuristic) to route to LlamaCppRedactionPipeline, forwarding a configurable thread count instead of relying on model_id string sniffing alone. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T5. Continues in the cli.py/unified_redactor.py/model_enhanced.py commits. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
run_redaction's llm_detail branch previously called ollama_extract_with_timing directly, a separate non-chunked extraction path that bypassed the normal enhanced pipeline's chunking, validation, concurrency, and failure semantics. llm_detail now only wraps the same _collect_enhanced_spans call with a timing measurement, so detail mode can no longer produce different spans or different failure behavior than a normal enhanced run. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T4. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
run_redaction's error classification now matches "deadline" in addition to "timeout" so a ProcessingDeadlineExceeded surfaced from the enhanced extraction path is reported as AI_PROCESSING_TIMEOUT rather than a generic processing error. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T6. Continues in the cancellation.py/model.py/llm_timing.py/model_enhanced.py commit that introduces ProcessingDeadlineExceeded. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
_read_metadata_values now summarizes embedded binary parts by default instead of retaining raw bytes, gated behind an explicit forensic/binary export mode that is itself bounded by per-part and total-byte limits with warnings when payloads are skipped. Raw custom XML/alternate-content/fast-save previews are truncated under MARCUT_METADATA_CAPTURE_MAX_STRING_CHARS. _build_scrub_report's serializer applies string/list/dict budgets under MARCUT_METADATA_REPORT_MAX_*, recording warning codes when values are truncated, so default metadata/report generation can't expand unbounded package contents into memory or the report. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T9. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Records the audit findings and the T0-T14 remediation backlog this branch implements, per docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T0's scope of keeping the backlog as the implementation tracker. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
_generate_html_audit_report and generate_html_report (report_html.py) now chmod their output to 0o600 after writing, matching the existing JSON report permission behavior so audit-report and metadata-report HTML artifacts are not group/world-readable by default. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T0/T3 (T3's own implementation notes in the backlog doc were copy-pasted from T4 in error; this is the actual T3 change). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ests (T6, 2/2) Add marcut.cancellation (ProcessingDeadlineExceeded, processing_deadline(), remaining_seconds(), check_processing_deadline()) reading MARCUT_PROCESSING_DEADLINE_MONOTONIC. ollama_extract (model.py) and ollama_extract_with_timing (llm_timing.py) now check the deadline before each request and bound the HTTP timeout to the remaining processing time, so a hung request can't outlive the configured deadline. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T6. Continues from the pipeline.py deadline-classification commit; the model_enhanced.py cancellation wiring (combined with T5 seed/thread changes in that file) and the Swift PythonKitBridge.swift deadline-marker commit follow. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…s (T2, 1/3) PythonBridgeService now strips both MARCUT_ALLOW_REMOTE_OLLAMA and MARCUT_DEVELOPER_UNSAFE_ALLOW_REMOTE_OLLAMA from the sanitized process environment and the rule-filter subprocess environment before launching Python, so public runtime paths can't be silently redirected to a remote Ollama host via an inherited environment variable. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T2. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
get_ollama_base_url now reads MARCUT_DEVELOPER_UNSAFE_ALLOW_REMOTE_OLLAMA instead of the legacy MARCUT_ALLOW_REMOTE_OLLAMA. The embedded-Python env sync (PythonKitBridge.swift) and the redact --help preflight subprocess (MarcutApp.swift) strip both variable names before Python ever sees them. Security docs and in-app help now state that public runtime cannot be silently redirected to a remote Ollama host, and that the developer-unsafe override must not be used with confidential documents. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T2. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…mptly (T6) PythonKitRunner sets MARCUT_PROCESSING_DEADLINE_MONOTONIC for each timed processing phase and clears it after completion, cancellation, or before a new run starts. User stop now calls PyErr_SetInterrupt() immediately (in addition to the existing async worker interrupt) and expires the deadline marker right away, so Python-side deadline checks (see the cancellation.py commit) observe the stop without waiting on the async path. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T6. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…llama calls (T5, 2/3) cli.py forwards --llama-gguf/--threads into run_unified_redaction. unified_redactor.py accepts llama_gguf/threads and raises a clear error when the llama_cpp backend has no GGUF path instead of silently falling back to the default Ollama model string. model_enhanced.py threads the configured seed through ollama_validate_batch/ollama_validate/apply_llm_overrides_to_rule_spans and IntelligentRedactionPipeline (chunk extraction previously hard-coded seed=42), and adds a thread count to LlamaCppRedactionPipeline. This same file also carries this pass's T6 cancellation wiring (cancel_event, deadline checks in the validate/extract retry loops, deadline-aware polling waits replacing blocking concurrent.futures.wait, non-blocking executor shutdown) -- the two concerns are interleaved inside the same chunk-processing methods and are not being split into separate commits to avoid hand-editing a single diff hunk in the core extraction pipeline. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T5 and T6. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The ollama pull CLI fallback now tracks time-since-last-output and terminates the process with an actionable error if it stalls. Download completion now waits for /api/show readiness after the model appears on disk, and processing performs the same readiness probe before starting non-rules/non-mock work, closing the race where a model looks installed but isn't yet ready to serve requests. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T8. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…oice (T1) The document row's share button now opens an explicit choice: "Send Final Redacted Copy" creates a separate copy, accepts Marcut's redaction Track Changes into it, and runs maximum-privacy metadata scrubbing before sharing; "Send Review Copy" requires an extra confirmation that Track Changes and metadata may still contain recoverable original text before sharing the review artifact as-is. Users can no longer accidentally share a Track Changes review DOCX as if it were a finalized redaction. DocumentRedactionViewModel also gains makeSensitiveReportFilePrivate (T3's owner-only-permissions helper) in this same hunk since it was added immediately adjacent to finalRedactedCopyURL; T3's call sites land in the next commit. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T1. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…2/2) Metadata-only JSON/HTML report writes and exported report copies now call makeSensitiveReportFilePrivate (added in the previous DOCX-send-choices commit) after writing, matching the Python-side 0o600 behavior for audit/scrub reports. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T3. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…T11) notarize_macos.sh no longer treats a pending notarytool status as success (was exit 0, now exit 1) and no longer swallows a failed post-staple Gatekeeper assessment with || true. build_appstore_release.sh exits on code-signature verification failure instead of continuing to DMG creation, and gates every notarization-skip path behind an explicit MARCUT_ALLOW_NOTARIZATION_SKIP=1 override rather than silently skipping when SKIP_NOTARIZATION is set or a keychain profile is missing. build_devid_release.sh sets that override only for its own internal --skip-notarization build step. The tag/nightly E2E workflow now has a fail-closed prerequisite step requiring a signing identity, Developer ID Application identity, and App Store Connect notarization secrets before a release-tag job can proceed, and sets the skip override explicitly for its intermediate (pre-notarization) DMG build step only. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T11. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ins (T12) generate_python_sbom.py now builds a CycloneDX-style SBOM from the actual staged python_site (or --bundle-root for a built MarcutApp.app), including transitive PyPI packages from *.dist-info/METADATA, SwiftPM dependencies from Package.resolved, and explicit manual-review components for BeeWare Python.framework and the embedded Ollama binary. check_dependency_vulnerabilities.py gains --sbom to scan all shipped PyPI components through OSV and report unsupported components that still need manual review. docs/release/python-sbom.json is regenerated from the current staged app (23 components). Restored the script's executable bit, which the prior working-tree diff had accidentally dropped (100755 -> 100644). Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T12. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…rchive path (T11) run_with_live_output gains an env parameter so run_appstore_release can pass MARCUT_ALLOW_NOTARIZATION_SKIP=1 explicitly to the underlying build script, matching the fail-closed notarization-skip gate added to build_appstore_release.sh (this override is intentional here because App Store notarization happens at submission time, not in this build step). Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T11. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…14 tooling) verify_entitlements.sh prints app/helper entitlements from a built MarcutApp.app and fails on forbidden debug/runtime-bypass entitlements. build_tui.py runs it (plus SBOM, vulnerability, stapler, and Gatekeeper evidence checks) automatically after a Developer ID DMG build or existing-DMG notarization. CODEOWNERS assigns public-beta-critical paths for review. docs/release/entitlement_governance_verification.md records source-level entitlement evidence and the repository's governance controls (branch protection ruleset, PR template, CI workflows). This is the source-level portion of T14 -- it does not itself run against a built artifact, since that requires a Developer ID signed DMG this pass didn't produce. Final acceptance (running verify_entitlements.sh against the real app/helper and recording the output) remains open; see the doc's "Public-Beta Blockers" section. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T14. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
docs/release/public_beta_qualification.md supersedes the stale 0.5.95 ad-hoc note with current 0.5.96 source/config evidence and this pass's remediation verification results, and states that a notarized 0.5.96 DMG was not produced locally and remains a public-beta blocker. docs/README.md drops stale MarcutApp-Swift-v0.2.3.dmg references for current 0.5.96/AppStore.dmg wording. docs/RELEASE_CHECKLIST.md points SBOM/vulnerability steps at --bundle-root/--sbom. docs/TECHNICAL_ARCHITECTURE.md states notarization is mandatory for public direct distribution builds. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T13. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…y (T5) test_cli.py::test_main_forwards_gguf_backend_settings and test_unified_redactor.py::test_llama_cpp_backend_requires_gguf_path. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T5. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Builds body paragraphs, a table, headers/footers, comment metadata, and document metadata with many sensitive spans, then runs pipeline.run_redaction(..., mode="rules") and asserts wall time, phase timings, output/report sizes, scrub report creation, and a minimum redaction count -- using the real production entry point rather than a timing-only extraction shortcut. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T10. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
test_metadata_html_report_is_owner_only (T3), TestLLMDetailTiming:: test_llm_detail_does_not_change_enhanced_spans and test_llm_detail_keeps_enhanced_failure_semantics (T4), test_llama_cpp_backend_uses_gguf_path_and_threads (T5), test_processing_deadline_failure_does_not_write_output_docx (T6), TestTransactionalArtifacts::test_finalize_cleans_docx_when_audit_report_fails (T7). Landing as one commit rather than five: these are pure-insertion additions appended together in the file, several sharing the same _patch_minimal_enhanced_pipeline fixture helper, and all of pipeline.py's production code they exercise is already committed. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T3/T4/T5/T6/T7. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
test_legacy_remote_host_override_is_ignored, test_remote_host_requires_developer_unsafe_override (T2), test_request_timeout_respects_processing_deadline (T6), plus MARCUT_PROCESSING_DEADLINE_MONOTONIC cleanup in existing tests. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T2/T6. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…5/T6) test_ollama_validate_sends_seed, test_intelligent_pipeline_sends_seed_to_chunk_extraction (T5), test_ollama_validate_respects_processing_deadline, test_intelligent_pipeline_rejects_expired_processing_deadline, test_intelligent_pipeline_deadline_interrupts_hanging_extraction (T6). Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T5/T6. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…dgets test_scrub_accepts_track_changes_for_final_copy (T1), owner-only 0o600 assertions appended to the existing scrub-report test (T3), test_report_values_are_bounded_with_warnings and test_metadata_reader_summarizes_binary_payloads_by_default (T9). Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T1/T3/T9. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…T1/T3/T8) testFinalRedactedCopyURLUsesSeparateDocxCopy, testFinalRedactedCopyURLAvoidsOverwrite (T1), testSensitiveReportFilePrivacyHelperSetsOwnerOnlyMode (T3), testModelDownloadCLIIdleTimeoutConfiguration (T8). Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T1/T3/T8. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ground-truth generation and F1/latency comparison scripts across qwen3.5 model sizes (4b/9b/27b/35b), plus one prior benchmark run's results. Not part of the pre-public-beta remediation stack -- kept as separate research tooling, not wired into CI or the release checklist. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Tracks upcoming features, quality-of-life improvements, technical debt, and new architecture directions discovered during system audits. Unrelated to the pre-public-beta remediation stack (T0-T14). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ythonBridge Refs #21
…json (#22) Adds models.json (mirrored identically across assets/, src/python/marcut/, and src/swift/MarcutApp/Sources/MarcutApp/Resources/, the same pattern already used for excluded-words.txt) as the single source of truth for recommended models and their parameters (temperature, skip-confidence, display metadata), replacing hardcoded literals previously scattered across cli.py, gui.py, ollama_manager.py, and SettingsView.swift. Adds model_config.py (Python loader) and ModelCatalog.swift (Swift loader) as mirrored loaders, plus BundleResourceLocator.swift for resolving the bundled resource path in both dev and production bundle layouts. Same recommended models (llama3.1:8b, mistral:7b, llama3.2:3b) and parameters as before this refactor -- pure data-location change, no selection/recommendation behavior change. This commit was staged by an AFK loop coder that got cut off by a session limit mid-run; verified independently before landing (full Python suite: 463 passed, 6 skipped; full Swift suite: 65 passed, 0 failures). Refs #22 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…on consistency Refs #28
… revised documents Refs #31
…n audit log Refs #32
src/swift/MarcutApp/Sources/MarcutApp/Resources/help.md is generated from assets/help.md by scripts/render_help_html.py (run as part of the release build). The earlier T1/T2 commits in this branch edited the generated Swift copy directly but never updated assets/help.md, the actual source of truth. Running the Developer ID release build regenerated the Swift copy from the stale canonical source and silently reverted those two doc additions. Added the same "Send Final Redacted Copy"/"Send Review Copy" (T1) and remote-Ollama override (T2) bullets to assets/help.md, then regenerated the Swift copy via the actual render script to confirm the two stay in sync going forward. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Produced and verified the actual Developer ID signed, notarized, stapled, Gatekeeper-verified 0.5.96 DMG this ticket was blocked on: - Built via scripts/sh/build_devid_release.sh against a freshly-provisioned BeeWare Python.framework. - Signed with Developer ID Application: Marc Mandel (QG85EMCQ75). - Notarized via scripts/notarize_macos.sh (Apple submission 5a2c8f87-038d-4ada-866d-5bf17d01b4dd, status Accepted) using credentials stored at ~/.config/marcut/notarize.env (owner-only, not committed). - Stapled and Gatekeeper-verified (spctl: accepted, source=Notarized Developer ID). - scripts/verify_entitlements.sh passed against the built app/helper -- matches the source-level review, no forbidden debug/runtime-bypass entitlements. - SBOM regenerated directly from the built bundle (--bundle-root): 23 shipped components, dependency vulnerability gate passed for 20 shipped PyPI packages, only Ollama flagged for the expected manual review. docs/release/entitlement_governance_verification.md and docs/release/public_beta_qualification.md updated with the full evidence. The DMG itself is a local build artifact (gitignored) and not part of this commit. Part of docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md T14. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
CI's build-verify/smoke workflows run generate_python_sbom.py --check with no --bundle-root, expecting the manual-review-required placeholder entries for BeeWare Python.framework and embedded Ollama. The SBOM committed in 949a734 was generated with --bundle-root against a real built app, which produces precise (non-placeholder) values for those two components -- correct for the T14 release-time verification recorded in entitlement_governance_verification.md, but a mismatch against CI's per-PR gate, which doesn't have a built bundle available. docs/release/python-sbom.json now matches what --check (no --bundle-root) expects; verified locally with the exact commands CI runs. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
test_intelligent_pipeline_deadline_interrupts_hanging_extraction asserted the interrupt fires within 0.3s against a 0.05s deadline and a 0.4s hang. Failed on GitHub-hosted CI by ~7ms (0.307s) -- not a real regression, just insufficient headroom for a loaded/throttled CI host. Loosened to 0.35s, which still meaningfully proves the interrupt fires well before the full 0.4s hang would complete. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Applies the conflict resolutions previously combined from a stale local
`main` branch (model catalog architecture, PythonBridge.swift injection
fix, MarcutApp.swift unredacted-path-logging fix, and Python pipeline/CLI
feature merges across scripts/generate_ground_truth.py,
scripts/run_qwen_experiment.py, src/python/marcut/{cli,gui,llm_timing,
model_enhanced,ollama_manager,pipeline,unified_redactor}.py, and the
Swift DocumentModels/DocumentRedactionViewModel/MarcutApp/PythonBridge/
SettingsView files) directly on top of this branch's own history.
That local `main` had diverged from origin/main since 2026-05-12,
predates it by ~140 unrelated legacy commits never pushed to origin,
and includes a commit whose blob object is no longer present in any
local pack (0-byte pack file, confirmed via `git fsck --full`) --
making its full ancestry unpushable. This branch's own tip already
contained everything from real origin/main, so nothing from that
ancestry was actually needed; only the resolved tree is carried
forward here, unchanged from the original merge commit.
Originally combined as 5a5e5bbd4ea644ddd37fd06216b8590fe5e41384; this
commit carries an identical tree with clean, pushable parentage.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
ccbf7a4 loosened the assertion 0.3s -> 0.35s but the underlying issue wasn't the bound -- it's that remaining_seconds() enforces a hard 0.25s minimum poll floor (cancellation.py), so the interrupt can never fire faster than that regardless of how soon the deadline itself expires. With only a 0.4s hang, that floor plus routine CI scheduling jitter left almost no margin, and build-verify failed again post-push at ~0.40s. Widen the gap instead: hang for 1.5s and assert interrupt within 0.75s, which still proves the interrupt fires well before the hang completes while giving real headroom over the 0.25s floor for a loaded CI host. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ample, bump interim version release_preflight.sh's version-sync and secrets-check steps hardcoded build-scripts/config.json, which is deliberately untracked (local signing config) and never exists on a fresh CI checkout -- so the new "Release preflight gate" workflow step (wired in by 8160be9) could never pass in CI. Give both steps the same config.json -> config.example.json fallback scripts/sh/build_swift_only.sh already uses, and skip the secrets check when only the tracked example is present (it's meant to be tracked). With that fixed, the version-sync check correctly reports that 0.5.96 matches the last tagged release (v0.5.96) -- this gate is designed to block merging to main without bumping past the last tag, so an interim bump to 0.5.97 unblocks this reconciliation merge. The real product version bump (release notes, App Store number) happens separately in the upcoming model-catalog/App-Store-prep work. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
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
docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md: DOCX send-choice consolidation, remote-Ollama lockdown, owner-only report permissions,--llm-detailparity, GGUF backend forwarding, hard cancellation/deadlines, transactional artifact writes, model-download readiness, metadata/report size limits, large-DOCX performance gates, fail-closed notarization, shipped-bundle SBOM coverage, release docs refresh, and entitlement/governance verification -- as 39 atomic, per-ticket commits (reconstructed byte-identical to the original working tree; verified).scripts/release_preflight.sh) gating the automatableRELEASE_CHECKLIST.mdsteps, wired into CI.backlog.md(settings search, download notifications, retry-failed, log viewer, profile export/import, excluded-word live preview, ETA display, batch-job persistence/resume, UserDefaults centralization, model-naming unification, model config externalization).docs/design/*.md) for the higher-risk backlog items (view-controller decomposition,docx_io.pysplit, Swift/Python bridge schema migration, streaming progress, and all 6 "Major New Directions") -- each grounded in the actual code, proposing a plan rather than a blind implementation.docs/release/entitlement_governance_verification.mdanddocs/release/public_beta_qualification.md..gitinternals (one was actively breakinggit fetch).NameErrorincheck_dependency_vulnerabilities.py(droppedimport sys), and a doc-sync gap whereassets/help.md(canonical) and the generated Swift resource copy had drifted.Test plan
PYTHONPATH=src/python python3 -m pytest -q-- 463 passed, 6 skippedswift test --package-path src/swift/MarcutApp-- 65 passed, 0 failurespython3 scripts/check_markdown_links.py-- 31 files passedbash scripts/release_preflight.sh-- all 7 steps pass5a2c8f87-038d-4ada-866d-5bf17d01b4dd, Accepted), stapled, Gatekeeper-verifiedscripts/verify_entitlements.shagainst the built app/helper -- no forbidden entitlements🤖 Generated with Claude Code