diff --git a/docs/DESIGN.md b/docs/DESIGN.md index ed32772..fef7455 100644 --- a/docs/DESIGN.md +++ b/docs/DESIGN.md @@ -186,3 +186,33 @@ The dashboard's Configuration Status widget (`MarketingRuntime.describeIntegrati - *Available* No live call is made to verify a provider or transport. + +## Owner decisions (2026-10-12): all recommendations accepted + +The owner accepted every recommendation on 2026-10-12. The concrete defaults, recorded 2026-10-13: + +**Providers** + +| Integration | Default | Why | +|---|---|---| +| Model provider | Claude through `qbit-assistant-provider-anthropic`, model `claude-sonnet-5-5`, set by the host (`ANTHROPIC_API_KEY`, `MARKETING_MODEL`) | The existing provider SPI and pricing table; no second abstraction. | +| OpenAI-compatible provider | Not configured | Optional; register it only for a specific need (for example a local Ollama for experiments). With two providers the host must name one. | +| Email transport | QQQ messaging over Amazon SES, from a verified `qrun.io` domain (SPF, DKIM, DMARC), from-address `news@qrun.io`, replies to `hello@qrun.io` | SES is a low-cost, reliable sender and QQQ messaging supports it directly. Reports *Configured, not verified* until one end-to-end test send, then the host sets `withVerifiedOperational(true)`. | +| Social and community posting | No transports. Posted by hand | No connector exists, and each community's rules must be checked before any automation. | +| Measurement | Outcome events from the CRM import and by hand; no third-party analytics provider | Matches the honest-measurement rules: not instrumented shows *Not measured*. | +| CRM gateway | `QbitCrmGateway` (qbit-crm) | What Voyage's Marketing wiring uses. | + +**AI-content channel policy** + +- The agent drafts and a person approves every publication. The agent never publishes. +- **Owned channels:** email to the opted-in CRM list and the project blog are *Allowed with disclosure*, with the default `aiDisclosureText` ("Prepared with AI assistance."). +- **GitHub release notes:** *Allowed*, without disclosure. A maintainer checks every line against the release's merged changes before publishing. +- **Third-party community channels** (forums, Reddit, Hacker News, social networks): *Not allowed* for agent-written text. A new community channel starts *Not allowed*, or *Unknown* until its current rules are read and recorded with a verification date. Never loosen one without its rules on file. +- **Test sink:** *Allowed*. + +**Policy row and approval** + +- `default` policy: agent and execution on, 1,000,000 tokens a day, a **USD 25 monthly cost limit** (`monthlyCostLimitMicros` 25,000,000), 2 concurrent runs, 24 tool calls per run. +- `requireDifferentApprover` stays `false`: the team is one person. Turn it on when a second approver exists. + +The starter data (`marketing-starter-data.json`) carries these channel policies, verification dates and the cost limit. diff --git a/docs/STARTER-DATA.md b/docs/STARTER-DATA.md index e727f44..811246a 100644 --- a/docs/STARTER-DATA.md +++ b/docs/STARTER-DATA.md @@ -61,8 +61,11 @@ Re-verify before use. The readiness check flags sources older than `staleSourceD ## Channels and policy -- **Controlled test sink:** test only. -- **Email to opted-in CRM list:** needs a configured, verified QQQ messaging provider. The team's AI-content policy is *Unknown* until recorded. -- **Project blog (posted by hand)** and **GitHub release notes (posted by hand):** no connectors. Their AI policies are *Unknown* until the team records them. -- **No community channels:** none are seeded, because their current rules have not been checked. -- **Policy row `default`:** agent and execution on, 1,000,000 agent tokens per day, 2 concurrent runs, 24 tool calls per run. +Channel AI policies follow the owner decisions in `DESIGN.md` (2026-10-12, recorded 2026-10-13). + +- **Controlled test sink:** test only. AI content *Allowed*. +- **Email to opted-in CRM list:** needs a configured, verified QQQ messaging provider (Amazon SES). AI content *Allowed with disclosure*. +- **Project blog (posted by hand):** no connector. AI content *Allowed with disclosure*. +- **GitHub release notes (posted by hand):** no connector. AI content *Allowed*; a maintainer checks every line against the release. +- **No community channels:** none are seeded, because their current rules have not been checked. Agent-written text is *Not allowed* on them by policy. +- **Policy row `default`:** agent and execution on, 1,000,000 agent tokens per day, USD 25 monthly cost limit, 2 concurrent runs, 24 tool calls per run. diff --git a/src/main/resources/marketing-starter-data.json b/src/main/resources/marketing-starter-data.json index 2c91c14..e56f09e 100644 --- a/src/main/resources/marketing-starter-data.json +++ b/src/main/resources/marketing-starter-data.json @@ -21,8 +21,9 @@ "transportName": "qqq_email", "isActive": true, "allowsAutomation": true, - "aiContentPolicy": "UNKNOWN", - "rulesSummary": "Only CRM contacts who are subscribed to the chosen list and have current email consent; one message per recipient; at most 50 recipients per execution. Record the team's policy on AI-assisted email before approving agent drafts here.", + "aiContentPolicy": "ALLOWED_WITH_DISCLOSURE", + "rulesSummary": "Only CRM contacts who are subscribed to the chosen list and have current email consent; one message per recipient; at most 50 recipients per execution. Team policy (2026-10-13): agent drafts are allowed with the AI disclosure line in the body; a person approves every send.", + "rulesVerifiedDate": "2026-10-13", "rateLimitPerHour": 50, "maxRecipientsPerExecution": 50 }, @@ -31,16 +32,18 @@ "channelType": "BLOG", "isActive": true, "allowsAutomation": false, - "aiContentPolicy": "UNKNOWN", - "rulesSummary": "Our own site. No publishing connector is configured: approved posts are published by a person. Record the team's policy on AI-assisted posts." + "aiContentPolicy": "ALLOWED_WITH_DISCLOSURE", + "rulesSummary": "Our own site. No publishing connector is configured: approved posts are published by a person. Team policy (2026-10-13): agent drafts are allowed with the AI disclosure line in the post.", + "rulesVerifiedDate": "2026-10-13" }, { "name": "GitHub release notes (posted by hand)", "channelType": "RELEASE_NOTES", "isActive": true, "allowsAutomation": false, - "aiContentPolicy": "UNKNOWN", - "rulesSummary": "Release notes on the product's GitHub releases page, written and published by a maintainer. No connector is configured." + "aiContentPolicy": "ALLOWED", + "rulesSummary": "Release notes on the product's GitHub releases page, published by a maintainer. No connector is configured. Team policy (2026-10-13): agent drafts are allowed without a disclosure line, because a maintainer checks every line against the release's merged changes before publishing.", + "rulesVerifiedDate": "2026-10-13" } ], @@ -49,6 +52,7 @@ "agentEnabled": true, "executionEnabled": true, "dailyTokenLimit": 1000000, + "monthlyCostLimitMicros": 25000000, "maxConcurrentAgentRuns": 2, "maxToolCallsPerRun": 24 },