Skip to content

chore(#488): ship status-in-dev automation to main - #492

Merged
vybe merged 1 commit into
mainfrom
release/in-dev-automation
Apr 24, 2026
Merged

chore(#488): ship status-in-dev automation to main#492
vybe merged 1 commit into
mainfrom
release/in-dev-automation

Conversation

@vybe

@vybe vybe commented Apr 24, 2026

Copy link
Copy Markdown
Contributor

Ships the status-in-dev label + PR-merge workflow to main ahead of the next full release, so issue-state tracking is live everywhere immediately.

Narrow cherry-pick of ef6cfdb (from #489) — does not include the WEBHOOK-001 feature still staged on dev.

Closes #488

Contents

  • .github/workflows/issue-status-on-merge.yml — on PR-merge-to-dev, parse Fixes/Closes/Resolves #N → add status-in-dev, remove status-in-progress
  • .claude/skills/release/SKILL.md/release uses status-in-dev as authoritative shipping list; emits Closes #N in release PR
  • docs/DEVELOPMENT_WORKFLOW.md — SDLC updated to Todo → In Progress → In Dev → Done

Test plan

🤖 Generated with Claude Code

Close the gap between "PR merged to dev" and "released to main".

- New GH Action `issue-status-on-merge.yml`: on PR merge to dev,
  parse Fixes/Closes/Resolves #N from PR body+title, add
  `status-in-dev`, remove `status-in-progress`.
- `/release` skill: read `gh issue list --label status-in-dev` as
  the authoritative shipping list for release notes; include
  `Closes #N` in the release PR body so issues auto-close on merge
  to main.
- `DEVELOPMENT_WORKFLOW.md`: SDLC is now Todo → In Progress →
  In Dev → Done, each stage mapped 1:1 to commit-graph location.

Fixes #488

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vybe
vybe merged commit 167c375 into main Apr 24, 2026
vybe pushed a commit that referenced this pull request Sep 6, 2026
…s its rail (#2540, ent#474) (#2543)

Two operator rulings from the 2026-09-06 Workspace review, one PR because the
second is built under the first.

#2540 — the loading rule. Design-system principle 12 is amended: the scanline
beam + wipe-in reveal is the CHART-loading motion only; every other first load
— pages, panels, lists, message threads — is a skeleton placeholder keyed on
"no data yet". The three Workspace zones #2163 wrapped in `ScanlineReveal`
(the stage in Portal.vue, the thread in PortalConversation.vue, the hint zone
in PortalBriefing.vue) render `PortalSkeleton` (stage / thread / briefing)
instead, gated on `stage.state === 'loading'`, `!historyLoaded` and
`zone.state === 'pending'` — never a bare `<x>.loading` path, which the #1927
ratchet counts as a bare gate. The `reveal` verdict the zones computed for the
primitive is gone. The footprint (`min-h`, `max-w`) moves onto a wrapper both
faces sit inside, so the swap never shifts. `tests/unit/portalLoadingTreatment.spec.js`
pins the `ScanlineReveal` importer set as an allowlist: three chart consumers
plus the two pre-ruling non-chart holdovers (LibrarySkillsSection,
FinishSetupCard), recorded on #1921 — whose sweep is re-pointed by comment:
bespoke spinners on non-chart surfaces become skeletons, not scanlines. The
doc names the canonical forms (`SkeletonLoader.vue`, or content-shaped) and
the recipe; `/audit-design-system` reads the amended doc without a skill change.

ent#474 — the rail shell, to the approved design pass (48px collapsed /
`w-96` open, `trinity-workspace-rail`, mobile strip + sheet, two signal
shapes). Scope is the operator's own split: the three-column layout, the tab
contract, the collapsed signal, Work docked EMPTY — its content is #457's and
the re-homing of loops / canvas / files is #472's second child; the sidebar,
thread tab strip, top band, Agent-details panel and drop target of the approved
conversation page are later steps of the same build, and #492 lands the grid
variables the rail's widths then follow.

- `portalRail.js` is the contract: a tab declares door (platform / audience /
  agent), participant scope, empty state and signal shape; `visibleTabs` is
  the ONE gate for render AND mount, so a tab whose door the session fails
  has no icon, no label and no mounted body — nothing it would fetch is ever
  requested (the per-door test; an external client sees no rail until an
  audience tab docks). An unknown door fails closed.
- `PortalRail.vue` is a sibling of <main>, outside `convKey`, so a chat switch
  remounts the conversation and never the rail; visibility keys on the route
  and the stage verdict, never on data still arriving. Collapsed by default;
  open/collapsed + active tab persist under one key, read before first paint.
- The Work signal is DERIVED — from the conversation's in-flight `sending`
  (1:1) and the room's server-reported `working` list — reset on every chat
  switch and cleared on unmount, so it structurally cannot stick.
- A room groups by participant over `portalLoopUtils.byAgent`, absence
  visible; `1 running` is a `BaseBadge`. `OverflowTabs` gains an optional
  per-tab `signal` dot, measured in its mirror row.
- Mobile: `PortalRailStrip` above the composer through a `#rail-strip` slot on
  both conversations, opening the same component as a bottom sheet (Esc closes).

Verified live on the Docker frontend: collapsed → open → persisted across
reload; light and dark; mobile strip → sheet → Escape; the stage skeleton
under a slowed roster; no console errors. Unit suite 1889/1889; both ratchets
flat (no bare gate added, no touched file's raw-gray count grew).

Fixes #2540
Part of Abilityai/trinity-enterprise#474


Claude-Session: https://claude.ai/code/session_01FgAncnTAbgjJS3EGwuEtd4

Co-authored-by: sim <sim@example.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Sign up for free to 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.

Wire up status-in-dev label and PR-merge automation

1 participant