Update README with Fast team and payment info#27
Merged
Conversation
Added information about the Fast team and payment infrastructure for AI agents. Requested by Jessy.
Contributor
There was a problem hiding this comment.
Pull request overview
Adds a brief attribution and linkout in the README to the Fast team and their agent payment/wallet SDK, aligning the project with its sponsoring org and related infrastructure.
Changes:
- Added a “Built by the team at Fast” line with links to fast.xyz and fast-sdk.
- Inserted a blank line to separate the new attribution from the Requirements section.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
damienen
approved these changes
Apr 17, 2026
damienen
added a commit
that referenced
this pull request
Apr 17, 2026
* chore: ignore .worktrees/ directory * feat: stable task IDs + optimizer loop diagram (#24) * chore: ignore .worktrees/ directory * feat: stable task IDs + optimizer loop diagram in README - fix(tasks): derive task IDs from sha1(action names) instead of LLM-supplied id field, which changed on every regeneration and broke --task filters. Action names come from the discovered surface and are stable across runs when the surface hasn't changed. Duplicate action-name sets get a -1/-2 numeric suffix. - docs: add horizontal optimizer-loop SVG diagram to README top, showing the full init → baseline → iterate (analyze/mutate/ re-benchmark/accept-reject) → output flow at a glance. Closes #17 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: add PNG version of optimizer loop diagram Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: use SVG in README (PNG kept as companion file) SVG renders natively on GitHub and scales without pixelation. PNG is included alongside as a companion for external use cases (email, Office docs, tools that don't render SVG). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: address Copilot review on PR #24 - Delete SAFE_TASK_ID / isSafeTaskId from src/tasks/generate.ts — dead after the stable-ID refactor (still used in src/benchmark/config.ts for external task-file validation, so that copy stays). - Extend stable task IDs to the prompt surface: fall back to a SHA-1 hash of the prompt text when expected_actions is empty, so prompt-surface --task filters survive regeneration. - Rewrite four README links (optimizer-loop.svg, docs/reference/*.md, CONTRIBUTING.md) to absolute github.com URLs — docs/ and CONTRIBUTING.md are not in the npm tarball's files field, so relative paths 404 when users view the README on npmjs.com. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: final 1.1.0 polish — CHANGELOG, error message, README consistency - CHANGELOG.md: fill in all additions and fixes that landed on development after the initial 1.1.0 bump (stable task IDs, Codex auth, SKILL folder, diagram, model-ID slug overhaul, error message). - src/errors.ts + docs/reference/errors.md: fix E_MODEL_ID_FORMAT — was "missing the openrouter/ prefix"; now lists all three valid provider prefixes (openrouter/, anthropic/, openai/). - README.md: use catalog-correct openrouter/google/gemini-2.5-flash (dot, not hyphen) in answers.json example; change "skill-optimizer benchmark" to "skill-optimizer run" for consistency with other examples. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(tasks): stable dedup suffix order + accurate CHANGELOG wording Sort validated tasks by (id, prompt) before the dedup counter loop so that numeric suffixes assigned to same-action-hash tasks are determined by content order, not LLM output order. Previously, if the model regenerated two create_wallet tasks in swapped order, the -1/-2 suffixes would swap between runs, making --task filters unstable for multi-variant cases. Also soften the CHANGELOG entry for "stable task IDs": clarifies that SDK/CLI/MCP IDs are stable across regenerations (action names come from discovered code), while prompt-surface IDs are only stable when the LLM produces identical wording. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: OpenClaw Agent (basd) <basd@openclaw.ai> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * Update README with Fast team and payment info (#27) * Update README with Fast team and payment info Added information about the Fast team and payment infrastructure for AI agents. Requested by Jessy. * Update README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: dmn <damian.ovidiu27@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: prompt-surface correctness (P1/P2/P3/B/C5) (#28) * fix: exempt openai/ model IDs from dot→hyphen rewrite OpenAI's direct-API model IDs use dots in version numbers (gpt-5.4, gpt-4.1). fix.ts already exempted openrouter/ but not openai/, so a manufactured model-id-bad-format issue would corrupt an openai/ ID. Defense-in-depth: validate.ts already skips emitting the issue for openai/, but fix.ts must independently respect the documented invariant in CLAUDE.md. Also wires smoke-model-ids.ts into npm test — it existed on disk but was not in the test script. * chore: remove unused src/discovery/prompt.ts and its tests The active prompt discovery lives in src/project/discover-prompt.ts, imported by snapshot.ts and benchmark/runner.ts. src/discovery/prompt.ts was a dead parallel implementation — only referenced by its own test file. Removing both the dead module and its test file to keep the codebase lean. The live discover-prompt.ts API (discoverPromptCapabilities) is covered by other smoke tests in this PR. * fix: prompt surface not blocked by coverage violation Prompt-surface tasks don't guarantee 1:1 capability coverage the way SDK/CLI/MCP tasks do, so coverageViolation=true was hard-FAILing every prompt benchmark regardless of actual scores. computeVerdict now only appends the coverage-violation reason when config.surface !== 'prompt'. Coverage is still computed and appears in the report. Regression guard in new smoke-verdict-prompt.ts locks in both halves of the behavior: prompt PASSes with coverageViolation=true + scores above floor; mcp still FAILs under identical conditions. * refactor: extract resolveCriteriaForTask from runner Pure refactor. Moves the caps→criteria lookup out of runner.ts into src/benchmark/prompt-criteria.ts so it can be unit-tested without running the full LLM pipeline. Behavior is unchanged in this commit — tasks missing capabilityId are logged as eval errors (FAIL with message) rather than silently vacuously passing; capabilityId tagging by the generator lands in a later commit. Adds optional capabilityId to GeneratedTask (SDK/CLI/MCP generators don't set it). Runtime enforcement (throw on missing/unknown) lives in resolveCriteriaForTask — no silent fallback, per the no-legacy-compat policy. New smoke-prompt-criteria.ts locks in: match, distinct-per-capability, throws-on-unknown, throws-on-missing, and noActiveCriteria flagging. * fix: evaluator flags noActiveCriteria instead of vacuous 1.0 pass Previously, when every criteria category was empty the evaluator returned score: 1.0 — any response (including an empty string) scored a perfect pass. Now the evaluator returns score: 0 and noActiveCriteria: true. The runner treats that flag as an evaluation error with an actionable message pointing at the SKILL.md section for the offending capability. Evaluator stays dumb (no pass/fail policy). Runner is the policy layer. * feat: per-capability prompt scoring via capabilityId The runner's caps[0] global was collapsing every prompt-surface task into evaluation against the first discovered capability regardless of what the task actually exercised. With this commit, each generated prompt-surface task is tagged at generation time with the action key of the capability it exercises, and the runner looks up criteria per-task via resolveCriteriaForTask (wired in previous commits). No legacy compat. Prompt-surface tasks lacking capabilityId fail to load; users regenerate with `skill-optimizer generate-tasks`. Regression guards: - smoke-generation.ts: valid tagging plus rejection of unknown ids - smoke-verdict-prompt.ts: three caps produce distinct criteria (caps[0]-collapse detector), P3 regression guard via evaluator, and mock-LLM verdict matrix (threshold + weight math) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: v1.1.0 correctness fixes CHANGELOG gets a Fixed block covering P1/P2/P3/Bug B/C5 for v1.1.0. README prompt templates section reflects per-capability scoring. SKILL.md audit for any guidance contradicting the fixed behavior. * test: release-readiness coverage check smoke-changelog-coverage.ts parses the top block of CHANGELOG.md and asserts every item in Added/Fixed has at least one test file referencing relevant keywords. Guards against 'shipped feature, forgot the test' — the class that let P1/P2/P3 slip past v1.1.0 before this PR. smoke-release.ts also gains an assertion that the CHANGELOG contains a section header matching the current package.json version. * fix: plumb capabilityId through TaskDefinition and tighten changelog coverage check - Add capabilityId?: string to TaskDefinition and update normalizeTaskDefinition to read and pass it through — without this, resolveCriteriaForTask threw on every prompt-surface task because loadTasks silently dropped the field - smoke-changelog-coverage: require ≥2 tokens to co-occur in a single test file (whole-word match) instead of any one token anywhere in the corpus — prevents false-passes on generic words like "prompt" or "coverage" - generate.ts comment: clarify that parseGeneratedTasks attaches capabilityId; membership validation is in ground.ts, not here Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: output capability criteria and prompt coverage computation - discover-prompt.ts: _output capabilities now store section: section.body (full markdown with fences) instead of section: snippet (extracted content without fences). generateCriteriaFromCapability requires fences to extract format patterns, so passing bare snippet produced empty criteria and forced noActiveCriteria/FAIL for every output-format task. - coverage.ts: actionNamesOf falls back to capabilityId when expected_actions is empty — prompt tasks always have expected_actions:[] so coverage showed 0/N covered. capabilityId matches action.name for prompt capabilities (key===name in capabilityToAction), so this correctly attributes coverage. - Tests: regression guards added in smoke-prompt-criteria and smoke-coverage. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: OpenClaw Agent (basd) <basd@openclaw.ai> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: OpenClaw Agent (basd) <basd@openclaw.ai> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Xiaohong Chen <xiaohong.chen@pi2.network> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
damienen
added a commit
that referenced
this pull request
Apr 17, 2026
* chore: ignore .worktrees/ directory * feat: stable task IDs + optimizer loop diagram (#24) * chore: ignore .worktrees/ directory * feat: stable task IDs + optimizer loop diagram in README - fix(tasks): derive task IDs from sha1(action names) instead of LLM-supplied id field, which changed on every regeneration and broke --task filters. Action names come from the discovered surface and are stable across runs when the surface hasn't changed. Duplicate action-name sets get a -1/-2 numeric suffix. - docs: add horizontal optimizer-loop SVG diagram to README top, showing the full init → baseline → iterate (analyze/mutate/ re-benchmark/accept-reject) → output flow at a glance. Closes #17 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: add PNG version of optimizer loop diagram Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: use SVG in README (PNG kept as companion file) SVG renders natively on GitHub and scales without pixelation. PNG is included alongside as a companion for external use cases (email, Office docs, tools that don't render SVG). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: address Copilot review on PR #24 - Delete SAFE_TASK_ID / isSafeTaskId from src/tasks/generate.ts — dead after the stable-ID refactor (still used in src/benchmark/config.ts for external task-file validation, so that copy stays). - Extend stable task IDs to the prompt surface: fall back to a SHA-1 hash of the prompt text when expected_actions is empty, so prompt-surface --task filters survive regeneration. - Rewrite four README links (optimizer-loop.svg, docs/reference/*.md, CONTRIBUTING.md) to absolute github.com URLs — docs/ and CONTRIBUTING.md are not in the npm tarball's files field, so relative paths 404 when users view the README on npmjs.com. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: final 1.1.0 polish — CHANGELOG, error message, README consistency - CHANGELOG.md: fill in all additions and fixes that landed on development after the initial 1.1.0 bump (stable task IDs, Codex auth, SKILL folder, diagram, model-ID slug overhaul, error message). - src/errors.ts + docs/reference/errors.md: fix E_MODEL_ID_FORMAT — was "missing the openrouter/ prefix"; now lists all three valid provider prefixes (openrouter/, anthropic/, openai/). - README.md: use catalog-correct openrouter/google/gemini-2.5-flash (dot, not hyphen) in answers.json example; change "skill-optimizer benchmark" to "skill-optimizer run" for consistency with other examples. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(tasks): stable dedup suffix order + accurate CHANGELOG wording Sort validated tasks by (id, prompt) before the dedup counter loop so that numeric suffixes assigned to same-action-hash tasks are determined by content order, not LLM output order. Previously, if the model regenerated two create_wallet tasks in swapped order, the -1/-2 suffixes would swap between runs, making --task filters unstable for multi-variant cases. Also soften the CHANGELOG entry for "stable task IDs": clarifies that SDK/CLI/MCP IDs are stable across regenerations (action names come from discovered code), while prompt-surface IDs are only stable when the LLM produces identical wording. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: OpenClaw Agent (basd) <basd@openclaw.ai> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * Update README with Fast team and payment info (#27) * Update README with Fast team and payment info Added information about the Fast team and payment infrastructure for AI agents. Requested by Jessy. * Update README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: dmn <damian.ovidiu27@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: prompt-surface correctness (P1/P2/P3/B/C5) (#28) * fix: exempt openai/ model IDs from dot→hyphen rewrite OpenAI's direct-API model IDs use dots in version numbers (gpt-5.4, gpt-4.1). fix.ts already exempted openrouter/ but not openai/, so a manufactured model-id-bad-format issue would corrupt an openai/ ID. Defense-in-depth: validate.ts already skips emitting the issue for openai/, but fix.ts must independently respect the documented invariant in CLAUDE.md. Also wires smoke-model-ids.ts into npm test — it existed on disk but was not in the test script. * chore: remove unused src/discovery/prompt.ts and its tests The active prompt discovery lives in src/project/discover-prompt.ts, imported by snapshot.ts and benchmark/runner.ts. src/discovery/prompt.ts was a dead parallel implementation — only referenced by its own test file. Removing both the dead module and its test file to keep the codebase lean. The live discover-prompt.ts API (discoverPromptCapabilities) is covered by other smoke tests in this PR. * fix: prompt surface not blocked by coverage violation Prompt-surface tasks don't guarantee 1:1 capability coverage the way SDK/CLI/MCP tasks do, so coverageViolation=true was hard-FAILing every prompt benchmark regardless of actual scores. computeVerdict now only appends the coverage-violation reason when config.surface !== 'prompt'. Coverage is still computed and appears in the report. Regression guard in new smoke-verdict-prompt.ts locks in both halves of the behavior: prompt PASSes with coverageViolation=true + scores above floor; mcp still FAILs under identical conditions. * refactor: extract resolveCriteriaForTask from runner Pure refactor. Moves the caps→criteria lookup out of runner.ts into src/benchmark/prompt-criteria.ts so it can be unit-tested without running the full LLM pipeline. Behavior is unchanged in this commit — tasks missing capabilityId are logged as eval errors (FAIL with message) rather than silently vacuously passing; capabilityId tagging by the generator lands in a later commit. Adds optional capabilityId to GeneratedTask (SDK/CLI/MCP generators don't set it). Runtime enforcement (throw on missing/unknown) lives in resolveCriteriaForTask — no silent fallback, per the no-legacy-compat policy. New smoke-prompt-criteria.ts locks in: match, distinct-per-capability, throws-on-unknown, throws-on-missing, and noActiveCriteria flagging. * fix: evaluator flags noActiveCriteria instead of vacuous 1.0 pass Previously, when every criteria category was empty the evaluator returned score: 1.0 — any response (including an empty string) scored a perfect pass. Now the evaluator returns score: 0 and noActiveCriteria: true. The runner treats that flag as an evaluation error with an actionable message pointing at the SKILL.md section for the offending capability. Evaluator stays dumb (no pass/fail policy). Runner is the policy layer. * feat: per-capability prompt scoring via capabilityId The runner's caps[0] global was collapsing every prompt-surface task into evaluation against the first discovered capability regardless of what the task actually exercised. With this commit, each generated prompt-surface task is tagged at generation time with the action key of the capability it exercises, and the runner looks up criteria per-task via resolveCriteriaForTask (wired in previous commits). No legacy compat. Prompt-surface tasks lacking capabilityId fail to load; users regenerate with `skill-optimizer generate-tasks`. Regression guards: - smoke-generation.ts: valid tagging plus rejection of unknown ids - smoke-verdict-prompt.ts: three caps produce distinct criteria (caps[0]-collapse detector), P3 regression guard via evaluator, and mock-LLM verdict matrix (threshold + weight math) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: v1.1.0 correctness fixes CHANGELOG gets a Fixed block covering P1/P2/P3/Bug B/C5 for v1.1.0. README prompt templates section reflects per-capability scoring. SKILL.md audit for any guidance contradicting the fixed behavior. * test: release-readiness coverage check smoke-changelog-coverage.ts parses the top block of CHANGELOG.md and asserts every item in Added/Fixed has at least one test file referencing relevant keywords. Guards against 'shipped feature, forgot the test' — the class that let P1/P2/P3 slip past v1.1.0 before this PR. smoke-release.ts also gains an assertion that the CHANGELOG contains a section header matching the current package.json version. * fix: plumb capabilityId through TaskDefinition and tighten changelog coverage check - Add capabilityId?: string to TaskDefinition and update normalizeTaskDefinition to read and pass it through — without this, resolveCriteriaForTask threw on every prompt-surface task because loadTasks silently dropped the field - smoke-changelog-coverage: require ≥2 tokens to co-occur in a single test file (whole-word match) instead of any one token anywhere in the corpus — prevents false-passes on generic words like "prompt" or "coverage" - generate.ts comment: clarify that parseGeneratedTasks attaches capabilityId; membership validation is in ground.ts, not here Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: output capability criteria and prompt coverage computation - discover-prompt.ts: _output capabilities now store section: section.body (full markdown with fences) instead of section: snippet (extracted content without fences). generateCriteriaFromCapability requires fences to extract format patterns, so passing bare snippet produced empty criteria and forced noActiveCriteria/FAIL for every output-format task. - coverage.ts: actionNamesOf falls back to capabilityId when expected_actions is empty — prompt tasks always have expected_actions:[] so coverage showed 0/N covered. capabilityId matches action.name for prompt capabilities (key===name in capabilityToAction), so this correctly attributes coverage. - Tests: regression guards added in smoke-prompt-criteria and smoke-coverage. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: OpenClaw Agent (basd) <basd@openclaw.ai> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: address PR #26 review findings (prompt surface, docs, precision, error quality) (#30) * docs: add implementation plan for PR #26 review fixes (13 issues) * fix(preflight): exempt prompt surface from maxTasks check; surface-aware discovery hints Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(init): add prompt surface next-steps guidance * fix(wizard): accept anthropic/ and openai/ model IDs in custom model validator * fix(generate): allow missing expected_actions on prompt surface in validateTask When `knownCapabilityKeys` is defined (prompt surface), LLMs may omit `expected_actions` entirely even though the prompt requests an empty array. Fall back to `[]` instead of throwing, so task generation is not blocked. * fix(docs): correct config path to .skill-optimizer/ and update stale model ID Replace all occurrences of `skill-optimizer/skill-optimizer.json` (without dot) with `.skill-optimizer/skill-optimizer.json` (with dot) to match the actual path written by `src/init/scaffold.ts`. Also update stale `openrouter/openai/gpt-4o` model ID in `SKILL/references/setup.md` to `openrouter/openai/gpt-4o-mini`. * fix(snapshot): include snapshotPath in unsupported-format error message * fix(runner): set toolPrecision=1.0 for prompt surface tasks * fix(docs): correct apiKeyEnv description and loop.ts agent cwd comment Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(generate): guard generateCandidateTasksWithCoverage against prompt surface * fix(tasks): replace brittle string match with NoTextBlocksError class --------- Co-authored-by: OpenClaw Agent (basd) <basd@openclaw.ai> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: OpenClaw Agent (basd) <basd@openclaw.ai> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Xiaohong Chen <xiaohong.chen@pi2.network> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Added information about the Fast team and payment infrastructure for AI agents. Requested by Jessy.