QT4CG meeting 168 draft minutes, 16 June 2026

Hello,

Here are the draft minutes:

   https://qt4cg.org/meeting/minutes/2026/06-16.html

QT4 CG Meeting 168 Minutes 2026-06-16

   [1]Meeting index / [2]QT4CG.org / [3]Dashboard / [4]GH Issues / [5]GH
   Pull Requests

Table of Contents

     * [6]Summary of new and continuing actions [0/10]
     * [7]Draft Minutes
     * [8]1. Administrivia
          + [9]1.1. Roll call [8/11]
          + [10]1.2. Accept the agenda
          + [11]1.3. Approve minutes of the previous meeting
          + [12]1.4. Next meeting
          + [13]1.5. Review of open action items [0/10]
          + [14]1.6. Review of open pull requests and issues
               o [15]1.6.1. Blocked
               o [16]1.6.2. Merge without discussion
               o [17]1.6.3. Close without action
               o [18]1.6.4. Substantive PRs
     * [19]2. Technical agenda
          + [20]2.1. Issue 2683, Can casting return a subtype of the
            requested type?
          + [21]2.2. PR #2678: 2581 XSLT Patterns
          + [22]2.3. PR #2676: 2672 FLWOR trace clause
          + [23]2.4. PR #2671: 2668 Drop number-parser option of
            json-to-xml
          + [24]2.5. PR #2670: 2669 Add option to ignore empty entries
            when comparing maps
          + [25]2.6. PR #2667: 2458 replacement for get() selectors
          + [26]2.7. PR #2589: 2587 Streamability of context value
            expressions
     * [27]3. Any other business

Summary of new and continuing actions [0/10]

     * [ ] QT4CG-143-02: MK to try to recover the ability to extract
       formal equivalences into tests
     * [ ] QT4CG-167-01: DB to write a PR for #2641, comments in CSV
     * [ ] QT4CG-167-02: MK to make a PR for #2591, grammar for
       step?lookup is invalid
     * [ ] QT4CG-167-03: NW to make a PR for #2482, fallback on
       bin:decode-string
     * [ ] QT4CG-167-04: NW to make a PR explaining load-xquery-module for
       PR #2464
     * [ ] QT4CG-167-05: MK to write a proposal to change #2393 so the
       functions return JNodes
     * [ ] QT4CG-167-06: NW to write a PR to resolve #2169 per
       GuntherRademacher
     * [ ] QT4CG-167-07: NW to review tests for interpolated strings with
       edge cases in mind
     * [ ] QT4CG-167-08: MK to review the state of #1949 to see which
       items are still outstanding.
     * [ ] QT4CG-167-09: NW to close all "nice to have" issues at the end
       of October if they haven't progressed

Draft Minutes

1. Administrivia

1.1. Roll call [8/11]

   Regrets: CG, BTW
     * [X] David J Birnbaum (DB)
     * [ ] Reece Dunn (RD)
     * [ ] Christian Gr¸n (CG)
     * [X] Joel Kalvesmaki (JK)
     * [X] Michael Kay (MK)
     * [X] Juri Leino (JLO)
     * [X] John Lumley (JWL)
     * [X] Alan Painter (AP)
     * [X] Wendell Piez (WP)
     * [ ] Bethan Tovey-Walsh (BTW)
     * [X] Norm Tovey-Walsh (NW) Scribe. Chair.

1.2. Accept the agenda

   Proposal: Accept [28]the agenda.

   Accepted.

1.3. Approve minutes of the previous meeting

   Proposal: Accept the minutes of [29]26 May 2026 (teleconference).

   Accepted.

   Proposal: Accept the minutes of [30]2 June 2026 (face-to-face).

   Accepted.

1.4. Next meeting

   The next meeting is planned for 23 June.

   AP gives regrets.

1.5. Review of open action items [0/10]

     * [ ] QT4CG-143-02: MK to try to recover the ability to extract
       formal equivalences into tests
     * [ ] QT4CG-167-01: DB to write a PR for #2641, comments in CSV
     * [ ] QT4CG-167-02: MK to make a PR for #2591, grammar for
       step?lookup is invalid
     * [ ] QT4CG-167-03: NW to make a PR for #2482, fallback on
       bin:decode-string
     * [ ] QT4CG-167-04: NW to make a PR explaining load-xquery-module for
       PR #2464
     * [ ] QT4CG-167-05: MK to write a proposal to change #2393 so the
       functions return JNodes
     * [ ] QT4CG-167-06: NW to write a PR to resolve #2169 per
       GuntherRademacher
     * [ ] QT4CG-167-07: NW to review tests for interpolated strings with
       edge cases in mind
     * [ ] QT4CG-167-08: MK to review the state of #1949 to see which
       items are still outstanding.
     * [ ] QT4CG-167-09: NW to close all "nice to have" issues at the end
       of October if they haven't progressed

1.6. Review of open pull requests and issues

   This section summarizes all of the issues and pull requests that need
   to be resolved before we can finish. See [31]Technical Agenda below for
   the focus of this meeting.

1.6.1. Blocked

   The following PRs are open but have merge conflicts or comments which
   suggest they aren't ready for action.
     * PR [32]#2594: 2389 Adaptive Serialization: more freedom
     * PR [33]#2350: 708 An alternative proposal for generators
     * PR [34]#2247: 716 Deferred Evaluation in XPath - the f:generator
       record
     * PR [35]#2160: 2073 data model changes for JNodes and Sequences
     * PR [36]#2071: 77c deep update

1.6.2. Merge without discussion

   The following PRs are editorial, small, or otherwise appeared to be
   uncontroversial when the agenda was prepared. The chairs propose that
   these can be merged without discussion. If you think discussion is
   necessary, please say so.
     * PR [37]#2682: 2681 Clarifications for map-for-key() function
     * PR [38]#2675: 2664 Allow element-to-map(doc())
     * PR [39]#2673: 2590 Editorial Omnibus

   Proposal: accept without discussion.

   Accepted.

1.6.3. Close without action

   It has been proposed that the following issues be closed without
   action. If you think discussion is necessary, please say so.
     * Issue [40]#2518: Type Safety
     * Issue [41]#2039: Generalize context item to context value in XSLT

   Proposal: close without further action.

   Accepted.

1.6.4. Substantive PRs

   The following substantive PRs were open when this agenda was prepared.
     * PR [42]#2678: 2581 XSLT Patterns
     * PR [43]#2676: 2672 FLWOR trace clause
     * PR [44]#2671: 2668 Drop number-parser option of json-to-xml
     * PR [45]#2670: 2669 Add option to ignore empty entries when
       comparing maps
     * PR [46]#2667: 2458 replacement for get() selectors
     * PR [47]#2649: 2647 [48]descendants: recursion, filtering
     * PR [49]#2589: 2587 Streamability of context value expressions

2. Technical agenda

2.1. Issue 2683, Can casting return a subtype of the requested type?

   See [50]Issue 2683
     * MK: This is a binary decision, so let's see which the group prefers
       we write it up.
          + ... The spec is contradictory.
     * MK: In general, an expression is allowed to return a subtype of the
       requested. Should that be allowed for constructors and cast
       expressions?
     * MK: What I want to propose is that the general rule applies, but
       casts and type constructors are an exception to that rule.
     * NW: I think that makes sense.
     * JLO: I think the question will be, will we see any errors from
       this?
          + ... It would only raise an error when you do a cast to decimal
            and then do instance of and it isn't a decimal.
     * MK: The general rule does mean that you can write things that
       aren't interoperable.
          + If Saxon returns 4 div 2 as an integer and BaseX returns it as
            a decimal, you might not have interoperable code.
          + If you're calling a user defined function, you can't constain
            a user defined function to return an integer when it's
            declared type is decimal.
          + Why shouldn't the same rule apply to system defined functions?
     * JLO: In my head, I think we might want to say that you have to
       return the type specified and the implementation may used a value
       internally that's unchanged.
          + Treat it as a boxed value.
     * MK: We clearly can't do that with user defined functions.
     * JLO: Maybe I'm not sure what you mean.
     * MK: If a function declares a return type of xs:integer?, you can
       return () which is a more specific type.
          + ... Maybe that's a bad example. Let's say it returns
            xs:decimal and on one branch of a choose you return 0, that's
            an integer.
          + ... We don't cast that to a decimal, it comes back as the
            integer 0 and instance of will say it's an integer.
     * JLO: I'm not sure. I'd really expect that if it says it returns
       decimal, that's what I get back.
     * MK: That would clearly be problematic.
     * JWL: If you're calling a function that expects an xs:decimal, you
       can pass in an integer. That's fine.
          + ... It's effectively symmetric on the way out.
          + ... What you require is a xs:decimal but an integer is a
            decimal.
     * MK: It's basically the principle of substitutability, which you can
       break with instance of.
     * JLO: Okay, I think this makes more sense. But we need to make it
       clear that instance of may not do what you think it does.
          + ... You may need to do something else. Maybe castable as.
     * MK: The instance of check works if it belongs to a subtype.

   Some discussion of where the problem arises. If you test if the value
   returned is an integer, then you may see different results from
   different implementations.

   Consensus: go with Mike's proposal for a special case.

2.2. PR #2678: 2581 XSLT Patterns

   See PR [51]#2678
     * MK: I suggest we go through the non-diff version. The diff makes it
       looks like a bigger change than it is.
     * MK: The changes are in Patterns, 6.3. I've flattened things
       slightly.
          + ... Patterns now fall into six groups at the top level:
            predicate, type, XNode, map, array, and JNode.
          + ... Predicate and type patterns haven't changed.
          + ... XNodes are clarified that they only apply to XNodes
          + ... Map patterns are extended by this proposal.
          + ... Array and JNode patterns are new.
     * MK: Sequence patterns aren't a top level kind of pattern, but
       they're used by several others.
          + ... They match a sequence; the empty sequence of an item type
            plus an occurrence indicator.
     * MK: Map patterns change primarily by the addition of ,* to say that
       it's extensible.
          + ... For example, {} matches an empty map, {*} matches any map,
            {"first", "last"} matches a map containing first and last,
            {"first", "last", *} matches a map that contains first and
            last and maybe other things.
          + ... The key has to be a constant
          + ... And there are a number of examples, including {"elements":
            **, *} (!!!)

   MK observes that some of these ideas come from a white boarding
   exercise that we did in Prague.
     * MK: Array patterns is just array with a sequence pattern inside.
          + ... Every member has to match the sequence pattern, you can't
            match heterogenous arrays.
     * MK: Finally, JNode patterns match JNodes.
          + ... You specify a selector part (the key part) and then a
            pattern to match the value part.
          + ... And then there are examples.

   There is an editorial error, the list of 1 to 7 after the green box of
   examples should be removed.
     * MK: The section on default priorities is changed, but just to
       ensure that every kind of rule has a default priority.
     * JLO: I like it. Remind me why the tilde character is necessary.
     * MK: The tilde character says that the pattern matches a type. It
       turns any type into a pattern. That's not new.
     * JLO: Is it true for arrays as well?
     * MK: It's somewhat confusing because there are both types and
       patterns for arrays and they're not the same.
          + ... I was half thinking that I might try to reduce some of the
            scope for using types as patterns to avoid some of the
            overlap.
          + ... But at the moment, it is the way it is.
     * AP: You mentioned that you can't match heterogenous arrays? Can't
       you use union types?
     * MK: Yes, but you can't say the first member is a string and the
       second is something else.
     * JK: One suggestion on sequence patterns, perhaps we should name
       that "pattern sequences" to avoid ambiguity over the name. (In case
       we do want to match sequences in the future.)

   Proposal: accept this PR.

   Accepted.

   MK to remove the errant list and then do the merge.

2.3. PR #2676: 2672 FLWOR trace clause

   See PR [52]#2676
     * MK: This was CG's suggestion that I implemented.
          + ... Though it may have been something I suggested long ago!
     * MK: This PR adds a trace clause to FLWOR expressions as an
       intermediate clause.
          + ... It takes an ExprSingle as the argument; the expression is
            evaluated and some record of its value should be presented.
          + ... It has no effects on the results of the expression.
          + ... If an error occurs, report it on the trace output
            destination and otherwise ignore it
     * MK: There's an example. With some advice to implementors and users.

   Proposal: accept this PR.

   Accepted.

2.4. PR #2671: 2668 Drop number-parser option of json-to-xml

   See PR [53]#2671
     * MK: This was an oversight; we dropped it from one function but not
       another.
          + ... By and large, the XML can contain the number in the
            original format, so there's no great need for the number
            parser.
          + ... It was there primarily for compatibility with parse-json,
            but we've dropped it there.

   Proposal: accept this PR.

   Accepted.

2.5. PR #2670: 2669 Add option to ignore empty entries when comparing maps

   See PR [54]#2670
     * MK: This arose from all the discussions about build date time
       records and whether absent fields should be absent or empty.
          + ... For many purposes, you don't care. If you're looking at
            the results of a test case, you might want deep-equal to treat
            them as the same.
     * MK: It's a new option ignore-empty-entries on fn:deep-equal.
          + ... It effects how you compare maps. It defines a
            "significant" entry to simplify the prose.
     * WP: Have you consider instead or in addition a function that would
       scrub a map, removing all the empty entries?
     * MK: No, I didn't think of that. There are ways of filtering with
       the map-filter function.
     * WP: I guess this is a nice to have.
     * JLO: I like this. Why don't we make this true by default?
     * NW: I'd say "because it hasn't historically been this way."

   Some discussion of the circumstances under which the distinction might
   be significant.
     * MK: I think that's going too far.

   Proposal: accept this PR.

   Accepted.

2.6. PR #2667: 2458 replacement for get() selectors

   See PR [55]#2667
     * MK: No one, including me, has ever been very happy with the get()
       expression in selectors.
          + ... It was original designed for selecting keys where the key
            might not be a string or might contain spaces.
     * MK: Mostly, we just replace that with new syntax.
          + ... Hopefully the meaning of ancestor::{$name} is clear.
     * MK: We rewrite the rules for evaluating slash expressions, mostly
       for editorial clarity.
          + ... The XNodes and JNodes cases are now separated.
          + ... For JNodes, the semantics of nodes vs atomic items differ
            so that atomics select keys with that value.
     * MK: The grammar now adds EnclosedExpr to the right hand side of
       NodeTest
          + ... The EnclosedExpr is typically used to select a member.
          + ... The get option of a selector is replaced by the
            EnclosedExpr.
          + ... The get() was more constrained syntactically than an
            EnclosedExpr.
     * MK: The expression must match the name of an XNode or JNode.
          + ... Multiple values can appear in the enclosed expression,
            selecting all the matches.
     * MK: The rest is just changing examples.
     * JWL: Two things. When you're talking about evaluating E1/E2; it
       might be worth noting that you can only get maps and arrays in that
       sequence at the top level. You can have XNodes below maps and
       arrays but not the other way around.
          + ... When you're doing a computed name, you could do that in
            patterns as well, couldn't you?
     * MK: Not with the syntax at the moment.
     * JWL: You can have a let inside a predicate so you can work up and
       down.
     * MK: But at the level of /a/b/c, the syntax isn't there yet.
     * JLO: It feels natural with the curly braces. I can select XNodes
       also, yes?
     * MK: Yes.
     * JLO: For the note that you can never have JNodes selected from
       inside an XNode, that might change.
     * MK: Not directly. You can do it indirectly, if you have a node
       inside a map and you select the map and then select the entry, that
       result is going to be JNode containing an XNode.
          + ... There are places where that will automatically be
            dereferenced.
          + ... Some things are going to work and others aren't.
     * JLO: I really like that I can write a/3.

   Some discussion of the presence (or absence) of the tilde in path
   expressions.

   Proposal: accept this PR.

   Accepted.

2.7. PR #2589: 2587 Streamability of context value expressions

   See PR [56]#2589
     * MK: I think this one isn't as scary as you might imagine.
          + ... 12.7.7 Streamability of Pipeline Expressions is new.
          + ... There are three rules based on the cardinality of the left
            hand operand.

   Proposal: accept this PR.

   Accepted.

3. Any other business

   None heard.

References

   1. https://qt4cg.org/meeting/minutes/
   2. https://qt4cg.org/
   3. https://qt4cg.org/dashboard
   4. https://github.com/qt4cg/qtspecs/issues
   5. https://github.com/qt4cg/qtspecs/pulls
   6. https://qt4cg.org/meeting/minutes/2026/06-16.html#new-actions
   7. https://qt4cg.org/meeting/minutes/2026/06-16.html#minutes
   8. https://qt4cg.org/meeting/minutes/2026/06-16.html#administrivia
   9. https://qt4cg.org/meeting/minutes/2026/06-16.html#roll-call
  10. https://qt4cg.org/meeting/minutes/2026/06-16.html#agenda
  11. https://qt4cg.org/meeting/minutes/2026/06-16.html#approve-minutes
  12. https://qt4cg.org/meeting/minutes/2026/06-16.html#next-meeting
  13. https://qt4cg.org/meeting/minutes/2026/06-16.html#open-actions
  14. https://qt4cg.org/meeting/minutes/2026/06-16.html#open-pull-requests
  15. https://qt4cg.org/meeting/minutes/2026/06-16.html#blocked
  16. https://qt4cg.org/meeting/minutes/2026/06-16.html#merge-without-discussion
  17. https://qt4cg.org/meeting/minutes/2026/06-16.html#close-without-action
  18. https://qt4cg.org/meeting/minutes/2026/06-16.html#substantive
  19. https://qt4cg.org/meeting/minutes/2026/06-16.html#technical-agenda
  20. https://qt4cg.org/meeting/minutes/2026/06-16.html#iss-2683
  21. https://qt4cg.org/meeting/minutes/2026/06-16.html#pr-2678
  22. https://qt4cg.org/meeting/minutes/2026/06-16.html#pr-2676
  23. https://qt4cg.org/meeting/minutes/2026/06-16.html#pr-2671
  24. https://qt4cg.org/meeting/minutes/2026/06-16.html#pr-2670
  25. https://qt4cg.org/meeting/minutes/2026/06-16.html#pr-2667
  26. https://qt4cg.org/meeting/minutes/2026/06-16.html#pr-2589
  27. https://qt4cg.org/meeting/minutes/2026/06-16.html#any-other-business
  28. https://qt4cg.org/meeting/agenda/2026/06-16.html
  29. https://qt4cg.org/meeting/minutes/2026/05-26.html
  30. https://qt4cg.org/meeting/minutes/2026/06-02.html
  31. https://qt4cg.org/meeting/minutes/2026/06-16.html#technical-agenda
  32. https://qt4cg.org/dashboard/#pr-2594
  33. https://qt4cg.org/dashboard/#pr-2350
  34. https://qt4cg.org/dashboard/#pr-2247
  35. https://qt4cg.org/dashboard/#pr-2160
  36. https://qt4cg.org/dashboard/#pr-2071
  37. https://qt4cg.org/dashboard/#pr-2682
  38. https://qt4cg.org/dashboard/#pr-2675
  39. https://qt4cg.org/dashboard/#pr-2673
  40. https://github.com/qt4cg/qtspecs/issues/2518
  41. https://github.com/qt4cg/qtspecs/issues/2039
  42. https://qt4cg.org/dashboard/#pr-2678
  43. https://qt4cg.org/dashboard/#pr-2676
  44. https://qt4cg.org/dashboard/#pr-2671
  45. https://qt4cg.org/dashboard/#pr-2670
  46. https://qt4cg.org/dashboard/#pr-2667
  47. https://qt4cg.org/dashboard/#pr-2649
  48. https://qt4cg.org/meeting/minutes/2026/descendants
  49. https://qt4cg.org/dashboard/#pr-2589
  50. https://github.com/qt4cg/qtspecs/issues/2683
  51. https://qt4cg.org/dashboard/#pr-2678
  52. https://qt4cg.org/dashboard/#pr-2676
  53. https://qt4cg.org/dashboard/#pr-2671
  54. https://qt4cg.org/dashboard/#pr-2670
  55. https://qt4cg.org/dashboard/#pr-2667
  56. https://qt4cg.org/dashboard/#pr-2589


--
Norm Tovey-Walsh
CEO, Saxonica

Received on Wednesday, 17 June 2026 06:37:49 UTC