aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWebX11 SysOp <darkmotox11@gmail.com>2026-11-05 20:40:17 +0100
committerWebX11 SysOp <darkmotox11@gmail.com>2026-11-05 20:40:17 +0100
commit36d45b1f4a9f317843c824946d8cf40a02f9412a (patch)
tree7c23a2c6a73b83f12cdfd8666323479b8bdcb961
parent5d1cb2c5778b8ac5f0347aac1b55a1d927212841 (diff)
fix(changelog): stop prepending the preamble on every run
write_md() put the H1 + description inside the generated body and also kept old[:m.start()], so each regeneration added another copy: 44 runs left 44 H1s and pushed the first release to line 179. Only the region between the markers is generated now, an existing file with N copies is collapsed to one, and an assert refuses to write a file containing two generated regions (proven RED by injecting a duplicate). Regenerated: 83 entries, 185 commits, first heading v4.6.146 (was v4.6.135 - the file had not been committed since 2026-11-02).
-rw-r--r--CHANGELOG.md126
-rw-r--r--scripts/build-changelog.py46
2 files changed, 75 insertions, 97 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 86862da..95f98e2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,125 +2,81 @@
Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
-# newOS4 changelog
-
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
-
-# newOS4 changelog
-
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
-
-# newOS4 changelog
-
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
-
-# newOS4 changelog
-
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
-
-# newOS4 changelog
-
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
-
-# newOS4 changelog
-
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
-
-# newOS4 changelog
-
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
-
-# newOS4 changelog
-
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
-
-# newOS4 changelog
-
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
-
-# newOS4 changelog
-
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
-
-# newOS4 changelog
-
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
-
-# newOS4 changelog
-
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
-
-# newOS4 changelog
-
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
+<!-- generated:start -->
-# newOS4 changelog
+## v4.6.146 — 2026-11-05
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
-
-# newOS4 changelog
+_Touches modules (3), README.md (2), main.html (1), LICENSE (1) · docs 2, project 1_
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
+- `One dashboard — port billing/API keys, 301 the duplicate` `8bf70f9`
+- `Publishable README, MIT licence, security policy` `447be4b`
+- `Clone instructions in the README; publisher sets gitweb owner/description` `350e1d0`
-# newOS4 changelog
+## v4.6.145 — 2026-11-02
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
+_Touches modules (2), main.html (1) · fix 1_
-# newOS4 changelog
+- `Stop offering a Telegram widget where it cannot work` `532e2ff`
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
+## v4.6.144 — 2026-11-02
-# newOS4 changelog
+_Touches modules (3), main.html (1) · fix 1_
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
+- `One session writer for every login path; expire dead credentials` `2421eb4`
-# newOS4 changelog
+## v4.6.143 — 2026-11-02
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
+_Touches modules (6), main.html (1) · fix 1_
-# newOS4 changelog
+- `Read_file pages were silently truncated; delegation no longer invents &quot;completed&quot;` `b380ec8`
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
+## v4.6.141 — 2026-11-02
-# newOS4 changelog
+_Touches modules (7), main.html (1) · fix 1_
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
+- `Memory-graph loads stop rewriting user data; unknown sizes say unknown` `8eaf114`
-# newOS4 changelog
+## v4.6.140 — 2026-11-02
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
+_Touches modules (6), main.html (1) · fix 1_
-# newOS4 changelog
+- `WebDAV listing sizes + pull, and five MemoryGraph defects` `e639c2d`
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
+## v4.6.139 — 2026-11-02
-# newOS4 changelog
+_Touches modules (4), main.html (1) · fix 1_
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
+- `Delegated agent runs no longer serialise; a waiter can&#x27;t steal a lock` `7491c34`
-# newOS4 changelog
+## v4.6.138 — 2026-11-02
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
+_Touches modules (4), main.html (1) · fix 1, review 1_
-# newOS4 changelog
+- `Chat() threw on every tool-using turn and never returned its answer` `8a9333b`
+- `Guard chat()&#x27;s return and tool-turn survival` `af28b5b`
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
+## v4.6.137 — 2026-11-02
-# newOS4 changelog
+_Touches modules (6), help.html (1), main.html (1), modules-index.json (1) · release 1_
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
+- `Configurable tool budgets, per-model defaults, real tool telemetry` `32608bc`
-# newOS4 changelog
+## v4.6.136 — 2026-11-02
-Generated from git history by `scripts/build-changelog.py` — do not edit by hand between the markers.
+_Touches scripts (4), modules (3), main.html (1) · release 4_
-<!-- generated:start -->
+- `No model-class gate; free allowance becomes $0.10/day` `a7cbc19`
+- `R5 stale-artefact rule + dashboard queues a decision once` `89910fd`
+- `Ingest report-like chat messages into the feedback queue` `b7fef93`
+- `Chat plane on the dashboard + honest triage ranking` `9f0b042`
-## v4.6.135 — 2026-10-29
+## v4.6.135 — 2026-10-30
-_Touches modules (6), course (1), help.html (1), main.html (1) · release 1_
+_Touches modules (6), data (6), course (2), help.html (1) · release 1, docs 1, project 1_
- `Register `test` / `[` so chains decide locally instead of asking a model (v4.6.135)` `4472c81`
+- `Regenerate after the metering and shell commits (73 entries)` `4fca1c9`
+- `Untrack cron/API runtime state, keep it on disk` `8555cd4`
## v4.6.132 — 2026-10-29
diff --git a/scripts/build-changelog.py b/scripts/build-changelog.py
index 1b00a5e..8973761 100644
--- a/scripts/build-changelog.py
+++ b/scripts/build-changelog.py
@@ -275,21 +275,31 @@ def write_page(page):
return len(new)
+PREAMBLE = ('# newOS4 changelog\n\n'
+ 'Generated from git history by `scripts/build-changelog.py` — do not edit by hand '
+ 'between the markers.\n\n')
+# The preamble is emitted EXACTLY once. Before 2026-11-05 it was part of the generated body *and*
+# old[:m.start()] was preserved on top of it, so each run prepended another copy: 44 runs left 44
+# copies of the H1 at the top of the file (and pushed the real first release from line 6 to 179).
+PREAMBLE_RE = re.compile(re.escape('# newOS4 changelog') +
+ r'\n\nGenerated from git history by `scripts/build-changelog\.py` — '
+ r'do not edit by hand between the markers\.\n+')
+
+
def write_md(page, rows):
- """App-side Keep-a-Changelog history; generated region is delimited."""
- out = ['# newOS4 changelog', '',
- 'Generated from git history by `scripts/build-changelog.py` — do not edit by hand '
- 'between the markers.', '', '<!-- generated:start -->', '']
+ """App-side Keep-a-Changelog history; only the region between the markers is generated."""
+ region = ['<!-- generated:start -->', '']
for entry in page['entries']:
- out.append('## %s — %s' % (entry['version'], entry['date']))
- out.append('')
+ region.append('## %s — %s' % (entry['version'], entry['date']))
+ region.append('')
if entry['note']:
- out.extend(['_' + re.sub(r'<[^>]+>', '', entry['note']) + '_', ''])
+ region.extend(['_' + re.sub(r'<[^>]+>', '', entry['note']) + '_', ''])
for item in entry['items']:
- out.append('- ' + re.sub(r'<[^>]+>', '`', item).replace('``', '`').replace('``', '`'))
- out.append('')
- out.extend(['<!-- generated:end -->', ''])
- body = '\n'.join(out)
+ region.append('- ' + re.sub(r'<[^>]+>', '`', item).replace('``', '`').replace('``', '`'))
+ region.append('')
+ region.extend(['<!-- generated:end -->', ''])
+ region_text = '\n'.join(region)
+
if os.path.exists(MD):
with open(MD, encoding='utf-8') as fh:
old = fh.read()
@@ -299,7 +309,19 @@ def write_md(page, rows):
# hand-edit added, and silently dropping it is worse than failing loudly.
raise SystemExit('CHANGELOG.md exists but has no generated:start/end markers - '
'refusing to overwrite it')
- body = old[:m.start()] + body + old[m.end():]
+ head, tail = old[:m.start()], old[m.end():]
+ copies = len(PREAMBLE_RE.findall(head))
+ if copies != 1:
+ rest = PREAMBLE_RE.sub('', head).strip('\n')
+ head = PREAMBLE + (rest + '\n\n' if rest else '')
+ print('changelog: collapsed %d preamble copies in CHANGELOG.md' % copies)
+ body = head + region_text + tail
+ else:
+ body = PREAMBLE + region_text
+ # Guard against the 2026-11-05 regression class: the generated region may appear exactly once.
+ # The old code concatenated the preamble into `body` and kept old[:m.start()] as well, so every
+ # run appended another copy — 44 runs, 44 H1s, and the first release pushed to line 179.
+ assert body.count('<!-- generated:start -->') == 1, 'CHANGELOG.md would contain a duplicated region'
write_atomic(MD, body)
return len(body)