06:50
<ptomato>
I'd be happy to do a scrub session as well
07:09
<Richard Gibson>
or was the scenario you were thinking of in u and v modes only?
right, because of IdentityEscape[UnicodeMode] :: [~UnicodeMode] |SourceCharacter| but not |UnicodeIDContinue| (almost all character escapes are valid in legacy mode)
08:04
<nicolo-ribaudo>
I just realised we'll have to figure out the PDF generation story also for the source maps spec ๐Ÿ˜ญ
08:07
<nicolo-ribaudo>
Oh actually just printing to PDF from Firefox is good enough
08:11
<Michael Ficarra>
yeah tell that to Ecma
08:19
<littledan>
we'll all have until December to figure this out; it won't be until next meeting (at the absolute earliest) that we have something that we want to propose to TC39 to propose to the Ecma GA
08:33
<hax (HE Shi-Jun)>
Is the link of slides of current topic available?
08:33
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
hax (HE Shi-Jun) will ask the speaker to post them
09:00
<littledan>
For the ShadowRealms topic, I've inserted the comment that I wanted to make in the notes, which was: I recommend applying the criterion, โ€œShadowRealms should contain the intersection of whatโ€™s in all conceivable environmentsโ€, which implies that they are missing everything to do with I/O [excluding import()], timers, DOM, etc. https://github.com/tc39/proposal-shadowrealm/issues/398#issuecomment-1939418911
09:01
<waldemar>
Bit-packing breaks down badly once concurrent threads are introduced. C++ found out about this the hard way.
09:01
<littledan>
I agree with the set of things that are spec'd as Exposed=* that Igalia has put together--they seem to be following this principle already.
09:01
<waldemar>
A key requirement is that writes to different variables must be independent.
09:55
<Aki>
I just realised we'll have to figure out the PDF generation story also for the source maps spec ๐Ÿ˜ญ
i got u bb ๐Ÿ˜˜
09:57
<Aki>
Does anyone want to volunteer to audit the PDF when it's ready? If a handful of volunteers took a few clauses each (just scrolling through and making sure there's no unfortunate page breaks mostly) then I'd feel a lot more confident with the final product
09:57
<Aki>
it's like 900 pages, my eyes keep glazing over
10:00
<Michael Ficarra>
@Aki I can take a look at it
10:01
<Aki>
Michael Ficarra: cool, i'll let you know when it's ready
10:01
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
I volunteer especially if you also want someone to look through 402
10:02
<Aki>
I'm pretty confident there isn't gonna be stuff randomly missing or cut off. readability is my priority now.
10:02
<Aki>
ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ): yessss
10:02
<littledan>
could someone who's been in the zoom copy the slide link for the notes?
10:02
<Michael Ficarra>
yeah it's the finding random bits that aren't there that's the real hard part
10:03
<sffc>
Can someone share Ben's slides? I have an older link but it's not these latest slides
10:03
<Ashley Claymore>
The link was posted in zoom, but I wasn't in the call when it was posted
10:03
<Ashley Claymore>
so joining now can't see it
10:04
<Ashley Claymore>
if someone who was already in zoom could share that would be great
10:05
<eemeli>
https://docs.google.com/presentation/d/1WCdpcX4IpObi0CD1ftXA9QbZL5RSEGlYGXdqw3EfIdg/
10:05
<Ashley Claymore>
thanks!
10:17
<Duncan MacGregor>
I was going to ask about the US survey foot, but apparently that's being retired.
10:18
<Duncan MacGregor>
It's definitely not in the units.xml, nor are any of the other historical survey feet that various countries have specified.
10:34
<Michael Ficarra>
@littledan I disagree that MDN is a good solution for discoverability of these values
10:35
<littledan>
@littledan I disagree that MDN is a good solution for discoverability of these values
Can you elaborate on that?
10:38
<Michael Ficarra>
an l10n expert may have enough familiarity with cultural differences to know to describe a speed unit as a road travel speed or a volume unit as volume of gasoline, but your average developer might just see something more generic (which has no special handling in their locale) and use that
10:39
<Michael Ficarra>
that's why I think this is great for l10n experts but I just don't see your average dev who has no interest in l10n being all that effective with it
10:40
<Michael Ficarra>
not without having read through 100s of possible special cases from all around the world
10:40
<littledan>
it's hard for me to understand what sort of documentation or API shape might support them better.
10:40
<Michael Ficarra>
for example, I may not think to describe a volume of milk differently than a volume of water because in the US they are measured the same, but in other locales that makes a difference
10:41
<Michael Ficarra>
exactly, I don't know the solution to make this more discoverable either
10:46
<Duncan MacGregor>
In my experience people will use the wrong units or usage contexts, I don't think you can stop that. Luckily the units defined in units.xml are fairly limited, and most of them are different enough that people should spot problems fairly quickly. Things like piints and gallons are the exception here because the various types are close enough to be problematic in real world use.
10:47
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
for example, I may not think to describe a volume of milk differently than a volume of water because in the US they are measured the same, but in other locales that makes a difference
idk about that, I think people tend to do it when designing interfaces...
10:48
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
like if you're writing an app that sells milk across different locales, you might care about it
10:48
<Michael Ficarra>
if you're writing a news article, you may not
10:50
<Duncan MacGregor>
if you're writing a news article, you may not
Yeah, but if you're writing a news article you'll measure things in Olympic swimming pools, whales, Wales, and other silliness. :-)
10:50
<Michael Ficarra>
"libraries of Congress" is a frequent one in the US...
10:50
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
if you're writing a news article, you may not
sure but you'd most likely write a static article in a single language
10:58
<Michael Ficarra>
@ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ) I don't think that's the direction new articles are moving. NYT very frequently has interactive visualisations to help tell the story. I would not be surprised if they are localising units in their articles.
11:17
<hax (HE Shi-Jun)>
Yeah, I really want ambient AbortSignal!
11:18
<rbuckton>
For the record, I'm very much opposed to it. It looks good on the surface, but has a terrible developer experience for anything more than the simplest base case
11:18
<Rob Palmer>

*** New agenda item ***

Please be aware a new item has been added to the end of the Agenda - last thing tomorrow.

Discard Bindings update or Stage 2 - by rbuckton

https://github.com/tc39/agendas/pull/1634

11:20
<hax (HE Shi-Jun)>
For the record, I'm very much opposed to it. It looks good on the surface, but has a terrible developer experience for anything more than the simplest base case
Ok. But I really need some easy way to solve such simplest case ... It's really frustrating that debugging several hours and find that someone just forgotten to pass signal in some inner functions...
11:21
<rbuckton>
Ok. But I really need some easy way to solve such simplest case ... It's really frustrating that debugging several hours and find that someone just forgotten to pass signal in some inner functions...
Debugging is even harder when transparent things you can't even trace cause issues in the other direction. Finding a forgotten parameter is easy in comparison.
11:30
<rbuckton>
Adding magical capabilities that do an end run around existing code is a great way to cause headaches for package authors who now start getting issues filed against them because they break unexpectedly where they worked fine before.
11:31
<rbuckton>
Filing issues or sending upstream PRs to packages to add support for cancellation is annoying, yes, but it allows those package authors to consider the ramifications of such a change.
11:33
<hax (HE Shi-Jun)>
I understand the risk, maybe we can find some way to allow package authors opt in such magic, for example, add special symbol to the objects/functions/classes to denote it.
11:36
<rbuckton>
I think it's reasonable for someone to use an AsyncContext variable to establish their own magical transparent cancellation token, as it's on a case by case basis. I would still strongly discourage that practice, though.
11:40
<Ashley Claymore>
Debugging is even harder when transparent things you can't even trace cause issues in the other direction. Finding a forgotten parameter is easy in comparison.

Debugging is even harder when transparent things you can't even trace

Maybe devtools could help show when Tasks get cancelled, and show the stack of what triggered the cancellation?

11:40
<rbuckton>
I spoke out against transparent cancellation mechanisms when Yehuda suggested them back in ~2017. They overcomplicate everything but 1-1 cancellation interactions.
11:40
<hax (HE Shi-Jun)>
I think it's reasonable for someone to use an AsyncContext variable to establish their own magical transparent cancellation token, as it's on a case by case basis. I would still strongly discourage that practice, though.
We need some balance here, it's too annoying to pass params everywhere for the simple cases.
11:41
<rbuckton>
I don't want cancellation to be the new this.
11:41
<rbuckton>
Everyone complains or is confused about this in JS.
11:42
<hax (HE Shi-Jun)>
What about other langauges? I remember swift have some implicit cancelation behavior?
11:42
<rbuckton>
I'm not terribly familiar with swift, so I couldn't say.
11:43
<hax (HE Shi-Jun)>
Everyone complains or is confused about this in JS.
I don't think it's comparable. Actually this will not be passed to function implicitly ?
11:46
<rbuckton>
It's comparable in that you have to do unique things to preserve or drop the this context in many cases.
11:46
<Anthony Bullard>
Any sort of implicit or ambient control flow sounds like a debugging nightmare
11:46
<hax (HE Shi-Jun)>
Only global functions will get this implicitly ?... oh, non-strict functions...
11:47
<rbuckton>
hax (HE Shi-Jun): you're proving my point. this is actually very complex.
11:47
<Anthony Bullard>
But I just woke up, so maybe I should get caught up first
11:47
<rbuckton>
Passing an argument is not complex.
11:48
<rbuckton>
Transparent cancellation is overoptimizing for the simplest case at the cost of the more complex cases that often have more need for an accurate and reliable cancellation mechanism.
11:48
<hax (HE Shi-Jun)>
hax (HE Shi-Jun): you're proving my point. this is actually very complex.
I think the complexity is coming from inconsitant , not implicity itself. For example, in many languages, fn() equal to this.fn() in classes, and it seems ok to developers.
11:48
<Duncan MacGregor>
Let's just introduce common lisp style "special variables" if we want to thread things through in an ambient fashion. /s
11:51
<rbuckton>
I think the complexity is coming from inconsitant , not implicity itself. For example, in many languages, fn() equal to this.fn() in classes, and it seems ok to developers.
I'm not saying its a 1:1 parallel. I'm saying this confusion is a well known issue where simple cases seem fine, but the complex cases you run into are perilously close to the simple case.
11:52
<hax (HE Shi-Jun)>
hax (HE Shi-Jun): you're proving my point. this is actually very complex.
Actually, when I research old JS, it seems as the JS 1.0 logic, JS could choose fn() always use fn.call(this) semantic everywhere, and I find it could be consistent and no confusion. ๐Ÿ˜…
11:52
<rbuckton>
const counter = { value: 0, increment() { return this.value++; } };
counter.increment(); // simple case
setTimeout(counter.increment, 250); // complex case
11:56
<rbuckton>
But back to cancellation. An opt-in mechanism is "fine", i.e. fetch(url, { signal: "inherit" }). But that means documenting that native API's should always require user opt-in. A native API designer might choose to ignore that and require opt-out, thus it's a slippery slope.
12:07
<Luca Casonato>
Duncan MacGregor: we do have that already: String.prototype[Symbol.iterator]
12:10
<littledan>
But back to cancellation. An opt-in mechanism is "fine", i.e. fetch(url, { signal: "inherit" }). But that means documenting that native API's should always require user opt-in. A native API designer might choose to ignore that and require opt-out, thus it's a slippery slope.
If we have a simple and regular rule, I'm pretty optimistic that we can document it in https://w3ctag.github.io/design-principles/ and it will be generally followed. There's a lot of effort going into checking for this kind of API consistency these days (as we're seeing through pushback in proposals which don't lend themselves to that)
12:13
<littledan>
Passing an argument is not complex.
it's not about being complex or simple, it's more like "will this actually be adopted". This is the motivation for AsyncContext in general--it sometimes becomes a layering violation to pass things around and through. For example, UI frameworks tend to track the current component/"owner" implicitly in a similar way. It'd be too weird to ask pieces of the component to pass the enclosing component into various APIs as an argument, rather than doing it as a global.
12:14
<littledan>
(I actually think having an ambient AbortSignal will be helpful for web components generally, alongside Signals)
12:15
<Duncan MacGregor>
Duncan MacGregor: we do have that already: String.prototype[Symbol.iterator]
I must be asleep, I had forgotten that existed. :-) I'm not convinced it's really the thing you want because strings like "๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ"[Symbol.iterator]() returns more elements than you may have wanted.
12:16
<Luca Casonato>
yeah - probably we also want string iteration on graphemes? :D
12:17
<Duncan MacGregor>
I think so yes.
12:17
<ljharb>
yup - we'd want string .graphemes() or something, and that's an intl API (Intl.Segmenter) which makes it tricky to put on String.prototype
12:19
<Duncan MacGregor>
Is that an intl API for historical reasons? Do graphemes alter with locale in some way I haven't considered?
12:20
<ljharb>
they do (i'm told)
12:20
<Duncan MacGregor>
๐Ÿ˜ฑ
12:21
<ljharb>
otherwise we'd have probably had a string .graphemes proposal many years ago :-)
12:21
<littledan>
the definition of grapheme is complicated and changing a bit over time
12:22
<littledan>
I think it wasn't quite that graphemes were already defined in a locale-dependent way but rather that they might be in the future
12:22
<littledan>
something something Indic scripts something
12:23
<rbuckton>
.NET does not have transparent cancellation, but developers still use CancellationToken. I don't think it's as big of an adoption blocker as you're making it out to be? I don't use AbortSignal partly because it's too awkward to use due to its EventTarget usage. I do use cancellation though (and @esfx/async-canceltoken can theoretically be used in place of an AbortSignal in DOM APIs)
12:23
<ljharb>
hmm, if it doesn't vary by locale now then it seems like there still might be value in shipping an invariant one in the language, and if that changes in the future, we could let Intl replace that in situ like it does for toLocaleString?
12:23
<bakkot>
zip ๐ŸŽ‰
12:24
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
localized strings cannot be iterated on in a locale-independent way
12:25
<littledan>
FYI "it should be fine to pass the cancel token explicitly" was the argument that Domenic and I had in 2016 (where I was arguing that explicit passing is OK) which led him to withdraw cancel tokens from TC39.
12:26
<littledan>
moving venues was a strange reaction to that argument, as it clearly didn't lead to implicit threading of cancel tokens... I think some misunderstandings happened around that issue.
12:26
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
well, segmenter allows you to iterate on strings/segment them in many different ways beyond just graphemes
12:27
<ljharb>
well, segmenter allows you to iterate on strings/segment them in many different ways beyond just graphemes
right, but if the only use case i have is to iterate on graphemes, can it be done in a locale-independent way?
12:27
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
I believe there are edge cases
12:27
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
but let me confirm that
12:27
<littledan>
right, but if the only use case i have is to iterate on graphemes, can it be done in a locale-independent way?
in general, we very much do not expose the "root locale". But with graphemes probably any locale will do for now.
12:28
<littledan>
the "root locale" is a synthetic construct in CLDR that doesn't correspond to anyplace, but other locales are expressed as a diff against it
12:28
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
in general, we very much do not expose the "root locale". But with graphemes probably any locale will do for now.
und
12:28
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
I think it could work? Let me see what implementations think.
12:29
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
both un and und work here on FF
12:30
<ljharb>
if it can work and not be in intl, i'd be happy to co-champion something like .codePoints(), .codeUnits(), and .graphemes() methods on String.prototype. only reason i haven't years ago is that i thought it can't work
12:30
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
why not champion an Intl proposal if needed?
12:30
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
we'd love to help out if we can ๐Ÿ˜„
12:30
<Michael Ficarra>
I don't like .graphemes living outside Intl but the other two would be great and I would co-champion
12:30
<ljharb>
i have Intl.Segmenter for that already. I need something that's in every environment, and ideally on String.prototype.
12:30
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
ah, sure
12:31
<ljharb>
I don't like .graphemes living outside Intl but the other two would be great and I would co-champion
if it's not locale-dependent, why would it need to be inside intl?
12:31
<Michael Ficarra>
@ljharb it is though
12:31
<littledan>
both un and und work here on FF
Are you sure? What is their .resolvedOptions().locale ?
12:31
<ljharb>
i thought that's what ujjwal was just saying it's not.
12:32
<Michael Ficarra>
... where?
12:32
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
ah interesting, it's treating "und" as the JS value undefined
12:32
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
by which I mean it's falling back to my system locale (en-DK)
12:33
<ljharb>
here: https://matrix.to/#/!WgJwmjBNZEXhJnXHXw:matrix.org/$dEtEYuEpnCUpLhfMmu7TbPKuc_4CEDr3LXHI_MkV4Y4?via=matrix.org&via=mozilla.org&via=igalia.com but that's still unconfirmed, and maybe isn't the case
12:34
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
yeah I'll recheck after today's session and let you know Michael
12:35
<Michael Ficarra>
uhhh ๐Ÿ‡น๐Ÿ‡ผ
12:37
<ljharb>
http://unicode.org/L2/L2001/01322r-grapheme_cluster.htm
12:37
<ljharb>
that's super old, did the proposal ever land?
12:38
<Michael Ficarra>
yeah if that exists, then I'd be fine putting it on String.prototype
12:39
<Duncan MacGregor>
There's a follow up here https://www.unicode.org/L2/L2023/23140-graphemes-expectations.pdf
12:39
<rbuckton>
Does Intl/CLDR/etc. have something like an "invariant" locale (i.e., for machine readable formatting, not UI formatting)?
12:39
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
Does Intl/CLDR/etc. have something like an "invariant" locale (i.e., for machine readable formatting, not UI formatting)?
yeah und
12:39
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
but apparently we handle it quite weirdly?
12:40
<bakkot>
uhhh ๐Ÿ‡น๐Ÿ‡ผ
flags are always a single grapheme regardless of whether they render
12:41
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
all nordic flags should be a ligature with a base flag
12:41
<bakkot>

e.g. there is no ww flag but it's still one grapheme:

[...new Intl.Segmenter('en', {granularity:'grapheme'}).segment('\u{1f1fc}\u{1f1fc}')]
12:41
<Michael Ficarra>
even regional flags like ๐Ÿด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ?
12:42
<bakkot>
[...new Intl.Segmenter('en', {granularity:'grapheme'}).segment('๐Ÿด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ')].length

1

12:42
<bakkot>

https://unicode.org/reports/tr29/#Default_Grapheme_Cluster_Table says

Do not break within emoji flag sequences. That is, do not break between regional indicator (RI) symbols if there is an odd number of RI characters before the break point.

12:44
<bakkot>

and also

Do not break within emoji modifier sequences or emoji zwj sequences.

which applies to regional flags, probably

12:45
<bakkot>
though I don't know offhand whether something counts as a "emoji zwj sequence" if the sequence is not a recognized emoji
12:45
<Michael Ficarra>
it's only a ZWJ if there's intercalated ZWJs
12:46
<bakkot>
I guess ๐Ÿด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ is a emoji modifier sequence not a zwj sequence yes
12:47
<littledan>
by which I mean it's falling back to my system locale (en-DK)
right, this is generally what Intl does if you ask for a nonexistent locale
12:47
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
no, I tried another and it complained
12:48
<littledan>
try (new Intl.NumberFormat("xyz")).resolvedOptions().locale, same thing
12:48
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
ah wait yes
12:48
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
nvm it was failing for non 2-3 character long locales
12:49
<littledan>
๐ŸŽ‰
12:49
<eemeli>
With "und" you're observing fallback to the system locale.
12:49
<Duncan MacGregor>
Amusingly Safari's dev console doesn't handle deletion correctly with flags. "๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ" -> "๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด" -> "๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ" -> "๐Ÿด๓ ง๓ ข๓ ณ" โ€ฆ
12:51
<nicolo-ribaudo>
(deleted because my code was wrong)
12:51
<jkup>
wait nic i want that link
12:51
<jkup>
oh ok
12:52
<nicolo-ribaudo>
https://developer.mozilla.org/en-US/docs/Web/API
12:52
<bakkot>

as far as I can tell:

12:53
<ljharb>
ok so then we should definitely have a future-402-enhanceable String.prototype method?
12:53
<bakkot>
I am not an Intl knower though, so that could be wrong
12:53
<Richard Gibson>
Is that an intl API for historical reasons? Do graphemes alter with locale in some way I haven't considered?
"ch" is logically a single grapheme in the Latin transcription of many Slavic languages, and it seems likely to me that such tailorings will be added to CLDR at some point
12:53
<littledan>

as far as I can tell:

lol that matches my understanding as of 2017
12:54
<Duncan MacGregor>
I think a 402 enhanceable method would be a good thing.
12:55
<Chris de Almeida>
folks on the queue, please include a topic description beyond just the letter. ๐Ÿ™
12:55
<ljharb>
(technically all methods are 402-enhanceable, but ofc i meant one explicitly designed for that future purpose)
12:56
<ljharb>
folks on the queue, please include a topic description beyond just the letter. ๐Ÿ™
still can't edit :-(
12:56
<rbuckton>
yeah und
Is "und" supposed to be the same regardless of system locale, or is the issue that Intl doesn't support that and treats it as an unknown locale?
12:57
<Chris de Almeida>
still can't edit :-(
you can add new, and I will rearrange
12:58
<Chris de Almeida>
thank you!
12:59
<bakkot>
we already have a built-in ThrowTypeError function
12:59
<bakkot>
(for Function.prototype.caller)
12:59
<ljharb>
asked about that on the queue
13:00
<rbuckton>
I'd really like to be able to use a locale-invariant Intl.Collator for sorting inputs reliably in, say, a compiler that runs on different systems all over the world...
13:01
<bakkot>
though, engines probably want a different error message for Function.prototype.caller vs these things
13:02
<hax (HE Shi-Jun)>
Is there any precedent of sharing methods among several classes?
13:03
<rbuckton>
Wouldn't b.until(a) be a better replacement for a.since(b)?
13:03
<rbuckton>
(no intermediate allocation)
13:04
<bakkot>
unicode reserves "und" for unknown
13:05
<rbuckton>
or is until clamped?
13:05
<bakkot>
so yes it is the system locale I think
13:05
<rbuckton>
so yes it is the system locale I think
Then that's definitely not what I want.
13:05
<nicolo-ribaudo>
Wouldn't b.until(a) be a better replacement for a.since(b)?
I think they are not equivalent, but I don't know exactly how. I suggest asking in the queue so that Philip can respond
13:05
<nicolo-ribaudo>
Or maybe ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ): knows
13:06
<rbuckton>
I think they are not equivalent, but I don't know exactly how. I suggest asking in the queue so that Philip can respond
It's more of a curiosity than a concern.
13:06
<bakkot>
ah, though apparently that isn't threaded through to browsers: https://github.com/tc39/ecma402/issues/885
13:06
<littledan>
ah, though apparently that isn't threaded through to browsers: https://github.com/tc39/ecma402/issues/885
yes this was a deliberate decision. Unicode recommends against exposing the root locale, and und isn't supposed to be interpreted as the root locale either.
13:06
<Richard Gibson>
Is there any precedent of sharing methods among several classes?
arguably those on %TypedArray.prototype%, %GeneratorPrototype%, etc.
13:06
<nicolo-ribaudo>
It's more of a curiosity than a concern.
I'd be concerned if "the intuitive workaround that people are likely to use is wrong" :P
13:11
<rbuckton>
From the temporal docs for since()
13:11
<rbuckton>
Per this, they should be equivalent? If not, I'm curious what the outliers are.
13:12
<Richard Gibson>
a.since(b, opts) and a.until(b, opts).negated() are equivalent, but a.since(b, opts) and b.until(a, opts) are not
13:13
<ljharb>
ftr C, and H - K, have nothing on the queue
13:14
<rbuckton>
Ah, the difference is in how the opts might be applied?
13:18
<Richard Gibson>
right, starting point is always the receiver so e.g. with largestUnit: "month", March 31 to April 30 is P1M while April 30 to March 31 is -P30D
13:19
<Duncan MacGregor>
Thank you, that really helps clarify things.
13:21
<rbuckton>
right, starting point is always the receiver so e.g. with largestUnit: "month", March 31 to April 30 is P1M while April 30 to March 31 is -P30D
That makes sense, but feels odd. It makes me want some kind of normalization to occur, but I'm not sure I feel that strongly about it.
13:22
<Duncan MacGregor>
I think as soon as you allow addition or subtraction of variable sized things like months you'll hit those odd corner cases.
13:23
<rbuckton>
Mostly because this is essentially "date math" but isn't as reliable as actual math.
13:24
<Duncan MacGregor>
Yeah, abandon all hope, there are no monoids here.
13:25
<rbuckton>
I mean, normalization would make it consistent, i.e., swap left and right as necessary to ensure they are ordered, perform the necessary math, and then negate the results as needed for the given API and whether a swap occurred.
13:34
<nicolo-ribaudo>
Could somebody re-explain to me this comment? ๐Ÿ˜… Do databases use timezones that are not the timezones we are using in temporal?
13:35
<Richard Gibson>

such normalization would not give desired results. actual example (runnable against the polyfill at https://tc39.es/proposal-temporal/ ):

Temporal.PlainDate.from("2024-06-30").until("2024-08-31", { largestUnit: "months" });
// => P2M1D
Temporal.PlainDate.from("2024-08-31").until("2024-06-30", { largestUnit: "months" });
// => -P2M
13:37
<rbuckton>
That discrepancy is desired?
13:37
<Richard Gibson>
yes
13:39
<rbuckton>
Why is it desirable?
13:41
<nicolo-ribaudo>
Re subtract, even Shu said that it's confusing to remove subtract in his pre-written message to Rob
13:41
<nicolo-ribaudo>
And this "size reduction" request is coming from him
13:42
<jkup>
I sort of read into it as "I understand if you want subtract" but with an undertone of "If you add it back, remove something else" - maybe that's wrong?
13:42
<littledan>
I sort of read into it as "I understand if you want subtract" but with an undertone of "If you add it back, remove something else" - maybe that's wrong?
I don't think that was necessarily the case
13:42
<nicolo-ribaudo>
We should look at O(n) reductions and not O(1)
13:44
<nicolo-ribaudo>
Would a .symmetricDifference instead of .subtract work, if the concern is hiding negative durations? (even though this should have been discussed in stage 2)
13:46
<nicolo-ribaudo>
Oh, I guess a.subtract(b).abs()
13:46
<littledan>
I'm not convinced that making people use negative durations for their subtract replacement more frequently is the best educational device... I don't think that should be a goal
13:48
<Richard Gibson>
Why is it desirable?
because it maps to what people expect when doing calendar operations based on how constraining logic is asymmetric w.r.t to start-of-month vs. end-of-month (going forward, end-of-month to end-of-month has a zero "days" part, but going backward, doing the same thing would impose lossiness by producing the same result for adjacent inputs)
13:50
<nicolo-ribaudo>
Is the way humans think to use "since" for things in the past and "until" for things in the future?
13:51
<ljharb>
yes, i'd say so (in english at least)
13:52
<rbuckton>
I'd almost rather have since as I'm sure many users would be tripped up by until not being symmetric.
13:52
<nicolo-ribaudo>
Somehow it's much harder for me to think about until than since but this is like... not a data point
13:54
<nicolo-ribaudo>
Also, we said it's difficult for people to have to think about negative durations and now we are saying "get a negative duration and then re-negate it"?
13:54
<Michael Ficarra>
@nicolo-ribaudo many JS programmers are non-native speakers, so it kinda is a data point
13:54
<nicolo-ribaudo>
Oh yeah I clearly remember a song we studied in middle school in my english classes that used "since" a lot ๐Ÿ˜‚
13:59
<bakkot>
ljharb: I am confused; stage 2.7->3 is pro-forma on the basis of sufficient tests being present
13:59
<bakkot>
it is not about anything other than that
13:59
<bakkot>
Temporal has lots of tests
14:00
<ljharb>
p sure it's not just about tests
14:00
<ljharb>
and either way this agenda item means its tests are no longer correct
14:02
<bakkot>
all changes at stage 3 invalidate some tests and we don't normally bump things down, and in fact the champions have already done the work to make the changes to the tests for these proposed changes
14:02
<bakkot>
and certainly when 2.7 was introduced I understood it to be about tests
14:02
<bakkot>

the purpose is

Testing and validation. Validate the design of the feature through the development of a rigorous and comprehensive test suite Develop spec-compliant prototypes to validate implementability, as necessary, or aid in test development

and the entrance criteria for 3 is

The feature has sufficient testing and appropriate pre-implementation experience

14:03
<bakkot>
perhaps Michael Ficarra can speak more to this?
14:03
<ljharb>
and clearly it wasn't sufficient given the vast quantity of normative changes over almost every meeting in the last 4 years.
14:03
<leftmostcat (UTC-7)>
justingrant ptomato I'd definitely be interested in discussing declarative custom time zone behavior further.
14:03
<littledan>
and certainly when 2.7 was introduced I understood it to be about tests
I agree. If we bump something down, it would be to Stage 2. There's no extra consensus-seeking step--that was very much a part of the process reform in the first place.
14:04
<ljharb>
ok, then maybe stage 2 is the right call
14:04
<ljharb>
i mainly feel that stage 3 isn't appropriate for Temporal (and really hasn't been in a long time)
14:04
<ljharb>
a big part of the discussion around 2.7 was admittedly my own stated opinion (but i wasn't alone) that "3 means shippable"
14:05
<ljharb>
temporal is not shippable yet.
14:05
<littledan>
I think Temporal is in a similar state to Decorators: right now it deserves to be at Stage 3, though at some point in the past it might've met the criteria for a demotion and re-promotion.
14:05
<bakkot>
3 means appropriate to implement
14:05
<nicolo-ribaudo>
Can we merge the since() and subtract() methods? And they check their receiver
14:06
<ljharb>
implement !== ship unflagged and use in production
14:06
<littledan>
Can we merge the since() and subtract() methods? And they check their receiver
if Shu wanted us to merge random things, he would've said so
14:06
<ljharb>
the intention was for 3 to mean the latter; perhaps the 2.7 PR should have tweaked the stage 3 wording better, but i didn't realize it said "implement".
14:06
<nicolo-ribaudo>
if Shu wanted us to merge random things, he would've said so
I mean since with the sinces and subtract with the subtracts
14:06
<nicolo-ribaudo>
To have ony one .since and one .subtract
14:06
<nicolo-ribaudo>
Like for .valueOf
14:11
<bakkot>
implement !== ship unflagged and use in production
I don't think engines want us to be in charge of deciding whether they can ship an implementation they're happy with, once we've given the signal that it is ready to implement, so I don't think that's really a thing we can dictate
14:11
<ljharb>
it's not about "in charge", it's about the public signal
14:11
<ljharb>
a lot of the 2.7 discussion was about precisely that - that stage 3 sends the signal that it's ok to use it in production and that it's ok for it to be shipped unflagged. they can do whatever they want regardless, but the signal matters
14:11
<ljharb>
and temporal has had an inaccurate signal for 4 years
14:12
<bakkot>
the only signal relevant to whether you can use something in production is whether it is in the engines that you support
14:13
<ljharb>
that's wildly incorrect, given the existence and usage of polyfills
14:13
<ljharb>
and, not every engine/implementation is always in this room. the stage is a signal to them, too.
14:13
<bakkot>
you can use a polyfill for a feature which has never even been proposed if you want to? I don't know what the relevance of "polyfills exist" is to this
14:35
<shu>
I sort of read into it as "I understand if you want subtract" but with an undertone of "If you add it back, remove something else" - maybe that's wrong?
no, didn't intend that subtext
14:36
<shu>
the undertone was more like "it is understandable, on a case by case basis, if some should be added back. but if too many are added back then we have a problem again"
14:45
<Christian Ulbrich>
https://www.youtube.com/watch?v=hnpILIIo9ek
14:45
<Christian Ulbrich>
Or: head over to: https://tcq.staging.tcq-reloaded.tcq.ninja to see tcq-reloaded in action.
14:47
<Christian Ulbrich>
For those, that are interested, the PR is https://github.com/zalari/tcq/pull/7 , it is not persistent, i.e. whenever I redeploy, everything is gone, because I need to write additional adapters. Feedback on above PR is highly appreciated. I have no clue, what the perf requirements for TCQ are, it is a very small VM running on AWS Fargate.
14:51
<Christian Ulbrich>
I have created a meeting -> https://tcq.staging.tcq-reloaded.tcq.ninja/meeting/gMqy for which, Rob Palmer davidenke and Chris de Almeida are chairs, so feel free to play around.
14:55
<Michael Ficarra>
for those of us walking to the FF speaker dinner from kamppi metro, meet at the South building entrance in like 10 minutes?
14:56
<Michael Ficarra>
it's a 26min walk
14:57
<ljharb>
you can use a polyfill for a feature which has never even been proposed if you want to? I don't know what the relevance of "polyfills exist" is to this
web compat makes them entirely relevant.
15:02
<littledan>
the undertone was more like "i understandable, on a case by case basis, if some should be added back. but if too many are added back then we have a problem again"
With the results today, are we in that โ€œproblemโ€ state (not yet removing minus or since; not merging toJSON or valueOf yet)?
15:03
<shu>
With the results today, are we in that โ€œproblemโ€ state (not yet removing minus or since; not merging toJSON or valueOf yet)?
i'm working through the notes still, but by state you mean items A-L excluding D, E, and F?
15:04
<shu>
i imagine the only way to tell is to implement the removals and see, but on paper it looks like a big improvement
15:05
<littledan>
i'm working through the notes still, but by state you mean items A-L excluding D, E, and F?
Yes
15:07
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
for those of us walking to the FF speaker dinner from kamppi metro, meet at the South building entrance in like 10 minutes?
We already went past that
15:07
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
At the Fazer cafe now
15:08
<ryzokuken (TC39 ๐Ÿ‡ซ๐Ÿ‡ฎ)>
It's on the walk there
15:08
<shu>
have a good dinner everyone
15:40
<ptomato>
I'd almost rather have since as I'm sure many users would be tripped up by until not being symmetric.
rbuckton: I'm not sure if this was later answered by anyone because there's a long scrollback that I wasn't keeping up with during the presentation; but since is equally asymmetric as until is
15:42
<ptomato>
also, I'd have to double-check to make sure I'm 100% right about this, but a.since(b) is equal to b.until(a); it's only if you pass a.since(b, opts) and b.until(a, opts) where opts is not the default, that they are asymmetric. the default options don't let you run into calendar math, and calendar math is where the asymmetry occurs
15:58
<rbuckton>
rbuckton: I'm not sure if this was later answered by anyone because there's a long scrollback that I wasn't keeping up with during the presentation; but since is equally asymmetric as until is
Yes, that's the reason I feel both should exist. They're individually asymmetric, but since and until are symmetric with each other.
17:39
<bakkot>
I don't think users can ever rely on a feature being stable before it is both implemented and shipped in browsers. to give a concrete example, groupBy was stage 3, and we were all happy with the design, but we discovered after shipping that it needed to change. we could not have reasonably learned that before shipping. I don't see how the existence of polyfills has any relevance to that.
17:40
<bakkot>
so I don't think it makes sense to have a specific stage to indicate "you can rely on this in prod". the only signal of that is "is it shipped in browsers".
17:41
<bakkot>
users should expect that any proposal might change prior to it being shipped
17:41
<ljharb>
i think the qualitative difference is the window. groupBy was only shipped for a very brief time
17:41
<ljharb>
i agree users should expect that. i'm saying that "stage 3" is what they DO expect indicates it.
17:41
<ljharb>
we can't just stick our heads in the sand and pretend users only think about things the way they "should"
17:45
<bakkot>
I don't think we can actually do anything about that though? we can't make them have different standards for relying on things
17:45
<bakkot>
redefining terms won't change what their thresholds actually are
19:15
<ljharb>
what we can do is adapt our meanings/signals to match their expectations. and their expectation is that "stage 3 means i can use it"
19:16
<ljharb>
iow just like the spec caves to web reality, the process should do the same to ecosystem reality.
19:21
<bakkot>
people don't interpret stage 3 as "i can use it" because they like the number 3, they interpret it that way because of what it actually signifies
19:22
<bakkot>
redefining terms will not cause them to start caring about different things
19:25
<Chris de Almeida>
I can't help but feeling there's some degree of hindsight bias involved
19:37
<ljharb>
i agree, i'm not saying we redefine terms. i'm saying that what stage 3 actually signifies in practice is "i can use it", not "browsers can implement it", which is why i think temporal probably doesn't belong in stage 3. because nobody's close to being able to use it yet.
20:46
<littledan>
We have been purposely refining the meaning of Stage 3 over time, eg recently adding the test requirement, in order to reinforce its rigor. It would be reasonable to consider further changes, eg โ€œif a proposal has recently changed it shouldnโ€™t be Stage 3 for a bitโ€, but that would be a new, different process idea that we could consider for consensus in general; it is kinda ad hoc to advocate that we should enforce that requirement just for a particular proposal.
21:29
<ljharb>
that was the precise suggestion you made for global, if you recall.