docs(spec): owner decisions, provider defaults and AI-content channel policy #7
No files matched your search
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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
|
||||
},
|
||||
|
||||
Reference in new issue
Block a user