Skip to content

phase0-status: capture post-merge cleanup + clear outstanding#2

Merged
rafael5 merged 1 commit into
mainfrom
chore/phase0-status-cleanup-followups
May 11, 2026
Merged

phase0-status: capture post-merge cleanup + clear outstanding#2
rafael5 merged 1 commit into
mainfrom
chore/phase0-status-cleanup-followups

Conversation

@rafael5
Copy link
Copy Markdown
Contributor

@rafael5 rafael5 commented May 11, 2026

Summary

After the B/C/D PRs merged and make phase0-smoke went green on main, a follow-on docs/-as-prose-only cross-repo cleanup landed:

  • m-standard PR #6docs/integrated/integrated/ (reverts 3bfb947)
  • m-cli PR #9docs/vista-lint-presets/examples/vista-lint-presets/
  • m-stdlib PR #4 — update four inbound refs
  • m-cli PR #10 — drop the docs/-walk shim in _find_m_standard() (compatibility code from the old layout)

make phase0-smoke re-verified PASS after each batch — exposes.* pointers move atomically with payload files, so the cleanup didn't break the Phase 0 contract at any point.

The previously-listed "local feature branches still exist" item turned out to be a no-op: gh pr merge --delete-branch clears both remote and local tracking branches when run from main with the feature branch not currently checked out.

Phase 0 follow-ups now exhausted; Phase 1 is unblocked.

After the B/C/D PRs merged and the smoke test went green on main,
a follow-on docs/-as-prose-only cross-repo cleanup landed:

- m-standard PR #6 — docs/integrated/ → integrated/ (reverts 3bfb947)
- m-cli PR #9 — docs/vista-lint-presets/ → examples/vista-lint-presets/
- m-stdlib PR #4 — update inbound refs
- m-cli PR #10 — drop the docs/-walk shim in _find_m_standard()

make phase0-smoke re-verified PASS after each batch (pointers move
atomically with payload files).

The previously-listed "local feature branches still exist" follow-up
turned out to be a no-op: `gh pr merge --delete-branch` cleared both
remote and local tracking branches when run from main with the
feature branch not currently checked out.

Phase 0 follow-ups now exhausted; Phase 1 is unblocked.
@rafael5 rafael5 merged commit 2673bda into main May 11, 2026
@rafael5 rafael5 deleted the chore/phase0-status-cleanup-followups branch May 11, 2026 00:18
rafael5 added a commit that referenced this pull request May 11, 2026
Adds the Phase-0 pointer URLs to the m-modern-corpus entry after
m-modern-corpus PR #2 (phase2-onboarding) landed:

- agent_instructions: AGENTS.md
- repo_meta_url:      dist/repo.meta.json
- manifest_url:       dist/manifest.json
- stats_url:          dist/stats.json
- license:            LicenseRef-mixed-per-subdir (was free-text)

The hand-curated lines (role, consumed_by, upstream_projects,
calibrates) stay until Phase 1 ships build-catalog.py. Once the
generator lands, those fall away too — replaced by counts derived
mechanically from the manifest.

Tier-2 onboarding per AI-discoverability-plan.md §3.4 / phase1-plan.md
§9. Phase 2 exit for this repo: satisfied at merge of upstream PR #2.
rafael5 added a commit that referenced this pull request May 11, 2026
Adds Phase-0 pointer URLs to the m-test-engine entry after PR #2 in
m-test-engine onboarded it (third and final tier-2 repo):

- agent_instructions: AGENTS.md
- repo_meta_url:      dist/repo.meta.json
- lifecycle_url:      dist/lifecycle.json
- dockerfile_url:     docker/Dockerfile
- compose_url:        docker/compose.yml

Hand-curated lines (role, consumed_by, container_name, bind_mount,
transport, lifecycle, alternative) stay until Phase 1 ships
build-catalog.py — those will fall away in favour of generator-derived
summaries.

Phase 2 progress: 3 of 3 tier-2 repos onboarded with this PR.
Phase 2 exit criterion ("all three tier-2 repos appear in generated
tools.json with verified_on dates within 30 days") will be met as
soon as Phase 1 lands.
rafael5 added a commit that referenced this pull request May 11, 2026
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 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
Captures Phase 4 exit per phase4-plan.md §6 + §11. Mirrors
phase3-evidence.md shape: one section per gate, "What this proves"
roll-up, then each §11 done-criterion cited green.

Verified locally (gate outputs in the evidence doc):

* pytest profile/build/ — 51/51 green
* make catalog — byte-idempotent regen
* make validate-catalog — schema-strict OK
* make handshake — 8/8 steps
* make recipes-check — 4/4 clean
* uvx --from git+...@v0.1.0 m-dev-tools-mcp --tool route_intent
  --query "parse JSON in M" → ["module:m-stdlib#STDJSON"]
  (the parent-plan exit criterion, end-to-end from a fresh clone)

All nine §11 done-criteria cited green:

1. m-dev-tools-mcp repo public AGPL-3.0 + full Phase-0 contract (PR
   #1)
2. server.py exposes 3 TDD-covered tools (PR #2 — 30 dedicated
   cases)
3. v0.1.0 GitHub Release with 23-KB pure-Python wheel attached
   (Track D2)
4. tools.json carries the entry with repo_meta_url + mcp_tools_url +
   release_wheel_url (.github PR #27)
5. task_index.json has infra.agent_integration → tool:m-dev-tools-mcp
   (.github PR #27)
6. examples/claude-code/ has .mcp.json + README + smoke.sh +
   session.md template (PR #3)
7. This evidence file (PR — current)
8. uvx canonical round-trip green (run captured above)
9. CI green on every Phase 4 PR

Phase 5 (continuous enforcement) unblocked. PyPI publishing remains
deliberately deferred.

Two out-of-scope follow-ups noted in the evidence doc:

* validate-repo-meta.py UTF-8-decode bug on binary release-wheel
  exposes URLs (use --no-resolve until fixed)
* 3 Phase-3-era orphan schema fixtures gitignored but still on
  disk; auto-classifier blocks rm
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