Install
$ agentstack add skill-iurykrieger-claude-bedrock-ask ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
/bedrock:ask — Adaptive Vault Reader
Plugin Paths
Entity definitions and templates are in the plugin directory, not at the vault root. Use the "Base directory for this skill" provided at invocation to resolve the paths:
- Entity definitions:
/../../entities/ - Templates:
/../../templates/{type}/_template.md - Plugin CLAUDE.md:
/../../CLAUDE.md(already automatically injected into context)
Where `` is the path provided in "Base directory for this skill".
Vault Resolution
Resolve which vault to query. This skill can be invoked from any directory.
Step 1 — Parse --vault flag: Check if the input arguments include --vault . If found, extract the vault name and remove it from the arguments (the remaining text is the question).
Step 2 — Resolve vault path:
- If
--vaultwas provided:
Read the vault registry at /../../vaults.json. Find the entry matching the name. If not found: error — "Vault ` is not registered. Run /bedrock:vaults to see available vaults." If found: set VAULT_PATH to the entry's path` value.
- If no
--vaultflag — CWD detection:
Read /../../vaults.json. Check if the current working directory is inside any registered vault path (CWD starts with a registered vault's absolute path). If multiple match, use the longest path (most specific). If found: set VAULT_PATH to the matching vault's path.
- If CWD detection fails — default vault:
From the registry, find the vault with "default": true. If found: set VAULT_PATH to the default vault's path.
- If no resolution:
Error — "No vault resolved. Available vaults:" followed by the registry listing. "Use --vault to specify, or run /bedrock:setup to register a vault."
Step 3 — Validate vault path:
test -d "" && echo "exists" || echo "missing"
If missing: error — "Vault path ` does not exist on disk. Run /bedrock:setup` to re-register."
Step 4 — Read vault config:
cat /.bedrock/config.json 2>/dev/null
Extract language and other relevant fields for use in later phases.
From this point forward, ALL vault file operations use `` as the root.
- Entity directories:
/actors/,/people/, etc. - Graphify output:
/graphify-out/
Overview
This skill receives a natural language question and answers it using an adaptive, vault-first approach. It always reads vault content first, then decides whether to escalate to graphify or /learn ased on what's actually needed — not what the question looks like in isolation.
You are an adaptive context orchestrator agent. You only READ — never write, edit, or delete files directly.
Writes happen exclusively through /bedrock:learn delegation (which flows through /bedrock:preserve). If the query reveals outdated or missing information and no remote source is available to ingest, suggest that the user run /bedrock:preserve or /bedrock:learn to update the vault.
Phase 0 — Read Configuration
0.1 Load config
Read .bedrock/config.json from the vault root:
if [ -f ".bedrock/config.json" ]; then
cat .bedrock/config.json
else
echo "config_not_found"
fi
- If config exists: extract the value of
query.max_graphify_calls. Store asmax_graphify_calls. - If config does not exist or field is absent: set
max_graphify_calls = 3(default). - Valid range: 1–5. If the value is outside this range, clamp to the nearest bound and log a warning.
Phase 1 — Analyze the Question
1.1 Classify the question
Read the user's question and identify:
- Mentioned entities — names of systems, people, teams, topics, projects, or discussions.
They may appear as:
- Exact filename (e.g.: "billing-api", "squad-payments")
- Human-readable name (e.g.: "Billing API", "Squad Payments")
- Alias or acronym (e.g.: "BillingAPI", "BRB")
- Contextual reference (e.g.: "the billing service", "the notifications team")
- Relevant domain(s) —
payments,notifications,orders,integrations,checkout,compliance,internal-tools.
Infer from the mentioned entities or the question context.
- Type of information sought:
- Status/overview — "what is X?", "what's the status of X?"
- Architecture/stack — "how does X work?", "what's the stack of X?"
- People/teams — "who owns X?", "who works with Y?"
- History/decisions — "what was decided about X?", "what happened with Y?"
- Relationships — "what depends on X?", "how does Y relate to Z?"
- Deprecation — "what is being deprecated?", "what's the deprecation plan for X?"
1.2 Assess clarity
If the question is too ambiguous to produce a targeted search (e.g.: "tell me everything", "how does the system work?", "what's going on?"), ask for clarification:
> "Your question is broad. Can you specify: which system, team, or topic would you like to know more about?"
If the question mentions something that clearly isn't part of the vault (e.g.: something personal, unrelated technology), inform: "I didn't find anything in the vault about this."
1.3 Phase 1 classification result
At the end, you should have:
- search_terms: list of names, aliases, and keywords to search for
- domains: list of relevant domains (may be empty if not identified)
- info_type: classification of the type of information sought
- explicit_entities: entities mentioned directly by name (if any)
Phase 2 — Graph-First Search
This phase always runs for every question. It uses the cumulative knowledge graph as the primary index when available, falling back to glob/grep for terms not represented in the graph. Never skip this phase.
2.0 Check graph.json and score nodes
Before any glob/grep, check if the cumulative knowledge graph is available:
if [ -f "/graphify-out/graph.json" ] && [ -s "/graphify-out/graph.json" ]; then
echo "graph_available"
else
echo "graph_not_available"
fi
If graph_available:
- Read
/graphify-out/graph.json— extract only thenodesarray (skip edges to avoid context explosion on large graphs). If the nodes array exceeds 500 entries, read only the first 500 — graphify orders nodes by centrality, so high-value nodes come first.
- From the nodes array, extract per node:
id,label,file_type,source_file,community,is_god_node.
- Score nodes by relevance to the search terms from Phase 1:
- Primary signal: node
labelcontains or closely matches any search term - Secondary signal: node belongs to a community that contains other high-scoring nodes (community resonance)
- Boost:
is_god_node: truenodes get elevated priority when their label is even loosely relevant to the query
- Select top N nodes (N ≤ 15, same limit as the current entity read budget). Track which search terms produced ≥ 1 matching node and which produced none.
- For each selected node with a non-null
source_file:
- Resolve the corresponding vault
.mdfile: search for thesource_filebasename in entity directories
`` Glob: /actors/.md, /people/.md, /teams/.md, /topics/**.md, /discussions/**.md, /projects/.md ``
- If found: read the full entity file — this node is fully resolved (skip steps 2.2–2.4 for this entity)
- If not found: record graph metadata only (label, community, relevant edge labels) — use this metadata in Phase 5 response to surface the concept even without a vault file
- For each search term that produced zero matching graph nodes → proceed to steps 2.2–2.4 (glob/grep) for that term only.
If graph_not_available: Skip to step 2.1. No warning — this is the normal path for fresh vaults.
2.1 Read entity definitions
Use Read to read the entity definition files from the plugin (see "Plugin Paths" section):
- If the question is about a system → read
/../../entities/actor.md - If the question is about a person → read
/../../entities/person.md - If the question is about a team → read
/../../entities/team.md - If the question is about a topic/deprecation → read
/../../entities/topic.md - If the question is about a meeting/decision → read
/../../entities/discussion.md - If the question is about a project/initiative → read
/../../entities/project.md - If you don't know the type → read all entity definitions from the plugin to classify correctly
2.2 Search entities by name and alias
For each search term identified in Phase 1:
Step 1 — Search by filename:
Glob: /actors/*.md, /people/*.md, /teams/*.md,
/topics/**.md, /discussions/**.md, /projects/*.md,
/fleeting/**.md
Step 2 — Search by alias in frontmatter:
Grep: pattern="aliases:.*" in directories: /actors/, /people/, /teams/,
/topics/, /discussions/, /projects/
(case-insensitive)
Step 3 — Search by name in frontmatter:
Grep: pattern="name:.*" or pattern="title:.*"
in the same directories (case-insensitive)
Step 4 — Search by content (fallback): If steps 1-3 did not return sufficient results:
Grep: pattern="" in entity directories (case-insensitive)
2.3 Filter by domain
If domains were identified in Phase 1, filter results:
Grep: pattern="domain/" in the found files (tags field of frontmatter)
Keep all results, but prioritize those matching the domain.
2.4 Read found entities
For each entity found (limit: 15 entities):
- Read the frontmatter first (~first 30 lines) to confirm relevance
- If relevant: read the full file
- If not relevant (false positive from Grep): discard
Record for each entity read:
- filename, type, name
- wikilinks found in frontmatter and body
- external URLs found in the content (Confluence, Google Docs, GitHub)
- Explicit date in the filename (if any)
2.5 Follow wikilinks (1 level of depth)
For each extracted wikilink that is relevant to the question:
- Resolve the file: search for
.mdin entity directories
`` Glob: /actors/.md, /people/.md, /teams/.md, /topics/**.md, /discussions/**.md, /projects/.md ``
- Read the found file (frontmatter + body)
- Do NOT follow wikilinks from this second level — stop here to avoid context explosion
Relevance criteria for following a wikilink:
- The question is about relationships ("who owns", "what depends on") → follow all
- The question is about status/overview → follow team, people (focal points)
- The question is about history → follow related discussions, topics
- The question is about architecture → follow dependent actors
Limit: Do not read more than 15 entities total (2.4 + 2.5 combined). If the limit is reached, prioritize entities directly mentioned in the question.
2.6 Phase 2 output
At the end of Phase 2, you have:
- A set of vault entities with their full content (resolved from graph nodes or grep)
- Graph-only nodes: concepts/entities from
graph.jsonwith no vault.md(label + community + edge metadata only) - Wikilinks between resolved entities (structural relationships)
- External URLs found in entity content (Confluence, GDocs, GitHub)
- A record of which search terms were covered by the graph vs. which fell back to grep
- A sense of whether the vault content covers the question
Phase 3 — Context Assessment + Conditional Escalation
This is the core decision point. After reading vault content in Phase 2, assess whether you have enough context to answer the question.
3.1 Self-Assessment
Evaluate the vault content you read in Phase 2 against the original question. Determine one of three outcomes:
vault_sufficient — You have enough information to compose a good answer. Indicators:
- The question is factual/status/ownership and the vault entities contain a clear answer
- Examples: "who owns X", "what's the status of Y", "what team manages Z", "what is X"
- The entities read in Phase 2 directly address the question
- No significant gaps in the information
needs_graphify — The vault content is partial but the knowledge graph could fill the gaps. Indicators:
- The question involves code-level relationships, cross-domain dependencies, or architectural paths
- The vault entities reference systems whose connections aren't explicit in the markdown
- You feel you're missing structural context that the knowledge graph could provide
- Examples: "how does X connect to Y at the code level", "what are the dependencies of X", "trace the data flow from A to B"
needs_remote_content — The vault entities reference external URLs that appear directly relevant to the question, but the content behind those URLs isn't ingested in the vault. Indicators:
- An entity's
sourcesfield or body text contains a URL (Confluence, GDocs, GitHub) that likely holds the answer - The question asks about something documented externally (e.g., "what's the runbook for X" and the entity links to a Confluence page)
- The vault has a pointer to the answer but not the answer itself
Priority when multiple outcomes apply: needs_remote_content > needs_graphify > vault_sufficient
Rationale: remote content must be internalized first for the vault to be complete. Graphify can run on richer data after ingestion. If both apply, handle remote content first, then re-assess whether graphify is still needed.
After determining the outcome:
vault_sufficient→ skip directly to Phase 4 (recency) then Phase 5 (respond)needs_graphify→ proceed to Phase 3-Gneeds_remote_content→ proceed to Phase 3-T
Phase 3-G — Graphify Escalation
Execute only when the self-assessment determines needs_graphify.
3-G.0 Assess graph coverage
Before escalating to a live /graphify call, assess whether the cumulative graph.json already covers the gap identified in Phase 3.1. Live /graphify invocations are a last resort — they re-extract what is likely already indexed.
Step 1 — Check if graph was available in Phase 2.0:
- If Phase 2.0 determined
graph_not_available: display the warning below, ask the user whether to build the graph now, and wait for their response before proceeding. - If Phase 2.0 determined
graph_available: proceed to Step 2.
> [!warning] Knowledge graph unavailable > The knowledge graph is not available (/graphify-out/graph.json missing or empty). > The answer below is based on vault content only — it may be incomplete for this type of question.
After displaying the warning, ask the user:
> "O knowledge graph não está disponível, o que pode tornar esta resposta incompleta. Deseja reconstruí-lo agora antes de continuar? > Se sim, rode: /graphify build — isso indexa todos os atores cadastrados no vault e pode levar alguns minutos. > Responda sim para aguardar e tentar novamente, ou não para continuar com o conteúdo disponível."
- If the user responds "sim" (or equivalent affirmative):
- Inform: "Aguardando
/graphify build…" - Invoke
/graphify buildvia the Skill tool - After completion, re-run the Phase 2.0 availability check
- If
graph.jsonis now available, continue to Step 2 - If still unavailable: inform the user and skip to Phase 4 with vault-only content
- If the user responds "não" (or equivalent negative), or does not respond:
Skip to Phase 4 with vault-only content. Never block indefinitely.
Step 2 — Assess coverage for the specific gap:
Using the nodes collected in Phase 2.0, evaluate whether the gap identified in Phase 3.1 is covered:
- If the gap is about relationships or dependencies: check whether
graph.jsonnodes for the relevant entities have edges. If yes, read the edges section ofgraph.jsonfiltered to those node IDs and incorporate into the working context. Only invoke live/graphifyif edges are also insufficient. - If the gap is about a domain or concept with zero graph nodes (Phase 2.0 produced no matches for those searc
…
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: iurykrieger
- Source: iurykrieger/claude-bedrock
- License: MIT
- Homepage: https://claude-bedrock.vercel.app
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.