chore(t3x): auto-build on a 12h cadence, not every main commit - #15

Merged
radroid merged 1 commit into
mainfrom
t3x/autobuild-12h-cadence
Jul 26, 2026
Merged

chore(t3x): auto-build on a 12h cadence, not every main commit#15
radroid merged 1 commit into
mainfrom
t3x/autobuild-12h-cadence

Conversation

@radroid

Copy link
Copy Markdown
Owner

Why

The desktop auto-build watcher (scripts/t3x/auto-build-desktop.sh --watch) polled HEAD every 60s (120s in the running LaunchAgent) and rebuilt whenever main advanced. On an active repo that means near-continuous ~470MB .dmg rebuilds — the laptop never settles. Requested change: build on a slow, deliberate cadence (at most every 12h, only if main changed), keep manual builds, and stop failures from retrying every 30 min.

Changes (scripts/t3x/auto-build-desktop.sh)

  • Default --watch interval 6043200 (12h). The watcher still rebuilds only when main changed since the last build (build_once is a no-op on unchanged HEAD); it no longer tracks every commit. It does not rebuild the instant main moves — a change is picked up at the next poll.
  • Failure backoff caps at max(30min, interval) instead of a flat 30 min. On the 12h cadence a persistently failing build now retries every 12h, not ~48×/day. Short intervals still top out at 30 min (unchanged). This also fixes the new cap line to assign the value (delay="$cap"), not the literal string cap — caught by a backoff arithmetic unit-check.
  • Docs/usage updated.

A one-shot manual build (scripts/t3x/auto-build-desktop.sh --install) still bypasses the interval entirely.

Verification

  • bash -n (syntax) clean.
  • Backoff arithmetic checked for both cadences: INTERVAL=60 → 120/480/1800s (unchanged); INTERVAL=43200 → 43200s at every failure count.
  • --help reflects the new default.

Operational note: the running dev.t3x.autobuild LaunchAgent's --interval was already switched to 43200 out of band and the build marker seeded to current main, so it is on the 12h cadence now and did not trigger a build on reload. This PR makes that cadence the script's own default so a regenerated plist inherits it.

🤖 Generated with Claude Code

The desktop auto-build watcher polled HEAD every 60s (120s in the running
LaunchAgent) and rebuilt on every main change, so an active repo rebuilt the
~470MB dmg near-continuously. Slow it to a deliberate 12h cadence:
- Default --watch --interval 60 -> 43200 (12h). The watcher still rebuilds only
when main changed since the last build; it no longer tracks every commit.
- Failure backoff caps at max(30min, interval) instead of a flat 30min, so on
the 12h cadence a persistently failing build retries every 12h, not ~48x/day.
(Also fixes the cap assignment to use the value, not the literal "cap".)
- Docs updated to match.
A one-shot manual build (plain --install) still bypasses the interval. The
running LaunchAgent's --interval was also updated to 43200 out of band.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3a409c74-d050-4113-96cd-5eaa0bf6e2c4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3x/autobuild-12h-cadence

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@radroid
radroid merged commit d25ec9d into mainJul 26, 2026
1 check passed
@radroid
radroid deleted the t3x/autobuild-12h-cadence branch July 30, 2026 14:23
radroid added a commit that referenced this pull request Aug 18, 2026
…s package
A five-axis review (standards / spec / claim re-verification / internal
consistency / prototype QA) turned up 102 findings, ~60 unique. The
load-bearing ones, all verified against the code before editing:
- The compose-don't-replace correction was applied unevenly: the check-in
prompt still said "I am the scheduler for this thread. Do not schedule
your own wake-ups", the report kept the CLAUDE_CODE_DISABLE_CRON switch
PLAN drops, and the report's deferred table still had session_crons in
Phase 3. All now carry the composed story.
- Deference now matches #42's Guard #15: T3 stands down while a recorded
wake is pending regardless of distance (the binary clamps at 3600s),
and fires wake_lost only past a new wakeGraceMs. TESTS 11c reworded.
- session_crons carries a cron EXPRESSION, not a timestamp
(SessionCronSummary in sdk.d.ts 0.3.170) — the nextFireAtMs parse is
the fork's and is now an explicit [A].
- pingdotgg#5127's voiding was overstated: the aborted branch resolves the
Deferred with {} but then DENIES the tool call while the session stops.
What survives is user-input.resolved with empty answers — voided reads
as answered downstream, which is still why the durable record exists.
- The §1.4 "second kill" is gone upstream (pingdotgg#5710, e70cdb4): the
no-turnState branch emits token usage plus a log, no lifecycle event.
- total_cost_usd is stamped onto turn.completed.totalCostUsd, not
"unread"; nothing aggregates it, and its semantics stay [A].
- Numbers re-stamped on the a4cc136 ledger: ClaudeAdapter churn 16 /
~4.6k lines, orchestration.ts 20, settingsSearch.ts 14, SettingsPanels
36/2088, contracts/settings 26, the _chat row churn 4 / risk 64 (the
fork's added delta stays 0), Sidebar +184/-81. #112 answered with
measured churn (RightPanelTabs 14, rightPanelStore 7).
- Seam accounting unified on PLAN §6 (3 rows, phases 1-4);
SETTINGS_SECTION_ICONS attributed to SettingsSidebarNav.tsx; the
"search-invisible" claim dropped (the id union is derived).
- Fork main SHAs are rewritten by every sync, so the docs now anchor on
the merge-base; the 08-18 force-rewrite to 94c6328 is recorded.
- Report section refs renumbered after the mobile insert (§13→§14 etc.),
the 137-sum test table now sums to 159, the orphaned decision-4 chips
and the four-vs-five scenario counts fixed.
- Prototypes: tokens re-lifted where they had drifted ([data-app-sidebar]
values, sky-300 not sky-400, computed base literals), p5 gains the
self-pacing and wake-lost states (15 total), the spinner became the
product's stepped pulse, switches got role/aria, p2 prices the sidebar
row chrome honestly (deferred — it would be a new Sidebar.tsx row),
p6/p3 align with #44's v1 contract (never pushes, PRs opt-in later).
- build-report.mjs: function replacer, escapeHtml on marker fields, a
GENERATED banner in the output, honest self-containedness claim, +x.
- LoopRecord gains the checkIns array the console's ledger reads;
workSource leaves phase 1 (lands with #44); stop-with-pending-crons
now calls stopSession, the honest cancel from #42 1c.
- The archived loop/ design's DESIGN.md banner no longer overclaims, and
its report.html carries a superseded pointer.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
radroid added a commit that referenced this pull request Aug 19, 2026
A fresh two-axis review plus an adversarial re-verification of every [V]
claim found three that did not survive contact with the tree, one of them
a design hole an implementer would have built.
- The [60, 3600] clamp belongs to ScheduleWakeup alone. session_crons also
carries CronCreate entries, which take an arbitrary 5-field expression
with no hour bound, so "the exposure is bounded without a second rule"
was wrong: a recorded `0 9 * * *` stands T3 down for up to 24h. Deference
is now capped at the loop's own deadline, since past it there is nothing
left to defer to. Added by review, and open beside Q1.
- wakeGraceMs ~90s was the wrong half of the jitter model. 90s is the
one-shot *early* jitter; the late jitter is up to 10% of period, max
15 min. Grace is now derived from the recorded entry, so a healthy
jittered wake no longer fires wake_lost.
- D2's evidence is retracted, its conclusion kept. Four closers exist and
handleResultMessage's is unconditional, and pingdotgg#5219 retired the
subagent -> synthetic-turn path nine days before this was written.
Re-anchored on the session reaper, which refuses to reap a thread with
an activeTurnId.
Also: settingsSearch.ts is ~+13, not ~+4 (each search item is a 5-6 line
object literal), so phases 1-4 cost ~16 lines rather than ~7 — the row
counts are unchanged. The 08-18 sync moved the merge-base to cebac35,
and the headline 53 files / +2590/-1042 only holds against it.
One assumption got promoted: the Stop hook does deliver session_crons,
spread unconditionally into both Stop and SubagentStop, [] when empty.
That was PLAN's top-listed falsifier. It also turned up an undocumented
1000-char truncation on the prompt field, now covered by a test case.
Guard #15, the run digest, and loop_status's narrowing are now declared
as divergences rather than decided in silence. build-report.mjs documents
the full build-then-fmt pipeline, which is what actually reproduces the
committed report.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto 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

@radroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

chore(t3x): auto-build on a 12h cadence, not every main commit - #15

Merged
radroid merged 1 commit into
mainfrom
t3x/autobuild-12h-cadence
Jul 26, 2026
Merged

chore(t3x): auto-build on a 12h cadence, not every main commit#15
radroid merged 1 commit into
mainfrom
t3x/autobuild-12h-cadence

Conversation

@radroid

Copy link
Copy Markdown
Owner

Why

The desktop auto-build watcher (scripts/t3x/auto-build-desktop.sh --watch) polled HEAD every 60s (120s in the running LaunchAgent) and rebuilt whenever main advanced. On an active repo that means near-continuous ~470MB .dmg rebuilds — the laptop never settles. Requested change: build on a slow, deliberate cadence (at most every 12h, only if main changed), keep manual builds, and stop failures from retrying every 30 min.

Changes (scripts/t3x/auto-build-desktop.sh)

  • Default --watch interval 6043200 (12h). The watcher still rebuilds only when main changed since the last build (build_once is a no-op on unchanged HEAD); it no longer tracks every commit. It does not rebuild the instant main moves — a change is picked up at the next poll.
  • Failure backoff caps at max(30min, interval) instead of a flat 30 min. On the 12h cadence a persistently failing build now retries every 12h, not ~48×/day. Short intervals still top out at 30 min (unchanged). This also fixes the new cap line to assign the value (delay="$cap"), not the literal string cap — caught by a backoff arithmetic unit-check.
  • Docs/usage updated.

A one-shot manual build (scripts/t3x/auto-build-desktop.sh --install) still bypasses the interval entirely.

Verification

  • bash -n (syntax) clean.
  • Backoff arithmetic checked for both cadences: INTERVAL=60 → 120/480/1800s (unchanged); INTERVAL=43200 → 43200s at every failure count.
  • --help reflects the new default.

Operational note: the running dev.t3x.autobuild LaunchAgent's --interval was already switched to 43200 out of band and the build marker seeded to current main, so it is on the 12h cadence now and did not trigger a build on reload. This PR makes that cadence the script's own default so a regenerated plist inherits it.

🤖 Generated with Claude Code

The desktop auto-build watcher polled HEAD every 60s (120s in the running
LaunchAgent) and rebuilt on every main change, so an active repo rebuilt the
~470MB dmg near-continuously. Slow it to a deliberate 12h cadence:
- Default --watch --interval 60 -> 43200 (12h). The watcher still rebuilds only
when main changed since the last build; it no longer tracks every commit.
- Failure backoff caps at max(30min, interval) instead of a flat 30min, so on
the 12h cadence a persistently failing build retries every 12h, not ~48x/day.
(Also fixes the cap assignment to use the value, not the literal "cap".)
- Docs updated to match.
A one-shot manual build (plain --install) still bypasses the interval. The
running LaunchAgent's --interval was also updated to 43200 out of band.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3a409c74-d050-4113-96cd-5eaa0bf6e2c4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3x/autobuild-12h-cadence

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@radroid
radroid merged commit d25ec9d into mainJul 26, 2026
1 check passed
@radroid
radroid deleted the t3x/autobuild-12h-cadence branch July 30, 2026 14:23
radroid added a commit that referenced this pull request Aug 18, 2026
…s package
A five-axis review (standards / spec / claim re-verification / internal
consistency / prototype QA) turned up 102 findings, ~60 unique. The
load-bearing ones, all verified against the code before editing:
- The compose-don't-replace correction was applied unevenly: the check-in
prompt still said "I am the scheduler for this thread. Do not schedule
your own wake-ups", the report kept the CLAUDE_CODE_DISABLE_CRON switch
PLAN drops, and the report's deferred table still had session_crons in
Phase 3. All now carry the composed story.
- Deference now matches #42's Guard #15: T3 stands down while a recorded
wake is pending regardless of distance (the binary clamps at 3600s),
and fires wake_lost only past a new wakeGraceMs. TESTS 11c reworded.
- session_crons carries a cron EXPRESSION, not a timestamp
(SessionCronSummary in sdk.d.ts 0.3.170) — the nextFireAtMs parse is
the fork's and is now an explicit [A].
- pingdotgg#5127's voiding was overstated: the aborted branch resolves the
Deferred with {} but then DENIES the tool call while the session stops.
What survives is user-input.resolved with empty answers — voided reads
as answered downstream, which is still why the durable record exists.
- The §1.4 "second kill" is gone upstream (pingdotgg#5710, e70cdb4): the
no-turnState branch emits token usage plus a log, no lifecycle event.
- total_cost_usd is stamped onto turn.completed.totalCostUsd, not
"unread"; nothing aggregates it, and its semantics stay [A].
- Numbers re-stamped on the a4cc136 ledger: ClaudeAdapter churn 16 /
~4.6k lines, orchestration.ts 20, settingsSearch.ts 14, SettingsPanels
36/2088, contracts/settings 26, the _chat row churn 4 / risk 64 (the
fork's added delta stays 0), Sidebar +184/-81. #112 answered with
measured churn (RightPanelTabs 14, rightPanelStore 7).
- Seam accounting unified on PLAN §6 (3 rows, phases 1-4);
SETTINGS_SECTION_ICONS attributed to SettingsSidebarNav.tsx; the
"search-invisible" claim dropped (the id union is derived).
- Fork main SHAs are rewritten by every sync, so the docs now anchor on
the merge-base; the 08-18 force-rewrite to 94c6328 is recorded.
- Report section refs renumbered after the mobile insert (§13→§14 etc.),
the 137-sum test table now sums to 159, the orphaned decision-4 chips
and the four-vs-five scenario counts fixed.
- Prototypes: tokens re-lifted where they had drifted ([data-app-sidebar]
values, sky-300 not sky-400, computed base literals), p5 gains the
self-pacing and wake-lost states (15 total), the spinner became the
product's stepped pulse, switches got role/aria, p2 prices the sidebar
row chrome honestly (deferred — it would be a new Sidebar.tsx row),
p6/p3 align with #44's v1 contract (never pushes, PRs opt-in later).
- build-report.mjs: function replacer, escapeHtml on marker fields, a
GENERATED banner in the output, honest self-containedness claim, +x.
- LoopRecord gains the checkIns array the console's ledger reads;
workSource leaves phase 1 (lands with #44); stop-with-pending-crons
now calls stopSession, the honest cancel from #42 1c.
- The archived loop/ design's DESIGN.md banner no longer overclaims, and
its report.html carries a superseded pointer.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
radroid added a commit that referenced this pull request Aug 19, 2026
A fresh two-axis review plus an adversarial re-verification of every [V]
claim found three that did not survive contact with the tree, one of them
a design hole an implementer would have built.
- The [60, 3600] clamp belongs to ScheduleWakeup alone. session_crons also
carries CronCreate entries, which take an arbitrary 5-field expression
with no hour bound, so "the exposure is bounded without a second rule"
was wrong: a recorded `0 9 * * *` stands T3 down for up to 24h. Deference
is now capped at the loop's own deadline, since past it there is nothing
left to defer to. Added by review, and open beside Q1.
- wakeGraceMs ~90s was the wrong half of the jitter model. 90s is the
one-shot *early* jitter; the late jitter is up to 10% of period, max
15 min. Grace is now derived from the recorded entry, so a healthy
jittered wake no longer fires wake_lost.
- D2's evidence is retracted, its conclusion kept. Four closers exist and
handleResultMessage's is unconditional, and pingdotgg#5219 retired the
subagent -> synthetic-turn path nine days before this was written.
Re-anchored on the session reaper, which refuses to reap a thread with
an activeTurnId.
Also: settingsSearch.ts is ~+13, not ~+4 (each search item is a 5-6 line
object literal), so phases 1-4 cost ~16 lines rather than ~7 — the row
counts are unchanged. The 08-18 sync moved the merge-base to cebac35,
and the headline 53 files / +2590/-1042 only holds against it.
One assumption got promoted: the Stop hook does deliver session_crons,
spread unconditionally into both Stop and SubagentStop, [] when empty.
That was PLAN's top-listed falsifier. It also turned up an undocumented
1000-char truncation on the prompt field, now covered by a test case.
Guard #15, the run digest, and loop_status's narrowing are now declared
as divergences rather than decided in silence. build-report.mjs documents
the full build-then-fmt pipeline, which is what actually reproduces the
committed report.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto 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

@radroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore(t3x): auto-build on a 12h cadence, not every main commit - #15

Merged
radroid merged 1 commit into
mainfrom
t3x/autobuild-12h-cadence
Jul 26, 2026
Merged

chore(t3x): auto-build on a 12h cadence, not every main commit#15
radroid merged 1 commit into
mainfrom
t3x/autobuild-12h-cadence

Conversation

@radroid

Copy link
Copy Markdown
Owner

Why

The desktop auto-build watcher (scripts/t3x/auto-build-desktop.sh --watch) polled HEAD every 60s (120s in the running LaunchAgent) and rebuilt whenever main advanced. On an active repo that means near-continuous ~470MB .dmg rebuilds — the laptop never settles. Requested change: build on a slow, deliberate cadence (at most every 12h, only if main changed), keep manual builds, and stop failures from retrying every 30 min.

Changes (scripts/t3x/auto-build-desktop.sh)

  • Default --watch interval 6043200 (12h). The watcher still rebuilds only when main changed since the last build (build_once is a no-op on unchanged HEAD); it no longer tracks every commit. It does not rebuild the instant main moves — a change is picked up at the next poll.
  • Failure backoff caps at max(30min, interval) instead of a flat 30 min. On the 12h cadence a persistently failing build now retries every 12h, not ~48×/day. Short intervals still top out at 30 min (unchanged). This also fixes the new cap line to assign the value (delay="$cap"), not the literal string cap — caught by a backoff arithmetic unit-check.
  • Docs/usage updated.

A one-shot manual build (scripts/t3x/auto-build-desktop.sh --install) still bypasses the interval entirely.

Verification

  • bash -n (syntax) clean.
  • Backoff arithmetic checked for both cadences: INTERVAL=60 → 120/480/1800s (unchanged); INTERVAL=43200 → 43200s at every failure count.
  • --help reflects the new default.

Operational note: the running dev.t3x.autobuild LaunchAgent's --interval was already switched to 43200 out of band and the build marker seeded to current main, so it is on the 12h cadence now and did not trigger a build on reload. This PR makes that cadence the script's own default so a regenerated plist inherits it.

🤖 Generated with Claude Code

The desktop auto-build watcher polled HEAD every 60s (120s in the running
LaunchAgent) and rebuilt on every main change, so an active repo rebuilt the
~470MB dmg near-continuously. Slow it to a deliberate 12h cadence:
- Default --watch --interval 60 -> 43200 (12h). The watcher still rebuilds only
when main changed since the last build; it no longer tracks every commit.
- Failure backoff caps at max(30min, interval) instead of a flat 30min, so on
the 12h cadence a persistently failing build retries every 12h, not ~48x/day.
(Also fixes the cap assignment to use the value, not the literal "cap".)
- Docs updated to match.
A one-shot manual build (plain --install) still bypasses the interval. The
running LaunchAgent's --interval was also updated to 43200 out of band.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3a409c74-d050-4113-96cd-5eaa0bf6e2c4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3x/autobuild-12h-cadence

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@radroid
radroid merged commit d25ec9d into mainJul 26, 2026
1 check passed
@radroid
radroid deleted the t3x/autobuild-12h-cadence branch July 30, 2026 14:23
radroid added a commit that referenced this pull request Aug 18, 2026
…s package
A five-axis review (standards / spec / claim re-verification / internal
consistency / prototype QA) turned up 102 findings, ~60 unique. The
load-bearing ones, all verified against the code before editing:
- The compose-don't-replace correction was applied unevenly: the check-in
prompt still said "I am the scheduler for this thread. Do not schedule
your own wake-ups", the report kept the CLAUDE_CODE_DISABLE_CRON switch
PLAN drops, and the report's deferred table still had session_crons in
Phase 3. All now carry the composed story.
- Deference now matches #42's Guard #15: T3 stands down while a recorded
wake is pending regardless of distance (the binary clamps at 3600s),
and fires wake_lost only past a new wakeGraceMs. TESTS 11c reworded.
- session_crons carries a cron EXPRESSION, not a timestamp
(SessionCronSummary in sdk.d.ts 0.3.170) — the nextFireAtMs parse is
the fork's and is now an explicit [A].
- pingdotgg#5127's voiding was overstated: the aborted branch resolves the
Deferred with {} but then DENIES the tool call while the session stops.
What survives is user-input.resolved with empty answers — voided reads
as answered downstream, which is still why the durable record exists.
- The §1.4 "second kill" is gone upstream (pingdotgg#5710, e70cdb4): the
no-turnState branch emits token usage plus a log, no lifecycle event.
- total_cost_usd is stamped onto turn.completed.totalCostUsd, not
"unread"; nothing aggregates it, and its semantics stay [A].
- Numbers re-stamped on the a4cc136 ledger: ClaudeAdapter churn 16 /
~4.6k lines, orchestration.ts 20, settingsSearch.ts 14, SettingsPanels
36/2088, contracts/settings 26, the _chat row churn 4 / risk 64 (the
fork's added delta stays 0), Sidebar +184/-81. #112 answered with
measured churn (RightPanelTabs 14, rightPanelStore 7).
- Seam accounting unified on PLAN §6 (3 rows, phases 1-4);
SETTINGS_SECTION_ICONS attributed to SettingsSidebarNav.tsx; the
"search-invisible" claim dropped (the id union is derived).
- Fork main SHAs are rewritten by every sync, so the docs now anchor on
the merge-base; the 08-18 force-rewrite to 94c6328 is recorded.
- Report section refs renumbered after the mobile insert (§13→§14 etc.),
the 137-sum test table now sums to 159, the orphaned decision-4 chips
and the four-vs-five scenario counts fixed.
- Prototypes: tokens re-lifted where they had drifted ([data-app-sidebar]
values, sky-300 not sky-400, computed base literals), p5 gains the
self-pacing and wake-lost states (15 total), the spinner became the
product's stepped pulse, switches got role/aria, p2 prices the sidebar
row chrome honestly (deferred — it would be a new Sidebar.tsx row),
p6/p3 align with #44's v1 contract (never pushes, PRs opt-in later).
- build-report.mjs: function replacer, escapeHtml on marker fields, a
GENERATED banner in the output, honest self-containedness claim, +x.
- LoopRecord gains the checkIns array the console's ledger reads;
workSource leaves phase 1 (lands with #44); stop-with-pending-crons
now calls stopSession, the honest cancel from #42 1c.
- The archived loop/ design's DESIGN.md banner no longer overclaims, and
its report.html carries a superseded pointer.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
radroid added a commit that referenced this pull request Aug 19, 2026
A fresh two-axis review plus an adversarial re-verification of every [V]
claim found three that did not survive contact with the tree, one of them
a design hole an implementer would have built.
- The [60, 3600] clamp belongs to ScheduleWakeup alone. session_crons also
carries CronCreate entries, which take an arbitrary 5-field expression
with no hour bound, so "the exposure is bounded without a second rule"
was wrong: a recorded `0 9 * * *` stands T3 down for up to 24h. Deference
is now capped at the loop's own deadline, since past it there is nothing
left to defer to. Added by review, and open beside Q1.
- wakeGraceMs ~90s was the wrong half of the jitter model. 90s is the
one-shot *early* jitter; the late jitter is up to 10% of period, max
15 min. Grace is now derived from the recorded entry, so a healthy
jittered wake no longer fires wake_lost.
- D2's evidence is retracted, its conclusion kept. Four closers exist and
handleResultMessage's is unconditional, and pingdotgg#5219 retired the
subagent -> synthetic-turn path nine days before this was written.
Re-anchored on the session reaper, which refuses to reap a thread with
an activeTurnId.
Also: settingsSearch.ts is ~+13, not ~+4 (each search item is a 5-6 line
object literal), so phases 1-4 cost ~16 lines rather than ~7 — the row
counts are unchanged. The 08-18 sync moved the merge-base to cebac35,
and the headline 53 files / +2590/-1042 only holds against it.
One assumption got promoted: the Stop hook does deliver session_crons,
spread unconditionally into both Stop and SubagentStop, [] when empty.
That was PLAN's top-listed falsifier. It also turned up an undocumented
1000-char truncation on the prompt field, now covered by a test case.
Guard #15, the run digest, and loop_status's narrowing are now declared
as divergences rather than decided in silence. build-report.mjs documents
the full build-then-fmt pipeline, which is what actually reproduces the
committed report.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto 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

@radroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore(t3x): auto-build on a 12h cadence, not every main commit - #15

Merged
radroid merged 1 commit into
mainfrom
t3x/autobuild-12h-cadence
Jul 26, 2026
Merged

chore(t3x): auto-build on a 12h cadence, not every main commit#15
radroid merged 1 commit into
mainfrom
t3x/autobuild-12h-cadence

Conversation

@radroid

Copy link
Copy Markdown
Owner

Why

The desktop auto-build watcher (scripts/t3x/auto-build-desktop.sh --watch) polled HEAD every 60s (120s in the running LaunchAgent) and rebuilt whenever main advanced. On an active repo that means near-continuous ~470MB .dmg rebuilds — the laptop never settles. Requested change: build on a slow, deliberate cadence (at most every 12h, only if main changed), keep manual builds, and stop failures from retrying every 30 min.

Changes (scripts/t3x/auto-build-desktop.sh)

  • Default --watch interval 6043200 (12h). The watcher still rebuilds only when main changed since the last build (build_once is a no-op on unchanged HEAD); it no longer tracks every commit. It does not rebuild the instant main moves — a change is picked up at the next poll.
  • Failure backoff caps at max(30min, interval) instead of a flat 30 min. On the 12h cadence a persistently failing build now retries every 12h, not ~48×/day. Short intervals still top out at 30 min (unchanged). This also fixes the new cap line to assign the value (delay="$cap"), not the literal string cap — caught by a backoff arithmetic unit-check.
  • Docs/usage updated.

A one-shot manual build (scripts/t3x/auto-build-desktop.sh --install) still bypasses the interval entirely.

Verification

  • bash -n (syntax) clean.
  • Backoff arithmetic checked for both cadences: INTERVAL=60 → 120/480/1800s (unchanged); INTERVAL=43200 → 43200s at every failure count.
  • --help reflects the new default.

Operational note: the running dev.t3x.autobuild LaunchAgent's --interval was already switched to 43200 out of band and the build marker seeded to current main, so it is on the 12h cadence now and did not trigger a build on reload. This PR makes that cadence the script's own default so a regenerated plist inherits it.

🤖 Generated with Claude Code

The desktop auto-build watcher polled HEAD every 60s (120s in the running
LaunchAgent) and rebuilt on every main change, so an active repo rebuilt the
~470MB dmg near-continuously. Slow it to a deliberate 12h cadence:
- Default --watch --interval 60 -> 43200 (12h). The watcher still rebuilds only
when main changed since the last build; it no longer tracks every commit.
- Failure backoff caps at max(30min, interval) instead of a flat 30min, so on
the 12h cadence a persistently failing build retries every 12h, not ~48x/day.
(Also fixes the cap assignment to use the value, not the literal "cap".)
- Docs updated to match.
A one-shot manual build (plain --install) still bypasses the interval. The
running LaunchAgent's --interval was also updated to 43200 out of band.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3a409c74-d050-4113-96cd-5eaa0bf6e2c4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3x/autobuild-12h-cadence

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@radroid
radroid merged commit d25ec9d into mainJul 26, 2026
1 check passed
@radroid
radroid deleted the t3x/autobuild-12h-cadence branch July 30, 2026 14:23
radroid added a commit that referenced this pull request Aug 18, 2026
…s package
A five-axis review (standards / spec / claim re-verification / internal
consistency / prototype QA) turned up 102 findings, ~60 unique. The
load-bearing ones, all verified against the code before editing:
- The compose-don't-replace correction was applied unevenly: the check-in
prompt still said "I am the scheduler for this thread. Do not schedule
your own wake-ups", the report kept the CLAUDE_CODE_DISABLE_CRON switch
PLAN drops, and the report's deferred table still had session_crons in
Phase 3. All now carry the composed story.
- Deference now matches #42's Guard #15: T3 stands down while a recorded
wake is pending regardless of distance (the binary clamps at 3600s),
and fires wake_lost only past a new wakeGraceMs. TESTS 11c reworded.
- session_crons carries a cron EXPRESSION, not a timestamp
(SessionCronSummary in sdk.d.ts 0.3.170) — the nextFireAtMs parse is
the fork's and is now an explicit [A].
- pingdotgg#5127's voiding was overstated: the aborted branch resolves the
Deferred with {} but then DENIES the tool call while the session stops.
What survives is user-input.resolved with empty answers — voided reads
as answered downstream, which is still why the durable record exists.
- The §1.4 "second kill" is gone upstream (pingdotgg#5710, e70cdb4): the
no-turnState branch emits token usage plus a log, no lifecycle event.
- total_cost_usd is stamped onto turn.completed.totalCostUsd, not
"unread"; nothing aggregates it, and its semantics stay [A].
- Numbers re-stamped on the a4cc136 ledger: ClaudeAdapter churn 16 /
~4.6k lines, orchestration.ts 20, settingsSearch.ts 14, SettingsPanels
36/2088, contracts/settings 26, the _chat row churn 4 / risk 64 (the
fork's added delta stays 0), Sidebar +184/-81. #112 answered with
measured churn (RightPanelTabs 14, rightPanelStore 7).
- Seam accounting unified on PLAN §6 (3 rows, phases 1-4);
SETTINGS_SECTION_ICONS attributed to SettingsSidebarNav.tsx; the
"search-invisible" claim dropped (the id union is derived).
- Fork main SHAs are rewritten by every sync, so the docs now anchor on
the merge-base; the 08-18 force-rewrite to 94c6328 is recorded.
- Report section refs renumbered after the mobile insert (§13→§14 etc.),
the 137-sum test table now sums to 159, the orphaned decision-4 chips
and the four-vs-five scenario counts fixed.
- Prototypes: tokens re-lifted where they had drifted ([data-app-sidebar]
values, sky-300 not sky-400, computed base literals), p5 gains the
self-pacing and wake-lost states (15 total), the spinner became the
product's stepped pulse, switches got role/aria, p2 prices the sidebar
row chrome honestly (deferred — it would be a new Sidebar.tsx row),
p6/p3 align with #44's v1 contract (never pushes, PRs opt-in later).
- build-report.mjs: function replacer, escapeHtml on marker fields, a
GENERATED banner in the output, honest self-containedness claim, +x.
- LoopRecord gains the checkIns array the console's ledger reads;
workSource leaves phase 1 (lands with #44); stop-with-pending-crons
now calls stopSession, the honest cancel from #42 1c.
- The archived loop/ design's DESIGN.md banner no longer overclaims, and
its report.html carries a superseded pointer.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
radroid added a commit that referenced this pull request Aug 19, 2026
A fresh two-axis review plus an adversarial re-verification of every [V]
claim found three that did not survive contact with the tree, one of them
a design hole an implementer would have built.
- The [60, 3600] clamp belongs to ScheduleWakeup alone. session_crons also
carries CronCreate entries, which take an arbitrary 5-field expression
with no hour bound, so "the exposure is bounded without a second rule"
was wrong: a recorded `0 9 * * *` stands T3 down for up to 24h. Deference
is now capped at the loop's own deadline, since past it there is nothing
left to defer to. Added by review, and open beside Q1.
- wakeGraceMs ~90s was the wrong half of the jitter model. 90s is the
one-shot *early* jitter; the late jitter is up to 10% of period, max
15 min. Grace is now derived from the recorded entry, so a healthy
jittered wake no longer fires wake_lost.
- D2's evidence is retracted, its conclusion kept. Four closers exist and
handleResultMessage's is unconditional, and pingdotgg#5219 retired the
subagent -> synthetic-turn path nine days before this was written.
Re-anchored on the session reaper, which refuses to reap a thread with
an activeTurnId.
Also: settingsSearch.ts is ~+13, not ~+4 (each search item is a 5-6 line
object literal), so phases 1-4 cost ~16 lines rather than ~7 — the row
counts are unchanged. The 08-18 sync moved the merge-base to cebac35,
and the headline 53 files / +2590/-1042 only holds against it.
One assumption got promoted: the Stop hook does deliver session_crons,
spread unconditionally into both Stop and SubagentStop, [] when empty.
That was PLAN's top-listed falsifier. It also turned up an undocumented
1000-char truncation on the prompt field, now covered by a test case.
Guard #15, the run digest, and loop_status's narrowing are now declared
as divergences rather than decided in silence. build-report.mjs documents
the full build-then-fmt pipeline, which is what actually reproduces the
committed report.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto 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

@radroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

chore(t3x): auto-build on a 12h cadence, not every main commit - #15

Merged
radroid merged 1 commit into
mainfrom
t3x/autobuild-12h-cadence
Jul 26, 2026
Merged

chore(t3x): auto-build on a 12h cadence, not every main commit#15
radroid merged 1 commit into
mainfrom
t3x/autobuild-12h-cadence

Conversation

@radroid

Copy link
Copy Markdown
Owner

Why

The desktop auto-build watcher (scripts/t3x/auto-build-desktop.sh --watch) polled HEAD every 60s (120s in the running LaunchAgent) and rebuilt whenever main advanced. On an active repo that means near-continuous ~470MB .dmg rebuilds — the laptop never settles. Requested change: build on a slow, deliberate cadence (at most every 12h, only if main changed), keep manual builds, and stop failures from retrying every 30 min.

Changes (scripts/t3x/auto-build-desktop.sh)

  • Default --watch interval 6043200 (12h). The watcher still rebuilds only when main changed since the last build (build_once is a no-op on unchanged HEAD); it no longer tracks every commit. It does not rebuild the instant main moves — a change is picked up at the next poll.
  • Failure backoff caps at max(30min, interval) instead of a flat 30 min. On the 12h cadence a persistently failing build now retries every 12h, not ~48×/day. Short intervals still top out at 30 min (unchanged). This also fixes the new cap line to assign the value (delay="$cap"), not the literal string cap — caught by a backoff arithmetic unit-check.
  • Docs/usage updated.

A one-shot manual build (scripts/t3x/auto-build-desktop.sh --install) still bypasses the interval entirely.

Verification

  • bash -n (syntax) clean.
  • Backoff arithmetic checked for both cadences: INTERVAL=60 → 120/480/1800s (unchanged); INTERVAL=43200 → 43200s at every failure count.
  • --help reflects the new default.

Operational note: the running dev.t3x.autobuild LaunchAgent's --interval was already switched to 43200 out of band and the build marker seeded to current main, so it is on the 12h cadence now and did not trigger a build on reload. This PR makes that cadence the script's own default so a regenerated plist inherits it.

🤖 Generated with Claude Code

The desktop auto-build watcher polled HEAD every 60s (120s in the running
LaunchAgent) and rebuilt on every main change, so an active repo rebuilt the
~470MB dmg near-continuously. Slow it to a deliberate 12h cadence:
- Default --watch --interval 60 -> 43200 (12h). The watcher still rebuilds only
when main changed since the last build; it no longer tracks every commit.
- Failure backoff caps at max(30min, interval) instead of a flat 30min, so on
the 12h cadence a persistently failing build retries every 12h, not ~48x/day.
(Also fixes the cap assignment to use the value, not the literal "cap".)
- Docs updated to match.
A one-shot manual build (plain --install) still bypasses the interval. The
running LaunchAgent's --interval was also updated to 43200 out of band.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3a409c74-d050-4113-96cd-5eaa0bf6e2c4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3x/autobuild-12h-cadence

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@radroid
radroid merged commit d25ec9d into mainJul 26, 2026
1 check passed
@radroid
radroid deleted the t3x/autobuild-12h-cadence branch July 30, 2026 14:23
radroid added a commit that referenced this pull request Aug 18, 2026
…s package
A five-axis review (standards / spec / claim re-verification / internal
consistency / prototype QA) turned up 102 findings, ~60 unique. The
load-bearing ones, all verified against the code before editing:
- The compose-don't-replace correction was applied unevenly: the check-in
prompt still said "I am the scheduler for this thread. Do not schedule
your own wake-ups", the report kept the CLAUDE_CODE_DISABLE_CRON switch
PLAN drops, and the report's deferred table still had session_crons in
Phase 3. All now carry the composed story.
- Deference now matches #42's Guard #15: T3 stands down while a recorded
wake is pending regardless of distance (the binary clamps at 3600s),
and fires wake_lost only past a new wakeGraceMs. TESTS 11c reworded.
- session_crons carries a cron EXPRESSION, not a timestamp
(SessionCronSummary in sdk.d.ts 0.3.170) — the nextFireAtMs parse is
the fork's and is now an explicit [A].
- pingdotgg#5127's voiding was overstated: the aborted branch resolves the
Deferred with {} but then DENIES the tool call while the session stops.
What survives is user-input.resolved with empty answers — voided reads
as answered downstream, which is still why the durable record exists.
- The §1.4 "second kill" is gone upstream (pingdotgg#5710, e70cdb4): the
no-turnState branch emits token usage plus a log, no lifecycle event.
- total_cost_usd is stamped onto turn.completed.totalCostUsd, not
"unread"; nothing aggregates it, and its semantics stay [A].
- Numbers re-stamped on the a4cc136 ledger: ClaudeAdapter churn 16 /
~4.6k lines, orchestration.ts 20, settingsSearch.ts 14, SettingsPanels
36/2088, contracts/settings 26, the _chat row churn 4 / risk 64 (the
fork's added delta stays 0), Sidebar +184/-81. #112 answered with
measured churn (RightPanelTabs 14, rightPanelStore 7).
- Seam accounting unified on PLAN §6 (3 rows, phases 1-4);
SETTINGS_SECTION_ICONS attributed to SettingsSidebarNav.tsx; the
"search-invisible" claim dropped (the id union is derived).
- Fork main SHAs are rewritten by every sync, so the docs now anchor on
the merge-base; the 08-18 force-rewrite to 94c6328 is recorded.
- Report section refs renumbered after the mobile insert (§13→§14 etc.),
the 137-sum test table now sums to 159, the orphaned decision-4 chips
and the four-vs-five scenario counts fixed.
- Prototypes: tokens re-lifted where they had drifted ([data-app-sidebar]
values, sky-300 not sky-400, computed base literals), p5 gains the
self-pacing and wake-lost states (15 total), the spinner became the
product's stepped pulse, switches got role/aria, p2 prices the sidebar
row chrome honestly (deferred — it would be a new Sidebar.tsx row),
p6/p3 align with #44's v1 contract (never pushes, PRs opt-in later).
- build-report.mjs: function replacer, escapeHtml on marker fields, a
GENERATED banner in the output, honest self-containedness claim, +x.
- LoopRecord gains the checkIns array the console's ledger reads;
workSource leaves phase 1 (lands with #44); stop-with-pending-crons
now calls stopSession, the honest cancel from #42 1c.
- The archived loop/ design's DESIGN.md banner no longer overclaims, and
its report.html carries a superseded pointer.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
radroid added a commit that referenced this pull request Aug 19, 2026
A fresh two-axis review plus an adversarial re-verification of every [V]
claim found three that did not survive contact with the tree, one of them
a design hole an implementer would have built.
- The [60, 3600] clamp belongs to ScheduleWakeup alone. session_crons also
carries CronCreate entries, which take an arbitrary 5-field expression
with no hour bound, so "the exposure is bounded without a second rule"
was wrong: a recorded `0 9 * * *` stands T3 down for up to 24h. Deference
is now capped at the loop's own deadline, since past it there is nothing
left to defer to. Added by review, and open beside Q1.
- wakeGraceMs ~90s was the wrong half of the jitter model. 90s is the
one-shot *early* jitter; the late jitter is up to 10% of period, max
15 min. Grace is now derived from the recorded entry, so a healthy
jittered wake no longer fires wake_lost.
- D2's evidence is retracted, its conclusion kept. Four closers exist and
handleResultMessage's is unconditional, and pingdotgg#5219 retired the
subagent -> synthetic-turn path nine days before this was written.
Re-anchored on the session reaper, which refuses to reap a thread with
an activeTurnId.
Also: settingsSearch.ts is ~+13, not ~+4 (each search item is a 5-6 line
object literal), so phases 1-4 cost ~16 lines rather than ~7 — the row
counts are unchanged. The 08-18 sync moved the merge-base to cebac35,
and the headline 53 files / +2590/-1042 only holds against it.
One assumption got promoted: the Stop hook does deliver session_crons,
spread unconditionally into both Stop and SubagentStop, [] when empty.
That was PLAN's top-listed falsifier. It also turned up an undocumented
1000-char truncation on the prompt field, now covered by a test case.
Guard #15, the run digest, and loop_status's narrowing are now declared
as divergences rather than decided in silence. build-report.mjs documents
the full build-then-fmt pipeline, which is what actually reproduces the
committed report.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto 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

@radroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore(t3x): auto-build on a 12h cadence, not every main commit - #15

Merged
radroid merged 1 commit into
mainfrom
t3x/autobuild-12h-cadence
Jul 26, 2026
Merged

chore(t3x): auto-build on a 12h cadence, not every main commit#15
radroid merged 1 commit into
mainfrom
t3x/autobuild-12h-cadence

Conversation

@radroid

Copy link
Copy Markdown
Owner

Why

The desktop auto-build watcher (scripts/t3x/auto-build-desktop.sh --watch) polled HEAD every 60s (120s in the running LaunchAgent) and rebuilt whenever main advanced. On an active repo that means near-continuous ~470MB .dmg rebuilds — the laptop never settles. Requested change: build on a slow, deliberate cadence (at most every 12h, only if main changed), keep manual builds, and stop failures from retrying every 30 min.

Changes (scripts/t3x/auto-build-desktop.sh)

  • Default --watch interval 6043200 (12h). The watcher still rebuilds only when main changed since the last build (build_once is a no-op on unchanged HEAD); it no longer tracks every commit. It does not rebuild the instant main moves — a change is picked up at the next poll.
  • Failure backoff caps at max(30min, interval) instead of a flat 30 min. On the 12h cadence a persistently failing build now retries every 12h, not ~48×/day. Short intervals still top out at 30 min (unchanged). This also fixes the new cap line to assign the value (delay="$cap"), not the literal string cap — caught by a backoff arithmetic unit-check.
  • Docs/usage updated.

A one-shot manual build (scripts/t3x/auto-build-desktop.sh --install) still bypasses the interval entirely.

Verification

  • bash -n (syntax) clean.
  • Backoff arithmetic checked for both cadences: INTERVAL=60 → 120/480/1800s (unchanged); INTERVAL=43200 → 43200s at every failure count.
  • --help reflects the new default.

Operational note: the running dev.t3x.autobuild LaunchAgent's --interval was already switched to 43200 out of band and the build marker seeded to current main, so it is on the 12h cadence now and did not trigger a build on reload. This PR makes that cadence the script's own default so a regenerated plist inherits it.

🤖 Generated with Claude Code

The desktop auto-build watcher polled HEAD every 60s (120s in the running
LaunchAgent) and rebuilt on every main change, so an active repo rebuilt the
~470MB dmg near-continuously. Slow it to a deliberate 12h cadence:
- Default --watch --interval 60 -> 43200 (12h). The watcher still rebuilds only
when main changed since the last build; it no longer tracks every commit.
- Failure backoff caps at max(30min, interval) instead of a flat 30min, so on
the 12h cadence a persistently failing build retries every 12h, not ~48x/day.
(Also fixes the cap assignment to use the value, not the literal "cap".)
- Docs updated to match.
A one-shot manual build (plain --install) still bypasses the interval. The
running LaunchAgent's --interval was also updated to 43200 out of band.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3a409c74-d050-4113-96cd-5eaa0bf6e2c4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3x/autobuild-12h-cadence

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@radroid
radroid merged commit d25ec9d into mainJul 26, 2026
1 check passed
@radroid
radroid deleted the t3x/autobuild-12h-cadence branch July 30, 2026 14:23
radroid added a commit that referenced this pull request Aug 18, 2026
…s package
A five-axis review (standards / spec / claim re-verification / internal
consistency / prototype QA) turned up 102 findings, ~60 unique. The
load-bearing ones, all verified against the code before editing:
- The compose-don't-replace correction was applied unevenly: the check-in
prompt still said "I am the scheduler for this thread. Do not schedule
your own wake-ups", the report kept the CLAUDE_CODE_DISABLE_CRON switch
PLAN drops, and the report's deferred table still had session_crons in
Phase 3. All now carry the composed story.
- Deference now matches #42's Guard #15: T3 stands down while a recorded
wake is pending regardless of distance (the binary clamps at 3600s),
and fires wake_lost only past a new wakeGraceMs. TESTS 11c reworded.
- session_crons carries a cron EXPRESSION, not a timestamp
(SessionCronSummary in sdk.d.ts 0.3.170) — the nextFireAtMs parse is
the fork's and is now an explicit [A].
- pingdotgg#5127's voiding was overstated: the aborted branch resolves the
Deferred with {} but then DENIES the tool call while the session stops.
What survives is user-input.resolved with empty answers — voided reads
as answered downstream, which is still why the durable record exists.
- The §1.4 "second kill" is gone upstream (pingdotgg#5710, e70cdb4): the
no-turnState branch emits token usage plus a log, no lifecycle event.
- total_cost_usd is stamped onto turn.completed.totalCostUsd, not
"unread"; nothing aggregates it, and its semantics stay [A].
- Numbers re-stamped on the a4cc136 ledger: ClaudeAdapter churn 16 /
~4.6k lines, orchestration.ts 20, settingsSearch.ts 14, SettingsPanels
36/2088, contracts/settings 26, the _chat row churn 4 / risk 64 (the
fork's added delta stays 0), Sidebar +184/-81. #112 answered with
measured churn (RightPanelTabs 14, rightPanelStore 7).
- Seam accounting unified on PLAN §6 (3 rows, phases 1-4);
SETTINGS_SECTION_ICONS attributed to SettingsSidebarNav.tsx; the
"search-invisible" claim dropped (the id union is derived).
- Fork main SHAs are rewritten by every sync, so the docs now anchor on
the merge-base; the 08-18 force-rewrite to 94c6328 is recorded.
- Report section refs renumbered after the mobile insert (§13→§14 etc.),
the 137-sum test table now sums to 159, the orphaned decision-4 chips
and the four-vs-five scenario counts fixed.
- Prototypes: tokens re-lifted where they had drifted ([data-app-sidebar]
values, sky-300 not sky-400, computed base literals), p5 gains the
self-pacing and wake-lost states (15 total), the spinner became the
product's stepped pulse, switches got role/aria, p2 prices the sidebar
row chrome honestly (deferred — it would be a new Sidebar.tsx row),
p6/p3 align with #44's v1 contract (never pushes, PRs opt-in later).
- build-report.mjs: function replacer, escapeHtml on marker fields, a
GENERATED banner in the output, honest self-containedness claim, +x.
- LoopRecord gains the checkIns array the console's ledger reads;
workSource leaves phase 1 (lands with #44); stop-with-pending-crons
now calls stopSession, the honest cancel from #42 1c.
- The archived loop/ design's DESIGN.md banner no longer overclaims, and
its report.html carries a superseded pointer.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
radroid added a commit that referenced this pull request Aug 19, 2026
A fresh two-axis review plus an adversarial re-verification of every [V]
claim found three that did not survive contact with the tree, one of them
a design hole an implementer would have built.
- The [60, 3600] clamp belongs to ScheduleWakeup alone. session_crons also
carries CronCreate entries, which take an arbitrary 5-field expression
with no hour bound, so "the exposure is bounded without a second rule"
was wrong: a recorded `0 9 * * *` stands T3 down for up to 24h. Deference
is now capped at the loop's own deadline, since past it there is nothing
left to defer to. Added by review, and open beside Q1.
- wakeGraceMs ~90s was the wrong half of the jitter model. 90s is the
one-shot *early* jitter; the late jitter is up to 10% of period, max
15 min. Grace is now derived from the recorded entry, so a healthy
jittered wake no longer fires wake_lost.
- D2's evidence is retracted, its conclusion kept. Four closers exist and
handleResultMessage's is unconditional, and pingdotgg#5219 retired the
subagent -> synthetic-turn path nine days before this was written.
Re-anchored on the session reaper, which refuses to reap a thread with
an activeTurnId.
Also: settingsSearch.ts is ~+13, not ~+4 (each search item is a 5-6 line
object literal), so phases 1-4 cost ~16 lines rather than ~7 — the row
counts are unchanged. The 08-18 sync moved the merge-base to cebac35,
and the headline 53 files / +2590/-1042 only holds against it.
One assumption got promoted: the Stop hook does deliver session_crons,
spread unconditionally into both Stop and SubagentStop, [] when empty.
That was PLAN's top-listed falsifier. It also turned up an undocumented
1000-char truncation on the prompt field, now covered by a test case.
Guard #15, the run digest, and loop_status's narrowing are now declared
as divergences rather than decided in silence. build-report.mjs documents
the full build-then-fmt pipeline, which is what actually reproduces the
committed report.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto 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

@radroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore(t3x): auto-build on a 12h cadence, not every main commit - #15

Merged
radroid merged 1 commit into
mainfrom
t3x/autobuild-12h-cadence
Jul 26, 2026
Merged

chore(t3x): auto-build on a 12h cadence, not every main commit#15
radroid merged 1 commit into
mainfrom
t3x/autobuild-12h-cadence

Conversation

@radroid

Copy link
Copy Markdown
Owner

Why

The desktop auto-build watcher (scripts/t3x/auto-build-desktop.sh --watch) polled HEAD every 60s (120s in the running LaunchAgent) and rebuilt whenever main advanced. On an active repo that means near-continuous ~470MB .dmg rebuilds — the laptop never settles. Requested change: build on a slow, deliberate cadence (at most every 12h, only if main changed), keep manual builds, and stop failures from retrying every 30 min.

Changes (scripts/t3x/auto-build-desktop.sh)

  • Default --watch interval 6043200 (12h). The watcher still rebuilds only when main changed since the last build (build_once is a no-op on unchanged HEAD); it no longer tracks every commit. It does not rebuild the instant main moves — a change is picked up at the next poll.
  • Failure backoff caps at max(30min, interval) instead of a flat 30 min. On the 12h cadence a persistently failing build now retries every 12h, not ~48×/day. Short intervals still top out at 30 min (unchanged). This also fixes the new cap line to assign the value (delay="$cap"), not the literal string cap — caught by a backoff arithmetic unit-check.
  • Docs/usage updated.

A one-shot manual build (scripts/t3x/auto-build-desktop.sh --install) still bypasses the interval entirely.

Verification

  • bash -n (syntax) clean.
  • Backoff arithmetic checked for both cadences: INTERVAL=60 → 120/480/1800s (unchanged); INTERVAL=43200 → 43200s at every failure count.
  • --help reflects the new default.

Operational note: the running dev.t3x.autobuild LaunchAgent's --interval was already switched to 43200 out of band and the build marker seeded to current main, so it is on the 12h cadence now and did not trigger a build on reload. This PR makes that cadence the script's own default so a regenerated plist inherits it.

🤖 Generated with Claude Code

The desktop auto-build watcher polled HEAD every 60s (120s in the running
LaunchAgent) and rebuilt on every main change, so an active repo rebuilt the
~470MB dmg near-continuously. Slow it to a deliberate 12h cadence:
- Default --watch --interval 60 -> 43200 (12h). The watcher still rebuilds only
when main changed since the last build; it no longer tracks every commit.
- Failure backoff caps at max(30min, interval) instead of a flat 30min, so on
the 12h cadence a persistently failing build retries every 12h, not ~48x/day.
(Also fixes the cap assignment to use the value, not the literal "cap".)
- Docs updated to match.
A one-shot manual build (plain --install) still bypasses the interval. The
running LaunchAgent's --interval was also updated to 43200 out of band.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3a409c74-d050-4113-96cd-5eaa0bf6e2c4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3x/autobuild-12h-cadence

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@radroid
radroid merged commit d25ec9d into mainJul 26, 2026
1 check passed
@radroid
radroid deleted the t3x/autobuild-12h-cadence branch July 30, 2026 14:23
radroid added a commit that referenced this pull request Aug 18, 2026
…s package
A five-axis review (standards / spec / claim re-verification / internal
consistency / prototype QA) turned up 102 findings, ~60 unique. The
load-bearing ones, all verified against the code before editing:
- The compose-don't-replace correction was applied unevenly: the check-in
prompt still said "I am the scheduler for this thread. Do not schedule
your own wake-ups", the report kept the CLAUDE_CODE_DISABLE_CRON switch
PLAN drops, and the report's deferred table still had session_crons in
Phase 3. All now carry the composed story.
- Deference now matches #42's Guard #15: T3 stands down while a recorded
wake is pending regardless of distance (the binary clamps at 3600s),
and fires wake_lost only past a new wakeGraceMs. TESTS 11c reworded.
- session_crons carries a cron EXPRESSION, not a timestamp
(SessionCronSummary in sdk.d.ts 0.3.170) — the nextFireAtMs parse is
the fork's and is now an explicit [A].
- pingdotgg#5127's voiding was overstated: the aborted branch resolves the
Deferred with {} but then DENIES the tool call while the session stops.
What survives is user-input.resolved with empty answers — voided reads
as answered downstream, which is still why the durable record exists.
- The §1.4 "second kill" is gone upstream (pingdotgg#5710, e70cdb4): the
no-turnState branch emits token usage plus a log, no lifecycle event.
- total_cost_usd is stamped onto turn.completed.totalCostUsd, not
"unread"; nothing aggregates it, and its semantics stay [A].
- Numbers re-stamped on the a4cc136 ledger: ClaudeAdapter churn 16 /
~4.6k lines, orchestration.ts 20, settingsSearch.ts 14, SettingsPanels
36/2088, contracts/settings 26, the _chat row churn 4 / risk 64 (the
fork's added delta stays 0), Sidebar +184/-81. #112 answered with
measured churn (RightPanelTabs 14, rightPanelStore 7).
- Seam accounting unified on PLAN §6 (3 rows, phases 1-4);
SETTINGS_SECTION_ICONS attributed to SettingsSidebarNav.tsx; the
"search-invisible" claim dropped (the id union is derived).
- Fork main SHAs are rewritten by every sync, so the docs now anchor on
the merge-base; the 08-18 force-rewrite to 94c6328 is recorded.
- Report section refs renumbered after the mobile insert (§13→§14 etc.),
the 137-sum test table now sums to 159, the orphaned decision-4 chips
and the four-vs-five scenario counts fixed.
- Prototypes: tokens re-lifted where they had drifted ([data-app-sidebar]
values, sky-300 not sky-400, computed base literals), p5 gains the
self-pacing and wake-lost states (15 total), the spinner became the
product's stepped pulse, switches got role/aria, p2 prices the sidebar
row chrome honestly (deferred — it would be a new Sidebar.tsx row),
p6/p3 align with #44's v1 contract (never pushes, PRs opt-in later).
- build-report.mjs: function replacer, escapeHtml on marker fields, a
GENERATED banner in the output, honest self-containedness claim, +x.
- LoopRecord gains the checkIns array the console's ledger reads;
workSource leaves phase 1 (lands with #44); stop-with-pending-crons
now calls stopSession, the honest cancel from #42 1c.
- The archived loop/ design's DESIGN.md banner no longer overclaims, and
its report.html carries a superseded pointer.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
radroid added a commit that referenced this pull request Aug 19, 2026
A fresh two-axis review plus an adversarial re-verification of every [V]
claim found three that did not survive contact with the tree, one of them
a design hole an implementer would have built.
- The [60, 3600] clamp belongs to ScheduleWakeup alone. session_crons also
carries CronCreate entries, which take an arbitrary 5-field expression
with no hour bound, so "the exposure is bounded without a second rule"
was wrong: a recorded `0 9 * * *` stands T3 down for up to 24h. Deference
is now capped at the loop's own deadline, since past it there is nothing
left to defer to. Added by review, and open beside Q1.
- wakeGraceMs ~90s was the wrong half of the jitter model. 90s is the
one-shot *early* jitter; the late jitter is up to 10% of period, max
15 min. Grace is now derived from the recorded entry, so a healthy
jittered wake no longer fires wake_lost.
- D2's evidence is retracted, its conclusion kept. Four closers exist and
handleResultMessage's is unconditional, and pingdotgg#5219 retired the
subagent -> synthetic-turn path nine days before this was written.
Re-anchored on the session reaper, which refuses to reap a thread with
an activeTurnId.
Also: settingsSearch.ts is ~+13, not ~+4 (each search item is a 5-6 line
object literal), so phases 1-4 cost ~16 lines rather than ~7 — the row
counts are unchanged. The 08-18 sync moved the merge-base to cebac35,
and the headline 53 files / +2590/-1042 only holds against it.
One assumption got promoted: the Stop hook does deliver session_crons,
spread unconditionally into both Stop and SubagentStop, [] when empty.
That was PLAN's top-listed falsifier. It also turned up an undocumented
1000-char truncation on the prompt field, now covered by a test case.
Guard #15, the run digest, and loop_status's narrowing are now declared
as divergences rather than decided in silence. build-report.mjs documents
the full build-then-fmt pipeline, which is what actually reproduces the
committed report.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto 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

@radroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

chore(t3x): auto-build on a 12h cadence, not every main commit - #15

Merged
radroid merged 1 commit into
mainfrom
t3x/autobuild-12h-cadence
Jul 26, 2026
Merged

chore(t3x): auto-build on a 12h cadence, not every main commit#15
radroid merged 1 commit into
mainfrom
t3x/autobuild-12h-cadence

Conversation

@radroid

Copy link
Copy Markdown
Owner

Why

The desktop auto-build watcher (scripts/t3x/auto-build-desktop.sh --watch) polled HEAD every 60s (120s in the running LaunchAgent) and rebuilt whenever main advanced. On an active repo that means near-continuous ~470MB .dmg rebuilds — the laptop never settles. Requested change: build on a slow, deliberate cadence (at most every 12h, only if main changed), keep manual builds, and stop failures from retrying every 30 min.

Changes (scripts/t3x/auto-build-desktop.sh)

  • Default --watch interval 6043200 (12h). The watcher still rebuilds only when main changed since the last build (build_once is a no-op on unchanged HEAD); it no longer tracks every commit. It does not rebuild the instant main moves — a change is picked up at the next poll.
  • Failure backoff caps at max(30min, interval) instead of a flat 30 min. On the 12h cadence a persistently failing build now retries every 12h, not ~48×/day. Short intervals still top out at 30 min (unchanged). This also fixes the new cap line to assign the value (delay="$cap"), not the literal string cap — caught by a backoff arithmetic unit-check.
  • Docs/usage updated.

A one-shot manual build (scripts/t3x/auto-build-desktop.sh --install) still bypasses the interval entirely.

Verification

  • bash -n (syntax) clean.
  • Backoff arithmetic checked for both cadences: INTERVAL=60 → 120/480/1800s (unchanged); INTERVAL=43200 → 43200s at every failure count.
  • --help reflects the new default.

Operational note: the running dev.t3x.autobuild LaunchAgent's --interval was already switched to 43200 out of band and the build marker seeded to current main, so it is on the 12h cadence now and did not trigger a build on reload. This PR makes that cadence the script's own default so a regenerated plist inherits it.

🤖 Generated with Claude Code

The desktop auto-build watcher polled HEAD every 60s (120s in the running
LaunchAgent) and rebuilt on every main change, so an active repo rebuilt the
~470MB dmg near-continuously. Slow it to a deliberate 12h cadence:
- Default --watch --interval 60 -> 43200 (12h). The watcher still rebuilds only
when main changed since the last build; it no longer tracks every commit.
- Failure backoff caps at max(30min, interval) instead of a flat 30min, so on
the 12h cadence a persistently failing build retries every 12h, not ~48x/day.
(Also fixes the cap assignment to use the value, not the literal "cap".)
- Docs updated to match.
A one-shot manual build (plain --install) still bypasses the interval. The
running LaunchAgent's --interval was also updated to 43200 out of band.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3a409c74-d050-4113-96cd-5eaa0bf6e2c4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3x/autobuild-12h-cadence

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@radroid
radroid merged commit d25ec9d into mainJul 26, 2026
1 check passed
@radroid
radroid deleted the t3x/autobuild-12h-cadence branch July 30, 2026 14:23
radroid added a commit that referenced this pull request Aug 18, 2026
…s package
A five-axis review (standards / spec / claim re-verification / internal
consistency / prototype QA) turned up 102 findings, ~60 unique. The
load-bearing ones, all verified against the code before editing:
- The compose-don't-replace correction was applied unevenly: the check-in
prompt still said "I am the scheduler for this thread. Do not schedule
your own wake-ups", the report kept the CLAUDE_CODE_DISABLE_CRON switch
PLAN drops, and the report's deferred table still had session_crons in
Phase 3. All now carry the composed story.
- Deference now matches #42's Guard #15: T3 stands down while a recorded
wake is pending regardless of distance (the binary clamps at 3600s),
and fires wake_lost only past a new wakeGraceMs. TESTS 11c reworded.
- session_crons carries a cron EXPRESSION, not a timestamp
(SessionCronSummary in sdk.d.ts 0.3.170) — the nextFireAtMs parse is
the fork's and is now an explicit [A].
- pingdotgg#5127's voiding was overstated: the aborted branch resolves the
Deferred with {} but then DENIES the tool call while the session stops.
What survives is user-input.resolved with empty answers — voided reads
as answered downstream, which is still why the durable record exists.
- The §1.4 "second kill" is gone upstream (pingdotgg#5710, e70cdb4): the
no-turnState branch emits token usage plus a log, no lifecycle event.
- total_cost_usd is stamped onto turn.completed.totalCostUsd, not
"unread"; nothing aggregates it, and its semantics stay [A].
- Numbers re-stamped on the a4cc136 ledger: ClaudeAdapter churn 16 /
~4.6k lines, orchestration.ts 20, settingsSearch.ts 14, SettingsPanels
36/2088, contracts/settings 26, the _chat row churn 4 / risk 64 (the
fork's added delta stays 0), Sidebar +184/-81. #112 answered with
measured churn (RightPanelTabs 14, rightPanelStore 7).
- Seam accounting unified on PLAN §6 (3 rows, phases 1-4);
SETTINGS_SECTION_ICONS attributed to SettingsSidebarNav.tsx; the
"search-invisible" claim dropped (the id union is derived).
- Fork main SHAs are rewritten by every sync, so the docs now anchor on
the merge-base; the 08-18 force-rewrite to 94c6328 is recorded.
- Report section refs renumbered after the mobile insert (§13→§14 etc.),
the 137-sum test table now sums to 159, the orphaned decision-4 chips
and the four-vs-five scenario counts fixed.
- Prototypes: tokens re-lifted where they had drifted ([data-app-sidebar]
values, sky-300 not sky-400, computed base literals), p5 gains the
self-pacing and wake-lost states (15 total), the spinner became the
product's stepped pulse, switches got role/aria, p2 prices the sidebar
row chrome honestly (deferred — it would be a new Sidebar.tsx row),
p6/p3 align with #44's v1 contract (never pushes, PRs opt-in later).
- build-report.mjs: function replacer, escapeHtml on marker fields, a
GENERATED banner in the output, honest self-containedness claim, +x.
- LoopRecord gains the checkIns array the console's ledger reads;
workSource leaves phase 1 (lands with #44); stop-with-pending-crons
now calls stopSession, the honest cancel from #42 1c.
- The archived loop/ design's DESIGN.md banner no longer overclaims, and
its report.html carries a superseded pointer.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
radroid added a commit that referenced this pull request Aug 19, 2026
A fresh two-axis review plus an adversarial re-verification of every [V]
claim found three that did not survive contact with the tree, one of them
a design hole an implementer would have built.
- The [60, 3600] clamp belongs to ScheduleWakeup alone. session_crons also
carries CronCreate entries, which take an arbitrary 5-field expression
with no hour bound, so "the exposure is bounded without a second rule"
was wrong: a recorded `0 9 * * *` stands T3 down for up to 24h. Deference
is now capped at the loop's own deadline, since past it there is nothing
left to defer to. Added by review, and open beside Q1.
- wakeGraceMs ~90s was the wrong half of the jitter model. 90s is the
one-shot *early* jitter; the late jitter is up to 10% of period, max
15 min. Grace is now derived from the recorded entry, so a healthy
jittered wake no longer fires wake_lost.
- D2's evidence is retracted, its conclusion kept. Four closers exist and
handleResultMessage's is unconditional, and pingdotgg#5219 retired the
subagent -> synthetic-turn path nine days before this was written.
Re-anchored on the session reaper, which refuses to reap a thread with
an activeTurnId.
Also: settingsSearch.ts is ~+13, not ~+4 (each search item is a 5-6 line
object literal), so phases 1-4 cost ~16 lines rather than ~7 — the row
counts are unchanged. The 08-18 sync moved the merge-base to cebac35,
and the headline 53 files / +2590/-1042 only holds against it.
One assumption got promoted: the Stop hook does deliver session_crons,
spread unconditionally into both Stop and SubagentStop, [] when empty.
That was PLAN's top-listed falsifier. It also turned up an undocumented
1000-char truncation on the prompt field, now covered by a test case.
Guard #15, the run digest, and loop_status's narrowing are now declared
as divergences rather than decided in silence. build-report.mjs documents
the full build-then-fmt pipeline, which is what actually reproduces the
committed report.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto 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

@radroid