Skip to content

profile/tools.json: tier-3 trio now ships Phase 0 contract#13

Merged
rafael5 merged 1 commit into
mainfrom
chore/tier3-companion-pointers
May 11, 2026
Merged

profile/tools.json: tier-3 trio now ships Phase 0 contract#13
rafael5 merged 1 commit into
mainfrom
chore/tier3-companion-pointers

Conversation

@rafael5
Copy link
Copy Markdown
Contributor

@rafael5 rafael5 commented May 11, 2026

Summary

Coordinated org-side companion to the three tier-3 onboarding PRs that landed in parallel today:

What changes

Each tier-3 entry in `profile/tools.json` gains Phase-0 pointer URLs:

Repo New `*_url` pointers
tree-sitter-m-vscode `repo_meta_url`, `extension_info_url`, `package_json_url`, `language_configuration_url`
m-stdlib-vscode `repo_meta_url`, `extension_info_url`, `package_json_url`
m-cli-extras `repo_meta_url`, `plugins_url`

Also drops the placeholder `notes: "Not yet onboarded..."` lines on all three, and corrects two stale fields surfaced by the onboarding PRs:

  • tree-sitter-m-vscode license: `AGPL-3.0` → `MIT` (matches package.json)
  • tree-sitter-m-vscode agent_instructions: `CLAUDE.md` → `AGENTS.md`
  • m-stdlib-vscode agent_instructions: `README.md` placeholder → `AGENTS.md`

Phase 2 closure

Every non-archived repo in the org-catalog (m-cli, m-stdlib, m-standard, tree-sitter-m, m-test-engine, m-modern-corpus, tree-sitter-m-vscode, m-stdlib-vscode, m-cli-extras) now carries the Phase-0 contract. Only m-tools remains hand-curated, with `status: "archived"`.

Mechanical pickup happens via P1-B's `build-catalog.py` (PR #12, open for review).

Test plan

  • `tools.json` validates against the post-P1-A `tools.schema.json`
  • `make phase0-smoke` still PASS against tier-1 main URLs
  • CI green on this PR

Coordinated companion to the three tier-3 onboarding PRs that
landed in parallel today:

  - tree-sitter-m-vscode #3  (squash-merge 1251518)
  - m-stdlib-vscode      #2  (squash-merge e92f660)
  - m-cli-extras         #2  (squash-merge 6e6fccf)

Each entry gains Phase-0 pointer URLs:
  - repo_meta_url   → dist/repo.meta.json
  - tree-sitter-m-vscode: + extension_info_url, package_json_url, language_configuration_url
  - m-stdlib-vscode:      + extension_info_url, package_json_url
  - m-cli-extras:         + plugins_url

Also drops the placeholder "not yet onboarded" notes lines and
fixes two stale fields surfaced by the onboarding PRs:
  - tree-sitter-m-vscode license: AGPL-3.0 → MIT (matches package.json)
  - tree-sitter-m-vscode agent_instructions: CLAUDE.md → AGENTS.md
  - m-stdlib-vscode agent_instructions: README.md placeholder → AGENTS.md

Phase 2 (tier-2) and tier-3 onboardings now both COMPLETE — every
non-archived repo in the org-catalog carries the Phase-0 contract.
Mechanical pickup will happen via P1-B's build-catalog.py (PR #12,
open for review).

make phase0-smoke still PASS; tools.json validates against
tools.schema.json (P1-A's strict shape).
@rafael5 rafael5 merged commit 7453460 into main May 11, 2026
1 check passed
rafael5 added a commit that referenced this pull request May 11, 2026
…s PR

The three tier-3 repos (tree-sitter-m-vscode, m-stdlib-vscode,
m-cli-extras) all shipped dist/repo.meta.json today (PRs #3, #2, #2
in their respective repos; org-side companion .github PR #13 merged).

Adds TIER_3 = [...] alongside TIER_1 + TIER_2; defaults the URL list
to TIER_1 + TIER_2 + TIER_3 so build-catalog covers all nine
manifest-bearing org repos.

Without this commit the regenerated catalog would silently drop the
three tier-3 entries, looking like a drift-vs-committed bug.

Tests unchanged (still 22 green); local diff against committed
tools.json now shows the four real semantic gaps that P1-D will need
to address (m-tools archived-entry handling, consumed_by inverse-edge
computation, m-stdlib manifest_url/modules_url naming, additive
licenses_url/pyproject_toml_url payload pointers).
rafael5 added a commit that referenced this pull request May 11, 2026
* phase1-B: build-catalog + validate-catalog (TDD)

Phase-1 Track B of the AI-discoverability plan: implement the two
scripts that turn `profile/tools.json` from a hand-curated file into a
generated artifact, plus the catalog-level validator that enforces the
post-P1-A contract.

profile/build/validate-catalog.py
  * Validates `profile/tools.json` against `tools.schema.json` and
    `profile/task_index.json` against `task_index.schema.json`, both
    via Draft202012Validator from jsonschema.
  * Asserts no data-key collision between the two top-level shapes —
    a future-proofing guard: after P1-A the two documents share no
    top-level data key. The five meta-keys ($schema / schema_compat /
    schema_version / kind / _comment) are expected on both and skipped.
  * argparse: --tools (default profile/tools.json),
    --task-index (default profile/task_index.json).
  * Returns 0 on success; non-zero with structured stderr on failure.

profile/build/build-catalog.py
  * TIER_1 + TIER_2 constants: the six onboarded repos' raw-GitHub
    repo.meta.json URLs (m-cli, m-stdlib, m-standard, tree-sitter-m,
    m-test-engine, m-modern-corpus).
  * For each manifest: fetch → validate against repo.meta.schema.json
    (reusing validate-repo-meta.py's logic so the schema-check path
    stays in one place) → translate to a tools.<key> summary entry.
  * Translation: id / repo / role / language / license /
    agent_instructions / verified_on / status (default "active") /
    repo_meta_url straight from the manifest; each exposes.<kind>
    becomes <kind>_url with the URL resolved against the repo's
    main-branch raw prefix; consumes / consumed_by passed through.
  * Top-level narrative ($schema / schema_compat / schema_version /
    kind / description / org / workflow / discovery_protocol) is
    copied verbatim from the prior tools.json so we don't lose
    hand-curated content. task_index is NOT emitted — it stays in
    its own file post-P1-A.
  * --write PATH (default stdout), --prior PATH (default the
    committed tools.json), --no-network (dry-run framing only),
    --urls (override TIER_1+TIER_2).
  * Deterministic: sorted keys, 2-space indent, trailing newline,
    ensure_ascii=False (em dashes pass through). Running twice
    against the same input produces byte-identical output.

profile/build/test_validate_catalog.py (10 tests)
  * Baseline pair validates clean (smoke).
  * Unknown top-level keys fail under additionalProperties: false
    (covers task_index re-inlined, generic unknown key, inlined-facts
    block in a tool entry, surprise field in task_index).
  * Malformed typed IDs fail under the typedID regex (in primary
    and in see_also).
  * Missing required field in a tool entry fails.
  * Missing file path reports clean error.
  * Main(argv) exits 0 on the committed baseline.

profile/build/test_build_catalog.py (12 tests)
  * Three synthetic repo.meta.json payloads — minimal, rich,
    extra-exposes-kind — exercise the manifest → tools entry
    translation surface end-to-end.
  * Build emits all required top-level keys.
  * Build never emits task_index (post-P1-A contract).
  * Build preserves hand-curated top-level from prior_tools.
  * Minimal meta → summary entry; single-element language collapses
    to string; agent_instructions resolves to a github.com/.../blob/
    URL; manifest_url derives from exposes.manifest.
  * Rich meta → multi-language array stays as array; multiple
    exposes become multiple *_url pointers.
  * Extra-exposes-kind passes through (no hardcoded allow-list).
  * Tools key strips the `tool:` prefix from id.
  * Generated output validates against tools.schema.json.
  * dumps() is deterministic across input-order shuffles; emits
    trailing newline and sorted keys.
  * Two-run determinism (B5).
  * Invalid manifest raises a clear error rather than emitting a
    malformed entry.

Verification
  * pytest profile/build/ → 22 passed (10 + 12).
  * python3 profile/build/validate-catalog.py → exits 0 against the
    committed baseline.
  * python3 profile/build/build-catalog.py > generated.json runs
    twice → byte-identical output (B5 determinism).
  * Generated output validates clean against tools.schema.json.
  * make phase0-smoke → PASS (manifests unchanged).

Deferred to P1-D
  * Makefile `catalog` + `validate-catalog` targets — P1-D's job.
  * CI workflow `make catalog && git diff --exit-code` drift gate
    and `make validate-catalog` step — P1-D's job.
  * The drift between this branch's generator output and the
    committed `profile/tools.json` is intentional and surfaces
    exactly what the P1-D drift gate will need to address — see
    PR body for the catalogued differences.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* build-catalog: add TIER_3 list — tier-3 onboardings landed during this PR

The three tier-3 repos (tree-sitter-m-vscode, m-stdlib-vscode,
m-cli-extras) all shipped dist/repo.meta.json today (PRs #3, #2, #2
in their respective repos; org-side companion .github PR #13 merged).

Adds TIER_3 = [...] alongside TIER_1 + TIER_2; defaults the URL list
to TIER_1 + TIER_2 + TIER_3 so build-catalog covers all nine
manifest-bearing org repos.

Without this commit the regenerated catalog would silently drop the
three tier-3 entries, looking like a drift-vs-committed bug.

Tests unchanged (still 22 green); local diff against committed
tools.json now shows the four real semantic gaps that P1-D will need
to address (m-tools archived-entry handling, consumed_by inverse-edge
computation, m-stdlib manifest_url/modules_url naming, additive
licenses_url/pyproject_toml_url payload pointers).

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
rafael5 added a commit that referenced this pull request May 11, 2026
Implementation plan for AI-discoverability-plan.md §7 Phase 4 — ship
m-dev-tools-mcp as a GitHub-Release wheel exposing route_intent /
describe / verify over the org catalog. PyPI publishing deferred per
parent plan §5.3 and PR #18; tier-3 repo onboarding already shipped
in PR #13, so Phase 4 narrows to the MCP-server piece only.

Plan follows the phase0/phase1/phase3 structure:

- §0 blocking dependencies — Phase 1 + Phase 2 closed; Phase 3 C2
  is the soft blocker for Track B (the handshake-test helpers).
- §1 five tracks (A scaffold → B tools → C+D parallel → E close-out)
  with a parallel-safety matrix and stage status conventions.
- §2-§6 per-track stage breakdowns with verification commands and
  TDD checkpoints (RED → GREEN gates on every tool implementation).
- §7 single-glance stage matrix with explicit blockers.
- §8 calling convention (`run A`, `run B3`, `run C+D in parallel`).
- §9 risk notes: MCP SDK volatility, verify exec-vs-listing security
  call (Phase 4 ships listing only, not exec), PyPI namespace squat,
  catalog network latency, Phase 3 dependency timing.
- §10 Gantt — ~6 weeks single-threaded, ~5 with one parallel pair.
- §11 10-point definition of done; Phase 5 unblocked when all true.

Pure documentation; no code or schema changes.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
rafael5 added a commit that referenced this pull request May 11, 2026
…36)

Adds the first row to section 7 (open issues log) of the
docs-discoverability phases tracker. Captures the pattern where two
"docs:" PRs (m-cli #13, m-test-engine #3) inadvertently bundled
parallel Phase 1/Phase 2 work, the root cause, the resolutions, and
the verification rule for future passes.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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