feat: channel rules staleness, table help applied at run time with how rows get created #24

Merged
KofTwentyTwo merged 1 commits from feature/tables-populated-defaults into develop 2026-10-14 22:38:28 +00:00
KofTwentyTwo commented 2026-10-14 22:30:30 +00:00 (Migrated from github.com)

Audit per table

All 19 marketing_* tables are read or written by runtime code (checked by MarketingTablesGuardrailTest). Eight are seeded by the existing starter data action (product, evidence_source, claim, audience, campaign, metric, channel, policy); eleven hold work and results and start empty by design (content, revision, approval, execution, attempt, test_delivery, agent_run, agent_step, finding, outcome_event, metric_daily), each with a reason in STARTS_EMPTY.

Half-wired items

  • marketing_channel.rulesVerifiedDate had no staleness check. Fixed: new config staleChannelRulesDays (default 90); Check Readiness on a campaign warns when content uses a channel whose rules were last read longer ago than that, like staleSourceDays for sources (ChannelRulesStalenessTest: fresh, 91 days, 89 days, configurable window, unverified channel keeps its own warning).
  • marketing_channel.rulesSourceUrl had no reader but the agent tool. Fixed: the stale and the "not verified" findings now say "Read "; field help says so.
  • marketing_campaign.leadQualificationNote had no reader. It is a free-text note by design (the rule is the other fields); now also shown to the agent in its campaign view, and its help already says it is a note.
  • Found while auditing: the help bundle was never applied at run time (only tests read it; core #1198 has not shipped). Added MarketingHelp (STAND-IN core=QRun-IO/qqq#1198, removeBy=4.1.0-RC.8), which fills empty app/table help slots and resolves the {{label|default|maxLength|values}} references, called at the end of the producer. Field, process and widget entries are still not applied (they need core).

What changed

  • Every table entry now says How rows get created, naming Load Verified Starter Data for the eight tables it seeds, and the actions (Schedule, Approve, agent actions, Check Readiness, Update Results from CRM, Rebuild Results) for the rest. Bundle version: 1.
  • README (Starter data and setup), OPERATIONS (config), UPGRADE.md, CHANGELOG.
  • No Setup card added: the Configuration Status widget already exists.

Tests

ChannelRulesStalenessTest, MarketingTablesGuardrailTest (use, seeded or explained, help says how rows get created and names the starter action, references resolved, host help kept). ./mvnw verify green (95 tests, checkstyle, JaCoCo, StandInGuardrailTest).

Not done

Applying field, process and widget help entries at run time (waits for core #1198).

🤖 Generated with Claude Code

## Audit per table All 19 `marketing_*` tables are read or written by runtime code (checked by `MarketingTablesGuardrailTest`). Eight are seeded by the existing starter data action (product, evidence_source, claim, audience, campaign, metric, channel, policy); eleven hold work and results and start empty by design (content, revision, approval, execution, attempt, test_delivery, agent_run, agent_step, finding, outcome_event, metric_daily), each with a reason in `STARTS_EMPTY`. ## Half-wired items - `marketing_channel.rulesVerifiedDate` had no staleness check. **Fixed**: new config `staleChannelRulesDays` (default 90); Check Readiness on a campaign warns when content uses a channel whose rules were last read longer ago than that, like `staleSourceDays` for sources (`ChannelRulesStalenessTest`: fresh, 91 days, 89 days, configurable window, unverified channel keeps its own warning). - `marketing_channel.rulesSourceUrl` had no reader but the agent tool. **Fixed**: the stale and the "not verified" findings now say "Read <url>"; field help says so. - `marketing_campaign.leadQualificationNote` had no reader. It is a free-text note by design (the rule is the other fields); now also shown to the agent in its campaign view, and its help already says it is a note. - Found while auditing: the help bundle was **never applied at run time** (only tests read it; core #1198 has not shipped). Added `MarketingHelp` (STAND-IN core=QRun-IO/qqq#1198, removeBy=4.1.0-RC.8), which fills empty app/table help slots and resolves the `{{label|default|maxLength|values}}` references, called at the end of the producer. Field, process and widget entries are still not applied (they need core). ## What changed - Every table entry now says **How rows get created**, naming **Load Verified Starter Data** for the eight tables it seeds, and the actions (Schedule, Approve, agent actions, Check Readiness, Update Results from CRM, Rebuild Results) for the rest. Bundle `version: 1`. - README (Starter data and setup), OPERATIONS (config), UPGRADE.md, CHANGELOG. - No Setup card added: the Configuration Status widget already exists. ## Tests `ChannelRulesStalenessTest`, `MarketingTablesGuardrailTest` (use, seeded or explained, help says how rows get created and names the starter action, references resolved, host help kept). `./mvnw verify` green (95 tests, checkstyle, JaCoCo, StandInGuardrailTest). ## Not done Applying field, process and widget help entries at run time (waits for core #1198). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.