G6 (kind deploy smoke) is shipped — stop listing it as a gap - #534
Merged
Conversation
pr-kind-deploy-smoke.yml runs the exact job G6 specified: helm install into an ephemeral kind cluster, then the protocol smoke against the live pod. Observed green on #526 today. The entry still claimed we only run helm lint/template. A gap doc that is stale in the CLOSED direction is worse than one that is merely incomplete — it argues for building something that exists. So the entry now also says to edit this file in the same PR that closes a gap, and the priority list drops the two items already done. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
brentrager
added a commit
that referenced
this pull request
Aug 23, 2026
…ished work #534 landed because §G6 claimed "we only helm lint" after the kind deploy-smoke job had shipped. §5's priority list had the same rot: item 1 still named G3 as the highest-severity next increment, and item 4 pointed at G2/G9 by bare letter. Items 1 and 2 are struck (G3 and G1 shipped). Item 4 now names the specific remainders rather than the letters — G2's chunker is done and its format extraction is not; G9's mock and credential-free tier are done and the nightly that would run the gated external tier does not exist. "G2 is done" and "G2's chunker is done, format extraction isn't" send whoever picks this up to very different places.
brentrager
added a commit
that referenced
this pull request
Aug 23, 2026
…ipped (#535) * g1: fence the ingest→ACL chain at the pipeline seam, and mark G1/G2/G9 shipped G1's implementation already landed (315841c and follow-ups): the `Connector` seam, `MockConnector`, the file/web/github connectors, the chunker, incremental indexing. `docs/Planning/Feature Gaps.md` was never updated to say so, so §G1, §G2 and §G9 still read as open gaps while G3 and G8 carry ✅ markers. That is how a second agent gets sent to build what exists. The one real hole underneath the stale doc: the guarantee that a connector's ACL survives ingestion was asserted end to end in exactly one place — `github_connector.rs::custom_group_gates_retrieval_end_to_end`. That is a connector test. Rewrite or delete the GitHub connector and the ingest half of G3 loses its only fence, with `ingestion_contract.rs` still green. `ingested_acls_gate_retrieval_for_every_connector` asserts the same chain at the pipeline seam over a `MockConnector`, so it binds every connector present and future: a doc ingested for `group-eng` is readable by a principal carrying that group and returns nothing for `group-fin` or anonymous, while a doc with no ACL stays org-public. Each negative is paired with the entitled-principal positive control on the same query — "nothing leaked" must not be satisfiable by a pipeline that stored nothing, which is a failure mode this repo has shipped. Red before green: with `DocAcl::for_groups(...).attach_to(document)` reverted in pipeline.rs the new test fails with `group-fin must not read the group-eng doc, got 1 hits` — the exact G3 cross-user leak — while the pre-existing contract test stays green, which is what kept the gap invisible. The doc now records what shipped, plus what the ✅ does not cover: `pull` returns `Vec<RawDocument>` rather than the planned `Stream<Document>`, which materializes a whole source per pull and should be re-shaped before Confluence/Jira rather than after (it is a breaking trait change); format extraction (PDF/DOCX) does not exist ahead of the chunker; and rust.yml has no `schedule:`, so G9's gated `external` tier is a convention nothing ever executes. No production behavior changes — one test, one changeset, one doc. * docs: retire the closed items in §5 so the list stops arguing for finished work #534 landed because §G6 claimed "we only helm lint" after the kind deploy-smoke job had shipped. §5's priority list had the same rot: item 1 still named G3 as the highest-severity next increment, and item 4 pointed at G2/G9 by bare letter. Items 1 and 2 are struck (G3 and G1 shipped). Item 4 now names the specific remainders rather than the letters — G2's chunker is done and its format extraction is not; G9's mock and credential-free tier are done and the nightly that would run the gated external tier does not exist. "G2 is done" and "G2's chunker is done, format extraction isn't" send whoever picks this up to very different places. * docs: hand §G2 to #536, and state where ACL enforcement actually lives g2chunk's #536 wrote the G2 contract suite and it found four silent defects in the shipped chunker (overlap pushed emitted chunks past max_chars; unspaced CJK/URL text never spilled; CRLF destroyed paragraph structure; chunks straddled markdown sections). My §G2 text called the existing unit tests adequate because they were green and named every rule — which is exactly the reasoning this document exists to stop. Each of those tests asserted its rule on the one input shape that never triggers the bug. §G2 reverts to pristine; #536 owns it. Also corrects my own §G1 bullet. I wrote that an AclKnowledgeStore records and enforces the ACL, which reads as though the fence is opt-in wrapping. Traced it: enforcement is adapter-side in all three backends — Postgres parses DocAcl::ACL_METADATA_KEY at ingest into knowledge_vectors.acl and filters in SQL, DynamoDB into an acl attribute post-filtered at read, and InMemoryStorageAdapter already wraps its own knowledge slice. The live admin indexing path passes state.storage.knowledge() and is fenced by that, not by the caller remembering to wrap. The pipeline writing the metadata is therefore the one link no adapter provides for itself, which is what the contract test guards.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
docs/Planning/Feature Gaps.mdstill says of G6: "we onlyhelm lint/helm template", and prescribes building akind-based CI job.That job exists.
.github/workflows/pr-kind-deploy-smoke.ymldoes exactly what G6 specified —helm installinto an ephemeral kind cluster, then the protocol smoke against the live pod — and it ran green on #526 today.A gap doc that is stale in the closed direction is worse than one that is merely incomplete: an incomplete doc omits work, a stale-closed one actively argues for rebuilding something that already ships. Someone reading the priority list would have picked up G6 next.
So this marks G6 done, drops it and G8 from the "next increments" list (G8 rerank and G3 access control were already marked ✅ in their own entries but never removed from the priority order), and adds the standing rule to the G6 entry: when you close a gap here, edit this file in the same PR.
Context
Found while answering "what are we missing feature-wise versus Onyx?" — this document is that comparison, benchmarking "mature knowledge platforms" without naming them. It's the right doc for the question, which makes its accuracy load-bearing.
Remaining genuinely-open gaps, for the record: G1 connectors/ingestion (the big one — 50+ connectors is what "knowledge platform" means to a buyer), G2 chunking, G4 quality regression, G5 widget e2e, G7 multi-tenancy, G9 connector mock.
🤖 Generated with Claude Code
https://claude.ai/code/session_01NuqyQWN9ma2YSrB28ssSoc