Skip to content

Competitor feature-watch report - #581

Merged
jpr5 merged 1 commit into
mainfrom
auto/competitive-matrix-20261026-40297803406
Oct 26, 2026
Merged

jpr5 merged 1 commit into
mainfrom
auto/competitive-matrix-20261026-40297803406

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

No homepage competitive matrix changes this week. Detections below need a manual check.
Feature watch changes need a review; see the Feature watch section.

Migration Page Rows To Check By Hand

The competitor's cell in these rows shows no, but the scan does not flip it: a combined row covers several capabilities, and an unsupported cell is not in the page's usual cross shape. A no-row entry is a homepage change whose migration page has no row for the capability: add the row or map it in buildMigrationRowPatterns.

Page Competitor Capability Row Reason
docs/migrate-from-mock-llm/index.html mock-llm Azure OpenAI Azure OpenAI / Vertex AI / Ollama / Cohere combined-row

Row-Less Detections (Manual Follow-Up)

These rules have no homepage row. The last column says what the competitor's migration page did with each. Check them by hand.

Competitor Capability Migration page
VidaiMock Realtime GA protocol no row
VidaiMock Azure OpenAI no row
VidaiMock AWS Bedrock no row
VidaiMock Docker image "Docker" does not show no
VidaiMock CLI server no row
mock-llm Azure OpenAI "Azure OpenAI / Vertex AI / Ollama / Cohere" combines several capabilities: check by hand
mock-llm Docker image "Docker image" does not show no
mock-llm Helm chart "Kubernetes / Helm" does not show no
mock-llm CLI server no row
mock-llm GET /v1/models no row
piyook/llm-mock Docker image "Docker image" does not show no
piyook/llm-mock CLI server no row

Feature watch

The scan never changes a homepage cell from these checks. For each source that is not "no change", re-check its claims in the MCP spec's claims table (14.2), then edit the homepage by hand.

Source Competitor Claims Status Details Evidence
mastra-docs-tool-mocks Mastra C-M1, C-M2, C-M3, C-M4, C-M5, C-M6, C-M8, C-M9, C-M10, C-M11, C-M12 changed section text changed mock-from-trace: "unning the sub-agent and its inner tools. When you create a mock from a trace, sub-agent delegation calls are derived with matchArgs: 'ig"; tool-mock-report: "tics Direct link to Diagnostics Each item result includes a toolMockReport listing which mocks were used and which tool calls ran with"
mastra-docs-workflow-target Mastra C-M14 no change - -
mastra-blog-tool-mocks Mastra C-M13, C-M14, C-M15 no change - workflow-mocks-planned: "ng today, tool mocks are supported for agent targets , with workflow tool mocks to follow. note Requires @⁠mastra/core@⁠1.56.0 or later, added in PR #⁠1"
mastra-core-npm Mastra C-M13 changed version 1.78.0 -> 1.79.0 -
mockserver-ap-mcp MockServer C-S5, C-S6, C-S7, C-S13 no change - -
mockserver-lr-sessions MockServer C-S4, C-S13 no change - -
mockserver-lr-chaos MockServer C-S40 no change - -
mockserver-ao-record MockServer C-S10 no change - replay: "3 to capture real LLM traffic during development, Mode 2 to replay it deterministically in CI, and Mode 1 to let your AI assis"
mockserver-dd-cassette MockServer C-S11 no change - cassette: " is a different mechanism: that tool replays a recorded LLM cassette (fixture) against the live LLM provider and reports structu"
wiremock-ai-oss WireMock C-W4, C-W9 no change - -
wiremock-cloud-mcp-tools WireMock C-W5, C-W10, C-W11 no change - -
wiremock-rp-recording WireMock C-W2, C-W4 no change - -

jpr5 added a commit that referenced this pull request Oct 26, 2026
…erged PR (#583)

## Problem

The weekly competitor feature-watch report PR is opened with the
workflow `GITHUB_TOKEN`. GitHub does not start workflows from that
token's events, so no CI runs on the PR and it waits for a human push.
#581 is today's example.

## Change

A run whose only change is `scripts/competitive-watch-state.json` now
lands the way the adoption wall does (60fe76c):

- `Verify the auto-land diff is confined to the state file`: auto-land
only when `git status --porcelain -- docs/
scripts/competitive-watch-state.json` is exactly ` M
scripts/competitive-watch-state.json`.
- `Mint app token`: same action SHA, app `1108748`,
`secrets.DEVOPS_BOT_PRIVATE_KEY`, `contents`/`pull-requests` write only,
minted only on the auto-land path.
- `Auto-land via bot PR`: per-command auth through `GIT_CONFIG_*` env,
`copilotkit-bot[bot]` identity, `bot/competitive-watch-*` branch, stages
that one file, `gh pr merge --merge --admin` into `GITHUB_REF_NAME`. If
the merge fails, the PR stays open and the job fails.
- Any `docs/` change (homepage or migration pages) still goes to the
existing review PR on the workflow token.
- Visibility: the report stays in the PR body, is now also written to
the job summary, and the Slack digest (`SLACK_WEBHOOK`) gets a "merged
via a bot PR" line.
- Also as in adoption-wall: `HUSKY=0` and `--no-verify` on the bot
commit, and `cancel-in-progress: false`.

No new secrets. No new actions.

## Red / green

RED, workflow: `gh pr checks 581` returns `no checks reported on the
'auto/competitive-matrix-20261026-40297803406' branch` (exit 1). The
check-runs API gives `total_count: 0`.

RED, Slack contract test
(`src/__tests__/competitive-matrix-slack.test.ts`, which runs the real
`Notify Slack` step) against the old workflow:
```
× says the bot merged the report, with the digest, when the state auto-landed
Tests  1 failed | 4 passed (5)
```
GREEN, same test against this workflow:
```
Tests  5 passed (5)
```
Workflow and competitive tests: 24 files, 1410 passed.

Lint: `actionlint` exit 0. `zizmor` 1.26.1 with `.github/zizmor.yml`,
offline and online: exit 0, no findings.

The end-to-end check is a `workflow_dispatch` run after this merges.
@jpr5

jpr5 commented Oct 26, 2026

Copy link
Copy Markdown
Contributor

Closing and reopening to start CI: this PR was opened with GITHUB_TOKEN, so no checks ran. The bot-merge fix (#583) is merged, but the regenerating run fails today because every mock-server.com page returns HTTP 403.

@jpr5 jpr5 closed this Oct 26, 2026
@jpr5 jpr5 reopened this Oct 26, 2026
@pkg-pr-new

pkg-pr-new Bot commented Oct 26, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@copilotkit/aimock@581

commit: c620c06

@jpr5
jpr5 merged commit 5fecbbc into main Oct 26, 2026
14 checks passed
@jpr5
jpr5 deleted the auto/competitive-matrix-20261026-40297803406 branch October 26, 2026 23:35
jpr5 added a commit that referenced this pull request Oct 26, 2026
)

## What

Follow-up to #583 (and the same bug #581 had). When a refresh needs a
human, the review PR was still pushed and opened with `GITHUB_TOKEN`.
GitHub does not start workflows from `GITHUB_TOKEN` events, so CI never
ran on that PR.

Before, in `update-competitive-matrix.yml`:

```yaml
      - name: Configure git credentials
          git config --local url."https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/".insteadOf "https://github.com/"
      - name: Create PR
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

`update-adoption-wall.yml` had the same gap:

```yaml
      - name: Open review PR
        env:
          GH_TOKEN: ${{ github.token }}
```

## Change

- Both review paths push and open their PR with the copilotkit-bot App
token. The token comes from the existing "Mint app token" step (same
app, same pinned action, same secret, same `contents`/`pull-requests`
write scopes). No new secret.
- The review PR is **never merged** by the workflow. It waits for a
human, as before.
- The mint condition is now the union of the two steps that use the
token:
  - competitive matrix: `changed == 'true'`
- adoption wall: `exists && changed && (status == 'safe' || status ==
'needs-review')`
- Least privilege for the workflow token: `pull-requests: write` is gone
from both jobs. The competitive-matrix job is now `contents: read`,
because its workflow token only reads the API now.
- The "Configure git credentials" step is removed. It wrote
`GITHUB_TOKEN` into `.git/config`. The review step now passes the App
token through git's environment config, like the auto-land step.

## `if:` trace

Competitive matrix:

| case | mint | auto-land | review PR |
|---|---|---|---|
| no change | skip | skip | skip |
| docs/ changed (confine skipped) | run | skip (`docs_changed`) | run
(`confined != 'true'`) |
| state only, confined | run | run | skip |
| state only, not confined | run | skip | run |

Adoption wall: auto-land (`exists && safe && changed && confined`) and
review (`exists && changed && (needs-review || (safe && !confined))`)
are both subsets of the mint condition. A clean run, a run with no
change, or a run with no state branch mints nothing.

## Red-green proof

Contract test added to `src/__tests__/competitive-matrix-slack.test.ts`
(`review PRs are opened with the App token`), for both workflows. It
checks that the review step uses `steps.app-token.outputs.token` for
push and PR, that no workflow-token git credential remains, that the
review step never merges, and that the mint condition covers the review
path.

RED (new test against the `origin/main` workflows):

```
⎯⎯⎯⎯⎯⎯⎯ Failed Tests 4 ⎯⎯⎯⎯⎯⎯⎯
 FAIL  src/__tests__/competitive-matrix-slack.test.ts > review PRs are opened with the App token > update-competitive-matrix.yml: "Create PR" pushes and opens the PR on the App token
 FAIL  src/__tests__/competitive-matrix-slack.test.ts > review PRs are opened with the App token > update-competitive-matrix.yml: the App token is minted for the review path too
 FAIL  src/__tests__/competitive-matrix-slack.test.ts > review PRs are opened with the App token > update-adoption-wall.yml: "Open review PR" pushes and opens the PR on the App token
 FAIL  src/__tests__/competitive-matrix-slack.test.ts > review PRs are opened with the App token > update-adoption-wall.yml: the App token is minted for the review path too
      Tests  4 failed | 7 passed (11)
```

GREEN (same test against this branch):

```
      Tests  11 passed (11)
```

Full suite: 483 files, 19670 tests passed. `actionlint` exit 0. `zizmor
--offline` exit 0 (no findings). typecheck, eslint and prettier clean.

## End-to-end proof

Not triggered by hand: mock-server.com currently returns 403, so a run
would fail before these steps. The end-to-end proof is the next
scheduled Monday run.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant