文件预览

SKILL.md

查看 Founder Signal 技能包中的文件内容。

文件内容

SKILL.md

---
name: founder-signal
version: "0.2.13"
description: >
  Founder Signal turns verified Reddit and V2EX evidence into a small, reviewable signal package
  for founders evaluating product demand and positioning across one or more configured
  product profiles.
  Use this skill when the user wants founder research from Reddit or V2EX evidence, a scored
  review artifact, or a Draft page generated from verified candidate discussions.
  This skill depends on the canonical draft-cli skill. Draft is the default founder
  review surface, so Founder Signal emits a Draft-ready public publish intent for the
  run review artifact on every successful run. Successful runs should be published through the downstream
  draft-cli skill with `draft page create -> draft page append -> draft page publish`
  so the run returns a human-reviewable Draft public page URL without asking for
  another approval; later public web publication outside that Draft page requires
  explicit confirmation.
metadata:
  clawdis:
    author: innosage-llc
    emoji: "📡"
    dependencies:
      - name: "toliuweijing/draft-cli"
        type: "other"
        url: "https://clawhub.ai/toliuweijing/draft-cli"
    requires:
      bins:
        - "bash"
        - "python3"
        - "draft"
    install:
      - id: "npm"
        kind: "node"
        package: "@innosage/draft-cli"
        bins:
          - "draft"
        label: "Install draft-cli (npm)"
---

# Founder Signal OpenClaw Skill

Use this skill to turn verified Reddit and V2EX evidence into a small, reviewable signal package
for founders evaluating product demand and positioning across one or more configured
product profiles.

## Founder Signal Invariant

No saved verified snapshot means no scoring. Draft can still publish a public-safe run review page.

Every run must persist a run folder before later steps execute so failures still leave
traceable artifacts. The skill should only score verified evidence. It should always
prepare a public-safe run review page for founder review and should embed
`daily-review.md` only when an Action Card exists for the selected profile.
Successful test and scheduled runs should publish the generated content into a
human-reviewable Draft public page automatically. Public web publication outside that
Draft page requires explicit founder confirmation.

## Setup Contract

After installation, treat the signal profile as the primary user-facing object. The
founder should be able to create a profile, run it, and open the latest review page
without learning about runtime profiles, config imports, or Draft publish intents. Do
not ask the founder to hand-edit package-local `profiles/*.json` unless they explicitly
want to debug the skill source. The installed ClawHub skill directory is source code;
mutable runtime data belongs under `${FOUNDER_SIGNAL_HOME:-~/.founder-signal}` unless
`--root-dir` is passed explicitly.

Recommended flow:

1. Share or fill `founder-signal.config.example.json`.
2. Initialize the runtime home:

```bash
python3 -m founder_signal init
```

This seeds a working canonical config at `${FOUNDER_SIGNAL_HOME:-~/.founder-signal}/founder-signal.config.json`.

3. Save that config as a profile:

```bash
python3 -m founder_signal profile create --config ~/.founder-signal/founder-signal.config.json
```

4. Run it:

```bash
python3 -m founder_signal run draft
```

5. Re-open the latest review page:

```bash
python3 -m founder_signal latest-review draft
```

Advanced/debug commands still exist:

```bash
python3 -m founder_signal doctor --config ~/.founder-signal/founder-signal.config.json
python3 -m founder_signal config import ~/.founder-signal/founder-signal.config.json
```

Canonical config requirements:

- `profile_id`
- `product_name`
- `product_one_liner`
- `target_audience`
- `keywords`
- `scoring_terms`
- `platforms`
- `discovery_mode`
- `max_candidates`
- `draft.require_confirmation_before_public_publish: true`

Reject legacy user-facing fields such as `subreddits`, `seed_reddit_urls`,
`excluded_reddit_urls`, or any `draft_publish_command` escape hatch in canonical setup
JSON. Founder Signal writes an internal runtime profile under `<runtime-home>/profiles/`
plus a normalized canonical copy under `<runtime-home>/config-imports/`, but normal
run UX should not depend on the founder understanding that split. If the canonical copy
is missing later, normal runs should rebuild it from the runnable profile automatically.

## Inputs

- one canonical Founder Signal config JSON during setup
- one or more active imported product profiles from `<runtime-home>/profiles/*.json`
- optional `--profile <profile_id>` selection for single-profile runs
- platform configuration from the canonical `platforms` object or existing internal legacy profiles
- deterministic Reddit/Eddrit research discovery from profile communities,
  `keywords`, and scoring terms; discovery always runs before configured Reddit hints
- optional Reddit `discovery_mode: live` using subreddit new feeds with age/comment
  filtering and product-term matching
- V2EX discovery through SOV2EX, search, node latest pages, or configured seed topics; third-party discovery is candidate-finding only
- optional platform `excluded_urls` or legacy `excluded_reddit_urls` to suppress known old candidates
- `history_ttl_days` to expire old private repeat-candidate exclusions
- optional `verified_evidence_snapshots` when a Claw/browser agent has verified a source post but automated fetch is blocked

## Draft Publish Handoff

Founder Signal depends on the canonical `draft-cli` skill for Draft public-page
publication. Draft handoff preparation is on by default: when Founder Signal creates
`public-run-review.md`, it also writes `draft-publish-intent.json` next to
`public-run-review.md` and does not hardcode Draft CLI subcommands. The intent contains the
artifact path, title, profile, Draft visibility request, and
`requires_confirmation: false` and `draft_public_publish_requires_confirmation: false`
for the `draft page create -> draft page append -> draft page publish` sequence. It
also contains `external_public_publish_requires_confirmation: true` for any later
public web publication outside the Draft page.

When a test run or scheduled run succeeds and writes this intent, the agent must
immediately use the `draft` CLI supplied by the required `draft-cli` skill installed in
the agent workspace to run `draft page create`, `draft page append`, and
`draft page publish` for `public-run-review.md`, then report the resulting
human-reviewable Draft public page URL in the completion message. Do not ask the founder for another approval
before this Draft page step. Ask for explicit confirmation only before running a
separate public web publish action outside that Draft page.

The `draft-cli` skill is the source of truth for daemon readiness, page creation,
append/patch behavior, public publishing, invite codes, and Draft URL extraction.

## E2E Verification Playbook

When the founder asks for an end-to-end verification run, the agent must deliver a
Draft public page URL or clearly report E2E incomplete.

1. Enable the target profiles.
2. Use the built-in discovery phase. Do not start from placeholder URLs.
3. Try the normal Eddrit search/listing and post mirror paths first.
4. If the mirror is blocked, use browser/manual verification and add
   `verified_evidence_snapshots` to the profile:

```json
{
  "platform": "reddit",
  "source_url": "https://www.reddit.com/r/ChatGPT/comments/abc123/real_slug/",
  "verification_method": "agent_browser",
  "verified_by": "openclaw-agent",
  "text_snapshot": "Copy the relevant source post text observed by the agent here."
}
```

The snapshot must be real source text from the source post, not invented content.
Placeholder URLs such as `POST_ID`, `REAL_ID`, `SUB`, `/slug/`, or V2EX placeholder topic IDs are invalid and must
not be used. Founder Signal treats `verified_read_via_agent_browser` and
`verified_read_via_manual_snapshot` as verified reads only after the snapshot is
persisted.

Run E2E checks with:

```bash
python3 -m founder_signal run --config ~/.founder-signal/founder-signal.config.json --require-action-card --require-publish-intent
```

When the run creates `draft-publish-intent.json`, inspect its `requires_confirmation`
field. If it is `false`, immediately invoke the `draft` CLI from the installed
`draft-cli` skill in the agent workspace to run `draft page create`, `draft page
append`, and `draft page publish` for `public-run-review.md`, then return the resulting
human-reviewable Draft public page URL to the founder in the completion message. Reporting only that
`draft-publish-intent.json` exists is incomplete. If a later action would make the
page publicly reachable outside that Draft page, inspect
`external_public_publish_requires_confirmation` and ask for explicit approval before that
separate public web publish action.

## Outputs

- `runs/<RUN_ID>/run.json`
- `runs/<RUN_ID>/REPORT.md`
- `runs/<RUN_ID>/profiles/<profile_id>/run.json`
- `runs/<RUN_ID>/profiles/<profile_id>/REPORT.md`
- `runs/<RUN_ID>/profiles/<profile_id>/evidence/`
- `runs/<RUN_ID>/profiles/<profile_id>/outputs/candidates.json`
- `runs/<RUN_ID>/profiles/<profile_id>/selected-candidate.json` when a verified
  candidate is selected
- `runs/<RUN_ID>/profiles/<profile_id>/daily-review.md` when an Action Card is generated
- `runs/<RUN_ID>/profiles/<profile_id>/public-run-review.md` for every successful profile run
- `runs/<RUN_ID>/profiles/<profile_id>/draft-publish-intent.json` when Draft
  public-page publishing is prepared for automatic downstream `draft-cli` handling
- `state/past-candidates.json` as private local candidate history used to avoid repeat
  candidates in future runs

These output paths are relative to the runtime home, not the installed skill package.
The runtime home defaults to `${FOUNDER_SIGNAL_HOME:-~/.founder-signal}`.

Action Cards use `Source platform` and `Source URL` labels and must not expose private local evidence paths in Draft-bound Markdown.
High-quality structured evidence should improve Action Card quality, not decide whether
the card exists. If a selected candidate is verified, eligible, not agent-rejected, and
has a readable saved text snapshot, generate `daily-review.md` even when structured
evidence is missing or low quality. In that fallback mode, render from the raw snapshot
and record `action_card_generation_mode: snapshot_fallback`; structured cards record
`action_card_generation_mode: structured`.
## Manual Execution

```bash
python3 -m founder_signal doctor --config ~/.founder-signal/founder-signal.config.json
python3 -m founder_signal config import ~/.founder-signal/founder-signal.config.json
python3 -m founder_signal run --config ~/.founder-signal/founder-signal.config.json
bash scripts/run_founder_signal_once.sh
bash scripts/run_founder_signal_once.sh --profile draft
bash scripts/run_founder_signal_once.sh --config ~/.founder-signal/founder-signal.config.json --require-action-card --require-publish-intent
```

Without `--profile`, the runner processes all enabled profiles.

## Bundled Runtime Payload

This published skill package includes the minimum local runtime payload needed to run
from the installed skill directory:

- `scripts/run_founder_signal_once.sh`
- `src/founder_signal/`
- `founder-signal.config.example.json`
- `profiles/README.md`
- `profiles/draft.example.json`

Before a real run, create one canonical config JSON, validate it, and import it. No
Draft publish settings file is required; Draft public-page publication is part of the
default flow and successful runs should be published to Draft automatically until a
human-reviewable Draft public page URL exists. Public web publication outside that
Draft page remains confirmation-gated. Keep the working canonical config under the
runtime home rather than the installed skill directory.

## Runtime Order

1. Load either all enabled profiles or one selected profile.
2. For each profile, run enabled platform adapters, skipping profile exclusions and previous local candidate history before capping, then consider configured hints and verified snapshot fallbacks.
3. Save evidence from mirror or verified snapshot fallback, enforce the verified-read
   gate, score only verified candidates, and optionally generate an Action Card.
4. Write `public-run-review.md` for founder review on every successful profile run,
   embedding `daily-review.md` when an Action Card exists.
5. Write a Draft public-page publish intent whenever `public-run-review.md` exists, marked
   for automatic `draft page create -> draft page append -> draft page publish` and
   explicit confirmation before any later public web publish outside that Draft page.

Eddrit search/listing and post mirror pages are the Reddit read layer. V2EX discovery providers are never the verified evidence source; verified V2EX reads use the original `https://www.v2ex.com/t/<topic_id>` topic URL or future official API reads. Browser/manual fallback remains a verified snapshot path when automated reads are blocked.