Skip to content

feat(product-tour): SDK factory + pipeline - #92

Open
pl wants to merge 3 commits into
pl/spec-migrationfrom
pl/resource-product-tours
Open

feat(product-tour): SDK factory + pipeline#92
pl wants to merge 3 commits into
pl/spec-migrationfrom
pl/resource-product-tours

Conversation

@pl

@pl pl commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Adds product tours as a managed resource. Closes Wave 1 (8 shipped / 2 deferred).

Identity

Description marker (no tags) — iac:product-tours:<key>.

Content + lifecycle

  • content (the step tree) is a passthrough bag, canonically hashed.
  • Scheduling/lifecycle is declared through directly-writable fields: autoLaunch / startDate / endDate / archived. Unlike surveys (whose start_date is server-managed, forcing launch/stop endpoints + a status abstraction), a product tour's schedule dates are set on the row itself — so they're plain declarative fields with no injected now(). Re-applying a scheduled tour is a clean no-op instead of drifting each run.
  • Targeting flags (linked_flag / internal_targeting_flag / targeting_flag_filters) are server-managed and read-only — no flag references exposed.

Serializer fidelity (checked carefully — younger API)

Full GET mirrors the create/update payload exactly — no silently-dropped fields. The draft_content / has_draft draft workflow is read-only and left alone (we manage the published content directly).

Live verification (project 806)

create → no-op re-apply (hash projection correct; explicit dates don't drift) → edit the content → single update → orphan left alone → hand-built tour (no marker) untouched → kind-scoped prune deletes managed only. Delete is a real DELETE (204).

Notes

Scope: product_tour:read / product_tour:write. Gates green (typecheck, typecheck:examples, test — 304 pass, lint). Smoke wiring verified in isolation; full smoke.sh stays red on the pre-existing actions pull gap (lands on pl/pull-actions).


Stacks on #81 (base pl/spec-migration) — codegen only compiles there. Retarget to main when #81 merges.

🤖 Generated with Claude Code

pl and others added 3 commits July 24, 2026 00:04
Add product_tours list/create/retrieve/partial_update/destroy to the openapi
allowlist and regenerate src/generated/api.d.ts. Product tours support a real
DELETE (204).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adds the product-tours resource: SDK factory, Zod-validated client,
description-marker identity, pull codegen, unit tests, two examples.

Identity: description marker (no tags) — iac:product-tours:<key>.

The tour `content` (step tree) is a passthrough bag, canonically hashed.
Scheduling / lifecycle is expressed through directly-writable fields —
`autoLaunch` / `startDate` / `endDate` / `archived`. Unlike surveys (whose
start_date is server-managed, requiring launch/stop endpoints and a status
abstraction), a product tour's schedule dates are set on the row itself, so
they are declared as plain fields with no injected "now" — re-applying a
scheduled tour is a clean no-op rather than drifting each run. Targeting flags
(linked_flag / internal_targeting_flag / targeting_flag_filters) are
server-managed and read-only, so no flag references are exposed.

Serializer fidelity checked field-by-field on this younger API: the full GET
mirrors the create/update payload exactly — no silently-dropped fields (the
draft_content / has_draft draft workflow is read-only and left alone).

Live-verified on project 806: create -> no-op re-apply (hash projection
correct; explicit dates don't drift) -> edit the content -> single update ->
orphan left alone -> hand-built tour (no marker) untouched -> kind-scoped
prune deletes managed only. Delete is a real DELETE (204).

Scope: product_tour:read / product_tour:write.

Stacks on #81 (pl/spec-migration); retarget to main when #81 merges.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Add a minimal single-step product tour to the smoke seed (independent
resource), plus the SMOKE_KINDS entry and smoke-cleanup wiring.

Verified in isolation: seed apply -> pull -> tag-back -> apply --dry-run is a
clean no-op. As with the other new resources, the full smoke.sh run stays red
at the pull step on the pre-existing `actions` pull gap on pl/spec-migration
(lands on pl/pull-actions).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
pl added a commit that referenced this pull request Jul 23, 2026
…tive

Messaging templates (#91) and product tours (#92) close the wave. Records
the retrospective lessons: description marker is the default carrier,
generated types are a floor not a contract, delete-verb variance, nested-
blob noise stripping, the secrets convention, and --all-rows collateral.

Co-Authored-By: Claude Fable 5 <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.

1 participant