← Commit history

0.30.1: plan.unify and plan.freight render as sentences in the changelog

Drew Owens ·b53792c9ff · ·parent 7fc5eea
4 files changed +20−3
docs/BUILD-NOTES.md+8
@@ -3,6 +3,14 @@ Decisions taken while building, and the places where the plan and the code disagreed. Newest first. +## Build notes, 2026-08-17 (0.30.1, the last two data events read like sentences)++`plan.unify` and `plan.freight` were both landing in the changelog as+`describeEvent`'s generic fallback. Same reasoning as 0.28.3: the changelog is+what the next agent reads, so an event it cannot read did not happen. Both render+properly now, and because `describeEvent` runs at READ time the two events already+on disk started reading correctly the moment this shipped.+ ## Build notes, 2026-08-14 (0.30.0, the sections editor)  0.29.0 made `phases[]` the truth about sections; this puts a door on it. A
package.json+1−1
@@ -2,7 +2,7 @@   "slug": "adom-gantt",   "title": "Adom Gantt",   "type": "app",-  "version": "0.30.0",+  "version": "0.30.1",   "description": "Interactive Gantt chart viewer for project timelines, with a table view over the same data. Data-driven, dark by default with a print-friendly light mode, and fully editable in the browser: drag bars to move or resize, multi-select and batch-shift dates, manage dependency arrows inline, reorder rows, filter by phase, and undo. Toggle to the table for every task and milestone as a row with owner, deadline and status, filtered per owner and edited in place. Every edit is recorded in an append-only changelog so an AI can read what a human changed and build on it. Imports JSON, CSV, MS Project XML and Jira CSV; exports JSON, CSV, SVG and a self-contained HTML snapshot.",   "main": "server.js",   "bin": {
page.json+2−2
@@ -2,7 +2,7 @@   "slug": "adom-gantt",   "title": "Adom Gantt",   "type": "app",-  "version": "0.30.0",+  "version": "0.30.1",   "description": "Interactive Gantt chart viewer for project timelines, with a table view over the same data. Data-driven, dark by default with a print-friendly light mode, and fully editable in the browser: drag bars to move or resize, multi-select and batch-shift dates, manage dependency arrows inline, reorder rows, filter by phase, and undo. Toggle to the table for every task and milestone as a row with owner, deadline and status, filtered per owner and edited in place. Every edit is recorded in an append-only changelog so an AI can read what a human changed and build on it. Imports JSON, CSV, MS Project XML and Jira CSV; exports JSON, CSV, SVG and a self-contained HTML snapshot.",   "main": "server.js",   "bin": {@@ -63,4 +63,4 @@     "name": "Drew Owens",     "email": "[email protected]"   }-}\ No newline at end of file+}
server.js+9
@@ -499,6 +499,15 @@ function describeEvent(e) {     const kept = e.kept_drews_newer_edits ? `, keeping ${e.kept_drews_newer_edits} edit(s) made while it was being worked out` : '';     return `${who} re-scheduled the plan: ${e.tasks || 0} task(s) given new dates and ${e.reordered || 0} row(s) reordered so each lane reads top to bottom in the order the work happens. ${e.milestones_untouched || 0} milestone(s) were left exactly where they were, and ${ov} hand-set date(s) had to be overridden to keep a dependency or an anchor honest (listed in this event's "overrides")${kept}${via}`;   }+  if (action === 'plan.unify') {+    const leads = e.leads && Object.keys(e.leads).length ? `, carrying the old header asides across as section leads (${Object.keys(e.leads).join(', ')})` : '';+    return `${who} made sections and phases one thing: ${e.phases || 0} section(s) now own their own headers, and ${e.groupsRetired || 0} group ROW(s) stopped being rows${leads}. Their uids (${(e.retiredUids || []).join(', ')}) are retired for good. The saved order went from ${e.orderBefore || 0} to ${e.orderAfter || 0} entries because headers are derived and no longer stored${via}`;+  }+  if (action === 'plan.freight') {+    const nm = Array.isArray(e.names) && e.names.length ? `: ${e.names.join('; ')}` : '';+    const en = Array.isArray(e.enriched) && e.enriched.length ? `. Enriched ${e.enriched.join(', ')} rather than duplicating what they already covered` : '';+    return `${who} added ${e.added || 0} Capitol delivery task(s) from the USCP research${nm}${en}. Source: ${e.source || 'USCP'}${via}`;+  }   if (action === 'plan.sections') {     const names = Array.isArray(e.names) && e.names.length ? `: ${e.names.join(', ')}` : '';     const rn = e.rename ? `. Renamed ${e.rename.uid} "${e.rename.from}" to "${e.rename.to}"` : '';