Session Log Canvas Update
MicrosoftOfficialPublished by Microsoft
- Skill
- Workflow
- Software development
- MIT
- Low risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured workflow for maintaining the Session Log canvas when updates to Copilot releases introduce changes to session events, storage, or system prompt structures. It automates the process of diffing schemas, identifying necessary code adjustments, updating test fixtures, and refreshing the baseline to ensure that both new and historical session data remain accurately readable within the canvas.
What it does
- Diffs installed Copilot session-events schemas against the current canvas baseline.
- Identifies and classifies changes to event types, fields, and storage structures.
- Guides the implementation of necessary code fixes and updates to the canvas indexer.
- Updates synthetic test fixtures to ensure backward and forward compatibility.
- Refreshes the event-shapes baseline after verification.
- Validates changes through automated test suites and linting.
When to use it
- After updating the Copilot CLI or SDK version.
- When the Session Log canvas displays unknown events or missing data.
- When preparing to release changes that affect session logging or storage.
- During routine maintenance to ensure the canvas remains aligned with the latest Copilot schema.
Advantages
- Ensures consistent rendering of session logs across different Copilot versions.
- Prevents regressions by requiring synthetic fixture updates for all schema changes.
- Provides a clear audit trail of changes via the style guide and baseline updates.
- Maintains data privacy by strictly prohibiting the use of real session content in tests or docs.
Usage examples
- “Update the session log canvas for the latest Copilot release.”
- The agent runs the update workflow, diffs the latest schema, identifies required changes, and prompts for confirmation before applying updates and refreshing the baseline.
- “Check if the current canvas is compatible with Copilot version 1.2.3.”
- The agent performs a check-mode analysis, reporting any discrepancies between the current canvas baseline and the specified Copilot version without modifying any files.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/microsoft/session-log-canvas-update/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip session-log-canvas-update.zip -d .agents/skills
Documentation by Microsoft
Session Log Canvas Update
Goal
Keep the Session Log canvas accurate when a new Copilot version changes what a session records. Find what changed between the schema the canvas was built against and the current one, then update the canvas so new and changed data renders correctly while sessions recorded by earlier versions stay readable.
This skill belongs to the HVE Core repository. Keep it directly under .github/skills/session-log-canvas-update/, outside package directories and plugin or VSIX membership. The canvas it maintains lives at .github/extensions/hve-core/session-log/.
Inputs
mode(optional):checkreports what changed and the work it implies without editing.update(default) also applies the changes and refreshes the baseline.schema(optional): which schema to compare. Accepts a path to asession-events.schema.json, an installed Copilot version, orlatest(default, the newest installed Copilot CLI package).
Success Criteria
Every change to an event type the canvas handles is classified (needs code, already tolerated, or not used by the canvas) with the diff line that supports it.
New persisted event types either render through a deliberate log kind or are recorded as intentionally generic; none is silently dropped.
Sessions recorded by both the baseline version and the new version render without regressions: the canvas tests cover the old and new shapes with synthetic fixtures.
Storage,
workspace.yaml, system prompt structure, and canvas SDK changes are checked even when the event schema diff is empty.The baseline (
assets/event-shapes.json) describes the schema the updated canvas was verified against, and the style guide revision log names the change.No session content appears in fixtures, tests, docs, reports, or responses.
Flow
Find the versions in play. Run
node scripts/event-schema.mjs listfrom the skill root (ornode .github/skills/session-log-canvas-update/scripts/event-schema.mjs listfrom the repository root) to see installed Copilot CLI schemas. Read the baseline'ssourcein assets/event-shapes.json. For a VS Code session, also locate the schema bundled with VS Code at<VS Code app resources>/app/node_modules.asar.unpacked/@github/copilot-sdk-<platform>/schemas/session-events.schema.json, because the VS Code harness can run a newer runtime than the installed CLI. ThecopilotVersiona session recorded comes from itssession.startevent; the canvasget_session_summaryaction returns it.Diff the schema. Run
node scripts/event-schema.mjs diff --schema <path|version|latest>for each relevant schema. The report lists handled types that changed (field by field), new event types with whether they persist, removed types, other changed types, and handled types the schema no longer defines. A field that union alternatives share lists every signature it can take, and a signature cut short by the script's size limits ends in…. Use--jsonwhen you need to process the result.Check real sessions without reading content. Open the canvas on a session from the new version and call its
get_session_summaryaction:eventHealth.unknownTypeslists persisted types the canvas does not handle, andunreadableLinescounts lines it could not parse. The Details tab shows the same counts. Compare a few entries of each changed kind in the log against the expected rendering.Read the release notes. The CLI package's
changelog.json(beside itsschemas/folder) lists changes per version; scan the versions between the baseline and the new version for session events, compaction, hooks, subagents, system prompt, storage, and extension or canvas changes.Map each change to canvas code with references/coupling-map.md, and classify it:
Changed field that the indexer reads: read the new location first and fall back to the old one so earlier sessions still render.
New persisted type: decide whether it becomes a log entry, enriches an existing entry, updates counts or metadata, or stays generic. Add it to the indexer switch and
HANDLED_EVENT_TYPEStogether; a test enforces that they match.Removed type or field: keep reading it while sessions recorded by earlier versions can still contain it.
Ephemeral type: ignore unless it becomes persisted. In
checkmode, stop here and report.
Apply the changes. Add synthetic events for each new or changed shape to the canvas test fixtures (never copy real session text), extend the indexer, server, and UI as needed, and keep the log grammar consistent with the style guide. Update the style guide's Log Grammar table and revision log, and the README when user-visible behavior or actions change.
Validate:
npm run test:extensionsandnode --test ".github/skills/session-log-canvas-update/tests/*.test.mjs". PR validation runs both suites in its Node test lane.node --checkon changed modules, andnpm run plugin:validate.Markdown lint, spelling, table format, and frontmatter checks on changed Markdown.
A browser check on synthetic fixtures only: confirm the page URL before each screenshot, and never capture the live canvas because it shows real session content.
A host reload (
extensions_reload, then reopen the canvas) with the servedui/files matching disk.
Refresh the baseline. Run
node scripts/event-schema.mjs snapshot --schema <the schema you verified against> --write, rerundiffagainst it to confirm a clean report, and commit the baseline with the canvas changes. Both commands exit non-zero without writing anything when the file defines no session event types.
Constraints
Read session logs only through the canvas or for event type names, field names, counts, and sizes. Do not print, paste, or persist message, prompt, tool, or summary text from real sessions.
The script reads schema files, their
package.json, and the baseline, and imports the canvas indexer, or the module passed with--indexer, to read its exported type lists. That module runs in the script's process, so pass--indexeronly a module you trust. The script writes only to stdout or, withsnapshot --write, toassets/event-shapes.json. SECURITY.md records its threat model.The baseline keeps event and field identifiers and type signatures only, never schema descriptions.
Prefer a schema from a package whose license permits redistribution of derived identifiers for the committed baseline, such as the MIT-licensed
@github/copilot-sdk-<platform>package bundled with VS Code.Keep changes inside the canvas, its tests and docs, and this skill. Do not commit, push, or publish without the user's request.
Stop Rules
Stop and ask for a schema path when no installed schema is found and none was given.
Stop in
checkmode after the classified report.Stop as Blocked when a change cannot be mapped to canvas behavior from the diff, release notes, and synthetic reproduction; report the type and fields and what evidence would settle it.
Stop as Revise when validation fails; report the failing check and do not refresh the baseline.
Final Response Contract
Report the versions compared, a classified table of changes (type or surface, change, canvas impact, action taken or proposed), files changed, validation results with exact commands, whether the baseline was refreshed and from which schema, and any blocked items with the evidence needed.
Files
- ATTRIBUTION.mdAdded by AutoGineer846 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SECURITY.md29.8 KiB
- SKILL.md7.9 KiB
- assets/event-shapes.json128.4 KiB
- references/coupling-map.md22.3 KiB
- scripts/event-schema.mjsScript29.2 KiB
- tests/event-schema.test.mjsScript18.9 KiB
SECURITY.md
title: Session Log Canvas Update Skill Security Model description: STRIDE threat model for the session-log-canvas-update skill organized by assets, adversaries, and trust buckets (schema discovery and parsing, baseline and report outputs, indexer module import) with in-code mitigations and acknowledged enterprise readiness gaps author: microsoft/hve-core ms.date: 2026-10-23 ms.topic: reference estimated_reading_time: 10 keywords:
security
STRIDE
session-log-canvas-update
json schema
threat model
<!-- markdownlint-disable-file -->
Session Log Canvas Update Skill Security Model
<!-- cspell:ignore NONBLOCK RDONLY -->
This document records the STRIDE threat model for the session-log-canvas-update skill, whose only runtime file is scripts/event-schema.mjs, a Node.js command-line tool that uses built-in modules only. The model is organized by trust bucket: schema discovery and parsing (B1), baseline and report outputs (B2), and indexer module import (B3). Each bucket enumerates all six STRIDE categories with the in-code mitigations that address them. Assets and adversaries are enumerated first. Acknowledged enterprise readiness gaps are listed at the end.
The tool has three commands. list prints the session event schemas installed under the Copilot home. snapshot summarizes one schema as event types, data field paths, and type signatures, printing the result or, with --write, saving it as the skill's baseline. diff compares a schema with the baseline and flags the event types the Session Log canvas handles. The skill lives at .github/skills/session-log-canvas-update/, outside every package folder, so it ships in neither the plugin nor the extension. Its SKILL.md sets disable-model-invocation: true, so the model never starts it on its own; a maintainer runs the tool directly or through /session-log-canvas-update. It handles no credentials, makes no network requests, starts no subprocesses, and never opens session logs.
See also: repo-wide STRIDE model. This skill participates in the repository-wide threat model at
docs/security/security-model.mdand is registered in its Skill Security Models section.
Executive Summary
The session-log-canvas-update skill keeps the Session Log canvas aligned with Copilot's session event schema. Its highest-risk behaviors are parsing schema files that come from downloaded Copilot packages or from paths the operator names, and importing the module named by diff --indexer, which runs that module's code in the tool's process. Every file is read through one size-capped, no-follow handle and parsed with JSON.parse only; extraction is bounded in nesting depth, total work, and signature length; a file with no session event types is rejected before anything is written; and the only file the tool writes is the skill's own baseline. Residual risk concentrates in the operator-trusted --indexer import (EoP-Med) and in low-severity integrity gaps around the baseline write and report text.
Security Posture Overview
| Dimension | Value |
|---|---|
| Runtime surface | Repository-only Node.js CLI (list, snapshot, diff); local file reads, one optional ESM import, stdout, one fixed output file |
| Trust buckets | 3: B1 schema discovery and parsing, B2 baseline and report outputs, B3 indexer module import |
| Credentials | None read, stored, or sent |
| Network egress | None |
| Open residual gaps | 6 (EoP-Med: --indexer runs the named module in-process) |
Contents
System Description
Trust Boundaries
Assets
Adversaries
Bucket B1: Schema discovery and parsing
Bucket B2: Baseline and report outputs
Bucket B3: Indexer module import
Enterprise Readiness Gaps
References
System Description
Components
scripts/event-schema.mjs: the CLI. It finds schemas at<COPILOT_HOME or ~/.copilot>/pkg/<platform>/<version>/schemas/session-events.schema.json, or reads the file passed with--schema <path>.json, reads the owningpackage.jsonfor the package name and version, extracts event shapes under fixed bounds, and prints a snapshot or a Markdown or JSON diff.assets/event-shapes.json: the committed baseline of event types, field paths, type signatures, and source metadata.snapshot --writereplaces it, anddiffreads it unless--baseline <path>names another file.Canvas indexer,
.github/extensions/hve-core/session-log/lib/indexer.mjs: the repository module thatdiffimports by default to readHANDLED_EVENT_TYPESandHANDLED_EVENT_PREFIXES.diff --indexer <path>imports a different module instead.tests/event-schema.test.mjs:node:testcoverage for extraction, rejection of files without event types, and the extraction bounds. The crafted deep and wide schemas run in a worker thread so the test timeout can stop a runaway extraction.
Data Flow
flowchart TD
accTitle: Session Log Canvas Update Data Flow
accDescr: The event-schema CLI reads schema and manifest files from installed Copilot packages or operator-named paths, reads the baseline, imports the canvas indexer or an operator-named module, prints reports, and writes only the skill baseline.
subgraph HOST["Operator process and repository checkout (trust zone)"]
CLI["event-schema.mjs<br/>list / snapshot / diff"]
BASE["assets/event-shapes.json<br/>(baseline)"]
IDX["Canvas indexer<br/>(default module)"]
OUT["stdout and stderr<br/>(reports, JSON, errors)"]
end
subgraph DATA["Schema inputs (untrusted data)"]
SCH["Installed Copilot packages<br/>session-events.schema.json"]
MAN["package.json manifests"]
XF["--schema and --baseline files"]
end
subgraph CODE["Operator-named module (code)"]
XI["--indexer module"]
end
SCH -->|"file read: O_NOFOLLOW, 16 MiB cap, JSON.parse"| CLI
MAN -->|"file read: O_NOFOLLOW, 1 MiB cap, regex-checked fields"| CLI
XF -->|"file read: O_NOFOLLOW, 16 MiB cap, JSON.parse"| CLI
BASE -->|"file read (diff)"| CLI
IDX -->|"ESM import, runs in-process (diff)"| CLI
XI -->|"ESM import, runs in-process (diff --indexer)"| CLI
CLI -->|"file write (snapshot --write only)"| BASE
CLI -->|"text and JSON"| OUTTrust Boundaries
Boundary Diagram
┌───────────────────────────────────────────────────────────────────────┐
│ TRUST BOUNDARY: Operator process and repository checkout │
│ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │
│ │ event-schema.mjs │ │ Baseline │ │ Canvas indexer │ │
│ │ Node built-ins │ │ event-shapes.json │ │ default module │ │
│ └───────────────────┘ └───────────────────┘ └───────────────────┘ │
└────────────────┬────────────────────────────────────┬─────────────────┘
│ file reads: O_NOFOLLOW, size caps │ ESM import():
│ JSON.parse, extraction bounds │ module code runs
│ │ in-process
┌────────────────▼─────────────────┐ ┌────────────────▼─────────────────┐
│ TRUST BOUNDARY: Schema inputs │ │ TRUST BOUNDARY: Operator-named │
│ (untrusted data) │ │ --indexer module (code) │
│ ┌────────────────────────────┐ │ │ ┌────────────────────────────┐ │
│ │ Installed Copilot packages │ │ │ │ Module that exports │ │
│ │ (schemas, package.json) │ │ │ │ HANDLED_EVENT_TYPES │ │
│ │ --schema and --baseline │ │ │ │ (runs with the operator's │ │
│ │ files named by the operator│ │ │ │ privileges) │ │
│ └────────────────────────────┘ │ │ └────────────────────────────┘ │
└──────────────────────────────────┘ └──────────────────────────────────┘Boundary Descriptions
| Boundary | Assets Protected | Controls Enforced |
|---|---|---|
| Operator process and repository checkout | Baseline integrity, operator workstation | Fixed write target, schemas without event types rejected before writing, no network, credentials, or subprocesses, session logs never opened |
| Schema inputs | Availability of the CLI, accuracy of reports | One open handle per file with O_NOFOLLOW and O_NONBLOCK where defined, regular-file and size checks on that handle, change-while-reading guard, JSON.parse only, regex-checked names, field-walk and signature bounds |
Operator-named --indexer module | Operator workstation (code runs in the CLI process) | Default is the repository's canvas indexer, replaced only by an explicit flag; usage text and SKILL.md require a trusted path; export shape checked after import |
Assets
| Id | Asset | Lifetime | Notes |
|---|---|---|---|
| A1 | Baseline assets/event-shapes.json | Persisted, tracked in git | Records the schema the canvas was verified against; written only by snapshot --write; reviewed in pull requests |
| A2 | Snapshot and diff reports | Command lifetime (stdout) | Drive the maintainer's classification of canvas changes; accuracy matters more than secrecy |
| A3 | Operator workstation and the CLI process | Command lifetime | Runs with the operator's privileges; exposed to code execution only through the imported indexer module |
| A4 | Copilot session logs and session state | Persisted under the Copilot home | Never opened by the CLI; listed so the boundary is explicit |
| A5 | Installed Copilot packages and operator-named schema files | External, read-only | Downloaded or third-party content, parsed as data only |
Adversaries
| Id | Adversary | In-scope mitigations |
|---|---|---|
| ADV-a | Author of a crafted schema, manifest, or baseline file (a tampered installed package, a downloaded schema, a hostile --baseline file) | Size caps, single-handle regular-file reads, JSON.parse only, regex validation, extraction bounds that mark cut signatures with …, rejection of files without event types before any write |
| ADV-b | Local process that races the read paths by swapping a schema for a symbolic link, FIFO, device, or growing file | O_NOFOLLOW and O_NONBLOCK opens, type and size checks on the open handle, lstat during discovery, change-while-reading guard |
| ADV-c | Source of a hostile --indexer path, including text that steers an agent running the skill | Default repository indexer, explicit opt-in flag, documented trust requirement in the usage text and SKILL.md; residual G-EOP-1 |
| ADV-d | Contributor who alters the committed baseline or replaces it with a symbolic link | Pull request review of the tracked file; residual G-TAM-1 |
Bucket B1: Schema discovery and parsing
Spoofing
Package identity is self-asserted. The
package.jsonbeside a schema supplies the package name and version that a snapshot records; the name must match^[@a-z0-9/._-]{1,128}$and the version^[A-Za-z0-9_$.-]{1,96}$, or the value is recorded as null and the version folder name stands in. Nothing authenticates that a schema came from the package it names (G-SPF-1).Discovery reads
<COPILOT_HOME>/pkg/<platform>/<version>/and skips platform and version entries that are not directories, including symbolic links, and schema files thatlstatdoes not report as regular files.COPILOT_HOMEcomes from the operator's environment and defaults to~/.copilot.
Tampering
Schemas, manifests, and baselines are parsed with
JSON.parseonly; nothing read from them is evaluated or imported.readJsonopens each file once withO_RDONLY,O_NOFOLLOW, andO_NONBLOCKwhere the platform defines those flags, checks that the open handle is a regular file within the size cap, reads at most one byte past the checked size, and fails with "File changed while reading" when the file grew. The file that passed the checks is the file that is parsed.O_NOFOLLOWcovers only the final path component. Windows defines neither flag, so a symbolic link is followed there, though the handle's regular-file and size checks still apply.snapshotanddiffreject a file that has no session event root or yields no event types, naming the file and exiting non-zero before anything is written.
Repudiation
Not applicable. The CLI reads local files and produces local output; there is no actor or remote state change to attribute. Baseline provenance is covered in B2.
Information Disclosure
The CLI never opens session logs or session state. It reads the installed schemas under
pkg/, the files the operator names with--schemaand--baseline, and thepackage.jsontwo folders above each schema.A JSON syntax error message can quote about ten characters of the file it came from on stderr; this applies only to installed package files and files the operator names.
Extraction keeps identifiers, type signatures, and
constandenumvalues; schemadescriptiontext is not copied.
Denial of Service
Schema and baseline files are capped at 16 MiB and manifests at 1 MiB.
$refchains stop after 16 hops,$refstrings longer than 256 characters are not followed, and enum signatures keep at most 12 values.The field walk stops three levels below
data.Signature recursion stops at depth 16. One
extractShapescall shares a budget of 200,000 work units, charged for each schema node visited, each union alternative, property name, required name, and type entry examined, and each 64 characters of signature text built or recorded. Signatures longer than 4,096 characters are truncated, andconstandenumsignatures are built once per schema node. When a limit is reached, the affected signatures end in…and the walk stops, so recorded paths and signatures stay under about 12.8 million characters and a crafted schema cannot force exponential work. Regression tests run a 48-level union chain and a three-level, 200-property fan-out under a 5-second timeout.The published 1.0.24 schema needs 14,675 work units, a signature depth of 2, and at most 371 characters per signature, so these limits leave its output unchanged. Limits truncate rather than fail, and the parsed document's memory is bounded only by the 16 MiB file cap (G-DOS-1).
Elevation of Privilege
Parsing never executes schema content; the CLI runs with the operator's privileges and starts no subprocess.
Risk Rating
| Threat | Likelihood | Impact | Residual Risk | Status |
|---|---|---|---|---|
| Exponential or super-linear extraction on a crafted schema | Med | Med | Low | Mitigated (depth, work, and length bounds) |
| Symbolic link, FIFO, or file swap on a read path | Low | Med | Low | Mitigated (single-handle reads; Windows follows links) |
| Unrecognized file replaces the baseline | Low | Med | Low | Mitigated (rejected before writing) |
| Forged package provenance in a snapshot | Low | Low | Low | Accepted (G-SPF-1) |
Bucket B2: Baseline and report outputs
Spoofing
The baseline's
sourceblock (package, version, platform, and capture date) comes from the schema's manifest and the local clock. It documents provenance but is not signed (G-SPF-1); reports label the baseline and current sources with these values.
Tampering
snapshot --writewrites onlyassets/event-shapes.jsonin the skill folder; no option redirects the write, and--baselinechanges only whatdiffreads.The write happens only after the schema yields at least one event type. A rejected schema leaves the existing baseline byte-for-byte unchanged, which a regression test asserts.
The write uses
fs.writeFile, which follows a symbolic link at the target and replaces the file in place rather than atomically (G-TAM-1). The baseline is a tracked file, so a change to it, including a symbolic link, appears in pull request review.diffaccepts a baseline only when it hasformat: 1and atypesobject.Type names and field keys from a schema must match
^[A-Za-z0-9_$.-]{1,96}$, andconstandenumvalues pass throughJSON.stringify, which escapes C0 control characters. Version and platform folder names and thesourceandtypesentries of a--baselinefile are printed without filtering, so crafted names can put terminal control or Unicode display characters into a report (G-TAM-2).Signatures truncated by the extraction limits are written like any other signature; they stay visible as
…in the report and in the pull request diff (G-DOS-1).
Repudiation
The baseline records its source package, version, and capture date, and git history attributes each baseline change to a commit and its review. The CLI keeps no log of its own.
Information Disclosure
Output goes to stdout and stderr only. The baseline holds event and field identifiers, type signatures, and source metadata, never schema descriptions, local paths, or session content; a test asserts the committed baseline has no
descriptionkeys or user-profile paths. Error messages and the--writeconfirmation name local file paths on the operator's terminal only.
Denial of Service
Snapshot and report size is bounded by the extraction budget, and
diffrefuses a baseline larger than 16 MiB.An interrupted write can leave a partial baseline, which
diffthen rejects as invalid; git restores the tracked file (G-TAM-1).
Elevation of Privilege
Writing the baseline needs only the operator's write access to the checkout; there is no privilege transition.
Risk Rating
| Threat | Likelihood | Impact | Residual Risk | Status |
|---|---|---|---|---|
| Baseline overwritten by an unrecognized schema | Low | Med | Low | Mitigated |
| Baseline write follows a planted symbolic link | Low | Med | Low | Open (G-TAM-1) |
| Display-control characters in reports | Low | Low | Low | Accepted (G-TAM-2) |
| Truncated signatures committed to the baseline | Low | Low | Low | Accepted (G-DOS-1) |
Bucket B3: Indexer module import
Spoofing
The default module path is fixed relative to the script:
.github/extensions/hve-core/session-log/lib/indexer.mjsin the same checkout.diff --indexer <path>replaces it with any path the operator gives, and the CLI cannot verify who wrote that module.
Tampering
loadHandledimports the module with a dynamicimport()of its file URL, so the module's top-level code runs in the CLI's process and can change anything the operator can. The CLI then requires an arrayHANDLED_EVENT_TYPESexport and readsHANDLED_EVENT_PREFIXESwhen it is an array; those values only label report rows.
Repudiation
Not applicable. The import is a local, operator-initiated action with no remote state to attribute.
Information Disclosure
An imported module has the operator's file and network access, so a hostile module could read and send local data. The default indexer is repository code reviewed in pull requests and shipped as part of the Session Log canvas.
Denial of Service
A module that blocks or throws during import stops the
diffcommand.diffwrites nothing, and the import happens after the baseline and schema are read, so a failed import leaves no partial output.
Elevation of Privilege
The import runs code with the operator's privileges, and the operator's choice of path is the only control. The usage text, the
loadHandleddocumentation, and the skill's constraints say to pass only a trusted module; the skill's workflow never passes--indexer; andlistandsnapshotnever import a module (G-EOP-1).
Risk Rating
| Threat | Likelihood | Impact | Residual Risk | Status |
|---|---|---|---|---|
Hostile module passed with --indexer | Low | High | Med | Accepted (operator responsibility, G-EOP-1) |
| Default indexer modified in a pull request | Low | High | Low | Mitigated (repository review) |
Enterprise Readiness Gaps
The following are known limitations recorded so operators can make informed deployment decisions. Severity ratings are the project's own assessment and are not equivalent to a CVSS score.
| Id | Gap | Severity | Status |
|---|---|---|---|
| G-EOP-1 | diff --indexer <path> imports and runs the named module in the CLI's process with no allow-list, signature check, or isolation; only the operator's choice of path protects the workstation. | EoP-Med | Accepted (operator responsibility; the default is the repository's canvas indexer and the skill's workflow never passes --indexer) |
| G-TAM-1 | snapshot --write replaces assets/event-shapes.json with fs.writeFile, which follows a symbolic link at that path and is not atomic, so a link planted in the checkout redirects the write and an interrupted write leaves a partial file. | Tampering-Low | Open (candidate hardening: open the target with O_NOFOLLOW, or write a temporary file and rename it into place) |
| G-TAM-2 | Reports print version and platform folder names and the source and types entries of a --baseline file without filtering, and JSON.stringify keeps Unicode display controls such as bidirectional overrides in signatures, so crafted inputs can change what a terminal or Markdown viewer shows. | Tampering-Low | Accepted (the inputs are the operator's own Copilot home and files the operator names) |
| G-DOS-1 | Extraction limits truncate rather than fail: a schema that exhausts them still produces a snapshot with … signatures, which snapshot --write saves without a warning. Parsed-document memory is bounded only by the 16 MiB file cap. | DoS-Low | Accepted (the published schema uses a small fraction of each limit, and truncation stays visible in the report and the pull request diff) |
| G-SPF-1 | Snapshot provenance (source.package and source.version) comes from the unauthenticated package.json beside the schema, or from the version folder name when that manifest is missing or invalid. | Spoofing-Low | Accepted (provenance is advisory; the skill prefers the schema bundled with VS Code) |
| G-SUP-1 | The CLI runs on whatever Node.js runtime the operator provides. It uses built-in modules only, so there is no package dependency to pin, but the runtime itself is not verified. | SupplyChain-Low | Accepted (the repository's .node-version names the supported runtime) |
For an active issue tracker entry covering these gaps, see the hve-core issues list.
References
CWE-829: Inclusion of Functionality from Untrusted Control Sphere
Repository security model
🤖 Crafted with precision by ✨Copilot following brilliant human instruction, then carefully refined by our team of discerning human reviewers.
Requirements and compatibility
Written for: GitHub Copilot, Claude Code
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: Claude Code frontmatter, Needs Node.js
Security
What our scanner noticed· Low risk
- 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
- Published by
- Microsoft
- Publisher
- Microsoft (Official)
- Source
- microsoft/hve-core · .github/skills/session-log-canvas-update · commit f425e94
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from 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 session-log-canvas-update.zip