feat(product-tour): SDK factory + pipeline - #92
Open
pl wants to merge 3 commits into
Open
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.autoLaunch/startDate/endDate/archived. Unlike surveys (whosestart_dateis 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 injectednow(). Re-applying a scheduled tour is a clean no-op instead of drifting each run.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_draftdraft workflow is read-only and left alone (we manage the publishedcontentdirectly).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; fullsmoke.shstays red on the pre-existingactionspull gap (lands onpl/pull-actions).Stacks on #81 (base
pl/spec-migration) — codegen only compiles there. Retarget tomainwhen #81 merges.🤖 Generated with Claude Code