p='docs/MANIFEST.md'
b=open(p,'rb').read(); crlf=b'\r\n' in b; s=b.decode().replace('\r\n','\n')
a='''web_short_path = "cspt"            # optional; alias of the core-owned served root
```
'''
assert s.count(a)==1
s=s.replace(a,'''web_short_path = "cspt"            # optional; alias of the core-owned served root
summary = "Claude Code harness adapter for spt."   # optional; <= 300 chars, one plain paragraph
changelog = "CHANGELOG.md"         # optional; archive-relative markdown, served rendered
```
''')
a2='''deactivation, removal, update, and reactivation all retain the output bytes.
'''
assert s.count(a2)==1
s=s.replace(a2,a2+'''
<!-- [doc->REQ-ADAPTER-CHANGELOG] -->
`summary` *(optional)* — one plain-text paragraph saying what the adapter is:
at most 300 characters, no line breaks or other control characters. A longer
or multi-line value refuses the manifest at load (`MANIFEST_SUMMARY_TOO_LONG` /
`MANIFEST_SUMMARY_NOT_PLAIN`).

`changelog` *(optional)* — an **archive-relative** path to the adapter's
markdown changelog, so the changelog ships inside the artifact it describes
and nothing fetched from a second source can disagree with the installed
bytes. Absolute paths, `..` components and names not ending `.md` refuse the
manifest at load (`MANIFEST_CHANGELOG_PATH` / `MANIFEST_CHANGELOG_NOT_MARKDOWN`).
`spt adapter add` and every adapter update render the file to HTML **once**,
at install time, into `$SPT_HOME/adapters/<adapter>/changelog.html`; the node
serves that page at `http://localhost:5474/<node>/a/<adapter>/changelog`, and
that URL is the `changelog:` link an update divulge carries for this adapter.
A declared file that is missing from the installed tree or unreadable **fails
the install** (`ADAPTER_CHANGELOG_UNREADABLE`) rather than installing an
adapter whose changelog page is broken. Declaring neither key is the common
case and is not an error: no page is served (the route answers 404) and no
link is printed. Both keys are additive — a manifest written before them stays
valid. The `changelog` segment of the adapter facet is core's: an adapter's own
`web/` file named `changelog` is not reachable at that exact path.
''')
if crlf: s=s.replace('\n','\r\n')
open(p,'wb').write(s.encode())
