Repository navigation
feat: resolve SecID-Service backlog (#11, #20, #22, #44) - #64
Merged
Merged
Conversation
… tool contract hashes, feedback TTL, Node 24 actions (#11, #20, #22, #44) - Return a single namespace-level metadata result (official_name, common_name, alternate_names, notes, urls, wikidata, wikipedia, source_count: 0, optional country) in listSources() when match_nodes is empty, and relocate alternate_names under registry_text_untrusted across the MCP boundary (#11). - Add MCP tool contract hashes (io.cloudsecurityalliance.secid/contractHash and io.cloudsecurityalliance.secid/changed) to tools/list _meta via RFC 8785 JCS SHA-256 and add the describe_changes(since?) MCP tool (#44). - Add resolveFeedback(kv, id, resolutionNote?) with a 30-day KV TTL on resolved feedback items while keeping open inbox items without TTL, and update OPERATIONAL-RESOURCES.md, BACKUP-RESOURCES.md, and INTERFACE-RESOURCES.md (#22). - Bump actions/checkout to v7.0.1 and actions/setup-node to v7.1.0 (SHA-pinned Node 24 releases) across CI and deploy workflows (#20). - Record ADR-016, ADR-017, ADR-018, and ADR-019 in DECISIONS.md. Fixes #11 Fixes #20 Fixes #22 Fixes #44 AI-Agent: Gemini
…less RegistryResult - Tighten isEmptyNamespaceListing in src/api.ts to require exact normalized secid match and absence of source weight - Add 2026-11-04T00:00:00Z lookup tool change entry to TOOL_CHANGE_LOG and update LOOKUP_DESCRIPTION - Exclude URL-less RegistryResult notes when ?lang= qualifier is active in applyQualifierFilters and check buildLangNotFoundMessage when filtered is null - Update AGENTS.md and REVIEW.md for 5 MCP tools, src/tool-changes.ts, and alternate_names in UNTRUSTED_TEXT_KEYS - Seed secid:* name_index in test/country-filter.test.ts and add regression tests AI-Agent: Gemini
This was referenced Nov 5, 2026
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.
Agent: Gemini (SecID governing agent)
Summary
Resolves the 4 open issues in the
SecID-Servicebacklog plus?lang=qualifier parity for URL-lessRegistryResultnotes:Closes CI: bump actions/checkout@v4 and actions/setup-node@v4 (Node 20 deprecation) #20 — CI Node 24 Action Bumps (
ADR-016):actions/checkout(v4→de0fac2e4500dabe0009e67214ff5f5447ce83dd # v7.0.1) andactions/setup-node(v4→48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v7.1.0) across.github/workflows/ci.ymland.github/workflows/registry-kv-upload.ymlwith immutable commit SHAs ahead of GitHub's Node 20 deprecation deadline.Closes secid_FEEDBACK KV writes set no expirationTtl — the 30-day policy was only applied to the error store #22 —
secid_FEEDBACKKV Retention & Resource Doc Sync (ADR-017):expirationTtl) until triaged so nothing silently expires.resolveFeedback(kv, id, status)andRESOLVED_FEEDBACK_TTL_SECONDS = 2_592_000(30 days) insrc/feedback.tsso resolved/wontfix items expire automatically 30 days after triage.OPERATIONAL-RESOURCES.md,BACKUP-RESOURCES.md, andINTERFACE-RESOURCES.md.Closes Resolver returns empty results for namespace-level entity queries with empty match_nodes #11 — Empty
match_nodesNamespace Metadata (ADR-018) &?lang=URL-less Filter Parity:parsed.name === null && parsed.subpath === null) matches a file whosematch_nodesis empty ([]), the resolver now returnsstatus: "found"with a namespace-levelRegistryResultcontainingofficial_name,common_name,alternate_names,urls, andnotes, withsource_count: 0in the API response."alternate_names"toUNTRUSTED_TEXT_KEYSinsrc/sanitize.ts.applyQualifierFiltersinsrc/resolver.tsso?lang=excludes URL-lessRegistryResultentries (matchingcontent_typeandparsability) and checksbuildLangNotFoundMessagewhenfiltered === null.Closes Pilot: MCP tool change log (describe_changes since a timestamp) + tool contract hashes #44 — MCP Tool Change Log (
describe_changes) & Contract Hashes (ADR-019):src/tool-changes.tswith deterministic FNV-1a 64-bit contract hashing (computeToolContractHash,buildToolMeta) and structured change history (TOOL_CHANGE_LOG,queryToolChanges).tools/listnow includes_meta: { "secid/contractHash": "fnv1a64:...", "secid/lastChanged": "..." }.describe_changesMCP tool (readOnlyHint: true,idempotentHint: true,openWorldHint: false) accepting optionalsince(ISO 8601) andtoolparameters.Verification
npm run typecheck: passed (0 errors)npx vitest run: 17 test files, 1,350 passed, 0 failedtest/feedback.test.ts,test/mcp.test.ts,test/resolver.test.ts,test/sanitize.test.ts,test/country-filter.test.ts, ande2e/mcp.spec.ts.Two-Review Summary
REVIEW.mdandAGENTS.mdinvariants (escaping/sanitization onalternate_names,X-Content-Type-Options: nosniff, immutable SHA pinning on GitHub Actions, read-only MCP annotations, and parity withSecID-Server-API).codex review --base main):src/api.ts):isEmptyNamespaceListingcheckedresults.length === 1 && !("url" in results[0]) && Array.isArray(results[0].data?.urls), which could misclassify a single URL-less source node that happens to carrydata.urlsas a 0-source namespace listing. Fix: TightenedisEmptyNamespaceListingto also requirefirstResult.data.weight === undefinedand normalizedfirstResult.secid === decodedQueryTarget. Added unit test intest/resolver.test.ts.src/tool-changes.ts):TOOL_CHANGE_LOGomitted thelookuptool (#11changes namespace-levellookupresponses fromnot_foundtofound), leavinglookup's_meta["secid/lastChanged"]at the initial baseline. Fix: Added a2026-11-04T00:00:00Zlookupchange entry inTOOL_CHANGE_LOGand documented the behavior inLOOKUP_DESCRIPTION.