test(json-yaml): verify real YAML provider through pmacs

Drive Red Hat yaml-language-server 1.24.0 through the default YAML
auto-attach path. Disable SchemaStore and the Kubernetes CRD catalog for
network-free determinism, require language-specific initialization and a
real syntax diagnostic, and prove the server remains alive afterward.

Update the framing and runtime commentary with the completed live-provider
evidence. The test passes against the pinned provider and fails against the
pre-JSON/YAML runtime under scripts/bite.

Co-Authored-By: OpenAI Codex <noreply@openai.com>
This commit is contained in:
Levi Neuwirth 2026-07-20 16:36:34 -04:00
parent 19ad5cc8ac
commit 5c202c54c1
3 changed files with 105 additions and 16 deletions

View File

@ -240,8 +240,10 @@ pmacs.lsp.config.json = pmacs.lsp.config.json or {
-- live-observed with Red Hat `yaml-language-server@1.24.0`: its initial -- live-observed with Red Hat `yaml-language-server@1.24.0`: its initial
-- pull requests exactly those five sections, and opening a YAML document -- pull requests exactly those five sections, and opening a YAML document
-- requests a second scoped `[yaml]` section. The standalone smoke reached -- requests a second scoped `[yaml]` section. The standalone smoke reached
-- a real syntax diagnostic and clean shutdown; the PATH-gated -- a real syntax diagnostic and clean shutdown. The PATH-gated pmacs
-- pmacs-through-server acceptance remains a transfer task. -- acceptance also proves auto-attach, initialization, config pulls, a
-- syntax diagnostic, and continued server liveness with both catalogs
-- disabled for network-free determinism.
pmacs.lsp.config.yaml = pmacs.lsp.config.yaml or { pmacs.lsp.config.yaml = pmacs.lsp.config.yaml or {
command = "yaml-language-server", command = "yaml-language-server",
args = { "--stdio" }, args = { "--stdio" },

View File

@ -1,12 +1,12 @@
# JSON + YAML grammars — framing (side quest, highlight family) # JSON + YAML grammars — framing (side quest, highlight family)
**Revision 2 — 2026-07-20. Status: PR #123 open; review-fix **Revision 3 — 2026-07-20. Status: PR #123 open; review-fix
checkpoint preserved on branch `json-yaml-handoff-2026-07-20`.** checkpoint preserved on branch `json-yaml-handoff-2026-07-20`.**
The public PR branch still pointed to the original implementation The public PR branch still pointed to the original implementation
`4be2a65` when this checkpoint was created. JSON provider resolution `4be2a65` when this checkpoint was created. JSON provider resolution
and its real pmacs smoke are complete; the YAML 1.24.0 standalone and its real pmacs smoke are complete; the YAML 1.24.0 standalone
protocol smoke is complete; the real YAML-through-pmacs acceptance, protocol smoke and real YAML-through-pmacs acceptance are complete;
rebase onto current main, and full gates remain. rebase onto current main and full gates remain.
**Intent.** Add `tree-sitter-json` and `tree-sitter-yaml` grammars (plus **Intent.** Add `tree-sitter-json` and `tree-sitter-yaml` grammars (plus
their language servers) to the bundle. Two config formats that pmacs their language servers) to the bundle. Two config formats that pmacs
@ -157,8 +157,8 @@ fences resolve through the #122 engine. Acceptance proves both end to end
3. The two configuration models are now observed: JSON consumes the 3. The two configuration models are now observed: JSON consumes the
pushed full settings object; YAML 1.24.0 pulls the five documented pushed full settings object; YAML 1.24.0 pulls the five documented
sections plus a document-scoped `[yaml]` request. The remaining bet sections plus a document-scoped `[yaml]` request. The remaining bet
is that pmacs answers the real YAML server correctly end to end, was that pmacs answers the real YAML server correctly end to end;
which the pending PATH-gated acceptance must prove. the PATH-gated acceptance now proves that against version 1.24.0.
## Deferred (named) ## Deferred (named)
@ -203,18 +203,17 @@ fences resolve through the #122 engine. Acceptance proves both end to end
pmacs, receive the pushed default config, open invalid JSON, and pmacs, receive the pushed default config, open invalid JSON, and
publish a syntax diagnostic. Skips when the binary is absent. publish a syntax diagnostic. Skips when the binary is absent.
12. `m4_real_yaml_provider_pulls_config_and_reports_diagnostics` 12. `m4_real_yaml_provider_pulls_config_and_reports_diagnostics`
**pending on the destination machine**. PATH-gated live smoke for PATH-gated live smoke for Red Hat `yaml-language-server@1.24.0`:
Red Hat `yaml-language-server@1.24.0`: auto-attach through pmacs, auto-attach through pmacs, disable SchemaStore and Kubernetes CRD
disable SchemaStore and Kubernetes CRD catalog network access for catalog network access for determinism, reach initialized, open
determinism, reach initialized, open invalid YAML, publish a invalid YAML, publish a diagnostic, and remain alive.
diagnostic, and remain alive.
## Risks / interactions ## Risks / interactions
- **LSP configuration** (Q#JY2) — JSON push and YAML standalone pulls - **LSP configuration** (Q#JY2) — JSON push, YAML standalone pulls, and
are observed. The real YAML-through-pmacs path is still pending and the real YAML-through-pmacs path are observed. Both live provider
is an explicit transfer blocker, not implied complete by source tests remain PATH-gated, so release verification must put the pinned
inspection. binaries on PATH rather than accepting their skip paths.
- **Themes / injections** — untouched. This is pure grammar+detection - **Themes / injections** — untouched. This is pure grammar+detection
addition; it consumes the #122 engine, doesn't change it. No protocol addition; it consumes the #122 engine, doesn't change it. No protocol
bump. bump.

View File

@ -6496,6 +6496,94 @@ fn m4_real_json_provider_receives_config_and_reports_diagnostics() {
assert_no_lsp_crash(&mut state, "real JSON server"); assert_no_lsp_crash(&mut state, "real JSON server");
} }
/// PATH-gated provider smoke: drive Red Hat
/// `yaml-language-server@1.24.0` through pmacs's default YAML config and
/// require a syntax diagnostic for an invalid document. `SchemaStore` and
/// the Kubernetes CRD catalog are disabled in this test so the result is
/// deterministic and does not depend on network access. CI skips cleanly
/// when no compatible binary is installed.
#[test]
fn m4_real_yaml_provider_pulls_config_and_reports_diagnostics() {
use pmacs::editor::EditorState;
let Ok(command) = which_binary("yaml-language-server") else {
eprintln!("yaml-language-server not on PATH; skipping");
return;
};
let command = command.display().to_string();
let dir = tempfile::tempdir().expect("tempdir");
let file = std::fs::canonicalize(dir.path())
.expect("canonicalize")
.join("invalid.yaml");
std::fs::write(&file, b"root:\n broken: [one,\n").expect("write invalid yaml");
let file_disp = file.display().to_string();
let uri = format!("file://{file_disp}");
let mut state = EditorState::new();
state
.lua_host
.lua()
.load(format!(
"local c = pmacs.lsp.config.yaml
c.command = '{command}'
c.settings.yaml.schemaStore = {{ enable = false }}
c.settings.yaml.kubernetesCRDStore = {{ enable = false }}
pmacs.buffer.find_or_open('{file_disp}')"
))
.exec()
.expect("configure real YAML server + open file");
assert!(
pump_lua_flag(
&mut state,
"(function() for _,r in ipairs(pmacs.lsp.list()) do \
if r.language_id=='yaml' and r.state \
and r.state.kind=='initialized' then return true end \
end return false end)()",
30,
),
"auto-attached real YAML server never reached initialized"
);
let deadline = Instant::now() + Duration::from_secs(10);
let mut got_diagnostic = false;
while Instant::now() < deadline {
state.tick_processes();
state.tick_lsp();
state.tick_async();
got_diagnostic = state
.lua_host
.lua()
.load(format!("return pmacs.diag.count('{uri}') > 0"))
.eval()
.unwrap_or(false);
if got_diagnostic {
break;
}
std::thread::sleep(Duration::from_millis(10));
}
assert!(
got_diagnostic,
"real YAML server produced no diagnostic; config pulls or validation are broken"
);
assert_no_lsp_crash(&mut state, "real YAML server");
let still_initialized: bool = state
.lua_host
.lua()
.load(
"for _,r in ipairs(pmacs.lsp.list()) do \
if r.language_id=='yaml' and r.state \
and r.state.kind=='initialized' then return true end \
end return false",
)
.eval()
.expect("inspect YAML server state");
assert!(
still_initialized,
"real YAML server did not remain alive after publishing diagnostics"
);
}
/// Typing-perf: the default bundle coalesces full-document /// Typing-perf: the default bundle coalesces full-document
/// `didChange` notifications instead of sending one per keystroke /// `didChange` notifications instead of sending one per keystroke
/// (each send copies the whole buffer several times and writes /// (each send copies the whole buffer several times and writes