Skip to content

docs: correct test count in README - #13

Merged
robotrocketscience merged 1 commit into
mainfrom
docs/correct-test-count
Apr 27, 2026
Merged

docs: correct test count in README#13
robotrocketscience merged 1 commit into
mainfrom
docs/correct-test-count

Conversation

@robotrocketscience

Copy link
Copy Markdown
Owner

Summary

  • README said "16 tests"; actual count after the half-life lockdown tests + smoke is 24.
  • Spells out the breakdown: 3 pre-registered property tests + 7 type-half-life lockdown tests + the rest.

Test plan

  • uv run pytest -q → 24 passed
  • git log --show-signature -1Good "git" signature
  • staging-gate green

README claimed "16 tests"; actual count is 24 after the half-life
lockdown tests and the smoke test. Updates the line to 24 and explicitly
calls out the 3 pre-registered property tests plus the 7 type-half-life
lockdown tests so the breakdown is auditable from the README alone.
@robotrocketscience
robotrocketscience merged commit 5bcc69a into main Apr 27, 2026
8 checks passed
@robotrocketscience
robotrocketscience deleted the docs/correct-test-count branch April 27, 2026 00:59
robotrocketscience added a commit that referenced this pull request May 9, 2026
…dy for PR

Closes the mcp-builder audit of src/aelfrice/mcp_server.py started this
session. Resolves both CRITICAL findings, all six MAJOR findings, and
five of the eight MINOR findings. The deferred minors are documented
in this gate body for triage in follow-up issues.

## Commits in scope (10 atomic + 1 phase-1 gate before this)

  Phase 1 — server is startable and discoverable
    9adca85 feat(mcp): aelf mcp subcommand + python -m fallback
    904bfb0 feat(mcp): docstrings on all 12 wrappers + AST regression guard
    455eaac docs(mcp): document `aelf mcp` entrypoint + fix stale refs
    46df710 gate: phase 1

  Phase 2 — well-formed
    a7576ad feat(mcp): annotations on every @mcp.tool
    232d8ab feat(mcp): instructions= overview + 9-vs-12 stale comment fix
    5f21c29 fix(mcp): tool_lock structured error vs AssertionError

  Phase 3 — input/output discipline
    6c6bf6c feat(mcp): Pydantic Field constraints via Annotated
    174d245 feat(mcp): cursor pagination on tool_locked
    7f04675 feat(mcp): response_format=markdown on read tools

  Phase 4 — wrapper-layer testing
    0214c17 test(mcp): wrapper-layer tests via static AST + fastmcp shim

## Verification

- pytest 76/76 passing across MCP test files (40 prior + 36 new):
    test_mcp_server.py, test_mcp_lock_via_worker.py,
    test_mcp_wrapper_layer.py, test_cli_mcp.py
- aelf --help: 'mcp' subcommand visible with help string
- aelf mcp (no [mcp] extra): exits 1 with actionable stderr
- Static AST guards: docstrings, annotations, instructions=, store
  lifetime, no print()-to-stdout, all green
- fastmcp shim test: 12 tools register, all with full annotations,
  read-only / destructive sets match expected
- Discretion grep: clean (only mentions Claude Code/Desktop, both
  pre-existing on main as the intended MCP host targets)

## Audit findings closure

  CRITICAL  #1  Server unstartable  → CLOSED (Phase 1 C1)
  CRITICAL  #2  Empty tool descriptions  → CLOSED (Phase 1 C2)
  MAJOR     #3  No tool annotations  → CLOSED (Phase 2 M1)
  MAJOR     #4  No Pydantic input validation  → CLOSED (Phase 3 I1)
  MAJOR     #5  No server instructions=  → CLOSED (Phase 2 M2)
  MAJOR     #6  No README/docs MCP setup section  → CLOSED (Phase 1 C3)
  MAJOR     #7  Registration layer untested  → CLOSED (Phase 4)
  MAJOR     #8  tool_lock hard assert  → CLOSED (Phase 2 M4)
  MINOR    #11  No response_format enum  → CLOSED (Phase 3 I2)
  MINOR    #12  No pagination on aelf_locked  → CLOSED (Phase 3 I3)
  MINOR    #13  Stale 9-vs-12 tools comment  → CLOSED (Phase 2 M3)

## Deferred (file follow-up issues)

  MINOR    #1   Server name "aelfrice" vs convention "aelfrice_mcp"
                — backwards-compat break, not load-bearing. Defer.
  MINOR    #6   Sync handlers (no async def) — defensible for SQLite,
                revisit if/when an async I/O dep lands.
  MINOR    #14  Polymorphic tool_onboard (3 input shapes in one tool)
                — design call. Re-evaluate after host telemetry.
  MINOR    #15  Untyped fastmcp cast `_FastMCP: Any` — fastmcp lacks
                stubs upstream. Pragmatic; revisit when stubs ship.

## Behavior changes worth flagging in PR description

- `tool_locked` return shape: ADDED keys total/has_more/next_offset.
  Existing keys (kind/n/locked) preserved. Callers that consumed
  `n` as "total locks across all locks" should switch to `total`.
- `tool_locked` returns first 50 by default instead of all locks. Tests
  on stores with <50 locks behave identically.
- `tool_lock` returns lock.error dict (with `error` field) instead of
  raising AssertionError on empty derivation. Callers that grep for
  AssertionError need to update; callers that check `out["kind"]` are
  fine.

## Blockers (require user decision before next phase)

- [user] Open PR? Branch is local-only on `feat/mcp-server-properly-built`.
  Need a `git push -u github feat/mcp-server-properly-built` to land it,
  then `gh pr create`. Not done by this gate.
- [user] File the four deferred-minor follow-up issues now or after
  PR merge?
- [user] Resume parked feat/aelf-upgrade-imperative work next session?
  That branch has no commits but the worktree state is captured in the
  end-of-session handoff.

Open questions: (none)

Rollback:
- Whole branch: never merged → just delete `feat/mcp-server-properly-built`.
- Per-phase: `git revert <phase-commit-range>` (see commit list above).
robotrocketscience added a commit that referenced this pull request May 9, 2026
…dy for PR

Closes the mcp-builder audit of src/aelfrice/mcp_server.py started this
session. Resolves both CRITICAL findings, all six MAJOR findings, and
five of the eight MINOR findings. The deferred minors are documented
in this gate body for triage in follow-up issues.

## Commits in scope (10 atomic + 1 phase-1 gate before this)

  Phase 1 — server is startable and discoverable
    9adca85 feat(mcp): aelf mcp subcommand + python -m fallback
    904bfb0 feat(mcp): docstrings on all 12 wrappers + AST regression guard
    455eaac docs(mcp): document `aelf mcp` entrypoint + fix stale refs
    46df710 gate: phase 1

  Phase 2 — well-formed
    a7576ad feat(mcp): annotations on every @mcp.tool
    232d8ab feat(mcp): instructions= overview + 9-vs-12 stale comment fix
    5f21c29 fix(mcp): tool_lock structured error vs AssertionError

  Phase 3 — input/output discipline
    6c6bf6c feat(mcp): Pydantic Field constraints via Annotated
    174d245 feat(mcp): cursor pagination on tool_locked
    7f04675 feat(mcp): response_format=markdown on read tools

  Phase 4 — wrapper-layer testing
    0214c17 test(mcp): wrapper-layer tests via static AST + fastmcp shim

## Verification

- pytest 76/76 passing across MCP test files (40 prior + 36 new):
    test_mcp_server.py, test_mcp_lock_via_worker.py,
    test_mcp_wrapper_layer.py, test_cli_mcp.py
- aelf --help: 'mcp' subcommand visible with help string
- aelf mcp (no [mcp] extra): exits 1 with actionable stderr
- Static AST guards: docstrings, annotations, instructions=, store
  lifetime, no print()-to-stdout, all green
- fastmcp shim test: 12 tools register, all with full annotations,
  read-only / destructive sets match expected
- Discretion grep: clean (only mentions Claude Code/Desktop, both
  pre-existing on main as the intended MCP host targets)

## Audit findings closure

  CRITICAL  #1  Server unstartable  → CLOSED (Phase 1 C1)
  CRITICAL  #2  Empty tool descriptions  → CLOSED (Phase 1 C2)
  MAJOR     #3  No tool annotations  → CLOSED (Phase 2 M1)
  MAJOR     #4  No Pydantic input validation  → CLOSED (Phase 3 I1)
  MAJOR     #5  No server instructions=  → CLOSED (Phase 2 M2)
  MAJOR     #6  No README/docs MCP setup section  → CLOSED (Phase 1 C3)
  MAJOR     #7  Registration layer untested  → CLOSED (Phase 4)
  MAJOR     #8  tool_lock hard assert  → CLOSED (Phase 2 M4)
  MINOR    #11  No response_format enum  → CLOSED (Phase 3 I2)
  MINOR    #12  No pagination on aelf_locked  → CLOSED (Phase 3 I3)
  MINOR    #13  Stale 9-vs-12 tools comment  → CLOSED (Phase 2 M3)

## Deferred (file follow-up issues)

  MINOR    #1   Server name "aelfrice" vs convention "aelfrice_mcp"
                — backwards-compat break, not load-bearing. Defer.
  MINOR    #6   Sync handlers (no async def) — defensible for SQLite,
                revisit if/when an async I/O dep lands.
  MINOR    #14  Polymorphic tool_onboard (3 input shapes in one tool)
                — design call. Re-evaluate after host telemetry.
  MINOR    #15  Untyped fastmcp cast `_FastMCP: Any` — fastmcp lacks
                stubs upstream. Pragmatic; revisit when stubs ship.

## Behavior changes worth flagging in PR description

- `tool_locked` return shape: ADDED keys total/has_more/next_offset.
  Existing keys (kind/n/locked) preserved. Callers that consumed
  `n` as "total locks across all locks" should switch to `total`.
- `tool_locked` returns first 50 by default instead of all locks. Tests
  on stores with <50 locks behave identically.
- `tool_lock` returns lock.error dict (with `error` field) instead of
  raising AssertionError on empty derivation. Callers that grep for
  AssertionError need to update; callers that check `out["kind"]` are
  fine.

## Blockers (require user decision before next phase)

- [user] Open PR? Branch is local-only on `feat/mcp-server-properly-built`.
  Need a `git push -u github feat/mcp-server-properly-built` to land it,
  then `gh pr create`. Not done by this gate.
- [user] File the four deferred-minor follow-up issues now or after
  PR merge?
- [user] Resume parked feat/aelf-upgrade-imperative work next session?
  That branch has no commits but the worktree state is captured in the
  end-of-session handoff.

Open questions: (none)

Rollback:
- Whole branch: never merged → just delete `feat/mcp-server-properly-built`.
- Per-phase: `git revert <phase-commit-range>` (see commit list above).
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