AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
Foundry IQ provides a structured framework for creating, diagnosing, and connecting knowledge bases to AI agents. It supports making local or Blob-based documents searchable, managing multi-source knowledge configurations, and retrieving information with citations. The skill emphasizes strict adherence to defined procedures for service discovery, resource creation, and troubleshooting to ensure reliable agent-knowledge integration.
What it does
- Creates searchable knowledge bases from local or Azure Blob storage documents.
- Connects existing knowledge bases to AI agents.
- Diagnoses issues with knowledge base configurations or unsupported connectors.
- Retrieves information from knowledge bases with source citations.
- Manages the lifecycle of search services and knowledge sources.
- Routes requests based on specific operational needs rather than source counts.
When to use it
- When you need to make local or cloud-stored documents searchable by an AI agent.
- When connecting an existing knowledge base to a new or current agent.
- When troubleshooting or diagnosing a knowledge base configuration.
- When you need to create a new search service or knowledge source.
- When performing retrieval tasks that require citations from a knowledge base.
Advantages
- Provides a clear, procedural approach to knowledge base management.
- Ensures consistent handling of multi-source knowledge configurations.
- Includes built-in diagnostic paths for troubleshooting.
- Supports secure, citation-backed retrieval for agent responses.
- Prevents unauthorized or unsupported configuration changes.
Usage examples
- “Create a new knowledge base from my Azure Blob container.”
- The agent will initiate the knowledge base creation procedure, validating the source and setting up the necessary search indexing.
- “Connect my existing knowledge base to the current agent.”
- The agent will follow the connection workflow to link the specified knowledge base to the agent's retrieval pipeline.
- “Why is my multi-source knowledge base failing to index?”
- The agent will trigger the diagnostic procedure to identify configuration drifts or unsupported connector issues.
- “Retrieve information about project timelines from the knowledge base.”
- The agent will query the knowledge base and provide an answer with citations from the source documents.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/microsoft/foundry-iq/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip foundry-iq.zip -d .agents/skills
Documentation by Microsoft
Foundry IQ
Read one procedure before questions/actions; invocation is not a read.
Read the owning procedure before blocked/unsupported responses too.
Before mutation plans/approval, successfully read its required pre-action references, selected
branches only. Do not reload successful reads. On failure, try only permitted
bounded exact-path reads with any supported reader; never bypass restrictions
or search broadly. If still unavailable: blocked: reference-unavailable, name
missing references and inability to plan. Never invent requirements/plans.
Failures first.
Cleanup and receipt-backed execution go directly to their lifecycle/producer owner; do not reopen Search intake, provisioning or hardening.
Before expensive service discovery, reuse supplied resource/intent; otherwise ask one early USE EXISTING / FIND CANDIDATES / CREATE NEW choice. Only FIND enumerates; supplied identity uses exact/minimum scoped resolution. CREATE checks its proposed name, not existing-service inventories. Preserve these answers across source/KB/CU/model handoffs; selection is not write approval.
Searchable docs: KB + validated retrieval. Confirm intent once; KS-only must be explicit. Child success is not KB completion. Unclear/compound/mode/completion: read.
Route by requested operation, not existing KB source count. Connecting an existing KB with two or more sources, without changing the KB, uses Connect. Read-only operations use their owning procedure and actual helper constraints; this does not add retrieval modes or supported source kinds. Explicit unsupported provisioning or multi-source KB creation/reconfiguration uses Diagnose and stops before discovery, even when connecting an agent is also requested. This routing takes precedence over classic-search terms (e.g. hybrid search) in compound requests. Never end in a plain refusal: Diagnose gives the boundary, docs pointer and agent handoff; writes still need an approved concrete plan. Do not silently execute only the supported part of a compound request. If existing-KB connection versus KB creation/reconfiguration is unclear, read intent-routing and clarify that scope before Azure discovery. Never infer KB mutation.
| Outcome | Read |
|---|---|
| Cleanup | Plan cleanup |
| Failure/drift | Diagnose |
| Unsupported connector provisioning / multi-source KB creation or reconfiguration | Diagnose |
| Connect | Connect |
| Read KB | Query |
| Search only | Search |
| File KS only | File |
| Blob/ADLS KS only | Blob |
| Searchable/KB | KB |
Generic agents: microsoft-foundry.
Reads: no approval; approve unchanged plans before writes.
Hide hashes. No Search/Storage keys, scope widening, guessed identity/boundaries,
drift repair or joint cleanup/creation approval. Acceptance != success.
Files
- ATTRIBUTION.mdAdded by AutoGineer977 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md3.7 KiB
- agents/connect-hosted-toolbox.md7.8 KiB
- agents/connect-hosted.md7.8 KiB
- agents/connect-prompt-sdk-fallback.md7.8 KiB
- agents/connect.md7.8 KiB
- agents/create-missing-agent.md7.8 KiB
- helpers/_blob_observation.pyScript4.4 KiB
- helpers/_blob_source_read.pyScript39.5 KiB
- helpers/_bootstrap_io.pyScript30.1 KiB
- helpers/_cleanup_dependencies.pyScript27.5 KiB
- helpers/_cleanup_receipts.pyScript13.5 KiB
- helpers/_common.pyScript36.2 KiB
- helpers/_document_adapters.pyScript15.0 KiB
- helpers/_document_limits.pyScript3.9 KiB
- helpers/_embedding.pyScript7.0 KiB
- helpers/_file_inventory.pyScript24.4 KiB
- helpers/_file_source_config.pyScript15.6 KiB
- helpers/_indexer_observation.pyScript7.1 KiB
- helpers/_initial_prompt.pyScript12.5 KiB
- helpers/_private_json.pyScript2.4 KiB
- helpers/_progress.pyScript12.1 KiB
- helpers/_prompt_read.pyScript17.7 KiB
- helpers/_search_read.pyScript6.0 KiB
- helpers/_source_readback.pyScript1.6 KiB
- helpers/blob-contracts.md7.8 KiB
- helpers/blob-cu-contracts.md7.8 KiB
- helpers/blob_inventory.pyScript17.1 KiB
- helpers/blob_recheck.pyScript64.6 KiB
- helpers/blob_source.pyScript35.8 KiB
- helpers/bootstrap-contracts.md7.8 KiB
- helpers/bootstrap_azure.pyScript41.5 KiB
- helpers/cleanup_plan.pyScript41.4 KiB
- helpers/contracts.md7.8 KiB
- helpers/cu_ingestion_auth.pyScript12.5 KiB
- helpers/document-assessment.md7.8 KiB
- helpers/document_assess.pyScript14.0 KiB
- helpers/file-upload-recovery.md7.8 KiB
- helpers/file_cu_canary.pyScript32.7 KiB
- helpers/file_cu_mi.pyScript9.6 KiB
- helpers/file_ingest.pyScript15.4 KiB
- helpers/file_source.pyScript31.7 KiB
- helpers/file_upload.pyScript53.7 KiB
- helpers/hosted_connect.pyScript30.8 KiB
- helpers/kb-contracts.md7.8 KiB
- helpers/knowledge_base_retrieve.pyScript7.7 KiB
- helpers/model-discovery-contracts.md7.8 KiB
- helpers/model-discovery-scopes.md7.8 KiB
- helpers/model_discovery.pyScript23.7 KiB
- helpers/private-artifacts.md7.2 KiB
- helpers/private_artifacts.pyScript4.8 KiB
- helpers/prompt_cleanup.pyScript22.0 KiB
- helpers/prompt_connect.pyScript62.3 KiB
- helpers/requirements-assessment.txt103 B
- helpers/retrieval-verification-contracts.md7.8 KiB
- helpers/retrieval_verify.pyScript19.6 KiB
- helpers/search-intake-contracts.md7.6 KiB
- helpers/search_intake.pyScript18.4 KiB
- helpers/search_reconcile.pyScript59.7 KiB
- helpers/source_vector.pyScript33.2 KiB
- helpers/throttle-recovery.md5.0 KiB
- helpers/vector-contracts.md7.8 KiB
- knowledge-bases/create.md8.1 KiB
- knowledge-bases/retrieve.md7.8 KiB
- knowledge-sources/create-azure-blob.md7.8 KiB
- knowledge-sources/create-file.md7.8 KiB
- lifecycle/cleanup.md7.8 KiB
- references/abstention.md1.0 KiB
- references/blob-binding-evidence.md7.8 KiB
- references/blob-indexer-observation.md7.7 KiB
- references/blob-ingestion-progress.md6.5 KiB
- references/blob-readiness-recheck.md7.8 KiB
- references/blob-vector-readiness.md2.6 KiB
- references/bootstrap-azure.md7.8 KiB
- references/content-fit.md7.8 KiB
- references/cu-ingestion.md7.8 KiB
- references/file-cu-canary.md7.8 KiB
- references/intent-routing.md7.7 KiB
- references/owner.md2.1 KiB
- references/platform-contracts.md7.7 KiB
- references/platform-interfaces.md7.8 KiB
- references/resource-intake.md7.8 KiB
- references/search-substrate.md7.8 KiB
- references/standard-cu.md7.8 KiB
- search-services/create.md7.8 KiB
- troubleshooting/diagnose.md8.7 KiB
helpers/_indexer_observation.py
"""Private, versioned evidence for generated indexers; no service operations."""
from __future__ import annotations
import re
from datetime import datetime, timedelta, timezone
try:
from ._common import HelperFailure, digest
except ImportError:
from _common import HelperFailure, digest
PROJECTION_FIELDS = {"non_schedule_digest", "schedule_digest", "schedule_raw_digest"}
TICKS = 10_000_000
DURATION = re.compile(r"P(?:(?P<days>[0-9]{1,9})D)?(?:T(?:(?P<hours>[0-9]{1,9})H)?"
r"(?:(?P<minutes>[0-9]{1,9})M)?(?:(?P<seconds>[0-9]{1,9})(?:\.(?P<fraction>[0-9]{1,7}))?S)?)?")
INSTANT = re.compile(r"([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})"
r"(?:\.([0-9]{1,7}))?(Z|[+-][0-9]{2}:[0-9]{2})")
def note(diagnostics, severity, code, field, message, request_id):
entry = dict(severity=severity, code=code, field=field, message=message, request_id=request_id)
if entry not in diagnostics:
diagnostics.append(entry)
def failure(diagnostics, code, field, message, request_id):
note(diagnostics, "error", code, field, message, request_id)
return HelperFailure(code, message, blocked_at="indexer-verification", request_id=request_id)
def interval(value):
match = DURATION.fullmatch(value) if isinstance(value, str) and len(value) <= 96 else None
if not match or not any(match.group(k) for k in ("days", "hours", "minutes", "seconds")):
raise ValueError("Unsupported duration")
if "T" in value and not any(match.group(k) for k in ("hours", "minutes", "seconds")):
raise ValueError("Empty time component")
parts = match.groupdict()
seconds = sum(int(parts[k] or 0) * scale for k, scale in
(("days", 86400), ("hours", 3600), ("minutes", 60), ("seconds", 1)))
ticks = seconds * TICKS + int((parts["fraction"] or "").ljust(7, "0"))
if not 300 * TICKS <= ticks <= 86400 * TICKS:
raise ValueError("Indexer interval outside documented bounds")
return ticks
def instant(value):
match = INSTANT.fullmatch(value) if isinstance(value, str) and len(value) <= 40 else None
if not match or match[8] == "-00:00":
raise ValueError("Unknown or unsupported timezone")
year, month, day, hour, minute, second = map(int, match.groups()[:6])
zone = match[8]
offset = 0
if zone != "Z":
hours, minutes = int(zone[1:3]), int(zone[4:6])
if hours > 14 or minutes > 59 or hours == 14 and minutes:
raise ValueError("Invalid offset")
offset = (hours * 60 + minutes) * (-1 if zone[0] == "-" else 1)
stamp = datetime(year, month, day, hour, minute, second,
tzinfo=timezone(timedelta(minutes=offset))).astimezone(timezone.utc)
elapsed = stamp - datetime(1, 1, 1, tzinfo=timezone.utc)
return (elapsed.days * 86400 + elapsed.seconds) * TICKS + int((match[7] or "").ljust(7, "0"))
def schedule(value, *, present=True, diagnostics=None, request_id=None):
diagnostics = diagnostics if diagnostics is not None else []
if value is None:
return {"state": "null" if present else "missing"}
field = "schedule"
try:
if not isinstance(value, dict) or set(value) - {"interval", "startTime"}:
raise ValueError("Unknown shape")
field = "schedule.interval"
period = interval(value.get("interval"))
field = "schedule.startTime"
start = instant(value["startTime"]) if value.get("startTime") is not None else None
return {"state": "object", "interval": period, "startTime": start}
except (ValueError, OverflowError) as exc:
raise failure(diagnostics, "indexer-schedule-evidence-invalid", field,
f"Generated indexer {field} is malformed or unsupported; no default is inferred.",
request_id) from exc
def observe(child, approved, diagnostics, request_id):
observed = schedule(child.get("schedule"), present="schedule" in child,
diagnostics=diagnostics, request_id=request_id)
expected = schedule(approved, diagnostics=diagnostics, request_id=request_id)
if approved is not None:
for field in ("interval", "startTime"):
if field == "startTime" and approved.get(field) is None:
continue
if observed.get(field) != expected[field]:
raise failure(diagnostics, "indexer-schedule-constraint-violation", f"schedule.{field}",
f"Generated indexer schedule.{field} violates the approved constraint; this is not an ingestion failure.",
request_id)
if child["schedule"].get(field) != approved.get(field):
note(diagnostics, "info", "indexer-schedule-format-equivalent", f"schedule.{field}",
"Schedule formats represent the same duration or instant.", request_id)
if observed != expected:
note(diagnostics, "warning", "indexer-schedule-unconstrained", "schedule",
"Generated schedule differs on unconstrained timing; recurring work/cost is possible. No schedule was changed or default assumed.",
request_id)
return {
"etag": child["@odata.etag"], "digest": digest(child),
"non_schedule_digest": digest({k: v for k, v in child.items() if k not in {"schedule", "@odata.etag"}}),
"schedule_digest": digest(observed),
"schedule_raw_digest": digest({"present": "schedule" in child, "value": child.get("schedule")}),
}
def compare(current, expected, diagnostics, request_id):
if current == expected:
return
if not PROJECTION_FIELDS <= set(expected):
raise failure(diagnostics, "indexer-legacy-evidence-insufficient", "indexer",
"Legacy full-hash evidence differs; no schedule preimage/projection exists. Retain it; do not auto-upgrade.",
request_id)
if current["digest"] == expected["digest"]:
raise failure(diagnostics, "indexer-evidence-inconsistent", "indexer",
"Equal full hashes have inconsistent version/projection evidence.", request_id)
if current["non_schedule_digest"] != expected["non_schedule_digest"]:
raise failure(diagnostics, "indexer-definition-drift", "indexer",
"A non-schedule indexer field changed; schedule policy cannot admit it.", request_id)
if current["schedule_raw_digest"] == expected["schedule_raw_digest"]:
raise failure(diagnostics, "indexer-version-unexplained", "@odata.etag",
"Indexer version/full hash changed without an observed schedule change; the revision is unproven.", request_id)
equivalent = current["schedule_digest"] == expected["schedule_digest"]
note(diagnostics, "info" if equivalent else "warning",
"indexer-schedule-format-equivalent" if equivalent else "indexer-schedule-unconstrained",
"schedule", "Only schedule changed; every other observed field matches the retained projection and approved timing constraints hold.",
request_id)
def warnings(diagnostics):
return list(dict.fromkeys(item["message"] for item in diagnostics if item["severity"] == "warning"))
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Python
The author says: Azure
Security
What our scanner noticed· Medium risk
- References to credential files
- Instructions that use the network
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Microsoft
- Publisher
- Microsoft (Official)
- Source
- microsoft/skills · .github/plugins/foundry-iq-skills/skills/foundry-iq · commit 0696600
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from .github/plugins/foundry-iq-skills/LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Microsoft or Microsoft.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download foundry-iq.zip