Agent skill

Bilan

by Atmosphere in Atmosphere/atmosphere

Measure whether this session actually finished — the 0-10 completion number, computed from git, the carnet ledger, LIMITATION markers and CI instead of narrated.

Apache-2.0Auto-check passedBackend & APIs

Install Bilan

skills CLI
$ npx skills add Atmosphere/atmosphere --skill bilan -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Atmosphere/atmosphere bilan --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/Atmosphere/atmosphere.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/bilan .claude/skills/bilan && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
bilan
GitHub stars
3.8k
Used in
1 other repo
Token cost
~5.5k tokens
SKILL.md length
3,552 words
Files
5
Skills in repo
20
Repo updated
First seen
Licence
Apache-2.0

At a glance

Measure whether this session actually finished — the 0-10 completion number, computed from git, the carnet ledger, LIMITATION markers and CI instead of narrated.

  • Works in 4 steps: Run it before you give a number. Report… → A cap is a fact, not an opinion. Each… → Failures never deduct. A red that is now… → …
  • Backend & APIs work in your project
  • SKILL.md covers The rules, What caps the score, This repo's shape and Uncommitted files that are not…, plus 6 more sections
  • Runs Shell scripts from its folder; calls git, gh and claude

What it does

Bilan is an agent skill from Atmosphere/atmosphere. Measure whether this session actually finished — the 0-10 completion number, computed from git, the carnet ledger, LIMITATION markers and CI instead of narrated. Use before reporting a completion number, when asked "where are we", at the end of a piece of work, and to find what a session that died left behind.

Its SKILL.md is about 5.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files (for example `bilan.sh`, `hooks/session-start-sweep.sh` and `hooks/stop-gate.sh`).

It sits in Backend & APIs. It works with Git. The repository describes itself as: Portable AI agent runtime for the JVM. One @Agent class runs on Spring AI, LangChain4j, Anthropic, or 9 more behind one SPI. Token streaming, tool calls, human approvals, and… The licence is Apache-2.0.

When your agent uses it

  • Backend & APIs work in your project

Example prompts

  • “where are we”
  • “/bilan”

Requirements

  • A Bash shell

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. Run it before you give a number. Report the score it prints. If you believe a cap is
  2. A cap is a fact, not an opinion. Each one prints its own evidence and its own remedy.
  3. Failures never deduct. A red that is now green, a mistake found and fixed, a rough path —
  4. Friction is printed, never scored. Tool errors, interrupts and denials are counted from

What it can do on your machine

Read from SKILL.md and the folder at commit 13671cf. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships script files (Shell), which the agent can run.

    Shell commands in SKILL.md call:

    • git
    • gh
    • claude

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git and gh, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Bilan loads about 5.5k tokens when it runs. Until then it costs about 79 tokens; SKILL.md has 3,552 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~79
When it runs · the whole SKILL.md, loaded when a task matches
~5.5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from Atmosphere/atmosphere at commit 13671cf, republished under its Apache-2.0 licence (© Atmosphere). 3,552 words, ~5,484 tokens.

Download SKILL.mdSave it as .claude/skills/bilan/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.
name
bilan
description
Measure whether this session actually finished — the 0-10 completion number, computed from git, the carnet ledger, LIMITATION markers and CI instead of narrated. Use before reporting a completion number, when asked "where are we", at the end of a piece of work, and to find what a session that died left behind.
argument-hint
[sweep] [scope] [--cheap] [--json]
user-invocable
true

Bilan

The completion number is this script's number, never yours.

It used to be narrated: it came from the session's account of itself, so a session that believed it was done reported 8 or 10 while it still held open carnet issues, had commits sitting unpushed, or had background work still running. Every one of those facts is machine-checkable, and bilan.sh checks them.

bash
.agents/skills/bilan/bilan.sh            # full: local facts, one fetch, one CI query
.agents/skills/bilan/bilan.sh --cheap    # local only, no network
.agents/skills/bilan/bilan.sh sweep      # what a session that DIED left behind
.agents/skills/bilan/bilan.sh scope      # the files the limitation register scans, as bilan resolves them

Exit code: 0 = 10/10 · 1 = incomplete · 2 = the script itself failed.

--cheap is the status-line run, and it gives the full run's number wherever local evidence can settle the fact. Where only the network can, the cheap run states what it cannot know instead of guessing: commits that look unpushed against a fetch more than five minutes old (it caps at 9, "may already be on the remote", where the full run fetches first), a filed issue someone else may have closed, or a limitation label applied outside carnet.sh (cheap keeps the cap on both), and whether the issue a new marker names is live (cheap does not judge it). CI is printed, never scored, so skipping it changes what is shown, not the score.

Every scoring run also writes score<TAB>epoch<TAB>top cap to ${CLAUDE_CONFIG_DIR:-~/.claude}/bilan/<session-id>.score, so a status-line command can show the number without running anything: it only has to refresh the file with bilan.sh --cheap --json when it ages.

The rules

  1. Run it before you give a number. Report the score it prints. If you believe a cap is wrong, say so in words and still report the script's number — arguing with the measurement is a conversation, overriding it silently is the failure this exists to stop.
  2. A cap is a fact, not an opinion. Each one prints its own evidence and its own remedy. The score is min() over the caps, so one open carnet issue holds the whole session at 6 no matter how much else landed.
  3. Failures never deduct. A red that is now green, a mistake found and fixed, a rough path — none of it lowers the number. The score measures completion, and only completion.
  4. Friction is printed, never scored. Tool errors, interrupts and denials are counted from the transcript and shown for context. They do not cap anything.

What caps the score

EvidenceCaps at
carnet issue claimed by this session, neither closed nor released6
carnet issue filed by this session and still open (unless a registered limitation) — or, in the full run, whose state the tracker would not give6
LIMITATION(registre#…) marker added in a file the register scans, naming no live issue — missing, closed, a pull request, or not labelled limitation (full run only), or no issue number at all6
LIMITATION( marker added in a file with an extension the register scans, while the register cannot say what it scans (.registre not checked out)6
background task still running7
tracked files modified and uncommitted7
todo still pending or in_progress7
commits not pushed — to the upstream, or, on a branch without one (or whose upstream was deleted), not on origin/main8
nothing measurable — no commit, no todo9
untracked files, a stash made on this branch during this session, a local branch whose upstream is gone — this checkout's own, or one no worktree has checked out9
commits to push but the validation marker is missing, older than the pre-push hook's TTL, or for another sha9
commits that look unpushed against a stale fetch (--cheap only)9
dev stack this session started still up — only in a checkout that ships bin/dev-processes.sh; this repo has none, so here it never fires9

This repo's shape

Worktrees and branches without an upstream. Work here commonly happens in .claude/worktrees/*, on branches that have no upstream at all: a branch is typically landed on main with git push origin <branch>:main rather than published. So a branch without an upstream is measured against origin/main — its commits that are not there are unpushed work, and the remedy says how this repo lands it. Measured against an upstream it does not have, a worktree's work would never be reported at all.

The validation marker is scripts/pre-push-validate.sh's: one line, <epoch> <sha>, in the checkout's own git dir. In a worktree that is .git/worktrees/<name>/validation-passed, so a marker stamped from the main checkout never validates a worktree's HEAD — the pre-push hook would refuse that push, and bilan says so first. The TTL is read from .githooks/pre-push rather than restated, so the two cannot disagree about when a marker has expired.

The stash is one stack. Every worktree pushes onto the same refs/stash, so a stash made on another branch was made in another checkout: it is stated and never counted. For this session's own stash the remedy is to apply or drop it by its exact ref — a bare git stash pop in a shared stack can take a peer's work.

The ledger directory is machine-wide. ${CLAUDE_CONFIG_DIR:-~/.claude}/carnet-claims/ holds the ledgers of every repo whose sessions use carnet, and each line names the register its issue lives in. An issue is a (number, tracker) pair: a question about it goes to its own tracker, and an issue on another repo's register is named as owner/repo#n, never as this repo's carnet#n. Every question goes over REST (gh api), never gh issue: that is GraphQL, which a cloud session's proxy refuses, and a refusal read as an answer kept a closed issue's cap. A tracker that does not answer at all keeps the cap and says so, rather than reporting the issue as open.

Uncommitted files that are not this session's

Several sessions can share one checkout. A peer's mid-edit file used to hold every other session at 7 — and those sessions were right to refuse to touch it, so they could not reach 10 no matter what they did. That was a category error: the score measures this session's completion, and a peer's in-flight file is not this session's incompleteness.

Two mechanisms fix it, and the first needs nothing from you.

The baseline. The SessionStart hook records which files were already dirty or untracked — every untracked file by name — and which commits were already unpushed, when the session opened. A path dirty before the session existed is definitionally not its work — that much is machine-decidable. Those are stated as a note and never scored. The hook records it once per session: SessionStart fires again on resume and after a compaction, and re-recording there would declare the session's own uncommitted work inherited. Its paths and its HEAD describe the checkout the session opened in and no other. In a worktree the session reaches afterwards no path is inherited — a path dirty in the main checkout says nothing about the same-named file there, and a peer's pre-existing worktree is what ack is for — and whether the session committed anything there is read from that checkout's own HEAD reflog: where its HEAD stood when the session opened, or the commit it was made at. The unpushed commits it recorded are inherited everywhere: a sha names the same commit in every checkout, so a peer's commit already unpushed when the session opened is not the session's to land from a worktree made on top of it either.

ack, for what goes dirty afterwards. A peer editing during your session is not covered by the baseline, so you say so once:

bash
bilan.sh ack --why "a peer's version bump, written into this shared checkout at 10:16"

That clears the cap rather than softening it — the tracked-files cap and the untracked-files cap alike — and carries the reason into every later report. It is keyed to the exact set of paths each cap names — what the baseline already calls inherited is not in it — so dirtying one more file brings that cap straight back, and ownership is a property of the files rather than their contents, so a peer changing those same files again stays covered. Neither cap's remedy ever says to delete a file: the ones it names might be a peer's.

Why not attribute automatically? It was tried and it does not work. Claude Code records the paths a session touched under file-history-snapshot.trackedFileBackups, but only for the Edit/Write tools, so a session that writes its files through Bash leaves that map empty. Attributing on it would call a session's own work a peer's and stop blocking — the worst direction to be wrong in.

The dev-stack cap follows the same rule where a checkout has one: a stack already running under the same pid when the session opened is a peer's, stated and never scored, because the only way to clear such a cap would be to take the peer's servers down.

The three call sites

/bilan — on demand, the full measurement including CI.

The startup sweep (hooks/session-start-sweep.sh) — records the baseline, then looks for what a dead session left behind. A kill -9, a closed terminal or an exhausted context fires no exit hook, so the dead session can never report on itself; the session that opens after it looks instead, across every worktree of this repo and every ledger on the machine. It reports only this repo's register, and drops a dead session's claim once the tracker says the issue is closed, so a long-resolved issue does not keep reappearing as abandoned.

A ledger belongs to its session, so the sweep rewrites or deletes one only when that session has certainly ended. A session is judged by its id, not by the pid its ledger recorded — carnet writes that pid once, and claude --resume keeps the id under a new one — from the session files Claude Code keeps under its config dir ($CLAUDE_CONFIG_DIR and every ~/.claude*): a file naming the id with a live pid is a running session, and the sweep leaves it alone. When the sweep cannot tell — a session file still names the session under a pid that does not run here (a leftover of a crash, or a session in another pid namespace sharing the config dir, such as a container), the ledger's recorded pid still runs with no session file to say whose it is, or the ledger names no pid — it reports the claims as possibly still held, and clears nothing. The host name carnet stamps into the ledger decides nothing: the ledger sits in this machine's config dir, and a machine's name changes under it — a Mac renames itself when its name is taken on the network — so a session this machine ran under an earlier name is still judged, and cleared, as this machine's.

The ledger directory is shared, and not every sweep that reads it keeps to its own register. This one asks each claim's own tracker and leaves another register's lines alone. The sweeps of dravr-platform and mirroir-mcp, as they stand, do not: each asks its own tracker about every claim number in a ledger whose session it takes for ended, whatever register the line names. A claim held here can then be reported there as that repo's own carnet#n, or be deleted — and the ledger with it, once nothing is left — because that repo's issue of the same number is closed; if that sweep runs first, this one then finds nothing to report. The claim marker on the tracker is untouched: carnet.sh status <n> still shows who holds the issue and whether that session has ended.

The Stop gate (hooks/stop-gate.sh) — disarmed, and deliberately not wired. It would refuse a stop while the score was 8 or below. That is only as good as the number: a gate grading something the session did not do — a shared checkout's HEAD, a peer's red CI — blocks every session in that checkout over a commit none of them made, and each block spends a session's last turn arguing with a number about somebody else's work. A wrong number costs a paragraph; a wrong number that can stop the session costs every turn it had left, and fixing one misattribution does not remove the class. The script is kept, and its tests run, so re-arming it would be a decision about a script that works.

Show full SKILL.md (1,554 more words)Show less

Work that leaves no trace

Two kinds of incompleteness are invisible to git, the ledger and CI, and both have produced a false 10:

Background tasks. Claude Code writes each one's stream to the session's tasks/ directory, beside its scratchpad (…/<session-id>/tasks/<id>.output), and closes it with [exited with code N] or [killed]; no marker and a live holder means it never ended. The directory is per session, so each terminal answers only for its own work. A session working in a worktree has it keyed by the directory the session was launched from — usually the main checkout — and bilan looks there too. Closing a session with a task running throws that work away, so it caps at 7. bilan runs inside one of those streams itself, so a file held by anything in its own process ancestry is this invocation, not a task.

Issues the session filed. carnet.sh create writes a filed line to the ledger and close removes it, so what remains is what this session opened and did not fix. That caps at 6 — level with an issue still held, because filing instead of fixing is the same unfinished work wearing a label. The standing rule is fix first, file only the residue; if something genuinely cannot be fixed here, that is a decision to put in front of the project maintainer, not a cap to slip past.

Except a registered limitation, which is the one filed issue that is not work owed. The LIMITATION procedure requires an open issue for as long as a marker names it, so this cap would punish a session for obeying it — and there would be nothing it could do, because the fix is to close an issue the rules say must stay open.

So the exemption needs both halves: the issue carries the limitation label, and a LIMITATION(registre#n) marker names that issue in a file the register scans. A label alone still caps, so a bug cannot be relabelled out of the score; a marker naming a dead issue is caught by the marker check from the other side. Both together mean the issue is a register entry rather than deferred work, and it prints as a note — the gap stays visible instead of disappearing into a clean pass, which is the entire point of registering it. The exemption only speaks for this repo's register: the marker half is this checkout's scope.

Both halves are local, so --cheap credits it too. The full run reads the label from the tracker, falling back to the ledger only when the tracker cannot be asked at all. --cheap reads the line carnet.sh writes to the session ledger when it applies the label — create --label limitation or label <n> +limitation — and removes on -limitation. A label applied any other way (the web UI) reaches only the full run.

Where a marker counts

It is the register's decision, not bilan's. The register is llm-registre, a git submodule at .registre; its gate scans the directories its callers name, for the extensions registre.toml configures, minus test, bench, example and generated trees. bilan asks the gate for that set instead of keeping its own copy of the exclusions: a copy drifts from the gate both ways, and a marker one tool honoured would be invisible to the other.

  • The files. A gate new enough to have --list-files is asked for them. An older gate is probed: it runs once with a recording ripgrep first on PATH, and bilan lists files with exactly the directories and globs the gate composed — which is what --list-files itself runs. Either way nothing is copied. bilan.sh scope prints the answer and how it was reached.
  • The directories. The ones the CI lane passes the gate (.github/workflows/limitation-register.yml, the only workflow read), read out of the workflow rather than restated. scan_dirs in registre.toml, and REGISTRE_SCAN_DIRS over it, replace them for bilan alone: the gate this repo pins reads neither, and both of its callers name the directories on the command line, so either setting narrows what bilan verifies and never what the gate scans. The suite checks that bilan resolves the same directories scripts/pre-push-validate.sh runs the gate on, so a committed scan_dirs that disagrees fails a test; the environment variable is a local override no test sees.
  • Test trees are outside it. A gap in test coverage is therefore marked on the production item the tests leave uncovered, not on the test that fails to cover it.
  • Only what the session added. Markers are read from the session's diff against the merge base, committed and not, so a checkout that is merely behind is neither credited with nor blamed for a line it has not merged.
  • When the register cannot say — .registre is not checked out, which is the usual state of a fresh worktree (git submodule update --init .registre), or the gate listed nothing — a marker this session wrote cannot be verified, and it caps at 6. Only a marker in a file whose extension the register scans: prose, scripts and this skill's own tree are outside every register's scope, so a session that merely documents the convention is not held to it. Once the submodule is populated in a worktree, a plain git worktree remove refuses it (git will not remove a worktree containing submodules): check it holds nothing uncommitted, then --force.
  • The tracker is private. A token that cannot read it leaves a new marker unverified; the cap then says the tracker was unreadable (gh auth status) rather than blaming the marker.

When there is nothing to measure

A score of 10 means everything I checked is done. When nothing was checkable, 10 means nothing at all — and that is how a session reported 10/10 with its artifact unwritten. bilan reads the repo, the register and CI; a session whose work is research, a design, a document or a published artifact touches none of the three, so every check came back clean because every check came back empty.

So a session that made no commit and declared no todo caps at 9, labelled nothing measurable. It caps rather than blocks, because answering a question really is a complete session; what it must not do is issue a verdict it never earned. Declaring the work as a todo, or committing something, makes it measurable again.

The verdict is measured against an ask, so it waits for one. A status line renders before the first prompt arrives, and without that condition every session would open at "9/10 nothing measurable" for having done nothing in its first second. A session nobody has asked anything of scores clean.

Every report also carries the ask, verbatim: asked: is the latest prompt the project maintainer typed, and opened: the first, when they differ. bilan cannot judge whether the work satisfies it — that would be narration again, the thing it exists to treat — but it can refuse to let a session claim completion without the request in view. The latest counts because a long session is not what it opened with. A scheduled wakeup, a task notification or a peer message is text the session or the harness wrote, not an ask, and the transcript marks it so.

CI, and one thing it cannot see

CI is printed, never scored. A shared checkout has one HEAD and many sessions, all committing as the same author, so whose commit the tip is cannot be recovered from git. Grading the tip caps every session in the checkout over one peer's red; grading it only when HEAD moved since the session opened is no better, because HEAD moves when peers push, and a session is then graded on a tip that landed after its own push. The verdict is shown; the number stays about work the session can act on. For CI on your own commit, ask for that sha by name.

It is read from the check-runs API by full sha, every page: gh run list --commit with a short sha answers with an empty list, and a failure on the second page of a commit's check runs is still a failure. A sha with no check run prints nothing — absent, not green. It is asked whether or not the branch has an upstream: a worktree branch landed with git push origin <branch>:main has main's tip as its HEAD, and that commit's CI is shown like any other.

Background work is scanned in the session's tasks/ directory only. Whether every kind of in-flight work can be detected there — a Monitor, a subagent, whose entry is a link to its transcript and never carries an exit marker — has not been confirmed. Treat the running-work cap as covering background Bash tasks; a session that knows it has other work in flight should say so rather than trust the absence of a cap.

What it does not do

It cannot tell you whether the work is good, only whether it is finished. A green bilan on a wrong implementation is still a wrong implementation — that is what /code-review is for.

It cannot see a deliverable the session never declared. A todo, a commit or an issue makes work visible to it; an artifact written and published with none of those does not. The nothing measurable cap is how it says so out loud instead of scoring an empty check clean.

© Atmosphere, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 4 other files in .agents/skills/bilan of Atmosphere/atmosphere.

  • SKILL.md
  • bilan.sh
  • hooks/session-start-sweep.sh
  • hooks/stop-gate.sh
  • test.sh

Open the folder on GitHubat commit 13671cf

Used in 1 other repository

We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in Atmosphere/atmosphere, which our catalogue first saw on October 7, 2026.

Compare with similar skills

Bilan next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Bilan compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Bilan this skillAtmosphere/atmosphere3.8k1 repos~5.5kAutomated safety check: PassApache-2.0
Arcgis To Portaljsdatopian/portaljs2.4k1 repos~2kAutomated safety check: PassMIT
Nuget UpdateCalabonga/Microservice-Template287—~1.4kAutomated safety check: PassMIT
Compliance ScanAojdevStudio/Finance-Guru322—~2.6kAutomated safety check: NotesCustom licence
Nitnewtype-ai/nit114—~3.6kAutomated safety check: PassMIT
Epiq Architectureljtn/epiq535—~2.3kAutomated safety check: PassMIT

Similar skills

  • Arcgis To Portaljs

    datopian/portaljs

    Migrate a whole ArcGIS Hub site into a PortalJS Arc portal end-to-end.

    2.4k GitHub starsUsed in 1 repo~2k tokens
    Backend & APIsAuto-check passed
  • Nuget Update

    Calabonga/Microservice-Template

    Проверить и обновить версии NuGet-пакетов в активных шаблонах NET10.0 (Module, IdentityModule, RazorPages).

    287 GitHub stars~1.4k tokensUpdated 3 days ago
    Backend & APIsAuto-check passed
  • Compliance Scan

    AojdevStudio/Finance-Guru

    Privacy and security compliance scanner for the Finance Guru repo.

    322 GitHub stars~2.6k tokensUpdated 2 days ago
    Backend & APIsAuto-check: notes
  • Nit

    newtype-ai/nit

    Git for agent identity — one identity, any apps. An agent skill from newtype-ai/nit.

    114 GitHub stars~3.6k tokensUpdated 5 mo ago
    Backend & APIsAuto-check passed
  • How epiq is built — the event log's distributed rules (causal ordering, logical clocks, tombstones, total replay), the code's layers, and the workflow for this repository.

    535 GitHub stars~2.3k tokensUpdated today
    Backend & APIsAuto-check passed
  • Cnb

    h4dex/opc-nexus

    CNB(cnb.cool)云原生构建平台操作:Git 推送、.cnb.yml CI 配置、CNB OpenAPI(Release/Issue/PR)。当需要推送代码到 CNB 远端、修改 CI 流水线、发布 Release 或调用 CNB API 时使用。

    244 GitHub stars~624 tokensUpdated 1 mo ago
    Backend & APIsAuto-check passed

More from Atmosphere/atmosphere

All 20 skills in this repo
  • Obsidian Bases

    Atmosphere/atmosphere

    Create and edit Obsidian Bases (.base files) with views, filters, formulas, and summaries.

    3.8k GitHub starsUsed in 22 repos~3.2k tokens
    Auto-check passed
  • Obsidian Markdown

    Atmosphere/atmosphere

    Create and edit Obsidian Flavored Markdown with wikilinks, embeds, callouts, properties, and other Obsidian-specific syntax.

    3.8k GitHub starsUsed in 20 repos~1.3k tokens
    Auto-check passed
  • Obsidian CLI

    Atmosphere/atmosphere

    Interact with Obsidian vaults using the Obsidian CLI to read, create, search, and manage notes, tasks, properties, and more.

    3.8k GitHub starsUsed in 13 repos~795 tokens
    Auto-check passed
  • Release Sample Sweep

    Atmosphere/atmosphere

    Run the pre-release end-to-end sweep of every user-facing surface — the 33 samples under samples/ (booted from their packaged artifacts and driven in a real browser via chrome-devtools MCP), the…

    3.8k GitHub stars~4.2k tokensUpdated today
    Auto-check passed
  • Obsidian Writer

    Atmosphere/atmosphere

    Write well-formatted notes to the atmosphere-vault Obsidian knowledge base.

    3.8k GitHub stars~2.6k tokensUpdated today
    Auto-check passed
  • Carnet

    Atmosphere/atmosphere

    Work the private register (Atmosphere/atmosphere-carnet) from a session — claim an issue before touching it so peers see who holds it and which session, release or close it when done, file new…

    3.8k GitHub stars~4k tokensUpdated today
    Auto-check passed

Works with

Categories

Questions about Bilan

What does Bilan do?

Measure whether this session actually finished — the 0-10 completion number, computed from git, the carnet ledger, LIMITATION markers and CI instead of narrated. Bilan is an agent skill from Atmosphere/atmosphere. Measure whether this session actually finished — the 0-10 completion number, computed from git, the carnet ledger, LIMITATION markers and CI instead of narrated.

When should I use Bilan?

Bilan fits situations like: backend & APIs work in your project.

How do I install Bilan in Claude Code?

Run `npx skills add Atmosphere/atmosphere --skill bilan -a claude-code`. Or copy the skill folder (.agents/skills/bilan in Atmosphere/atmosphere) into .claude/skills/bilan in your project. Claude Code loads it when a task matches its description.

How do I install Bilan in Codex?

Run `npx skills add Atmosphere/atmosphere --skill bilan -a codex`. Or copy the skill folder (.agents/skills/bilan in Atmosphere/atmosphere) into .agents/skills/bilan in your project. Codex loads it when a task matches its description.

Can I use Bilan in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Atmosphere/atmosphere --skill bilan -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/bilan, .gemini/skills/bilan, .github/skills/bilan and .opencode/skills/bilan in your project.

What does Bilan need to run?

Going by SKILL.md and its folder, Bilan needs a shell for the scripts in its folder and the command-line tools its instructions call (git, gh and claude). Our summary lists: A Bash shell.

Does Bilan access the network?

SKILL.md contains no URLs. Its commands use git and gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Bilan safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Bilan use?

Bilan is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Bilan use?

About 5.5k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Bilan?

Skills that share tags, products or a category with Bilan: Arcgis To Portaljs (datopian/portaljs, 2.4k stars), Nuget Update (Calabonga/Microservice-Template, 287 stars), Compliance Scan (AojdevStudio/Finance-Guru, 322 stars) and Nit (newtype-ai/nit, 114 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Bilan?

Atmosphere (a GitHub organization) maintains it in Atmosphere/atmosphere, which has 3,818 GitHub stars. The repository holds 20 skills in this directory. The repository was last updated on October 9, 2026.

Source: Atmosphere/atmosphere on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.