diff --git a/packages/react/src/Timeline/Timeline.issues.features.stories.module.css b/packages/react/src/Timeline/Timeline.issues.features.stories.module.css
new file mode 100644
index 00000000000..d3578d7d52d
--- /dev/null
+++ b/packages/react/src/Timeline/Timeline.issues.features.stories.module.css
@@ -0,0 +1,137 @@
+.Timestamp {
+ text-decoration: underline;
+}
+
+.CommitSha {
+ font-family: var(--fontStack-monospace);
+ font-size: var(--text-body-size-small);
+ font-weight: var(--base-text-weight-semibold);
+ color: var(--fgColor-default);
+}
+
+/* IssueLink-style inline reference: state octicon + bold title + muted number. */
+.IssueLink {
+ color: var(--fgColor-default);
+ text-decoration: none;
+}
+
+.IssueLink:hover {
+ color: var(--fgColor-accent);
+ text-decoration: underline;
+}
+
+.IssueLinkIcon {
+ color: var(--fgColor-done);
+ vertical-align: middle;
+ margin-right: var(--base-size-4);
+}
+
+.IssueLinkTitle {
+ font-weight: var(--base-text-weight-semibold);
+}
+
+.IssueLinkNumber {
+ color: var(--fgColor-muted);
+}
+
+/* Issue-version ProjectV2 reference (github-ui `ProjectV2.tsx` + `ClosedEvent.tsx`):
+ an inline default-colored TableIcon octicon followed by a default-color link
+ (`.ProjectRefLink`). The underline comes from the Link `inline` prop (always-on
+ underline, which also satisfies the high-contrast a11y rule). Mirrors live
+ `.projectLink`/`.stateReasonLink` (both `color: var(--fgColor-default)`). NOTE:
+ the PR (ERB) surface renders this differently — see the EventProject group. */
+.ProjectRefIcon {
+ vertical-align: middle;
+ margin-right: var(--base-size-4);
+}
+
+.ProjectRefLink {
+ color: var(--fgColor-default);
+}
+
+/* Open (green) state icon variant for IssueLink references that point at an
+ open issue/PR (e.g. the canonical issue in a "marked as duplicate of" row). */
+.IssueLinkIconOpen {
+ color: var(--fgColor-open);
+ vertical-align: middle;
+ margin-right: var(--base-size-4);
+}
+
+/* Inline pull-request state icon rendered in the body text (References group),
+ mirroring github-ui's `sourceIcon('PullRequest', ...)` open-state coloring. */
+.PrStateIcon {
+ color: var(--fgColor-open);
+ vertical-align: middle;
+ margin: 0 var(--base-size-4);
+}
+
+/* Open (green) badge icon, used when the badge icon itself is a PR state icon
+ (References "removed a link to a pull request" → `leadingIcon={PullStateIcon}`). */
+.BadgeIconOpen {
+ color: var(--fgColor-open);
+}
+
+/* Wrapper around a colored issue-type Token so it sits inline with the copy,
+ matching github-ui's `IssueTypeEvent.module.css` `issueTypeTokenWrapper`. */
+.TokenWrapper {
+ display: inline-flex;
+ vertical-align: middle;
+ margin: 0 var(--base-size-4);
+}
+
+/* Commit reference (github-ui's `ReferencedEventInner`): NOT a bordered card on
+ live GitHub — `.referencedCommitContainer` is a plain flex column (`gap: 2px`)
+ with the monospace message on the left and the SHA on the right. Mirror that:
+ no border, no card background, no row dividers. */
+.CommitRefBox {
+ display: flex;
+ flex-direction: column;
+ gap: var(--base-size-4);
+ margin-top: var(--base-size-8);
+}
+
+.CommitRefRow {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: var(--base-size-8);
+}
+
+.CommitRefMessage {
+ font-family: var(--fontStack-monospace);
+ font-size: var(--text-body-size-small);
+ color: var(--fgColor-muted);
+}
+
+.CommitRefOid {
+ font-family: var(--fontStack-monospace);
+ font-size: var(--text-body-size-small);
+ color: var(--fgColor-muted);
+}
+
+/* Secondary reference list (github-ui Hierarchy/Dependency events render the
+ linked issues below the main copy). On live GitHub these are PLAIN, lightly
+ indented rows — state octicon + bold title + muted #number per line — with no
+ surrounding border, no card background, and no row dividers. Single vs
+ multiple differ only by item count + singular/plural leading copy. */
+.RefList {
+ margin-top: var(--base-size-8);
+ padding-left: var(--base-size-4);
+ list-style: none;
+}
+
+.RefListItem + .RefListItem {
+ margin-top: var(--base-size-4);
+}
+
+/* IssueField event: the field name reads as semibold inline text, the value as
+ an inline link (github-ui's `IssueFieldEvent` `issueFieldTokenWrapper`). */
+.FieldName {
+ font-weight: var(--base-text-weight-semibold);
+ color: var(--fgColor-default);
+ margin: 0 var(--base-size-4);
+}
+
+.FieldValue {
+ margin-left: var(--base-size-4);
+}
diff --git a/packages/react/src/Timeline/Timeline.issues.features.stories.tsx b/packages/react/src/Timeline/Timeline.issues.features.stories.tsx
new file mode 100644
index 00000000000..36fd75db9ff
--- /dev/null
+++ b/packages/react/src/Timeline/Timeline.issues.features.stories.tsx
@@ -0,0 +1,2336 @@
+import type {Meta} from '@storybook/react-vite'
+import type React from 'react'
+import type {ComponentProps} from '../utils/types'
+import {FeatureFlags} from '../FeatureFlags'
+import Timeline from './Timeline'
+import {
+ BlockedIcon,
+ CalendarIcon,
+ CheckCircleIcon,
+ CircleSlashIcon,
+ CommentDiscussionIcon,
+ CrossReferenceIcon,
+ DuplicateIcon,
+ GitCommitIcon,
+ GitPullRequestIcon,
+ IssueClosedIcon,
+ IssueDraftIcon,
+ IssueOpenedIcon,
+ IssueReopenedIcon,
+ IssueTrackedByIcon,
+ IssueTracksIcon,
+ LinkExternalIcon,
+ LockIcon,
+ MilestoneIcon,
+ NumberIcon,
+ PencilIcon,
+ PersonIcon,
+ PinIcon,
+ SingleSelectIcon,
+ TableIcon,
+ TagIcon,
+ TrashIcon,
+ TypographyIcon,
+ UnlockIcon,
+} from '@primer/octicons-react'
+import {Button} from '../Button'
+import Label from '../Label'
+import Link from '../Link'
+import Octicon from '../Octicon'
+import RelativeTime from '../RelativeTime'
+import Token from '../Token'
+import classes from './Timeline.issues.features.stories.module.css'
+import {BoldLink, Examples, InlineAvatar, VariantSection} from './internal/timelineStoryHelpers'
+
+/**
+ * Issue Timeline event examples (Phase 2 of github/primer#6663).
+ *
+ * These stories recreate GitHub's live issue-timeline events using the Primer
+ * `Timeline` compositional slots, sourced from the `timeline-audit` Figma audit
+ * (`issue-timeline-events-for-figma.md`) and verified against the live React
+ * implementation in `github/github-ui` (`packages/timeline-items`).
+ *
+ * SCOPE: These are Storybook-only examples by design. They are intentionally
+ * NOT wired into components-json / the primer.style docs page (do NOT add this
+ * file to `Timeline.docs.json` or `build.ts`). Individual timeline events are not
+ * consumer-facing components — the primer.style Timeline page reflects the base
+ * `Timeline` component's own stories, and any docs-site representation is a
+ * Phase 3 consideration via base-component story changes, out of scope here.
+ *
+ * FUTURE FILTERING (taxonomy still open — github/primer#6663): category
+ * `data-*` attributes (e.g. `data-event-category="closed"`) will attach to each
+ * `Timeline.Item` below so stories can be filtered/grouped by event family. We
+ * intentionally do NOT add them yet to avoid baking in a taxonomy.
+ *
+ * SLOT USAGE (Phase 1 slots — establishes the convention for downstream groups):
+ * - `Timeline.Avatar` (gutter slot, #6677): the 40px LEFT-GUTTER avatar. Reserved
+ * for comment-style events. Badge-row events like Closed do NOT use it — the
+ * live github-ui `ClosedEvent` renders through `TimelineRow`, which places the
+ * actor's small (20px) avatar INLINE in the body (`EventActor` inline-avatar
+ * mode), not in the gutter. We mirror that here: avatar inline in `Timeline.Body`.
+ * - `Timeline.Actions` (right-controls slot, #6678): for buttons / SHAs / status
+ * pills on the right edge. Closed has no right controls, so it is omitted here.
+ * Downstream groups that DO have right controls (e.g. Duplicates' "Marked as
+ * duplicate" has a button) should add it as a sibling of `Timeline.Body`:
+ *
+ *
+ * {...}
+ * {...}
+ *
+ *
+ *
+ *
+ */
+
+const MONALISA_AVATAR = 'https://avatars.githubusercontent.com/u/583231?v=4'
+
+// Inline 20px avatar + bold username link, matching github-ui's `EventActor`
+// (packages/timeline-items/components/row/EventActor.tsx) inline-avatar mode.
+const Actor = () => (
+ <>
+
+
+ monalisa
+
+ >
+)
+
+// Muted underlined relative timestamp, mirroring github-ui's `Ago` deep-link.
+const Time = ({date}: {date: string}) => (
+
+
+
+)
+
+export default {
+ title: 'Components/Timeline/Events/Issues',
+ component: Timeline,
+ subcomponents: {
+ 'Timeline.Item': Timeline.Item,
+ 'Timeline.Avatar': Timeline.Avatar,
+ 'Timeline.Badge': Timeline.Badge,
+ 'Timeline.Body': Timeline.Body,
+ 'Timeline.Break': Timeline.Break,
+ 'Timeline.Actions': Timeline.Actions,
+ },
+ decorators: [
+ // File-scoped: render every story in the future-state list semantics
+ // (`
`/`
`). The `primer_react_timeline_list_semantics` flag is merged
+ // on main; this opts these stories into the DOM the timeline will ship.
+ Story => (
+
+
+
+ ),
+ ],
+} as Meta>
+
+/**
+ * The Closed event group — `IssueTimeline.eventClosed` (audit § 2).
+ *
+ * All seven variants are stacked in a single `` so they can be
+ * scanned like a Figma component set. Badge icon and color are dynamically
+ * derived by `useIssueState({ state: 'CLOSED', stateReason })` in the live code:
+ * completed/PR/commit/project/no-reason -> CheckCircleIcon on `done` (purple);
+ * not-planned/duplicate -> CircleSlashIcon on `neutral` (gray).
+ */
+export const EventClosed = () => (
+
+ {/* Closed as completed */}
+
+
+
+
+
+
+
+
+ {'closed this as '}
+
+ completed
+ {' '}
+
+
+
+
+
+
+ {/* Not planned — neutral (gray) badge. Timeline.Badge has no `neutral`
+ variant, so drive the documented `--timelineBadge-bgColor` hook inline
+ (portable for docs copy-paste; matches production `TimelineRow`). */}
+
+
+
+
+
+
+
+
+ {'closed this as '}
+
+ not planned
+ {' '}
+
+
+
+
+
+
+ {/* Closed via pull request */}
+
+
+
+
+
+
+
+
+ {'closed this as '}
+
+ completed
+
+ {' in '}
+ #123
+
+
+
+
+
+ {/* Closed via commit */}
+
+
+
+
+
+
+
+
+ {'closed this as '}
+
+ completed
+
+ {' in '}
+
+ abc1234
+ {' '}
+
+
+
+
+
+
+ {/* Closed via project (ProjectV2 status change). github-ui composes
+ the closer link as TableIcon + project title; there is no Primer
+ equivalent for github-ui's `ProjectV2` closer link. */}
+
+
+
+
+
+
+
+
+ {'closed this as '}
+
+ completed
+
+ {' by moving to Done in '}
+
+ Roadmap
+
+
+
+
+
+ {/* Closed as duplicate — neutral (gray) badge (see note above). github-ui
+ renders an `IssueLink` (state icon + title + #number + hovercard);
+ composed here from Primer primitives. */}
+
+
+
+
+
+
+
+
+ {'closed this as a '}
+
+ duplicate
+
+ {' of '}
+
+
+ Fix the flaky avatar test{' '}
+ #42
+ {' '}
+
+
+
+
+
+
+ {/* Closed with no state reason */}
+
+
+
+
+
+
+
+
+ {'closed this '}
+
+
+
+
+
+
+)
+
+/**
+ * The Issue-state event group (audit § 3).
+ *
+ * Six state-change variants. Badge icon/color verified against the live
+ * github-ui components (not the audit's icon column): Reopened maps to
+ * `useIssueState({ state: 'OPEN' })` -> `open` (green) badge; the rest are
+ * structural events with a default (muted) badge.
+ */
+export const EventState = () => (
+
+ {/* Reopened — open (green) badge via useIssueState (ReopenedEvent.tsx) */}
+
+
+
+
+
+
+
+
+ {'reopened this '}
+
+
+
+
+
+
+ {/* Transferred — github-ui's TransferredEvent renders the source repo as a
+ plain inline Link (the audit shows it bold; live code is canonical). */}
+
+
+
+
+
+
+
+
+ {'transferred this issue from '}
+
+ octo-org/legacy-repo
+ {' '}
+
+
+
+
+
+
+ {/* Pinned */}
+
+
+
+
+
+
+
+
+ {'pinned this issue '}
+
+
+
+
+
+
+ {/* Unpinned */}
+
+
+
+
+
+
+
+
+ {'unpinned this issue '}
+
+
+
+
+
+
+ {/* Converted to discussion — github-ui's ConvertedToDiscussionEvent links
+ the resulting discussion by number. */}
+
+
+
+
+
+
+
+
+ {'converted this issue into a discussion '}
+ #123
+
+
+
+
+
+ {/* Converted from draft */}
+
+
+
+
+
+
+
+
+ {'converted this from a draft issue '}
+
+
+
+
+
+
+)
+
+/**
+ * The References event group (audit § 5).
+ *
+ * Cross-reference events. All use a default (muted) badge except where the
+ * badge icon is itself a PR state icon. The inline PR state icon mirrors
+ * github-ui's `sourceIcon('PullRequest', isDraft, isInMergeQueue)`; commit
+ * references compose a simplified `ReferencedEventInner` card.
+ */
+export const EventReferences = () => (
+
+ {/* Linked pull request — ConnectedEvent.tsx (CrossReferenceIcon badge,
+ open PR state icon inline before the PR title). */}
+
+
+
+
+
+
+
+
+ {'linked a pull request that will close this issue '}
+
+ Add retry logic to the uploader
+ #42
+
+
+
+
+
+ {/* Unlinked pull request — DisconnectedEvent.tsx uses the PR state icon AS
+ the badge icon (leadingIcon={PullStateIcon}), so the badge octicon is
+ green (open) on a default badge. Verified the live render path is
+ active (in TIMELINE_ITEMS[__typename], current useIssueState hook,
+ story fixture is an OPEN PR) — the Figma audit's gray cross-reference
+ icon is behind the live code here. */}
+
+
+
+
+
+
+
+
+ {'removed a link to a pull request '}
+
+ Add retry logic to the uploader
+ #42
+
+
+
+
+
+ {/* Single commit reference — ReferencedEvent.tsx. The timestamp renders
+ inline (showAgoTimestamp={false}) and the commit card is sub-content. */}
+
+
+
+
+
+
+
+
+ {'added a commit that references this issue '}
+
+ {/* Simplified ReferencedEventInner card (github-ui composes message +
+ verification status + abbreviated OID per commit). */}
+
+
+
+
+
+
+)
+
+/**
+ * The Dependencies event group (audit § 9).
+ *
+ * Blocked-by and blocking events both use `BlockedIcon` (default badge). The
+ * dependent issues render in a bordered secondary list, like the hierarchy
+ * group.
+ *
+ * SINGLE vs MULTIPLE: live code branches on `itemsToRender.length`. Singular
+ * copy has no count ("marked this as blocked"); plural copy adds a count
+ * ("marked this as blocked by 2 issues") via `LABELS.timeline.blockedByAdded
+ * .multiple(count)`, and the secondary list grows from 1 to N rows.
+ */
+export const EventDependencies = () => (
+
+ {/* Blocked by (single) */}
+
+
+
+
+
+
+
+
+ {'marked this as blocked '}
+
+
+
+
+
+ Upgrade the storage client{' '}
+ #51
+
+
+
+
+
+
+
+
+ {/* Blocked by (multiple) — count in copy + N rows */}
+
+
+
+
+
+
+
+
+ {'marked this as blocked by 2 issues '}
+
+
+
+
+
+ Upgrade the storage client{' '}
+ #51
+
+
+
+
+
+ Add multipart upload support{' '}
+ #52
+
+
+
+
+
+
+
+
+ {/* Blocked by removed (single) */}
+
+
+
+
+
+
+
+
+ {'unmarked this as blocked '}
+
+
+
+
+
+ Upgrade the storage client{' '}
+ #51
+
+
+
+
+
+
+
+
+ {/* Blocked by removed (multiple) */}
+
+
+
+
+
+
+
+
+ {'unmarked this as blocked by 2 issues '}
+
+