/office-hours always reports SESSION_COUNT: 0, welcome_back tier is unreachable
Every /office-hours run on a fresh $HOME returns TIER: introduction and fires the full closing pitch. Doesn't matter how many times the user has run it. The welcome_back tier in bin/gstack-developer-profile:165-169 (which exists specifically to skip the closing pitch for returning users) is never reached on fresh-$HOME installs.
The v1.0.0.0 migration moved the read path to ~/.gstack/developer-profile.json, but the writer in office-hours/SKILL.md (lines 1560 and 2022 as of 2026-05-24) still appends to ~/.gstack/builder-profile.jsonl. On first read, ensure_profile() creates a stub developer-profile.json with sessions: []. Later writes go to a file the reader never re-reads. SESSION_COUNT stays 0 forever.
Live since 0a803f9 / PR #1039 / v1.0.0.0 (2026-04-18). 5 weeks on every fresh-$HOME user.
Repro
Fresh $HOME, run /office-hours twice (or check ~/.gstack/ between runs):
05:26 ~/.gstack/developer-profile.json created (sessions: [], empty stub)
05:53 ~/.gstack/builder-profile.jsonl appended (today's session)
27-minute gap inside one skill run. Reader saw the empty stub at preamble; writer appended to the legacy file at completion. Second /office-hours run re-reads the stub, still sees sessions: [], still picks the introduction tier.
Fix
Either (a) move the writer to developer-profile.json, or (b) move the reader back to builder-profile.jsonl. (a) is the direction v1.0.0.0 was going; (b) is a revert. Option (a) needs a small subcommand on gstack-developer-profile that read-modify-writes the sessions[] array. Whoever owns this should also decide on stranded entries in builder-profile.jsonl from the broken-writer period (leave them; loss is aesthetic).
Filing as a regression report, not a PR. Happy to send a PR if useful; flag here first since the choice of (a) vs (b) is yours.
/office-hoursalways reportsSESSION_COUNT: 0, welcome_back tier is unreachableEvery
/office-hoursrun on a fresh$HOMEreturnsTIER: introductionand fires the full closing pitch. Doesn't matter how many times the user has run it. Thewelcome_backtier inbin/gstack-developer-profile:165-169(which exists specifically to skip the closing pitch for returning users) is never reached on fresh-$HOMEinstalls.The v1.0.0.0 migration moved the read path to
~/.gstack/developer-profile.json, but the writer inoffice-hours/SKILL.md(lines 1560 and 2022 as of 2026-05-24) still appends to~/.gstack/builder-profile.jsonl. On first read,ensure_profile()creates a stubdeveloper-profile.jsonwithsessions: []. Later writes go to a file the reader never re-reads.SESSION_COUNTstays 0 forever.Live since
0a803f9/ PR #1039 / v1.0.0.0 (2026-04-18). 5 weeks on every fresh-$HOMEuser.Repro
Fresh
$HOME, run/office-hourstwice (or check~/.gstack/between runs):27-minute gap inside one skill run. Reader saw the empty stub at preamble; writer appended to the legacy file at completion. Second
/office-hoursrun re-reads the stub, still seessessions: [], still picks the introduction tier.Fix
Either (a) move the writer to
developer-profile.json, or (b) move the reader back tobuilder-profile.jsonl. (a) is the direction v1.0.0.0 was going; (b) is a revert. Option (a) needs a small subcommand ongstack-developer-profilethat read-modify-writes thesessions[]array. Whoever owns this should also decide on stranded entries inbuilder-profile.jsonlfrom the broken-writer period (leave them; loss is aesthetic).Filing as a regression report, not a PR. Happy to send a PR if useful; flag here first since the choice of (a) vs (b) is yours.