import sys
sys.path.insert(0, r'C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-core\eda11d3f-0102-46f7-a034-9d1d416bb9d3\scratchpad')
from crlfedit import Ed
e=Ed('docs-site/src/harness-contract/manifest.md')
e.rep('''  running process is never pulled out from under an update, so do not rely on an
  update to delete an old executable; stop referencing it instead.
''','''  running process is never pulled out from under an update, so do not rely on an
  update to delete an old executable; stop referencing it instead.

<!-- [doc->REQ-ADAPTER-ENTRY-EXEC-BIT] -->
**Ship your binaries executable.** On Linux and macOS, every binary your
manifest runs must carry its exec bit inside the `.spt` archive — an archive
packed on Windows often drops it (mode `0644`). spt-core keeps the modes your
archive carries, with one safety net: after every install or update it checks
the binaries your manifest **declares** — the program of each command spt-core
runs (`[service]`, `[message-idle-translation-binary]`, `[digest].extractor`,
`[session.*]` roles, `[update]` / `[update.post]`, `[shell]`) when that program
resolves to a file inside your install — and if one arrived without its exec
bit, spt-core sets it and prints

```text
ADAPTER_ENTRY_EXEC_FORCED:<adapter>: <path> extracted 0644 — packaging defect upstream
```

Treat that line as a bug report against your packaging: the node keeps working,
but the next node that installs a different way may not. The check runs on
every update run, even when no file changed, so a node that already installed
the broken mode heals on its next `spt adapter update`. Files your manifest does
not run are never touched.
''')
e.save()
e=Ed('docs/MANIFEST.md')
e.rep('''<!-- [doc->REQ-ADAPTER-UPDATE-PARALLEL] -->
**One thread per adapter''','''<!-- [doc->REQ-ADAPTER-ENTRY-EXEC-BIT] -->
**Exec bit on declared entry binaries (releases#62, ruled (b) 2026-09-24; F-028 contract).** Packaging MUST carry the exec bit on every binary the manifest runs; core PRESERVES archive modes. Safety net, Unix only: after every install (`spt adapter add`), every update run (applied OR up-to-date — the CRC swap compares content only, so a mode-only difference is never swapped and heals here), and inside the daemon-coordinated apply before it restarts the translation child, `spt_runtime::entry_exec::force_entry_exec` sets the exec bit on each DECLARED entry binary that lacks it and prints `ADAPTER_ENTRY_EXEC_FORCED:<adapter>: <path> extracted <mode> — packaging defect upstream` (a failed chmod prints `ADAPTER_ENTRY_EXEC_FAILED:`). Declared = the program token of a spawned command (`[session.*]` roles, `[history].normalize_command`, `[digest].extractor`, `[message-idle-translation-binary]` command/path, `[service].command`, `[update].command`, `[update.post].command`, `[shell].spawn`/`wake_command`) filled with `{adapter_dir}`/`{adapter_name}` and resolved per REQ-INSTALL-11 to a file INSIDE the install dir. Never a blanket chmod.

<!-- [doc->REQ-ADAPTER-UPDATE-PARALLEL] -->
**One thread per adapter''')
e.save()
print('ok')
