Repository navigation
Add the roadmap, sprint plan and campaign measurement - #81
Conversation
Adds campaign measurement on product pages, demo and terminal-demo script updates, the docs index entry, and the local roadmap, sprint plan and retired AgentShift sprint backlog. Preserved from local uncommitted work during the 2026-11-04 checkout cleanup; not validated. The ProfitCtlDemo20261007 capture is archived outside the repo. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Linear now tracks ProfitCtl, and AgentShift has been shut down. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…x/campaign-measurement
Codex Review Summary: ✅ CompletedThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8192ef8229
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| const tagged = params.get("utm_source") === "linkedin" && key && safe.test(key) && creative && safe.test(creative) && | ||
| ["organic_social", "paid_social"].includes(medium || "") && /^[1-9][0-9]{0,2}$/.test(revision || ""); | ||
| let value = previous && previous.expires > Date.now() ? previous : null; | ||
| if (tagged && (!value || value.key !== key || value.medium !== medium || value.creative !== creative || value.revision !== revision)) { |
There was a problem hiding this comment.
Reset attribution when the test flag changes
Actionable. When the same tab opens otherwise identical campaign URLs with different campaign_test values—for example, an operator tests a production campaign URL—the existing attribution is reused because this comparison omits the test flag. The subsequent visit therefore keeps the previous campaign_test value and its sent set, causing test traffic to be classified as production traffic (or vice versa) and potentially suppressing its events; include the normalized test value when deciding whether to create fresh attribution.
Useful? React with 👍 / 👎.
|
|
||
| ## Tracker handoff | ||
|
|
||
| **AgentShift synchronization: Confirmed on 2026-10-07.** The connection is restored. The canonical ProfitCtl project is `dc3a0fc2-fd0e-4707-8a6d-3cdc33aa7dc7`. All 100 mapped records were read back: 10 release/sprint groups, 20 stories, and 70 tasks. This created 97 records and reused PCTL-15 for S02-A1, PCTL-26 for S04-B, and PCTL-23 for S09-B, preserving their prior context and acceptance requirements. |
There was a problem hiding this comment.
Replace the retired AgentShift handoff with Linear
Actionable. Anyone following this newly added sprint plan is told that AgentShift is the confirmed canonical tracker, even though the same commit makes Linear authoritative; the referenced docs/AGENTSHIFT_SPRINT_BACKLOG.md at line 550 is also absent from the entire target tree. This makes the handoff unusable and can send planning updates to a retired system, so rewrite this section for the Linear project or clearly retain it as historical context.
AGENTS.md reference: AGENTS.md:L29-L29
Useful? React with 👍 / 👎.
| if (!link) return; | ||
| const url = new URL(link.href); | ||
| if (url.origin === location.origin && (url.pathname.startsWith("/docs") || url.hash === "#get-started")) trackCampaignAction("quickstart_opened"); | ||
| if (url.origin === "https://github.com" && url.pathname.startsWith("/IntelIP/ProfitCtl/releases/download/")) trackCampaignAction("package_download_clicked"); |
There was a problem hiding this comment.
Wire the package-download event to a reachable link
Actionable. On the product pages in this target tree, no anchor points to /IntelIP/ProfitCtl/releases/download/: the installation CTA opens the repository or docs/INSTALL.md, after which the actual download happens on GitHub outside this listener. Consequently package_download_clicked can never be emitted by the current website, so package conversions will always appear as zero; add a direct release-asset link or track the installation CTA that users can actually click.
Useful? React with 👍 / 👎.
|
|
||
| **Invariants.** Preserve existing gross-margin semantics, source provenance, units, billing periods, and explicit unknowns. Add delivery, human effort, productization, adoption, and migration costs as separate named views without double counting. An estimate, a simulation, a sandbox measurement, and a billed actual must remain distinguishable. An agent cannot approve its own consequential action. Neither context separation nor a Git worktree is a security sandbox. | ||
|
|
||
| **Testing.** Each story requires the direct tests stated below, relevant regression tests, and a repeatable user demo. Add behavior to the existing validation profiles rather than creating a parallel proof system. For product changes, use `validate-product` and `tabellio-validate gate` with [the committed validation manifest](../tabellio.validation.json). Bind results to the exact candidate commit and input/fixture versions. Required static, schema, semantic, workflow, operational, and security checks must pass. Unit tests alone do not establish the business outcome. |
There was a problem hiding this comment.
Replace the unavailable validate-product command
Actionable. In an environment built from this repository, validate-product cannot be run: a target-tree-wide search finds no script, package command, workflow step, or executable by that name, while the committed workflow invokes the Tabellio gate directly. Because every story inherits this testing contract, implementers cannot reproduce the prescribed acceptance sequence; replace this name with the actual Tabellio command/profile or add the missing repository command.
AGENTS.md reference: AGENTS.md:L25-L26
Useful? React with 👍 / 👎.
Checked locally:
websiteanalytics checks and production build pass. Merging does not deploy the website, because Cloudflare Pages builds production from another branch.🤖 Generated with Claude Code