Skip to main content

Sales, marketing, and support portfolio

TWL Tool ships a portfolio of 59 focused first-party apps. Each catalog entry has its own name, setup policy, scoped assistant, records, outputs, and certification, while sharing the existing Apps Layer runtimes.

The portfolio does not add a separate chat, document editor, database, or scheduler for each app. An installation provisions:

  • a scoped AI Chat surface that may launch only the app's pinned workflow;
  • a native Overview surface showing installed scope, maturity, and operating guidance;
  • a Data Workspace table for evidence, output records, review state, and workflow attribution;
  • an Activity surface backed by a second, installation-scoped view of that records table;
  • a Data Workspace table for selectable policies and context;
  • a private Document folder for generated drafts;
  • an active, organization-scoped workflow definition;
  • a Content Scheduler surface when the app produces recurring or publishable content.

No app in this portfolio uses a custom Frontend Page. The first release deliberately uses native Overview, Work, Records, Outputs, Activity, Settings, and optional Schedule surfaces so that behavior, permissions, and installed resources remain easy to inspect. The default surface is Overview; Work opens the scoped chat.

Current workflow modes

The assistant extracts the required fields from the conversation and passes them into the pinned workflow context.

ModeRequired inputWorkflow behavior
ContentA complete brief and optional selected policy contextGenerates an editable draft, saves a Document, and records the result.
Web evidenceAn authorized public source URL and a briefFetches the page as Markdown, generates an evidence-aware output, saves it, and records source lineage.
SEOSearch query, audience, and angleRuns SERP analysis, fetches representative pages, builds a brief, generates a draft, and saves the evidence-linked output.
TranscriptA consented public HTTPS media URL and reuse authorityRejects local, private, internal, credential-bearing, and non-HTTPS sources; transcribes with speaker-aware options; and saves explicit recording/transcript status plus capture provenance.
AssistedA complete supplied record, thread, policy, or conversationProduces a reviewable recommendation or draft without claiming that an external action occurred.
Support operationsA complete supplied thread or ticket plus SLA and risk signalsClassifies intent, analyzes sentiment, calculates deterministic priority, routes by policy, drafts the response, and preserves a human-handoff packet.
KnowledgeA question from an authenticated user and optional trusted Knowledge Manager filtersSearches only that user's organization-scoped knowledge, validates inline citations, creates an explicit no-answer result when evidence is insufficient, and saves the answer and citations.

Maturity labels

Every app includes its current scope in its catalog tags and installed operating policy:

  • ready — the useful draft/document workflow is implemented from existing Actions.
  • scoped — the app works with an explicit input mode, such as one authorized URL or an uploaded transcript.
  • foundation — the installed app provides safe analysis and drafting while a reusable provider adapter is still required for external reads or writes.
  • preview — the app provides planning, transcript review, or disposition workflows while real-time channel orchestration remains unavailable.
  • deferred — the defining live integration is unavailable; only an explicitly labeled fallback such as transcript-upload mode is present.

Foundation and preview apps never represent a draft as a sent email, Slack message, CRM update, support-ticket action, phone call, or calendar booking.

Reusable workflow input validation

Every portfolio workflow starts with workflow.validate-input@1. The Action verifies the fields required by that workflow mode before research, transcription, generation, or persistence begins. It also validates HTTP(S) URLs and rejects URLs containing embedded credentials.

The same Action validates required email recipients before an approval-only draft contract is created. Validation is a workflow boundary, so calling a workflow directly cannot bypass fields that the scoped assistant would normally collect conversationally.

Transcript workflows require an explicit media-consent confirmation. SEO Audit additionally requires domain-authorization confirmation. Contact Finder and Email Finder require confirmation of lawful professional use. The scoped assistant may collect these confirmations conversationally, but a forged or incomplete direct workflow launch still fails safely at the workflow boundary.

The search-research and transcript modes also call workflow.check-provider-readiness@1 before their first provider request. It recognizes the host's configured DataForSEO/SerpAPI variant or Deepgram configuration, returns no credential values, and fails with the exact environment settings the host administrator must provide. This is a run preflight, not an installation-owned OAuth connection: apps that still need Gmail, Slack, CRM, messaging, phone, calendar, or meeting accounts remain explicitly provider-neutral.

For future installed-account adapters, integration.check-connection-readiness@1 is the reusable connection preflight. Given a server-selected credential reference, it fails closed unless credential metadata exactly matches the workflow organization and expected provider, reports an active state, allowlists the current app installation or app key, and includes every required scope. The Action never reads decrypted credential data, never returns the selected credential identifier or metadata, and never performs an external request. It returns only readiness details and a one-way organization-bound reference hash. This preflight does not itself provide a connection picker, provider API adapter, webhook verification, or delivery audit store.

Reusable support workflow Actions

Support-mode apps compose five provider-neutral Actions before generating a response:

ActionStable output
ai.classify-record@1Allowed label, confidence, reason, evidence excerpts, and needsReview.
ai.analyze-sentiment@1Sentiment, score, confidence, topics, evidence excerpts, and needsReview.
support.calculate-priority@1Deterministic priority, score, contributing reasons, and human-review requirement.
workflow.route-by-policy@1Selected route, matching rule index, and auditable policy reason.
support.build-escalation-packet@1Channel-neutral packet and Markdown handoff containing identity, issue, summary, evidence, priority, destination, and pending actions.

The AI nodes validate structured outputs and fail closed when a classifier returns a label outside the configured allowlist. Priority and routing remain deterministic. High and urgent handoffs require acknowledgement.

Reusable email preparation Actions

Email responder workflows add two provider-neutral preparation steps before anything can reach a mailbox adapter:

ActionStable output
email.extract-participants@1Deduplicated addresses and roles, sender/domain policy status, policy reasons, and needsReview.
email.create-draft@1Normalized recipients, subject, body, thread references, stable idempotency key, approval reasons, and explicit delivery state.

email.create-draft@1 creates a workflow draft contract, not a Gmail or Outlook draft. Its output always reports externalDraftCreated: false, messageSent: false, and deliveryAdapterRequired: true. The responder apps use an always approval policy, so a later mailbox adapter cannot treat the generated copy as pre-approved.

Mailbox watching, remote draft creation, replies, labels, and priority markers are not part of this first provider-neutral tranche. Those capabilities require an installed mailbox connection, provider-specific permission checks behind a normalized contract, durable idempotency, and delivery audit records.

Reusable Knowledge Manager Actions

Knowledge workflows use server-owned authenticated identity. A chat prompt cannot choose or override the Knowledge Manager user scope.

ActionStable output
knowledge.search@1User- and organization-scoped chunks, stable K1 citation identifiers, source metadata, result count, and noEvidence.
knowledge.answer-with-citations@1Evidence-only answer, validated inline citations, confidence, review state, and explicit noAnswer.
knowledge.record-feedback@1Scoped feedback event IDs for cited chunks without changing the underlying knowledge.
knowledge.ingest-source@1Idempotently queues authenticated text content for indexing, with workflow attribution and organization-validated folder assignment.
knowledge.wait-until-indexed@1Returns a nonblocking readiness result, failure details, and retry guidance for an authenticated ingestion source.

The scoped AI Chat workflow launcher adds authenticatedUserId as a server-owned constraint alongside the conversation ID. Knowledge ingestion and retrieval fail closed when that identity or the workflow organization is absent. Answers with unknown citation identifiers are rejected; low-confidence, uncited, or incompletely cited answers become a no-answer response. Ingestion is asynchronous: use the readiness Action from a scheduler or continuation workflow instead of keeping a workflow run open while indexing completes.

Specialized multi-step compositions

Focused apps can reuse the same Actions while changing the workflow shape. Marketing Focus Group runs three independent simulated audience reactions and then a separate synthesis step. Its output must identify itself as synthetic research and separate consensus, disagreement, persona-specific concerns, risks, and testable revisions.

Brand Monitor reads its own app-scoped Records before fetching. research.validate-monitor-policy@1 normalizes the requested source and stops a run that falls inside the configured per-source interval. After the fetch, research.extract-findings@1 enforces exact excerpts, complete provenance, allowlisted categories, coverage, confidence, stable finding keys, and deterministic deduplication. research.evaluate-alert-policy@1 then applies the configured category, confidence, alert-impact, and urgent-impact thresholds. Every result retains a human-readable classification reason; prior evidence fingerprints are suppressed using the history rows. The saved output is a review queue—externalAlertSent remains false.

Generic content apps produce one explicit approved-facts ledger followed by complete Variant A and Variant B sections, a comparison, and approval notes. Before persistence, content.validate-grounded-draft@1 checks every factual, statistical, attributed, named-entity, proof, offer, pricing, performance, customer, or market claim against the approved brief/source and validates quotations exactly. The two variants remain beside each other in the editable Document, while the app record stores the grounding map and normal review fields. This keeps research claims distinct from generated copy and gives the reviewer one place to compare, edit, approve, reject, or escalate.

Content Repurposing Agent fetches one authorized source and creates separate LinkedIn, X, email, and short-form video drafts before assembling a review-ready content pack. Each variant preserves source and campaign lineage, and the final document states that no channel was published.

Lead Generator uses a natural-language search query and ideal-customer brief to collect search-result evidence and fetch representative public pages. It produces candidates with source URLs, supporting evidence, confidence, fit rationale, ambiguity, and recommended next research; it omits unverified contact details and never claims outreach occurred.

New Lead Qualifier applies an allowlisted structured decision (qualified, nurture, disqualified, or needs-review) to a supplied record and explicit criteria. A deterministic policy router selects the review destination, while the saved packet retains confidence, exact evidence, missing information, and bias or proxy-risk checks. It does not update a CRM or send an alert.

Support FAQ Generator first creates a privacy-safe evidence inventory from approved support content. A second step generates cited FAQ candidates with confidence and coverage state, while separating editorial questions and knowledge gaps. The result remains a private draft; it is not published or indexed automatically.

Support Inbox Content Creator removes customer identifiers and extracts recurring questions, terminology, objections, misunderstandings, and documentation gaps from supplied approved material. A separate drafting step converts those themes into prioritized, traceable content opportunities without exposing customer identity or claiming publication.

Feedback Survey Agent adds one more native resource without introducing custom UI: an installed survey Form. The form requires satisfaction, effort, resolution, written feedback, and explicit consent; follow-up contact details are optional. Submissions go to a dedicated app-scoped Responses table marked as containing personal data, and the app exposes that table through its own Responses surface. Submitting a response does not send a follow-up or create an external ticket.

Daily Slack Digest and Daily Support Email Report accept an approved export or supplied message set rather than reading external accounts. Each first creates a privacy-minimized evidence inventory, then synthesizes a reviewable digest or report with explicit coverage limits. The support report also records a model-derived sentiment signal and labels unavailable metrics instead of inventing counts. Neither workflow claims that its output was posted or emailed.

Customer Sentiment Tracker runs the reusable sentiment Action over supplied feedback and then creates a separate evidence-linked report. The report treats sentiment as an uncertain model signal, retains neutral, unknown, conflicting, and low-confidence material, and permits a trend claim only when a defined comparison period is present in the source.

SEO Audit Agent requires explicit domain authorization and audit scope. It fetches the authorized page and passes the exact capture, timestamp, source type, URL, and SHA-256 checksum to research.extract-findings@1. That Action rejects changed captures, cross-domain affected URLs, invented evidence excerpts, unknown categories, and incomplete category coverage. It merges stable duplicate finding keys without discarding provenance, then ranks validated findings by impact descending, effort ascending, confidence descending, and stable key. The app has no production-site write capability.

Content Repurposing Agent will not launch without confirmed reuse rights, audience, requested platforms, and CTA. It validates its LinkedIn, X, email, and YouTube drafts separately before revalidating the assembled pack. The X sections have a deterministic 280-character limit per standalone post.

LinkedIn Message Drafter likewise requires supplied profile facts, recipient and relationship context, objective, tone, and prohibited claims. Each primary and alternate message is limited to 1,200 characters and must contain a labeled low-pressure CTA. Both apps produce private Documents only; neither has a social publishing or messaging Action.

Email Negotiator treats the inbound thread as untrusted content, classifies it against an explicitly confirmed structured policy, and routes legal, high-value, ambiguous, novel, or out-of-authority terms for escalation. Before classification, sales.validate-negotiation-policy@1 requires every deal type to define key, name, floor, ceiling, non-empty concessions, prohibitedTerms, escalationRules, and authorityLimit. The assistant shows that normalized policy for approval before setting the confirmation flag. Its draft contract always requires approval and reports that no provider draft or message was created. The app record preserves the thread reference, normalized policy and checksum, participants, classification, route, and idempotent draft metadata.

Lead Outreacher, Influencer Outreach, Partnership Scout, and AI SDR use sales.validate-outreach-eligibility@1 before generating sequence material. The Action hashes stable lead/campaign/channel identifiers into one enrollment key, detects a previously supplied enrollment key, and routes the record to draft review, existing enrollment, manual review, manual-advance review, paused, stopped, or removed. Reply, opt-out, hard bounce, removal, pause, attempt limit, suppression, region, approval, and campaign kill-switch state are evaluated deterministically. The Records write is an upsert keyed by that enrollment, so retrying or resubmitting the same lead/campaign/channel cannot create a second enrollment. No provider action is authorized; any future adapter must repeat the current-state check immediately before acting.

Reusable evidence-grounding Action

content.validate-grounded-draft@1 validates source-dependent copy before it can be persisted or prepared for another action. It:

  • splits the draft into stable statement IDs and requires exactly one assessment for every statement;
  • requires exact source excerpts for personalization, facts, statistics, attributed claims, and paraphrases;
  • checks straight and curly quotations against the approved source byte-for-byte;
  • applies configured Unicode character limits to exact Markdown sections;
  • fails closed when an assessment is missing, unsupported, below the confidence threshold, or over its section limit;
  • returns the original draft, SHA-256 checksum, statement-level evidence assessments, quotation checks, section lengths, and any violations.

The source and draft are explicitly delimited as untrusted data during analysis. Content Repurposing Agent and LinkedIn Message Drafter use this gate in addition to structural output validation.

Reusable outbound phone policy Action

The two outbound phone apps call phone.validate-call-policy@1 before drafting a call plan. The Action fails closed unless all of the following are valid:

  • approved caller identity and strict E.164 destination;
  • consent, suppression check, opt-out state, and explicit row approval;
  • allowed region, IANA timezone, scheduled time, and local calling window;
  • attempt count and hard attempt limit;
  • opening disclosure, bounded goal, prohibited actions, and terminal stop conditions;
  • an enabled campaign kill switch state.

The Action has no dial side effect. It returns externalCallPlaced: false, a masked destination and hash, remaining attempts, local scheduled time, and a policy hash for later audit. The installed apps then create a private call-plan Document; consultation booking and Slack notification remain proposed actions until organization-scoped phone, calendar, and Slack adapters exist.

Reusable content output validation

Specialized workflows can insert content.validate-output@1 between generation and persistence or draft preparation. The Action supports exact required Markdown headings, required and forbidden terms, Unicode character bounds, case sensitivity, and fail-closed behavior. A valid result passes through the original content with a checksum and character count; an invalid result records every structural violation and stops the workflow by default.

SEO Audit, Content Repurposing, LinkedIn Message Drafter, Email Negotiator, and the outbound phone planners use this gate. For example, Email Negotiator cannot create even its provider-neutral approval draft unless the generated artifact contains separate draft, policy-basis, and escalation sections and omits forbidden delivery or binding claims.

All transcript-mode apps use the same gate after transcription. The transcription Action reports recordingStatus, transcriptionStatus, capture time, source type, evidence excerpt, confidence, and a transcript checksum; the app persists those values in its record. A saved artifact must contain separate source/consent, transcript-evidence, attribution-uncertainty, draft-output, and review/deletion sections. Required terms make speaker uncertainty, retention, deletion, and human review visible, while forbidden terms prevent the artifact from presenting guessed speaker identity, a CRM update, or publication as completed.

The underlying written-content Action keeps task instructions separate from templates, voice profiles, and source context. Those three inputs are delimited as untrusted data and cannot redefine the workflow policy, output format, tools, or system constraints. The Action also enforces maxChars after generation and fails rather than persisting an oversized result.

Deterministic privacy redaction

privacy.redact-sensitive-content@1 sanitizes supplied exports and records before privacy-sensitive analytics workflows use them. It removes common credentials and authentication tokens, email addresses, phone numbers, IP addresses, valid payment-card numbers, IBANs, sensitive URL query strings, and any additional literal terms supplied in context.additionalSensitiveTerms. The Action never returns the original text.

Daily Slack Digest, Daily Support Email Report, Customer Sentiment Tracker, Support FAQ Generator, Support Inbox Content Creator, and the outreach sequence planners use the redacted content. Their app records persist only a bounded safe excerpt, source and redacted checksums, redaction counts, and truncation state. Add customer names, private project names, account identifiers, or other organization-specific literals to additionalSensitiveTerms when they are not already covered by a built-in pattern.

Using an installed app

  1. Open Overview to confirm the app's current maturity, supported mode, and operating scope.
  2. Open Work and describe the requested result.
  3. Use @ to select an enabled row from Policies and Context when the workflow needs an operating policy, brand rule, or other reusable context.
  4. Supply the URL, media URL, search query, or source material requested by the assistant.
  5. The assistant launches only the workflow bound to that app installation.
  6. Review and edit the generated private Document in Outputs. In Records, set review_action to approved, rejected, or escalated and add review_notes; dedicated review views keep those decisions app-scoped.
  7. Use Activity for this installation's saved run history. Use Schedule only after reviewing the output. External publication or communication remains a separate approved action.

Safety defaults

All 59 apps start with external writes disabled and review required. Every pipeline starts with input validation. Workflow records include an app-scoped deduplication key, source URL where applicable, privacy-minimized evidence metadata, generated Document ID, workflow-run ID, and a review_required flag.

Retries are idempotent for the resources these workflows currently write. documents.create-document@1 receives an organization-scoped installation/app/run key and reuses the first matching Document. The Records step uses Data Workspace upsert with the installation/app/run record_key. Because external provider writes are disabled, a retry cannot duplicate an email, post, ticket, or call.

Each installed Settings table includes a Retention and deletion row. Data Workspace rows, settings, conversations, workflow runs, and Apps Layer resource mappings are organization-scoped. Generated Documents are linked through the organization-scoped installation and use the Documents package's private/workspace permission controls; the current Documents repository migration does not yet carry a storage-level organization_id, so deployments requiring that invariant should add the approved shared Documents migration before catalog launch. Current Apps Layer removal is non-destructive; archive or delete retained resources explicitly before removing catalog access. These draft-only workflows do not create provider-side copies.

Outreach and messaging planners require a recorded consent or lawful engagement basis, channel-specific opt-out instructions, and an explicit confirmation that current suppression and withdrawal state will be honored. Sequence-oriented apps expose paused and stopped views, stable enrollment state, and manual pause, removal, and advance-for-review controls through workflow context and their Records table. The outbound-phone planners additionally validate the live consent, suppression, opt-out, region, local calling window, attempt limit, disclosure, bounded goal, and campaign kill switch supplied for that plan. Contact-research apps require lawful-use confirmation. Transcript apps require recording or reuse consent before transcription.

Recurring apps use the native Schedule surface, where the schedule can be disabled. Phone plans fail while campaignEnabled is false. Other portfolio workflows are one manual run, not background loops. Provider adapters are absent, so Work itself is a safe test path: it creates only private native drafts and app records. Use non-sensitive fixtures and reserved example recipients or domains when testing.

Permissions

Every app requests only ai-chat.use, data-workspace.read, data-workspace.write, documents.write, and workflows.execute. Scheduled apps additionally request content-scheduler.read and content-scheduler.write. Current foundation and preview apps do not request Gmail, Slack, CRM, social-publishing, calendar, phone-dial, or messaging-provider permissions because those provider writes are not enabled.

Troubleshooting

  • Workflow input validation failed — open Work and supply the named missing value or confirmation. Direct workflow launches use the same fail-closed checks as chat.
  • URL rejected — use a public http or https URL without embedded credentials. Transcript media specifically requires https. Localhost, private/reserved IP addresses, and internal hostname suffixes are blocked.
  • Outreach sequence paused, stopped, or reused — inspect the eligibility packet in Records. Clear only the underlying condition that policy permits; a reply, opt-out, hard bounce, removal, attempt limit, suppression match, or existing enrollment must not be bypassed by rewriting generated copy.
  • Monitor interval has not elapsed — use the nextAllowedAt timestamp in the error or increase the source interval deliberately in Work. Do not retry-loop the same source; Brand Monitor reads prior app records and enforces the configured interval.
  • SERP credentials are required — configure the host's supported DataForSEO or SerpAPI provider. The app cannot bypass a missing host-level search provider.
  • Provider readiness failed — follow the named host-level configuration in the error (ACTIONS_DEEPGRAM_API_KEY, or the configured SERP provider credentials) and retry. The readiness packet never includes the secret value.
  • Grounded draft validation failed — inspect the statement or section named in the error. Remove unsupported personalization or claims, provide approved source evidence, correct a quotation, or shorten the named section.
  • No knowledge answer — confirm that the authenticated user can access indexed Knowledge Manager items matching the selected filters, then retry after ingestion reports ready.
  • No external draft, message, call, booking, or CRM update appears — this is expected for foundation, preview, and deferred provider capabilities. Review the private Document and record; do not treat it as delivered.
  • A retry shows the existing output — this is expected idempotent behavior for the same workflow run. Start a new Work conversation or run when a distinct output is intended.

The catalog artifacts are checksum-certified against executable contracts that verify the Space layout, resource references, permissions, workflow pipeline, records schema, and ordered native surfaces.

Building another focused app

Use the same composition when a new app is primarily a different job, policy, and workflow rather than a new runtime:

export default defineApp({
key: 'focused-assistant',
name: 'Focused Assistant',
version: '1.0.0',
permissions: [
'ai-chat.use',
'data-workspace.read',
'data-workspace.write',
'documents.write',
'workflows.execute',
],
ui: {
defaultSurface: 'work',
surfaces: [
// Scoped chat, Data Workspace records, Documents, and settings.
],
},
resources: {
// App-specific schemas and workflows composed from reusable Actions.
},
});

Add backend code only when the missing capability is genuinely reusable, such as a provider-neutral inbox, CRM, messaging, knowledge, or phone Action. Keep provider writes approval-first and idempotent.