Observability tooling for agent harness sessions, imports, and reports.
Project description
Harness Observability Layer
Minimal MVP for instrumenting an agent harness and generating observability metrics from canonical events.
Security And Privacy
HOL is a local-first analysis tool.
hol import,hol analyze,hol report,hol list,hol portfolio, andhol failuresoperate on local files.- HOL does not upload imported conversations, prompts, tool outputs, or reports by default.
- HOL stores imported raw sessions and derived artifacts only in local paths you control.
- Some metrics such as
total_linesand read coverage are optional local enrichments derived from the current filesystem state.
Privacy controls available now:
--no-raw-copy--no-resolve-files--redact-sensitive
Additional review docs:
- docs/security-and-privacy-review-plan.md
- docs/security-audit-inventory.md
- docs/release-hardening-checklist.md
- CHANGELOG.md
- SECURITY.md
- CONTRIBUTING.md
- CODE_OF_CONDUCT.md
Install
pip install -e .
For release validation and packaging tooling during development:
pip install -e .[dev]
This exposes the unified CLI:
hol --help
What exists
- canonical event model
- append-only JSONL logger
- observable file and shell adapters
- minimal harness runner
- offline analyzer
- mocked session example
- Codex session importer
- Claude Code session importer
- Codex runtime wrapper for
codex exec --json
Quick start
PYTHONPATH=src .venv/bin/python examples/mock_session.py
This writes events to a per-session file like /tmp/harness_observability_layer/sess_xxxx.events.jsonl and prints a derived metrics summary.
By default the example writes runtime data to /tmp/harness_observability_layer/events.jsonl so it can run cleanly in sandboxed environments.
Import an existing Codex session
hol import session ~/.codex/archived_sessions/rollout-YYYY-MM-DDTHH-MM-SS-....jsonl
Privacy-oriented variant:
hol import session ~/.codex/archived_sessions/rollout-YYYY-MM-DDTHH-MM-SS-....jsonl --no-raw-copy --no-resolve-files
This now creates a session artifact folder inside the project:
artifacts/sessions/<session-name>/raw.codex.jsonlartifacts/sessions/<session-name>/normalized.events.jsonlartifacts/sessions/<session-name>/summary.jsonartifacts/sessions/<session-name>/report.htmlartifacts/sessions/<session-name>/report.css
It also refreshes:
artifacts/sessions/index.html
Import the latest archived Codex session
hol import latest
This picks the most recently modified rollout-*.jsonl from ~/.codex/archived_sessions and imports it into the project.
Import a Claude Code session
hol import claude-session ~/.claude/projects/<project>/<session>.jsonl
This imports a Claude Code JSONL session into canonical events and stores it under:
artifacts/sessions/claude-<session-name>/raw.claude.jsonlartifacts/sessions/claude-<session-name>/normalized.events.jsonlartifacts/sessions/claude-<session-name>/summary.jsonartifacts/sessions/claude-<session-name>/report.html
To import the latest Claude session from the default archive tree:
hol import claude-latest
Import all archived Codex sessions
hol import all
This imports every rollout-*.jsonl from ~/.codex/archived_sessions.
By default:
- existing imported session folders are skipped
To force reimport:
hol import all --reimport
Summarize and compare imported sessions
hol list --limit 5
hol analyze latest --format markdown
hol analyze compare <session-a> <session-b>
hol report markdown <session-id>
hol report markdown <session-id> --redact-sensitive
Run Codex with observability capture
PYTHONPATH=src .venv/bin/python scripts/run_codex_observed.py \
"Say only OK" \
--cwd /path/to/project
This wrapper:
- runs
codex exec --json - saves the raw Codex JSONL stream
- normalizes it into canonical events
- writes
summary.json - writes a styled
report.html - prints a metrics summary
By default, live runs are saved under artifacts/live_runs/run_###/.
Open the HTML report
After an import or live run, open the generated report.html file from the corresponding artifact folder.
The page is static and does not require a server.
To browse imported sessions, open:
artifacts/sessions/index.html
In restricted environments, running Codex itself may still require broader filesystem or network access than the parser/importer.
The legacy scripts remain available, but the package/CLI surface is now the recommended interface.
Citation
If you use this project in research, documentation, or derivative tooling, please cite it using CITATION.cff.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file harness_observability_layer-0.1.0.tar.gz.
File metadata
- Download URL: harness_observability_layer-0.1.0.tar.gz
- Upload date:
- Size: 50.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d9cb9e1ef6e1bc0542a29b75a24ea1da2786fffcb9aeecda288dbbc2a5577ae3
|
|
| MD5 |
d62f9f93ea6eb6621387170846e8e7be
|
|
| BLAKE2b-256 |
504129f569bcc3a5529ff7ecdb57b5610e55b05af9ed06e97bb83e449ed3a478
|
Provenance
The following attestation bundles were made for harness_observability_layer-0.1.0.tar.gz:
Publisher:
release.yml on alexandrelira99/harness_observability_layer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
harness_observability_layer-0.1.0.tar.gz -
Subject digest:
d9cb9e1ef6e1bc0542a29b75a24ea1da2786fffcb9aeecda288dbbc2a5577ae3 - Sigstore transparency entry: 1310455307
- Sigstore integration time:
-
Permalink:
alexandrelira99/harness_observability_layer@4423123d51d43c1db17fb1911f5beb7d3c46b590 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/alexandrelira99
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4423123d51d43c1db17fb1911f5beb7d3c46b590 -
Trigger Event:
push
-
Statement type:
File details
Details for the file harness_observability_layer-0.1.0-py3-none-any.whl.
File metadata
- Download URL: harness_observability_layer-0.1.0-py3-none-any.whl
- Upload date:
- Size: 57.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0fb4efa5f902f9b85fb1361074bebb3ae810f31cca067b2a448188d678e1fe0c
|
|
| MD5 |
7f6344e915bd66594b85dc68e075117c
|
|
| BLAKE2b-256 |
ed70766fa5ff3b9f8501c698d9819ac9852d10d67acc68d166346cf1211895cb
|
Provenance
The following attestation bundles were made for harness_observability_layer-0.1.0-py3-none-any.whl:
Publisher:
release.yml on alexandrelira99/harness_observability_layer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
harness_observability_layer-0.1.0-py3-none-any.whl -
Subject digest:
0fb4efa5f902f9b85fb1361074bebb3ae810f31cca067b2a448188d678e1fe0c - Sigstore transparency entry: 1310455390
- Sigstore integration time:
-
Permalink:
alexandrelira99/harness_observability_layer@4423123d51d43c1db17fb1911f5beb7d3c46b590 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/alexandrelira99
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4423123d51d43c1db17fb1911f5beb7d3c46b590 -
Trigger Event:
push
-
Statement type: