Skip to content

Pre-public-beta remediation stack + AFK backlog grind + notarized 0.5.96 release - #33

Merged
LegalMarc merged 62 commits into
mainfrom
codex/prebeta-stack-a-docx-sharing
Jul 4, 2026
Merged

Pre-public-beta remediation stack + AFK backlog grind + notarized 0.5.96 release#33
LegalMarc merged 62 commits into
mainfrom
codex/prebeta-stack-a-docx-sharing

Conversation

@LegalMarc

Copy link
Copy Markdown
Owner

Summary

  • Lands the full pre-public-beta audit remediation stack (T0-T14) from docs/backlog/pre_public_beta_audit_remediation_2026-05-13.md: DOCX send-choice consolidation, remote-Ollama lockdown, owner-only report permissions, --llm-detail parity, 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).
  • Adds a release-preflight script (scripts/release_preflight.sh) gating the automatable RELEASE_CHECKLIST.md steps, wired into CI.
  • Lands 11 QoL/tech-debt implementation tickets from 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).
  • Adds 10 design-spike docs (docs/design/*.md) for the higher-risk backlog items (view-controller decomposition, docx_io.py split, 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.
  • Produces and verifies a real notarized 0.5.96 release artifact: Developer ID signed, submitted to Apple's notary service (accepted), stapled, Gatekeeper-verified. Full evidence in docs/release/entitlement_governance_verification.md and docs/release/public_beta_qualification.md.
  • Repo hygiene: removed 53 stray duplicate-extraction files from the working tree and 16 more that were corrupting .git internals (one was actively breaking git fetch).
  • Fixed two real pre-existing bugs found along the way: a NameError in check_dependency_vulnerabilities.py (dropped import sys), and a doc-sync gap where assets/help.md (canonical) and the generated Swift resource copy had drifted.

Test plan

  • PYTHONPATH=src/python python3 -m pytest -q -- 463 passed, 6 skipped
  • swift test --package-path src/swift/MarcutApp -- 65 passed, 0 failures
  • python3 scripts/check_markdown_links.py -- 31 files passed
  • bash scripts/release_preflight.sh -- all 7 steps pass
  • Real Developer ID DMG built, notarized (Apple submission 5a2c8f87-038d-4ada-866d-5bf17d01b4dd, Accepted), stapled, Gatekeeper-verified
  • scripts/verify_entitlements.sh against the built app/helper -- no forbidden entitlements
  • Manual RELEASE_CHECKLIST.md steps (Quick Look launch, functionality spot-check) -- not run as part of this PR, remain manual per the checklist

🤖 Generated with Claude Code

Marc Mandel and others added 30 commits July 3, 2026 09:33
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>
Marc Mandel and others added 23 commits July 3, 2026 10:37
…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>
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>
Marc Mandel and others added 4 commits July 3, 2026 18:02
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>
@LegalMarc
LegalMarc merged commit 7acf87c into main Jul 4, 2026
2 checks passed
@LegalMarc
LegalMarc deleted the codex/prebeta-stack-a-docx-sharing branch July 10, 2026 11:49
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