diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..4d64372 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,24 @@ +# Changelog + +## 0.4.0 - 2026-07-05 + +### Added + +- Added the `briefprint` installable skill bundle under `skills/briefprint`. +- Added cache explanation output for document cache and rendered-output cache behavior. +- Added the incident lifecycle example and README benchmark shape. +- Added `--sensitive` as a safe default alias for ephemeral cache, no output cache, PII redaction, and delete-on-exit behavior. +- Added secret redaction support for cache and summarizer boundaries. +- Added Korean README coverage in `README.ko.md`. + +### Changed + +- Rebranded the agent-facing skill surface to Briefprint while retaining the Python package name `document-briefing-cache`. +- Kept installable agent skill files separate from repository runtime, tests, docs, examples, and packaging files. +- Tightened skill metadata, routing boundaries, and bundle validation. +- Bumped runtime and skill metadata to `0.4.0`; cache keys include the skill version, so prior `0.3.x` document-summary cache entries are treated as misses after upgrade. + +### Security + +- Documented that HMAC signing is tamper detection only and does not encrypt plaintext cache files. +- Documented sensitive-document defaults and redaction limitations. diff --git a/agents/openai.yaml b/agents/openai.yaml index fa2aea7..662e5d1 100644 --- a/agents/openai.yaml +++ b/agents/openai.yaml @@ -1,4 +1,4 @@ -version: "0.3.1" +version: "0.4.0" interface: display_name: "Briefprint" diff --git a/pyproject.toml b/pyproject.toml index 7dfa0c5..ed3fa3a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "document-briefing-cache" -version = "0.3.1" +version = "0.4.0" description = "Reusable document briefing skill with document-level caching and template rendering." requires-python = ">=3.10" dependencies = [ diff --git a/scripts/validate_skill.py b/scripts/validate_skill.py index 5237b63..6aed74a 100644 --- a/scripts/validate_skill.py +++ b/scripts/validate_skill.py @@ -253,7 +253,7 @@ def validate_openai_yaml(path: Path) -> list[str]: text = path.read_text(encoding="utf-8") errors = [] required_fragments = [ - 'version: "0.3.1"', + 'version: "0.4.0"', "interface:", 'display_name: "Briefprint"', 'short_description: "Rerender cached document briefings without re-summarizing unchanged supplied documents."', diff --git a/skills/briefprint/SKILL.md b/skills/briefprint/SKILL.md index 12b611d..ec3241c 100644 --- a/skills/briefprint/SKILL.md +++ b/skills/briefprint/SKILL.md @@ -1,6 +1,6 @@ --- name: briefprint -description: Use to summarize, brief, digest, recap, or rerender docs/notes/tickets/logs/reports/transcripts, JSON/XML/API, or cached briefing state. Not for live research, source-code review/debugging, general writing, translation-only, simple Q&A, or non-cacheable input. +description: Use to summarize, brief, digest, recap, or rerender supplied documents, notes, tickets, logs, reports, transcripts, JSON/XML/API payloads, or cached briefing state. Do not use for live research, source-code review/debugging, general writing, translation-only edits, simple Q&A, or non-cacheable input. --- # Briefprint diff --git a/skills/briefprint/agents/openai.yaml b/skills/briefprint/agents/openai.yaml index fa2aea7..662e5d1 100644 --- a/skills/briefprint/agents/openai.yaml +++ b/skills/briefprint/agents/openai.yaml @@ -1,4 +1,4 @@ -version: "0.3.1" +version: "0.4.0" interface: display_name: "Briefprint" diff --git a/src/document_briefing_cache/__init__.py b/src/document_briefing_cache/__init__.py index 5dc605a..4f6923d 100644 --- a/src/document_briefing_cache/__init__.py +++ b/src/document_briefing_cache/__init__.py @@ -11,4 +11,4 @@ "BriefingPipeline", ] -__version__ = "0.3.1" +__version__ = "0.4.0" diff --git a/src/document_briefing_cache/pipeline.py b/src/document_briefing_cache/pipeline.py index 4b0faa5..3ba337b 100644 --- a/src/document_briefing_cache/pipeline.py +++ b/src/document_briefing_cache/pipeline.py @@ -26,7 +26,7 @@ from .render import TEMPLATE_VERSION, render_briefing from .summarizers import BaseSummarizer, RuleBasedExtractiveSummarizer -SKILL_VERSION = "0.3.1" +SKILL_VERSION = "0.4.0" class BriefingPipeline: diff --git a/tests/test_installable_skill_bundle.py b/tests/test_installable_skill_bundle.py index 35994f8..b7bf923 100644 --- a/tests/test_installable_skill_bundle.py +++ b/tests/test_installable_skill_bundle.py @@ -42,7 +42,7 @@ def test_installable_skill_bundle_frontmatter_and_references_are_portable(): assert re.fullmatch(r"[a-z0-9-]{1,64}", name) assert description assert len(description) <= 1024 - assert len(description) <= 260 + assert len(description) <= 320 root_only_fragments = [ "src/", diff --git a/tests/test_skill_metadata.py b/tests/test_skill_metadata.py index 69bd71d..939a45d 100644 --- a/tests/test_skill_metadata.py +++ b/tests/test_skill_metadata.py @@ -11,14 +11,14 @@ ) -def test_versions_are_synchronized_to_0_3_1(): +def test_versions_are_synchronized_to_0_4_0(): pyproject = (ROOT / "pyproject.toml").read_text(encoding="utf-8") openai_yaml = (ROOT / "agents" / "openai.yaml").read_text(encoding="utf-8") - assert 'version = "0.3.1"' in pyproject - assert __version__ == "0.3.1" - assert SKILL_VERSION == "0.3.1" - assert 'version: "0.3.1"' in openai_yaml + assert 'version = "0.4.0"' in pyproject + assert __version__ == "0.4.0" + assert SKILL_VERSION == "0.4.0" + assert 'version: "0.4.0"' in openai_yaml def test_openai_yaml_uses_interface_metadata(): @@ -47,11 +47,11 @@ def test_skill_description_matches_supported_modes_and_boundary(): description = next( line.split(":", 1)[1].strip().strip('"') for line in frontmatter.splitlines() if line.startswith("description:") ) - assert len(description) <= 260 + assert len(description) <= 320 description_lower = description.lower() for term in ["summarize", "brief", "digest", "recap", "rerender", "cached briefing state"]: assert term in description_lower - for input_kind in ["docs", "notes", "tickets", "logs", "reports", "transcripts", "json/xml/api"]: + for input_kind in ["documents", "notes", "tickets", "logs", "reports", "transcripts", "json/xml/api payloads"]: assert input_kind in description_lower for boundary in [ "live research",