Skip to content

InterfaceSummary v0: std carrier + first consumer - #6246

Merged
briansrls merged 68 commits into
mainfrom
session/jolly-lark-525
Jul 6, 2026
Merged

briansrls merged 68 commits into
mainfrom
session/jolly-lark-525

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Jul 4, 2026 •

Copy link
Copy Markdown
Contributor

Summary

InterfaceSummary v0: std carrier (dag/std/interface_summary.dag) with signature-only contracts (FLAG D: ContractAbsent | SignatureContract), per-declaration export fingerprints folded into a module rollup hash (FLAG B), all hashing on std.content_hash (no third hash surface). Derived projection lens (v2.lens.interface_summary) reads live declarations via new host builtin export_signature_facts (signature nodes only — no bodies). src/v2/std/interface_summary.dag is an imports-only re-export shim over std.interface_summary (zero second definitions). First consumer: firewall witness pair discriminating body-only vs signature edits.

Test plan

  • target/release/claim_batch --source-root dag --source-root src/v2 --wet --entry src/v2/test/claim/interface_summary/interface_summary_firewall_test.dag --function interface_summary_firewall_body_only_edit_is_green --function interface_summary_firewall_signature_edit_is_red — both PASS locally
  • cargo build -p v1-compiler --release --bin claim_executor — builds clean
  • PR stays draft until operator signs load-bearing host changes (below)

OPERATOR-SIGN-NEEDED

This PR adds host builtin export_signature_facts in load-bearing v1 seed files:

  • src/v1/04_method.dag — builtin registry row
  • src/v1/stage0/src/v1_interpreter.rs — interpreter dispatch
  • src/v1/stage0/src/coproduct_reflection.rs — marshal_fn_export_signature_node / eval_export_signature_facts (params + return Arrow, no body)
  • src/v1/stage0/src/v1_compiler_infer_method.rs — manual patch (generated; regen not run)

Why reflection was forced: InterfaceSummary v0 is signature-only (FLAG D). Existing decl_facts marshals fn items with body skeletons, so signature fingerprints would include implementation detail — wrong firewall semantics. With no resolver S2a integration in scope, the only path to live-tree export signature nodes is the same reflection seam as decl_facts / module_declaration_facts_live: a dedicated builtin that projects signature-shaped nodes per export. This follows the decl_facts precedent but is a new surface on the load-bearing interpreter/reflection layer — operator sign required before gh pr ready.

Coordination — decl_facts(roots) / #5966

export_signature_facts is adjacent to the decl_facts(roots) #5966 blocker named in the structural-quadratic-wall audit: same reflection machinery, narrower projection (signature nodes without bodies). This builtin may partially unblock that lane (roots-scoped signature facts without full body marshaling). Operator should review before this lands shape — especially if #5966 plans to generalize decl_facts rather than accumulate per-projection builtins.

By-execution receipts (verbatim)

Firewall witness reads the live tree via export_signature_facts / module_declaration_facts_live host intrinsics. Classified host-scaffold (floor:host_scaffold data note + _facts_live( classifier signal in interface_summary_firewall_test.dag) — never node-skipped on the CI floor.

GREEN — body-only edit, export fingerprint unchanged

$ target/release/gunbc run --source-root dag --source-root src/v2 \
    --entry src/v2/test/claim/interface_summary/interface_summary_firewall_test.dag \
    --function firewall_body_v1_fingerprint_receipt
running firewall_body_v1_fingerprint_receipt()...
7c54bb720f0264f7

$ target/release/gunbc run --source-root dag --source-root src/v2 \
    --entry src/v2/test/claim/interface_summary/interface_summary_firewall_test.dag \
    --function firewall_body_v2_fingerprint_receipt
running firewall_body_v2_fingerprint_receipt()...
7c54bb720f0264f7

$ target/release/claim_batch --source-root dag --source-root src/v2 --wet \
    --entry src/v2/test/claim/interface_summary/interface_summary_firewall_test.dag \
    --function interface_summary_firewall_body_only_edit_is_green
PASS interface_summary_firewall_body_only_edit_is_green
[witness] interface_summary_firewall_body_only_edit_is_green: 3ms subject=e2531cfbb5d1b10c eval_self=0.000ms

(firewall_body_v1.dag body { x + 1 } vs firewall_body_v2.dag body { x + 2 } — same signature fn firewall_gate(x: Int) -> Int, fingerprint 7c54bb720f0264f7 both sides.)

RED control — signature edit, export fingerprint changes

$ target/release/gunbc run --source-root dag --source-root src/v2 \
    --entry src/v2/test/claim/interface_summary/interface_summary_firewall_test.dag \
    --function firewall_sig_variant_fingerprint_receipt
running firewall_sig_variant_fingerprint_receipt()...
de2f79f14b466a7f

$ target/release/claim_batch --source-root dag --source-root src/v2 --wet \
    --entry src/v2/test/claim/interface_summary/interface_summary_firewall_test.dag \
    --function interface_summary_firewall_signature_edit_is_red
PASS interface_summary_firewall_signature_edit_is_red
[witness] interface_summary_firewall_signature_edit_is_red: 3ms subject=64bf446ef7fe18c4 eval_self=0.000ms

(firewall_sig_variant.dag changes return type to Bool — fingerprint de2f79f14b466a7f ≠ baseline 7c54bb720f0264f7.)

@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review July 5, 2026 00:42
@gunbai-bot
gunbai-bot Bot marked this pull request as draft July 5, 2026 00:42
@gunbai-bot

gunbai-bot Bot commented Jul 5, 2026

Copy link
Copy Markdown
Contributor Author

Verified each finding against current head (068b3d):

  • interface_summary_v0_dissolution_trigger — present at dag/std/interface_summary.dag:32; lens carries WallAfterGrounding { dissolves_to: SingleAuthority } at src/v2/lens/interface_summary.dag:219-221.
  • No unit-modeling triggers — carrier uses branded hash types + closed enums only; no bare-scalar domain-unit fields in added .dag.
  • Fail-closed Absent arms — body_only_edit_preserves_export_fingerprint / signature_edit_changes_export_fingerprint return false on any Absent fingerprint (lines 71-73, 89-90).
  • Firewall discrimination — fixtures: firewall_body_v1/_v2 same sig (Int→Int), different bodies; firewall_sig_variant flips return to Bool. Both witnesses wired; scoped claim_batch --wet PASS + fingerprint receipts in PR body (7c54bb720f0264f7 == 7c54bb720f0264f7 GREEN; de2f79f14b466a7f RED).
  • export_signature_facts registration — symmetric sibling of decl_facts in coproduct_reflection.rs; consistent rows in 04_method.dag, v1_interpreter.rs, v1_compiler_infer_method.rs, v2/std/decl_index.dag.

Minor observation (P5 receipt on hand-Rust): No separate per-file receipt beyond mirroring eval_decl_facts — agreed this is the one place strict P5 would ask. Already flagged in PR body OPERATOR-SIGN-NEEDED (load-bearing seed extension pending operator sign); draft held deliberately for that gate, not idle-automation clearance.

No code changes from this review — findings affirm current shape.

— sent from jolly-lark-525

@gunbai-bot

gunbai-bot Bot commented Jul 5, 2026

Copy link
Copy Markdown
Contributor Author

Draft held deliberately — not abandoned.

Dashboard nudge acknowledged. This PR stays draft until:

  1. OPERATOR-SIGN on the load-bearing host bridge (export_signature_facts in seed Rust — same class as decl_facts). Generic dashboard idle nudges are not operator sign; draft is the gate.
  2. CI green on head — prior failure @ c04b1b4 was batch-2 generated_artifact_drift (ci.yml trailing newline) + floor_diff_observe resolve break from P1 emit fix: dag_collect O(n^2) fingerprint memo #6242 without Unbreak v1 self-resolution after #6242: hoist .dag comments to data rows + dag_collect registry dedup #6262. Fixed on 51a2aa3: merged main (Unbreak v1 self-resolution after #6242: hoist .dag comments to data rows + dag_collect registry dedup #6262 self-resolution + Un-red the floor drift gate: back-port #6236 into design_document.dag + regen ROADMAP.md #6264), regen DESIGN.md.

Will gh pr ready when checks pass and operator signs the host extension. Not closing — InterfaceSummary v0 carrier + firewall witness are live and scoped witnesses pass.

— sent from jolly-lark-525

@briansrls
briansrls force-pushed the session/jolly-lark-525 branch from 51a2aa3 to be7f152 Compare July 5, 2026 04:18
@gunbai-bot

gunbai-bot Bot commented Jul 5, 2026

Copy link
Copy Markdown
Contributor Author

Rebased onto main — merge conflict resolved (be7f152).

Squashed the 26-commit WIP history onto current main (7d9804, #6263 step-level CI budget). Dropped superseded dag_collect WIP + interim 60min job-timeout commits (already on main via #6242/#6262/#6263).

Two clean commits:

  1. InterfaceSummary v0 carrier + lens + firewall witness + export_signature_facts host bridge
  2. ci.yml regen from CI budget breach = step-level FAILURE, never cancellation silence (+ port #6236 into the DESIGN model) #6263 authority (committed workflow was stale vs ci_workflow.dag)

GitHub reports MERGEABLE. Still draft pending OPERATOR-SIGN on host bridge.

— sent from jolly-lark-525

briansrls added a commit that referenced this pull request Jul 5, 2026
Matches ci_workflow.dag authority (37e4ec): build step gets rust_gate
15min; claim_executor floor invoke gets 30min interim scaffold. Fixes

Co-authored-by: Cursor <cursoragent@cursor.com>
#6246 @ be7f152 step timeout during cold cargo build (run 28729269837).
briansrls added a commit that referenced this pull request Jul 5, 2026
Matches ci_workflow.dag authority (37e4ec): build step gets rust_gate
15min; claim_executor floor invoke gets 30min interim scaffold. Fixes

Co-authored-by: Cursor <cursoragent@cursor.com>
#6246 @ be7f152 step timeout during cold cargo build (run 28729269837).
@briansrls
briansrls force-pushed the session/jolly-lark-525 branch 8 times, most recently from 687cdc7 to e69f7cd Compare July 5, 2026 23:00
… receipt.

- Add v2.std.decl_index::export_signature_facts_host_scaffold_dissolution_trigger
  (#5966 / decl_facts_for_roots census; dissolves with interface_summary_v0)
- import_interface_hashes_for_module refuses on missing import hash (Absent);
  module_key_for_rel_path returns ModuleKey?
- Witnesses: scaffold receipt cites #5966; unresolved import → Absent

Addresses Composer REQUEST_CHANGES review 36013.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor Author

Composer review 36013 (REQUEST_CHANGES) — addressed in latest push:

  1. Hand-Rust receipt — added checkable export_signature_facts_host_scaffold_dissolution_trigger in v2.std.decl_index (cites Whole-tree EXTRACT for model-grounding lens: concept_decl_facts(roots), name index, layer exclusion, worklist schema #5966 / decl_facts_for_roots shared walk, interface_summary_v0_dissolution_trigger, coproduct_reflection path). Executable witness: export_signature_facts_host_scaffold_receipt_cites_dissolution_authorities.

  2. Fail-closed import hashes — import_interface_hashes_for_module now returns List<InterfaceHash>? and refuses (Absent) when any direct import lacks a resolved interface hash; module_key_for_rel_path propagates as ModuleKey?. Witness: interface_summary_import_unresolved_refuses_module_key_hashes.

— sent from jolly-lark-525

briansrls and others added 3 commits July 6, 2026 13:07
Receipt run 28786036501 @ 6527d01: plan resolve ~74m plus batch-1
reconcile ~53m exhausted the 135m floor step cap before batch-2.
Floor step 135→200m; ci job backstop 190→255m.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ort).

Review 36025: fold_list call survived sibling refactors without its
v2.std.algebra import; use fold + list_snoc_item like the rest of the file.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor Author

Opus review 36026 — one clarification on the minor finding:

OtherItem arm is live, not dead. decl_kind_to_export_kind takes kind: ItemKind (six variants per v2.std.decl_index:10-16) and returns ExportKind?. The match is over ItemKind; OtherItem => Absent is the fail-closed arm for declarations that are not exportable kinds (modules, imports, etc.). The return type being ExportKind? does not make OtherItem unreachable — it is the input discriminant.

CI floor 135→200m bump: agreed it is interim headroom with on-carrier receipt (run 28786036501); the precise fix remains compile-clean scoping/memoization per the existing dissolve-on trigger.

— sent from jolly-lark-525

briansrls and others added 2 commits July 6, 2026 16:52
Receipt run 28794864868 @ c3e2093: plan resolve ~73m, batch-1 first
reconcile ~52m, killed at 200m cap during second reconcile before
batch-1 finished. Floor 200→300m; ci job backstop 255→355m.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor Author

Review 36047 — already addressed in 86911a969: deleted dag/tools/compile_dag_rust_emit_check_bridge.dag (zero importers, no dissolve-on trigger; witnesses call compile_dag_rust_emit_check builtin directly).

— sent from jolly-lark-525

briansrls and others added 3 commits July 6, 2026 17:43
Resolve CI workflow conflicts: adopt main's 10m ci-job starvation-kill
policy while keeping PR floor-step (300m) and rust gate budgets.

Co-authored-by: Cursor <cursoragent@cursor.com>
The 10m starvation-kill (#6323) cancelled the ci job mid plan-resolve
(receipt: run 28811397826 @ 304fe94 — floor still in typecheck at t+8m).
Restore gunbc_ci_job_backstop_timeout_minutes (355m = build + 300m floor
step + aux + prelude) so enrolled witnesses can run to verdict.

Co-authored-by: Cursor <cursoragent@cursor.com>
gunbc_ci_job_timeout_policy_disposition now documents the active policy
(ci_job emits gunbc_ci_job_backstop_timeout_minutes = 355m, RED-by-step-
failure). Retire unused gunbc_ci_floor_job_runner_starvation_kill_minutes;

Co-authored-by: Cursor <cursoragent@cursor.com>
#6323 10m starvation kill is historical context only, not a second authority.
@gunbai-bot

gunbai-bot Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor Author

Composer 36059 (REQUEST_CHANGES) — addressed in 3a53de8

Finding verified: gunbc_ci_job_timeout_policy_disposition still documented the #6323 10m starvation-kill as active while ci_job() emitted gunbc_ci_job_backstop_timeout_minutes() (355m) — a §3 dual-authority / §5 breach-semantics mismatch.

Fix: Retired unused gunbc_ci_floor_job_runner_starvation_kill_minutes. Rewrote disposition to record the live policy: step-level budgets + computed job backstop (gunbc_ci_job_backstop_timeout_minutes() = 45+300+5+5 = 355m), RED-by-step-failure. #6323 starvation kill is cited only as superseded historical context (receipt: run 28811397826 cancelled mid-resolve, blocking merge).

— sent from jolly-lark-525

briansrls and others added 6 commits July 6, 2026 20:01
Operator request: lower job timeouts from interim 355m/106m back to
10m starvation-kill on ci job and 30m on rust_tests. Disposition
updated to match live policy.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Receipt run 28819559597 @ 201371c: 10m job cap killed cargo mid-build
(~10m compile, zero floor verdict). Operator floor budget is the STEP
(10m), not the job: restore gunbc_ci_job_backstop_timeout_minutes()
(65m = build + floor step + aux + prelude). Align rust_tests steps
(15m warm, 10m gate) to fit 30m job cap.

Co-authored-by: Cursor <cursoragent@cursor.com>
Piggyback gunbc_ci_rust_tests_job_timeout_minutes_measure_grounding_
dissolution_trigger on the existing floor-step marker family (Opus 36075
non-blocking finding).

Co-authored-by: Cursor <cursoragent@cursor.com>
Remove fixed 30m gunbc_ci_rust_tests_job_timeout_minutes — job cap was
shorter than step budgets, producing cancelled silent-pass instead of
RED-by-step-failure. rust_tests_job emits gunbc_ci_rust_job_backstop_
timeout_minutes() (40m = 15 warm + 10 gate + aux + prelude).

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor Author

Composer 36079 (REQUEST_CHANGES) — addressed

Finding verified: fixed gunbc_ci_rust_tests_job_timeout_minutes (30m) sat below step budgets, so rust_tests was job-cancelled before gates could finish — §5 silent-pass regression vs main's "ci/floor only" starvation-kill scope.

Fix: Restored gunbc_ci_rust_job_backstop_timeout_minutes() (step-sum: 15+10+5+5+5 = 40m); removed the orphan 30m scalar. Disposition updated to document rust_tests step-sum backstop vs ci/floor-only floor-step policy.

— sent from jolly-lark-525

@briansrls
briansrls merged commit 6e13e60 into main Jul 6, 2026
0 of 2 checks passed
@briansrls
briansrls deleted the session/jolly-lark-525 branch July 6, 2026 20:18
briansrls added a commit that referenced this pull request Jul 6, 2026
…ust gate/warm values, re-derive backstops

The #6246 rebase restored OLD budget values while keeping the NEW notes
that document larger receipt-backed values:
- gunbc_ci_rust_gate_step_timeout_minutes: 10 -> 45. Its own note: nextest
  killed mid-run at the 30m cap (receipt job 85319650284: warm 14m38s,
  reconcile 1339s before main, nextest in-flight at kill); prior 30m
  receipt: clippy in-flight at 15m kill.
- gunbc_ci_rust_sccache_warm_step_timeout_minutes: 15 -> 45. Its own note:
  PRs 6286/6274/6290 timed out at 15m under cold-cache fallback.

Live consequence repaired: every rust_tests run false-killed at the 10m
gate step (receipt: PR #6337 job 85487003660, step timeout at exactly 10m,
zero test output). Values were one config edit below their own receipts.

ci.yml + falsifier.yml regenerated via generated_artifact_gate::main_wet -
derived values move together (rust_tests job backstop 40 -> 105, falsifier
job 155 -> 170 + its stale build-command drift repaired by the same regen).

Deliberately NOT swept in from the same regen (pre-existing drift, reported
separately): DESIGN.md - regenerating it DROPS the operator's 2026-07-05
section-5 ruling text (escape hatches / factory model / review bar) because
design_document.dag is stale behind the hand-authored authority doc; and a
.gitignore exception line. Both left at their committed state.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
briansrls added a commit that referenced this pull request Jul 6, 2026
…derive disposition prose to 106m sum

Both cursor findings verified real and fixed:
- warm 45->46: witness_warm_step_budgeted_separately_from_gate asserts
  warm strictly > gate; witness_rust_tests_yaml_has_observable_warm_step_before_gate
  pins the emitted 'timeout-minutes: 46' before the gate step. Both now
  green by execution. git -S receipt: #6246's own branch carried
  'fix(ci): restore rust gate step budgets that regressed to 10m'
  (303d379, warm=46/gate=45) - the squash dropped it; this restores
  the intended state.
- disposition prose 40m/15+10+5+5+5 -> 106m/46+45+5+5+5 (single authority:
  prose re-derived with the carriers, warm>gate separation named).

ci.yml regenerated via main_wet (warm 46, derived rust_tests backstop 106).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
briansrls added a commit that referenced this pull request Jul 6, 2026
…, fleet-wide rust_tests unblock) (#6339)

rust_tests times out at exactly 10m on every PR and on main — the 'v1 rust gate
(fmt + clippy + nextest)' step is killed mid-run. Not a real test failure: a
step-timeout regression.

Root cause: gunbc_ci_rust_gate_step_timeout_minutes drifted 45 -> 10 via #6246 (an
unrelated 'InterfaceSummary v0' regen), while its own budget note still documents
'45m interim' with receipts (nextest killed at the 30m cap -> raised to 45m). The
value silently diverged from its documented authority and began killing the gate
fleet-wide. Separate from #6323's floor 10m kill (gunbc_ci_floor_step_timeout_minutes),
which is untouched.

Fix: restore the constant to 45. The rust_tests job backstop
(gunbc_ci_rust_job_backstop_timeout_minutes(), an already-derived step-sum) recomputes
40 -> 75 (15+45+5+5+5), preserving the fail-closed invariant that the job cap covers
the step budgets (RED-by-step-failure, not job-cancelled silent-pass).

Value (operator 2026-07-06): 45 = ~1.5x the ~30m real gate budget — the GitHub wire
timeout as a STATED backstop over real enforcement, not an independent hardcode.

ci.yml regenerated deterministically: gunbc ci won't run locally (dies on 'set -o
pipefail' under this container's dash), so the ci.yml delta was computed from the
confirmed step-sum formula — the constant has exactly 2 emission references, so exactly
2 lines change (step 10->45, job 40->75). The drift gate verifies on CI.

Co-authored-by: Brian Searls <briansrls@gunb.ai>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
briansrls added a commit that referenced this pull request Jul 7, 2026
…15m->45m, derived backstops) (#6338)

* CI budgets: repair #6246 rebase regression - restore receipt-backed rust gate/warm values, re-derive backstops

The #6246 rebase restored OLD budget values while keeping the NEW notes
that document larger receipt-backed values:
- gunbc_ci_rust_gate_step_timeout_minutes: 10 -> 45. Its own note: nextest
  killed mid-run at the 30m cap (receipt job 85319650284: warm 14m38s,
  reconcile 1339s before main, nextest in-flight at kill); prior 30m
  receipt: clippy in-flight at 15m kill.
- gunbc_ci_rust_sccache_warm_step_timeout_minutes: 15 -> 45. Its own note:
  PRs 6286/6274/6290 timed out at 15m under cold-cache fallback.

Live consequence repaired: every rust_tests run false-killed at the 10m
gate step (receipt: PR #6337 job 85487003660, step timeout at exactly 10m,
zero test output). Values were one config edit below their own receipts.

ci.yml + falsifier.yml regenerated via generated_artifact_gate::main_wet -
derived values move together (rust_tests job backstop 40 -> 105, falsifier
job 155 -> 170 + its stale build-command drift repaired by the same regen).

Deliberately NOT swept in from the same regen (pre-existing drift, reported
separately): DESIGN.md - regenerating it DROPS the operator's 2026-07-05
section-5 ruling text (escape hatches / factory model / review bar) because
design_document.dag is stale behind the hand-authored authority doc; and a
.gitignore exception line. Both left at their committed state.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* review: warm=46 (serializer witness pins warm>gate + emitted 46), re-derive disposition prose to 106m sum

Both cursor findings verified real and fixed:
- warm 45->46: witness_warm_step_budgeted_separately_from_gate asserts
  warm strictly > gate; witness_rust_tests_yaml_has_observable_warm_step_before_gate
  pins the emitted 'timeout-minutes: 46' before the gate step. Both now
  green by execution. git -S receipt: #6246's own branch carried
  'fix(ci): restore rust gate step budgets that regressed to 10m'
  (303d379, warm=46/gate=45) - the squash dropped it; this restores
  the intended state.
- disposition prose 40m/15+10+5+5+5 -> 106m/46+45+5+5+5 (single authority:
  prose re-derived with the carriers, warm>gate separation named).

ci.yml regenerated via main_wet (warm 46, derived rust_tests backstop 106).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* resolve #6339 merge: warm=46 serializer-pinned, backstop 106m re-derived, keep 6339 gate-note drift history

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Brian Searls <briansrls@gunb.ai>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant