Skip to content

CXF-221: agent skills for post-sync verification, update/rollback, and failure diagnosis - #15

Merged
btipling merged 15 commits into
mainfrom
am/src-bmz7w/src-bmz7w-att5-impl
Sep 4, 2026
Merged

CXF-221: agent skills for post-sync verification, update/rollback, and failure diagnosis#15
btipling merged 15 commits into
mainfrom
am/src-bmz7w/src-bmz7w-att5-impl

Conversation

@btipling

@btipling btipling commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Summary

Agents authoring connectors in the eval harness could build, test, deploy, and activate a connector, but nothing covered what happens after activation: verifying the synced output, updating or rolling back a live connector, or diagnosing a failed build, draft test, or sync. This PR closes that gap with three new skills — verify-connector-output, update-and-rollback, and diagnose-authoring-failure — each with a SOURCES.md naming its pinned sources, registered in the eval skill bundle at v0.4.0 with the locked machine-checkable contract extended to cover them.

Linear

CXF-221: CXF-70 PR 6: verify / update-rollback / diagnose skills (8, 9, 10)

Linear requirements

This PR meets all requirements of CXF-221.

Requirement Status Evidence
verify-connector-output skill: post-sync verification — counts (fixture parity), grant wiring, ID stability across re-sync, UI spot-check; "never invent data to make a demo appear complete" ✅ Met skills/verify-connector-output/SKILL.md L13-45 (checklist), L47-58 (exit criteria)
update-and-rollback skill: same-catalog rerun; image-digest reuse rule + rotation STOP/escalate limitation; REST-only rollback with OWNER token ✅ Met skills/update-and-rollback/SKILL.md L13-42 (update flow), L44-55 (rotation STOP), L57-78 (rollback)
diagnose-authoring-failure skill: symptom → cause → fix router on the docs' common-failures table + draft-test FAIL reading + where logs live; port baton-admin taxonomy, replace all repo tooling ✅ Met skills/diagnose-authoring-failure/SKILL.md L25-37 (router table, all nine rows), L39-52 (FAIL reading), L54-59 (logs)
Done-criterion: exit criteria machine-checkable; verify catches data-correctness failures; diagnose routes documented failure modes ✅ Met ## Exit criteria in all three SKILL.md bodies; enforced by evals/runner/skills_bundle.test.ts test (c) L186-196
Bundle registration: v0.4.0, ten entries, existing seven byte-preserved ✅ Met evals/skills-bundle/bundle.json L2, L11-13
Version pins 0.3.0 → 0.4.0 across tests and full-mode scenarios ✅ Met evals/runner/skills_bundle.test.ts L18/L201/L250; agent.test.ts L81; scenario.test.ts L103; three scenario JSONs
Provenance: SOURCES.md per skill naming pinned sources with SHAs; skills/README.md table ✅ Met three SOURCES.md files; skills/README.md L16-18; test (f) skills_bundle.test.ts L256-270

Release Notes

The connector-authoring skill bundle (evals/skills-bundle) now ships ten skills at v0.4.0 instead of seven. Agents authoring connectors gain three new skills: verify-connector-output (post-sync verification of counts, grant wiring, and ID stability), update-and-rollback (same-catalog updates and REST-only rollback of live connectors), and diagnose-authoring-failure (symptom-to-cause-to-fix routing for build, draft-test, activation, and sync failures).

What changed

skills/verify-connector-output/SKILL.md (new, 74 lines)

Where: whole file L1-74; checklist L13-45, exit criteria L47-58.

What changed

  • New skill: post-sync verification checklist — connector status gate (SYNC_STATUS_DONE; SYNC_STATUS_DISABLED semantics via sync_disabled_reason), count parity against the live tenant API, grant wiring (every principal → emitted resource, every entitlement ID → emitted entitlement), ID stability across a re-sync, UI spot-check at /admin/connector/<catalog_id>/<app_id>/<connector_id>.
  • "Investigate empty or unexpected results; never invent data to make a demo appear complete" verbatim.

Why

  • Linear requirement 1: the post-11 verification skill. Content from the served guide's Production-sync verification contract, the lifecycle doc's "What success looks like", and the marketplace probe-contracts.md assertion inventory.

skills/verify-connector-output/SOURCES.md (new, 13 lines)

Where: whole file L1-13.

What changed

  • Provenance table naming the pinned sources (c1 guide/proto/lifecycle doc @ 2e5f53eb…, marketplace probe-contracts.md @ 0cc5ac2a…, c1 Go source) and what each contributes.

Why

  • Locked decision 5: nothing written from model memory; every claim traceable to a pinned source.

skills/update-and-rollback/SKILL.md (new, 115 lines)

Where: whole file L1-115; update flow L13-42, rotation STOP L44-55, rollback L57-78.

What changed

  • New skill: same-catalog update flow — update draft source, build new revision, reuse the managed runtime instance only when its image digest matches the target revision's pinned runtime image digest, fresh PASS evidence, mint a new approval URL, human OWNER activates, poll list_revision_summaries until ACTIVE and record activation_epoch, force sync, poll to terminal status.
  • The rotation STOP verbatim (serve image does not match the revision-pinned runtime image; do not clear runtime fields, call the provisioner directly, or mutate the deployment or AWS resources; record tenant/catalog/app/connector/target-revision IDs; escalate).
  • REST-only OWNER-gated rollback: POST /api/v1/connector-authoring/rollbacks with catalog_id, target_revision_id, instance_app_id, instance_connector_id, approval_token_id; strictly-greater activation epoch pointer move.

Why

  • Linear requirement 2: the update/rollback skill. Content from the served guide's "Updating an active connector" contract, authoring.proto, and the lifecycle doc's "Updating and rolling back a live connector" section.

skills/update-and-rollback/SOURCES.md (new, 12 lines)

Where: whole file L1-12.

What changed

  • Provenance table: guide, authoring.proto (MintApprovalToken, ListRevisionSummaries, RevisionStatus), lifecycle doc (image-digest rule, rotation STOP, rollback body), c1 Go source (SYNC_STATUS_ERROR/SYNC_STATUS_DISABLED semantics).

Why

  • Locked decision 5.

skills/diagnose-authoring-failure/SKILL.md (new, 90 lines)

Where: whole file L1-90; router table L25-37, FAIL reading L39-52, logs L54-59.

What changed

  • New skill: symptom → cause → fix router porting all nine lifecycle-doc common-failures rows (262144-byte compile limit, 1048576-byte bundle limit, is_secret, credential re-entry, missing type, unregistered transport, ticketing.enabled, activation evidence unsatisfied, Invalid token provided).
  • Draft-test FAIL reading: the evidence row is authoritative; PASS requires ConnectionOK, HostCallOK, no read error and no write attempt, config version handle match, runtime image digest match.
  • Where logs live: product connector activity and sync logs; the status row (c1_connector_service_getstatus.status, status.lastError).

Why

  • Linear requirement 3: the cross-cutting diagnosis skill. Ports the baton-admin diagnose-connector-failure taxonomy approach and replaces all repo tooling.

skills/diagnose-authoring-failure/SOURCES.md (new, 13 lines)

Where: whole file L1-13.

What changed

  • Provenance table: guide (caps table, evidence/credentials contract), authoring.proto (GetTestRunEvidence), lifecycle doc (common-failures table, FAIL reading, logs), baton-admin diagnose-connector-failure @ 6fe6886f….

Why

  • Locked decision 5.

evals/skills-bundle/bundle.json (modified)

Where: L2, L11-13.

What changed

  • version 0.3.0 → 0.4.0; three new entries (verify-connector-output, update-and-rollback, diagnose-authoring-failure at 0.1.0); the existing seven entries byte-preserved.

Why

  • Locked decision 9: bundle registration. The scenario loader throws on any full-mode scenario whose version does not match bundle.json's.

evals/runner/skills_bundle.test.ts (modified)

Where: L17-18, L59, L75-184, L201, L250, L256-270.

What changed

  • SKILLS list 7 → 10, VERSION 0.4.0, count assertion 7 → 10, three new SKILL_LITERALS entries (the locked literal minimums per skill), 0.3.0 → 0.4.0 in tests (d) and (e), and a new test (f) asserting every skill ships a non-empty SOURCES.md naming the c1 pin.

Why

  • Locked decisions 9/10: the machine-checkable contract. Test (f) enforces decision 5's "nothing from model memory" — a dropped or truncated pin fails the gate.

evals/runner/agent.test.ts (modified)

Where: L81.

What changed

  • skillBundle fixture version 0.3.0 → 0.4.0.

Why

  • Version-pin bump (plan Phase C).

evals/runner/scenario.test.ts (modified)

Where: L103.

What changed

  • Version assertion 0.3.0 → 0.4.0.

Why

  • Version-pin bump (plan Phase C).

evals/scenarios/tier1-directory-full.json (modified)

Where: L30.

What changed

  • skillBundle.version 0.3.0 → 0.4.0.

Why

  • The scenario loader throws on any full-mode scenario whose version does not match bundle.json's.

evals/scenarios/pre1-directory-proceed.json (modified)

Where: L32.

What changed

  • skillBundle.version 0.3.0 → 0.4.0.

Why

  • Same version-drift contract as above.

evals/scenarios/pre1-noiam-park.json (modified)

Where: L30.

What changed

  • skillBundle.version 0.3.0 → 0.4.0.

Why

  • Same version-drift contract as above.

evals/skills-bundle/README.md (modified)

Where: L5-20, L62.

What changed

  • New ## v0.4.0 — the ten skills section describing the three new skills; the mount-contract pin updated 0.2.0 → 0.4.0.

Why

  • Plan Phase B: the bundle README documents the new version; the v0.3.0 history section stays.

skills/README.md (modified)

Where: L1-10, L16-18.

What changed

  • Intro "seven skills" → "ten skills"; three new provenance rows in the skill table.

Why

  • Plan Phase B: the skills README documents the ten-skill set.

evals/README.md (modified)

Where: L18, L245.

What changed

  • Bundle mount-point line 0.3.0 → 0.4.0 (ten skills); the stale "remaining three skills — later PRs" non-goal bullet deleted.

Why

  • Plan Phase B: the evals README reflects the shipped bundle.

Excluded

No generated files. The eval runner test files are the deliverable's machine-checkable contract (plan Phase C), not incidental scaffolding — covered above. The READMEs are the provenance contract (plan Phase B) — covered above.

btipling and others added 13 commits September 4, 2026 19:01
Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
…nd credential guidance

- update-and-rollback/SOURCES.md: drop the fabricated RollbackRevision proto
  RPC citation (the proto exposes no rollback RPC; the REST-only contract
  lives in the lifecycle doc) — restores decision-5 provenance integrity.
- update-and-rollback/SKILL.md: add poll-with-backoff + evidence-unsatisfied
  guardrail to the ACTIVE poll (mirrors deploy-and-activate); add OWNER
  bearer-token hygiene anti-pattern.
- diagnose-authoring-failure/SKILL.md: bound the evidence polling with
  backoff and a ~10-poll stop.
- verify-connector-output/SKILL.md: handle RUNNING/unknown sync status in
  the status gate.
- skills_bundle.test.ts: lock the rotation-STOP safety negation literal;
  add test (f) asserting every skill ships a non-empty SOURCES.md and the
  three new skills name the c1 pin.

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
…ety prose

- verify-connector-output/SKILL.md: the RUNNING-status poll now stops after
  ~10 polls (STOP and report) instead of polling unbounded; SYNC_STATUS_DISABLED
  is called out as normal (per the sync_disabled caveat) instead of being
  caught by the unknown-status catch-all.
- skills_bundle.test.ts: lock the new safety prose in SKILL_LITERALS —
  SYNC_STATUS_RUNNING (verify), evidence is unsatisfied (update-and-rollback),
  Poll with backoff (diagnose-authoring-failure).

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
The f8dcfb1 literal lock for update-and-rollback ('evidence is unsatisfied')
was added against a working-tree rewrap that was never committed; the pushed
branch still wrapped the phrase across lines and failed test (c) on a clean
checkout. Commit the rewrap so the locked literal is present verbatim.

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
- verify-connector-output/SKILL.md: SYNC_STATUS_DISABLED is normal only for
  the post-activation sync_disabled state; a DISABLED row with
  status.lastError set (e.g. a data-anomaly auto-pause) routes through
  diagnose-authoring-failure. The backend derives DISABLED only from an
  ERROR-classified sync recategorized as ops pause / customer opt-out /
  data-anomaly (ConnectorStatusToAPI), so the blanket 'normal' carve-out
  would silently certify an anomaly-paused connector as verified.
- skills_bundle.test.ts: lock the poll-termination bounds themselves
  ('DONE/ERROR after ~10 polls, STOP and report', 'row after ~10 polls,
  stop and report') and the data-anomaly distinction, so a future edit
  cannot strip the bound clauses while the suite stays green.

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
…emaining safety prose

- verify-connector-output/SKILL.md: SYNC_STATUS_DISABLED is an
  error-classified outcome; the discriminator is now the connector's
  sync_disabled_category, not status.lastError presence (every real DISABLED
  row carries a non-empty lastError via ConnectorSyncStatusSetError, so the
  old gate misrouted benign ops/customer pauses). A data-anomaly auto-pause
  (SYNC_DISABLED_CATEGORY_DATA_ANOMALY) means the sync was paused after
  repeated data drops - investigate the counts and the drop reason; a
  deliberate pause (customer opt-out, ops, or deployment) is normal.
- skills_bundle.test.ts: lock SYNC_DISABLED_CATEGORY_DATA_ANOMALY (verify),
  the ACTIVE-poll bound and the OWNER bearer-token hygiene bullet
  (update-and-rollback).

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
…lated field)

- verify-connector-output/SKILL.md: sync_disabled_category is never
  populated on the app_v1.Connector returned by c1_connector_service_get
  (mdapp.ConnectorToAPI omits it), so the round-5 discriminator was
  unreadable and every real DISABLED row fell through to the unknown-status
  branch. Key the discriminator on sync_disabled_reason instead, which IS
  populated: the data-anomaly auto-pause stamps the 'Sync paused due to
  significant drop in sync data' prefix (SyncPausedPrefix), while deliberate
  pauses use 'system' / 'system-customer-opt-out'. Drop the unreachable
  'deployment' category (ConnectorStatusToAPI promotes only
  OPERATIONS/CUSTOMER_OPT_OUT/DATA_ANOMALY to DISABLED).
- verify-connector-output/SOURCES.md: provenance row for the DISABLED
  semantics from the c1 Go source at the same pin.
- skills_bundle.test.ts: lock 'significant drop in sync data' instead of
  the unreadable category enum.

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
…llback fail-closed routing

- verify-connector-output/SKILL.md: an empty or unexpected
  sync_disabled_reason routes through diagnose-authoring-failure (covers the
  ops Mode-B residual state where the reason is cleared while the DISABLED
  status remains).
- update-and-rollback/SKILL.md: scope 'Do not redeem the approval token' to
  activation ('Do not redeem the activation approval token') so it no longer
  reads as contradicting the rollback section's instructed token redemption;
  add fail-closed routing for rollback precondition errors.
- skills_bundle.test.ts: update the update-and-rollback literal to the
  scoped wording (other skills' literals unchanged).

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
…ol rollback guidance

- update-and-rollback/SKILL.md: scope the no-redeem instruction via prose
  ('Do not redeem the approval token for activation') in both step 5 and the
  Anti-patterns bullet, preserving the plan-locked literal 'Do not redeem
  the approval token' verbatim; reword the rollback fail-closed guidance to
  the Blocker protocol instead of routing to diagnose-authoring-failure
  (whose frontmatter disclaims rollback coverage).
- skills_bundle.test.ts: revert the update-and-rollback literal to the
  plan-locked value.

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
- update-and-rollback/SKILL.md step 7: poll c1_connector_service_get with
  backoff (every 5-10s) until SYNC_STATUS_DONE; if no DONE after ~10 polls,
  STOP and report — mirrors the bounded-poll convention used by every other
  async-wait check in the bundle (ForceSync is async, minutes-to-hours).
- skills_bundle.test.ts: lock the new bound literal.

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
- update-and-rollback/SKILL.md step 7: after the bounded DONE poll, an
  SYNC_STATUS_ERROR row routes through diagnose-authoring-failure with
  status.lastError; an SYNC_STATUS_DISABLED row routes through
  diagnose-authoring-failure unless sync_disabled_reason indicates a
  deliberate pause (customer opt-out or ops) — mirrors
  verify-connector-output's taxonomy so an immediate sync failure is not
  masked by the poll budget.
- skills_bundle.test.ts: lock SYNC_STATUS_ERROR in update-and-rollback.

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
…atter carve-out

- update-and-rollback/SKILL.md step 7: the poll now exits on any terminal
  status (DONE, ERROR, or DISABLED) so an immediate sync failure does not
  burn the ~10-poll budget; bound reworded to 'no terminal status after ~10
  polls, STOP and report'.
- update-and-rollback/SOURCES.md: provenance row for the ERROR/DISABLED
  terminal-state semantics from the c1 Go source at the same pin.
- diagnose-authoring-failure/SKILL.md: narrow the rollback anti-trigger to
  'updating or rolling back a healthy live connector' so a failed-sync
  route from update-and-rollback step 7 does not collide with the
  disclaimer.
- skills_bundle.test.ts: lock 'no terminal status after ~10 polls, STOP and
  report' and SYNC_STATUS_DISABLED in update-and-rollback.

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
- verify-connector-output/SKILL.md step 1: the RUNNING poll now exits on
  DONE, ERROR, or DISABLED (a mid-poll data-anomaly auto-pause no longer
  burns the ~10-poll budget before the DISABLED branch applies) — mirrors
  update-and-rollback step 7's terminal-state race.
- skills_bundle.test.ts: lock 'terminal status after ~10 polls, STOP and
  report' for verify-connector-output.

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
@btipling btipling changed the title Implement src-bmz7w-att5 CXF-221: agent skills for post-sync verification, update/rollback, and failure diagnosis Sep 4, 2026
@linear-code

linear-code Bot commented Sep 4, 2026

Copy link
Copy Markdown

CXF-221

Comment thread skills/update-and-rollback/SKILL.md
Comment thread skills/verify-connector-output/SKILL.md Outdated
Comment thread evals/skills-bundle/bundle.json
Comment thread evals/skills-bundle/README.md Outdated
Comment thread skills/diagnose-authoring-failure/SKILL.md Outdated
Comment thread skills/README.md Outdated
…ills

The seven prior skills are five funnel skills and two pre-1 skills
(design-access-model, source-openapi-spec); the intro now says so.

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

General PR Review: CXF-221: agent skills for post-sync verification, update/rollback, and failure diagnosis

Blocking Issues: 0 | Suggestions: 3 | Threads Resolved: 0
Criteria: Criteria status: none loaded - .claude/skills/ci-review.md was not found at trusted base b232e8c80074.
Review mode: full
View review run

Review Summary

Scanned the full PR diff for security and correctness: three new skill bodies plus SOURCES.md, the bundle bump to 0.4.0 (ten skills), the scenario/version pins, and the widened skills_bundle.test.ts literal and SOURCES.md gates. Prior bot feedback is addressed in 1e3c695verify-connector-output step 4 now names c1_connector_service_force_sync with the poll bound, the rollback POST names its executor and token source, skills/README.md no longer calls the pre-1 skills "funnel skills", and the v0.4.0 bundle README now records the 2e5f53eb… c1 pin. No security or correctness blockers; three new documentation/executability gaps remain, one of them a stale claim in an unchanged file that this PR invalidates.

Security Issues

None found.

Correctness Issues

None found.

Suggestions

  • skills/author-in-app-connector/SKILL.md:95 — the orchestrator's routing table still routes verify/update/diagnose (not yet shipped) to "follow the served guide", so full-mode runs mount the three new skills but the router never sends the agent to them.
  • skills/verify-connector-output/SKILL.md:31-37 — steps 2-3 state GATEs (count parity, grant wiring) without naming any tenant MCP tool or response field, unlike steps 1 and 4.
  • skills/update-and-rollback/SKILL.md:17-20 — the image-digest GATE that decides reuse vs. the rotation STOP names no tool or field for reading either digest.
Prompt for AI agents
Verify each finding against the current code and only fix it if needed.

## Suggestions

In `skills/author-in-app-connector/SKILL.md`:
- Around line 95: The Routing table row reads `| verify/update/diagnose (not yet shipped) | follow the served guide |`, but this PR ships `verify-connector-output`, `update-and-rollback`, and `diagnose-authoring-failure` in bundle v0.4.0. Replace that row with rows routing post-11 verification to `verify-connector-output`, post-activation update/rollback to `update-and-rollback`, and failure triage to `diagnose-authoring-failure`, keeping the post-activation-only / never-during-the-funnel caveat those skills carry. If the orchestrator SKILL.md body changes, bump its `version` in the frontmatter and the matching entry in `evals/skills-bundle/bundle.json` (test (a) asserts they are equal).

In `skills/verify-connector-output/SKILL.md`:
- Around line 31-37: Steps 2 (counts) and 3 (grant wiring) declare GATEs but name no tenant MCP tool or response field, while the skill header promises "Tool names below are the exact tenant MCP titles" and steps 1/4 do name them. Add the exact tool call(s) and response fields the agent uses to enumerate resources, entitlements, and grants for the intended scope, and the field the grant principal / entitlement ID is read from, so "count parity against the live tenant API" is executable.

In `skills/update-and-rollback/SKILL.md`:
- Around line 17-20: Step 2's GATE ("image digest match") decides between reusing the managed runtime instance and firing the rotation STOP + escalation, but names no way to read either digest. Add the tenant MCP call and response field for the deployed instance's image digest and for the target revision's pinned runtime image digest.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No blocking issues found.

- update-and-rollback: state the rollback actor (agent) and OWNER token
  provenance (env/secret store, never pasted into chat)
- verify-connector-output: name c1_connector_service_force_sync and the
  poll-to-terminal-status bound in the ID-stability step
- diagnose-authoring-failure: clarify that the baton-admin skill's
  repo-local CLI tooling is replaced by the tenant MCP tools
- evals/skills-bundle/README.md: note the three new skills' c1 pin

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>

btipling commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Addressed all six suggestions:

  1. update-and-rollback rollback actor/token — fixed in 1e3c695. The rollback section now states the agent executes the POST with an OWNER bearer token read from the environment or secret store, never pasted into chat (matching the lifecycle doc's Squire recipe, which mints the token from the local MCP credential). The do-not-print anti-pattern is unchanged.
  2. bundle.json mounts post-funnel skills in full-mode — intentional, locked design (plan decisions 2 and 9: ten-skill bundle, no orchestrator routing changes; the post-funnel skills are directly invoked in post-activation sessions only). The full-mode eval suite passes with the ten-skill bundle mounted: npm run eval:test 139/139 and skills_bundle.test.ts 7/7 at this head. The funnel prompt never invokes the post-funnel skills; each body's "never during the funnel run" line is the guard.
  3. verify-connector-output step 4 — fixed in 1e3c695. Step 4 now names c1_connector_service_force_sync and the poll-to-terminal-status contract (c1_connector_service_get with backoff until DONE/ERROR/DISABLED, STOP after ~10 polls), matching step 1.
  4. bundle README v0.4.0 c1 pin — fixed in 1e3c695. The v0.4.0 section now notes the three new skills pin the c1 contract sources at 2e5f53eb….
  5. diagnose-authoring-failure "replaces all repo tooling" — fixed in 1e3c695. Now reads "the baton-admin skill's repo-local CLI tooling is replaced by the tenant MCP tools named below".
  6. skills/README.md funnel/pre-1 mislabel — fixed in 14d811d (this review ran against the pre-fix head 79117b7). The intro now reads "the five funnel skills and two pre-1 skills".

Comment thread skills/verify-connector-output/SKILL.md
Comment thread skills/update-and-rollback/SKILL.md

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No blocking issues found.

btipling commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Addressed all three suggestions (evidence below; no code change needed for any):

  1. author-in-app-connector routing table — intentional, locked design. Plan decision 2 for CXF-221 explicitly locks "The seven existing SKILL.md bodies are NOT modified — no orchestrator routing changes; the post-funnel skills are directly invoked in post-activation sessions." The routing row's "follow the served guide" fallback remains correct for funnel runs (the funnel ends at the human boundary; the post-funnel skills are never invoked during it). Changing the row would modify an existing skill body, bump its version, and cascade into bundle.json — all outside the locked scope.
  2. verify-connector-output steps 2-3 tool names — the pinned sources do not name tenant MCP tools for the counts/grant-wiring steps. The served guide's Production-sync verification contract (quoted verbatim in the skill and in plan decision 6) says "inspect the resource, entitlement, and grant counts for the intended scope" without naming tools; the lifecycle doc's "What success looks like" names only c1_connector_service_get (status) and the UI path. Naming tools from model memory would violate locked decision 5 ("nothing written from model memory"). The skill names every tool the sources name.
  3. update-and-rollback image-digest GATE — the authoring surface exposes no read RPC for either digest. deploy_connector_instance returns container_image_digest once at deploy time (DeployConnectorInstanceResponse.container_image_digest); get_revision_summary returns source digests only (root_digest / config_schema_digest / runtime_schema_digest / capabilities_digest), no runtime image digest; c1_connector_service_get's Connector message has no image field. The lifecycle doc's GATE (the skill's source) likewise names no read tool — the comparison is a judgment call per the source contract, and the skill ports it verbatim.

@btipling
btipling merged commit bdff5ed into main Sep 4, 2026
2 checks passed
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