attest manifest: the integration facts, derived not transcribed - #15
Merged
Merged
Conversation
agentmarkit consumes attestation as a first-class dependency of its academic-research-assistant starter, and had to hand-copy ~40 facts about it into its own repo -- lab/docs/01-attestation-runtime-map.md in prose plus lab/presets/research-attestation/preset.yaml. Entry points, the seven skill names, resolve_db_path's ladder, env var names including the legacy RSS_DB, and which capabilities survive without a model. Hand-copied facts rot. Their pin sits 81 commits stale, and HERMES_HOME is absent from the map entirely because it postdates the transcription by a day. Everything printed is DERIVED: version and requires-python from installed metadata, console scripts from the entry points, skills from the shipped directory, surfaces from AGENT_SURFACES. Adding an eighth skill or a fifth surface needs no edit here, which is the whole point -- emit.py's docstring already says it: "two copies of one fact with no check between them is the whole problem". No credentials, by construction. agentmarkit's preset schema bans url/token/ api_key/secret from an MCP declaration, on the rule that a package declares a server should EXIST while only the instance holds its address and key. That rule is right independently of who reads it, so the manifest says attest-mcp exists and how to verify it, never where it lives. A test asserts it. Deliberately NOT a preset: their schema needs 15 required keys and most are genuinely theirs (agent37 template digests, teardown_steps, profile distribution). This feeds about six of them; a human writes the rest. Verified from an INSTALLED WHEEL with no pyproject.toml and cwd outside the checkout -- the actual packager case -- where the metadata fallbacks are what carry version, scripts and the skill list. test_db_precedence_matches_resolve_db_path drives the real function rather than reading the tuple back, so the ladder cannot silently diverge. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
agentmarkit consumes attestation as a first-class dependency of its
academic-research-assistantstarter, and had to hand-copy ~40 facts about it into its own repo —lab/docs/01-attestation-runtime-map.mdin prose, pluslab/presets/research-attestation/preset.yaml. Entry points, the seven skill names,resolve_db_path's ladder, env var names including the legacyRSS_DB, and which capabilities survive without a model.Hand-copied facts rot. Two are already wrong: their pin sits 81 commits stale, and
HERMES_HOMEis absent from the map entirely because it postdates the transcription by a day.What
attest manifestprints JSON that attestation derives from itself:{ "schema": "attestation/manifest/1", "version": "0.2.0", "console_scripts": {"attest": "...", "attestation": "...", "attest-mcp": "..."}, "mcp_servers": [{"name": "attest-mcp", "transport": "stdio", "verify": "attest install --check"}], "surfaces": {"feed": {...}, "provenance": {...}, "knowledge": {...}, "symbolic": {...}}, "skills": ["attestation-annotate", "... 7 total"], "env": {"HERMES_HOME": {...}, "ATTEST_DB": {"legacy_alias": "RSS_DB"}, ...}, "db_path_precedence": ["explicit --db", "ATTEST_DB, or RSS_DB", "...", "./hermes.db"], "degrades_without_model": {"still_works": [...], "unavailable": [...]} }Derived, never typed. Version and
requires-pythonfrom installed metadata, console scripts from entry points, skills from the shipped directory, surfaces fromAGENT_SURFACES. An eighth skill or a fifth surface needs no edit here — which is the point.emit.py's docstring already says it: "two copies of one fact with no check between them is the whole problem."No credentials, by construction. agentmarkit's preset schema bans
url/token/api_key/secretfrom an MCP declaration, on the rule that "a package declares that a server should exist; only the instance holds its address and its credential." That rule is right independently of who reads it, so the manifest saysattest-mcpexists and how to verify it — never where it lives.test_manifest_declares_no_credentialsasserts it.Deliberately not a preset
Their schema needs 15 required keys and most are genuinely theirs —
agent37template digests,teardown_steps,profile_distribution, pricing-adjacent status. This feeds about six of them; a human writes the rest. attestation shouldn't know those keys exist.Verified
pyproject.tomland cwd outside the checkout — the actual packager case, where theimportlib.metadatafallbacks carry version, scripts and the skill list. 7 skills, 4 surfaces, correct version.test_db_precedence_matches_resolve_db_pathdrives the real function rather than reading the tuple back, so the documented ladder cannot silently diverge from the code.One flake worth noting:
test_every_output_block_of_an_offline_path_is_real[flows]failed once under full-suite load and passes in isolation both with and without this change — I checked against cleanmainbefore concluding it wasn't mine.Note on timing
Nothing reads a source-published manifest today —
export_starters.pyreads only in-repo YAML, andsync_sources.pynever opens a file inside a checkout. This is a producer ahead of its consumer. It is small and fully tested, but its value turns on agentmarkit reading it; the natural join point issync_sources.py, where a pinned checkout already exists.🤖 Generated with Claude Code