Skip to content

Add NIP-32 for labeling things in nostr#532

Merged
fiatjaf merged 16 commits intonostr-protocol:masterfrom
coracle-social:nip-32-labeling
Jun 20, 2023
Merged

Add NIP-32 for labeling things in nostr#532
fiatjaf merged 16 commits intonostr-protocol:masterfrom
coracle-social:nip-32-labeling

Conversation

@staab
Copy link
Copy Markdown
Member

@staab staab commented May 15, 2023

Supersedes #524

Purpose

Content moderation involves labeling content. In #459, @Gruruya proposed expanding NIP-56 to encompass labeling. I chose to create a new NIP rather than update NIP 56 because backwards compatibility would have been difficult to maintain, and because the purpose of the NIPs are slightly different (see below).

In #457, @s3x-jay and @rabble proposed a nomenclature and more comprehensive mechanism for content reporting/labeling. The consensus seems to be that a nomenclature is not a good idea, but there were some good ideas to include.

In #522 (comment) I realized that the same labeling mechanism could be used to leave reviews for relays, which I am eager to add to Coracle so people can start to find a better relay selection.

This PR may also render #46 obsolete, and could someday replace NIP 14, NIP 56 and NIP 36 if labels get adoption.

Justification

Maybe this will seem like I'm trying to make a single NIP do too many things. But reviews, labels, and reports all have two things in common: they refer to an object, and are an expression of someone's opinion. In each case, there is a value judgment involved in assigning the label, involving both imprecision and uncertainty. Expressing this opinion using either a mark, or content, or both, allows either a machine or human to make a judgment call as needed.

One nice thing I'd also like to point out about this PR is it allows for associating any two entities (e/p/r/t) in nostr, and searching those associations. This gives us the beginning of graph-database-like functionality that can form the basis for both WoT and topical moderation and recommendations.

Confidence/quality may seem like the same thing, but they're two different axes along which to measure certainty. The first is subjective (the label author may not be 100% sure), the second objective (the label may not perfectly fit). This has been suggested in a few places, but was best executed by guide.newfounding.org (unfortunately their site is no longer available).

Compatibility

This PR is similar to NIP-56, but is focused on distributed "moderation" (allowing users to filter notes based on their preferences) rather than centralized moderation implemented by relays and clients directly as required by law or app store policy.

Implementation

None of this is implemented, but my main motivation of drafting this PR is so I can add relay ratings and reviews to Coracle soon.

@staab
Copy link
Copy Markdown
Member Author

staab commented May 15, 2023

@Gruruya multiple labels is now supported, see the examples section.

@Gruruya
Copy link
Copy Markdown

Gruruya commented May 15, 2023

https://github.com/staab/nips/blob/nip-32-labeling/32.md

l should be able to have more elements so you can do multi-element tags. Also split the second element into two, you can keep a strange convention like ["#t/", "chickens"] if you want to keep the queryability.

It may be more efficient to default to applying tags to the referenced thing rather than putting it behind an l tag so it could be a single query to match both the event's tags and tags added by these label events. Clients are usually filtering by kind anyway, so it wouldn't effect them.

so ["t", "chickens"] would apply to the referenced event rather than needing to do ["l", "#t/chickens"]. We would then need to make a context tag where you could put all of the references, etc. tags that apply to the labeling event itself. Or just default to interpreting reference tags specially.

I also want to add a third namespace field to t tags which would default to namespace: topic which would let us use t tags for more than just hashtags, for instance tagging images, and would let you differentiate "spam post" vs "discussing spam" vs "image of spam" without resorting to boutique formatting like ["t", "image:spam"]

The other boutique formatting I expect to see is ["t", "-spam"] to mean "this is not spam," the quality in this NIP can act as a good band-aid to the lack of negative tagging in Nostr, which is not just a problem for labels. I think a generic negative form of tag should be described, something like ["-t", "spam"] or ["negative", "t", "spam"]. That said, most things don't need to be "explicitly not specified" and having it as a field/tag just in labeling is probably fine.

The tag agnostic nature of the NIP means it can adjust for whatever, so that's good.

@staab
Copy link
Copy Markdown
Member Author

staab commented May 15, 2023

Yeah, I think everything above is covered by this NIP, since labels can be anything you want. So for negative matches, ["l", "-spam"] with a quality of 1 would be equivalent to ["l", "spam"] with a quality of 0, just queryable differently.

I think one thing we're not quite in agreement on is the difference between labels and tags. In my mind, tags are not a generic labeling mechanism, but a core part of the experience for the end user. Polluting t with machine-generated or non-topical content is a bad idea.

So,

I also want to add a third namespace field to t tags which would default to namespace: topic which would let us use t tags for more than just hashtags, for instance tagging images, and would let you differentiate "spam post" vs "discussing spam" vs "image of spam" without resorting to boutique formatting like ["t", "image:spam"]

Should be handled with a flatter hierarchy by just putting the second-level namespace in the label, e.g. #t-image/spam. But again, I don't think it makes sense to use #t here because #t/image/spam would create a image/spam topic, which would not be idiomatic for hashtags from an end-user perspective.

l should be able to have more elements so you can do multi-element tags. Also split the second element into two, you can keep a strange convention like ["#t/", "chickens"] if you want to keep the queryability.

I don't see what this accomplishes, it seems like it adds more complexity while also removing the ability to query specific labels. Maybe an example?

@Gruruya
Copy link
Copy Markdown

Gruruya commented May 15, 2023

I don't see what this accomplishes, it seems like it adds more complexity while also removing the ability to query specific labels. Maybe an example?

No, you're right. Doesn't accomplish anything, and keeping t tags simple makes sense.
I wanted to add these things to t so that it could be set in the original event, but it's alright. We should just use these labeling events for everything. It should be specified how to include more elements in an l label though i.e. prefixing every element.

@arthurfranca
Copy link
Copy Markdown
Contributor

arthurfranca commented May 15, 2023

The "lightning/channel" example made me think that maybe you should add required (relays may validate it) ["L", <vocabulary>] tag to help requesting just what the client supports

{
  "kind": 1985,
  "tags": [
    ["e", <id>],
    ["L", "nostr"],
    ["L", "ugc"],
    ["L", "none"],
    ["l", "#t/permies", "nostr"],
    ["l", "nintendo quality", "ugc"],
    /* edit: */ ["l", "brincante", "none"], // pt-BR slang that couldn't be auto-translated to english
    ["l", "triple A", "none"]
  ],
  "content": "",
  ...
}

Available vocabularies:

  • nostr: like you defined, use #x/value convention
  • nostr.nipXX: use nipXX defined vaules
  • ugc: user generated content (client takes no responsibility, may just try to auto-translate it to english). edit: lowercase words in english with allowed space between them
  • none: without spec; e.g.: client presets that can change anytime

Custom examples

  • io.damus: vocabulary that damus has created

@staab
Copy link
Copy Markdown
Member Author

staab commented May 15, 2023

I don't see why we couldn't add l tags to regular events, that would make sense, although it probably wouldn't get a lot of support.

It should be specified how to include more elements in an l label though i.e. prefixing every element.

Do you just mean more examples for e.g. labeling something with a relay or whatever?

@Gruruya

This comment was marked as resolved.

@Gruruya
Copy link
Copy Markdown

Gruruya commented May 15, 2023

I don't see why we couldn't add l tags to regular events, that would make sense, although it probably wouldn't get a lot of support.

No need. The features I'm talking about are quality and confidence as seperate elements. I don't think it's a bad idea to do it this way. Also, I would interpret an l tag in a regular event as labeling whatever it's referencing.

@staab
Copy link
Copy Markdown
Member Author

staab commented May 15, 2023

@arthurfranca very interesting idea. I guess the tradeoff here is being able to query all namespaces simultaneously rather than one at a time, but the two formats contain equivalent information. I like my version better, since if you want to query multiple namespaces you can just add more entries to your l list.

["l", "#e/id", "#e/url", "#e/marker"]

I'm not sure what this means, can you elaborate?

@Gruruya

This comment was marked as resolved.

@arthurfranca
Copy link
Copy Markdown
Contributor

I like my version better, since if you want to query multiple namespaces you can just add more entries to your l list.

You mean one could request this filter: { #l: ["io.damus.food", "io.damus.food.chinese"] } or even { #l: ["io.damus.food", "io.damus.food.chinese", <...all damus filters>] }?

But what if the client supports user generate labels that could be anything (almost), I'm talking about a steam-like system. In such a system, there is no fixed set of values. Steam allows any lowercase tag in english that can have space between words. "ugc" maybe should be exactly that: "any lowercase tag in english that can have space between words"

A client would have to request all label events for a specifc object and then filter out labels that don't follow the "lowercase english that can have space between words" client-side. Instead it could do { ..., #L: ['ugc'] }

@s3x-jay
Copy link
Copy Markdown

s3x-jay commented May 15, 2023

I’m in the hospital and can only type with one hand, so unable to give a full set of comments. But one thought…

Have you gotten any feedback from experts or people with considerable experience in either content moderation or labeling (e.g. scientific or industry use of structured vocabularies and the like)?

I would think their input needs to come first. Otherwise you’re just working on something that will need to be deprecated in the near future as experts come in and find things that need to be changed.

@Gruruya
Copy link
Copy Markdown

Gruruya commented May 15, 2023

["L", "nostr"],

Meta-labeling, I like this idea. Should keep it simple though, only put the current system and the structureless version in the NIP.

["l", "#t/permies", "nostr"],

The l array can have more than one element so this can't work, it's the same with quality/confidence, you need to seperate events based on these things.

Otherwise you’re just working on something that will need to be deprecated in the near future as experts come in and find things that need to be changed.

It can't get more generic than this. There's nothing to deprecate.

@staab
Copy link
Copy Markdown
Member Author

staab commented May 15, 2023

But what if the client supports user generate labels that could be anything

This is why the NIP recommends using qualified tags where ever possible; unqualified tags are for informal use either by clients or by users.

A client would have to request all label events for a specifc object and then filter out labels that don't follow the "lowercase english that can have space between words" client-side. Instead it could do { ..., #L: ['ugc'] }

I see, that makes more sense, I'll look at adding it to the spec.

@s3x-jay I haven't, but the purpose of this NIP is to leave the structure completely open. I have studied semantic web a little bit, but for the most part it seems like a never ending hole of pedantry. If someone wants to implement semantic web ontologies, they should be able to do so using this NIP, since labels can be anything. Do you have a recommendation for a quick primer on the problems you're referring to? I've read some Nikitia Bier, but not much else.

@arthurfranca
Copy link
Copy Markdown
Contributor

["l", "#t/permies", "nostr"],
The l array can have more than one element so this can't work, it's the same with quality/confidence, you need to seperate events based on these things.

@Gruruya remember that nostr relays only indexes the first "value" of the tag ("#t/permies"), so multiple labels like ["l", "romance", "sci-fi", "horror"] wouldn't be searchable (just "romance" would). You would have to use 3 separate "l" tag arrays.

@s3x-jay
Copy link
Copy Markdown

s3x-jay commented May 15, 2023

@s3x-jay I haven't, but the purpose of this NIP is to leave the structure completely open. I have studied semantic web a little bit, but for the most part it seems like a never ending hole of pedantry. If someone wants to implement semantic web ontologies, they should be able to do so using this NIP, since labels can be anything. Do you have a recommendation for a quick primer on the problems you're referring to? I've read some Nikitia Bier, but not much else.

Experts need to be involved. I’m not an expert on these things, but I have been using labeling systems / defined vocabularies for over 2 decades - including modeling my own vocabulary (based on the lessons I learned working closely with MesH for a few years) that powers/enhances the tagging system on my sites.

Is there a reason why you don’t just use NIP-68? Other than the reserved vocab values 68 really has nothing to do with 69. And it avoids some of the problems I see you making.

@staab
Copy link
Copy Markdown
Member Author

staab commented May 15, 2023

The reasons I'm creating a separate NIP from 68/69 are 1. it prescribes a nomenclature, 2. it's more complex than it needs to be. I've borrowed some of the ideas (e.g. qualified namespaces) for this NIP. I think something simpler and more generic is going to have more success with the nostr dev community.

Apart from the issue of nomenclatures, which I am avoiding here, what problems do you see with this NIP? What use case do you want supported that this NIP doesn't cover?

@Gruruya
Copy link
Copy Markdown

Gruruya commented May 15, 2023

remember that nostr relays only indexes the first "value" of the tag

Oh man, I feel dumb. Thanks for fixing everything despite my complete misconception staab.

@s3x-jay
Copy link
Copy Markdown

s3x-jay commented May 15, 2023

The reasons I'm creating a separate NIP from 68/69 are 1. it prescribes a nomenclature, 2. it's more complex than it needs to be. I've borrowed some of the ideas (e.g. qualified namespaces) for this NIP. I think something simpler and more generic is going to have more success with the nostr dev community.

Apart from the issue of nomenclatures, which I am avoiding here, what problems do you see with this NIP? What use case do you want supported that this NIP doesn't cover?

I’m in the hospital typing with one hand on a phone. I don’t have the time or energy to each you what I’ve learned over the past 2-3 decades. You’ve made your voice quite clear. No one will confuse your use of 68 as support for 69.

I’ve asked a data scientist with a background in biology to chime in about 68. Hopefully he’ll have time this week. I’m pretty confident it’s good, but want to be sure.

@arthurfranca
Copy link
Copy Markdown
Contributor

In my opinion, the bad thing with NIPs 68 and 69 is forcing all nostr to use the strict vocab>code scheme (cause all others go into an unsearchable "label" tag).

One, debatable, superior approach it presents, comparing to NIP-32, is having quality/confidence data per label along with extra useful things like "appliesto".

A different thing from NIP-32 (don't know if better or worse cause it is 2 ways of doing same thing) is allowing atomic labeling by the author of the original event (e.g.: author adding l tag inside its own kind 0 event, instead of creating an extra event).

It is very good for relays that NIP-68 proposes using parameterized replaceable events (there would be much less stale events). The trade-off is that the "d" tag format doesn't allow using just one event for tagging multiple events/profiles at once (or the graphs, like NIP-32 does).

What about you take the following from NIP-68/69...

{
  kind: 32144,
  // ...,
  tags: [
    ["d", <eventid of event being labeled (or pubkey being labeld)>],
    ["l", "MOD>NS-ero", "{ \"appliesto\": \"picture\", \"confidence\": 0.3 }"],
    ["l", "X-MOD>AB-cde"],
    ["l", "MOD>delete"],
    ["label", "crazy fantasy"]
  ]
}

...and turn into:

{
  kind: 32144, // parameterized replaceable event],
  // ...,
  tags: [
    ["d", <eventid of event being labeled (or pubkey being labeld)>], // not sure if this can be enhanced
    ["L", "nip69"],
    ["L", "ugc"],
    ["l", "MOD>NS-ero", "nip69", "{ \"appliesto\": \"picture\", \"confidence\": 0.3 }"],
    ["l", "MOD>AB-cde", "nip69"], // notice the "X" from X-MOD was removed. more on this below
    ["l", "MOD>delete", "nip69"],
    ["l", "crazy fantasy", "ugc"] // notice how it replaces "label" with "l"
  ]
}

Why drop the X from "X-MOD": "Non-standard (http) header fields were conventionally marked by prefixing the field name with X- but this convention was deprecated in June 2012 because of the inconveniences it caused when non-standard fields became standard.[6]"

@Gruruya
Copy link
Copy Markdown

Gruruya commented May 15, 2023

using parameterized replaceable events (there would be much less stale events).

They're good for the reason you state, but they make it so you can only reference one thing (unless we can come up with a convoluted d tag creating procedure) and you can't append labels. IMO both are useful and a single-reference replaceable version of the event could be added.

allowing atomic labeling by the author of the original event

If we want to make l tag handling the same regardless of what kind the event it's located in is (concern raised by mikedilger,) the l tag must mean to apply the label to whatever the event is referencing.

@staab
Copy link
Copy Markdown
Member Author

staab commented May 16, 2023

Just pushed a new version, summary of changes:

  • L tags are now supported (and required), defined as the namespace used in an l tag. This makes it trivial to add basic support for any nomenclature.
  • Namespace within l tags is now in a mark to avoid parsing ambiguities (e.g. multiple slashes in a tag)
  • Unqualified labels are no longer supported. Use a dang namespace, even if it's bogus.
  • ugc is specified as a special namespace to support user generated content.

I'm pretty happy with the NIP at this point. The replaceable functionality is the last thing I see that's not resolved. If we had to choose between the two, I'd prefer the ability to add multiple tags to a single event at the expense of replaceability. But What might be preferable would be to add support for an optional d tag. Is there an event kind that "may or may not" be replaceable?

@staab staab force-pushed the nip-32-labeling branch from 6e249be to b00c6d5 Compare May 16, 2023 13:22
@arthurfranca
Copy link
Copy Markdown
Contributor

arthurfranca commented May 16, 2023

Is there an event kind that "may or may not" be replaceable?

I think there isn't cause there exists only NIP-16 and NIP-33. And parameterized replaceable event with no d tag in considered having an empty string d tag as identifier.

Although the NIP could define that it requires special treatment from relay (as for instance kind 0 metadata, that isn't in the range of replaceable events (10000 <= n < 20000), is implied to be treated as replaceable - this happened cause kind 0 was created before replaceable events NIP existed). But this hurts relays as they have to add extra logic specific to a kind.

@Gruruya
Copy link
Copy Markdown

Gruruya commented May 16, 2023

L tags are now supported (and required), defined as the namespace used in an l tag.

Nice, this is good.

Is there an event kind that "may or may not" be replaceable?

You have to use two different kinds, I believe.

allowing atomic labeling by the author of the original event

I've though about this a bit more and a #self namespace or similar could work to accomplish this. May be worth adding. But just having labels in other kinds self-label by default works fine too.

@staab
Copy link
Copy Markdown
Member Author

staab commented May 16, 2023

it requires special treatment from relay

I definitely think this would be a bad idea. Another option would be to generate a UUID for the d tag. How bad would that be compared to a different kind? I personally don't like multiple kinds just to get the replaceability functionality, but I guess it's not that bad.

I've though about this a bit more and a #self namespace or similar could work to accomplish this.

The #e namespace refers to a different event than the one being tagged. So based on the namespace semantics, #self would be a self-reference, not in the sense of applying a label to self, but in the sense of labeling self with self, which is pretty silly.

@Gruruya
Copy link
Copy Markdown

Gruruya commented May 16, 2023

Another option would be to generate a UUID for the d tag

Worse hack than having two kinds.
If we wanted to use one kind, we would have to figure out how to concatinate multiple references into a d tag. I say a non-replaceable kind is useful for appending so it may be worth keeping just for that. Though I guess a client could make a d tag by appending the labels to the reference or something other nonsense if they wanted to keep that functionality.

@staab
Copy link
Copy Markdown
Member Author

staab commented May 16, 2023

Worse hack than having two kinds.

Yeah, you're right. Another reason to create a new kind is that the replaceable kind would have different requirements, i.e. only one target tag. Does anyone desperately want the replaceable version, or should we keep the NIP simple for now? I see no problem with duplicate labels, if clients care they can de-duplicate based on pubkey plus their query.

@Gruruya
Copy link
Copy Markdown

Gruruya commented Jun 14, 2023

NIPs are not meant to be exhaustive, nor prescriptive. Why don't you just go build your implementation and we can update the NIP to suit.

To be honest I've been wanting to shorten the NIP when I've been re-reading it. We could simplify it down to the main point of generic labels for indexing. WDYT?

@s3x-jay
Copy link
Copy Markdown

s3x-jay commented Jun 14, 2023

NIPs are not meant to be exhaustive, nor prescriptive. Why don't you just go build your implementation and we can update the NIP to suit.

Because I should be able to use what others build and vice versa. That's kinda the whole point IMHO.

@Gruruya
Copy link
Copy Markdown

Gruruya commented Jun 14, 2023

Breaks only having to query on l - which is why you'd use a delimiter.

What the hell? Why would you do that? Just use L
Anyways the l field has its namespace as its third parameter so you're point is moot.

@s3x-jay
Copy link
Copy Markdown

s3x-jay commented Jun 14, 2023

Breaks only having to query on l - which is why you'd use a delimiter.

What the hell? Why would you do that? Just use L Anyways the l field has its namespace as its third parameter so you're point is moot.

Because using L returns “dirty” results, as I’ve explained many times now.

L exists because relays don’t support starts with searches (and many never will). L is needed when you want to find all the labels using a specific namespace (e.g. for a particular event). It’s not the best way to find all uses of a particular namespace>code combination. For that searching on just l is far more efficient.

@Gruruya
Copy link
Copy Markdown

Gruruya commented Jun 14, 2023

For that searching on just l is far more efficient.

And it call comes down to this. It's simply more efficient for your use-case to use namespace>label and for mine to use label. Wouldn't it be great if we had a protocol that could accomodate both of us and have them both work?

At this point we're arguing over examples and it's probably better to just merge the thing and let us focus on implementing rather than arguing with each other. Any changes to examples can be made in a separate PR anyways.

@s3x-jay
Copy link
Copy Markdown

s3x-jay commented Jun 14, 2023

NIPs are not meant to be exhaustive, nor prescriptive. Why don't you just go build your implementation and we can update the NIP to suit.

Some additional thoughts…

NIPs are absolutely meant to be both prescriptive and exhaustive - or at least enough so that people all do things in the same way. NIPs are not needed where someone just wants to do their own thing.

There is a rich history of labeling systems that existed before Nostr - systems that have a long history of collaborative use where people used the same coding system in the same way so they could benefit from each other’s use. The point of this NIP is to be prescriptive and exhaustive enough that that collaboration can continue on Nostr.

@staab
Copy link
Copy Markdown
Member Author

staab commented Jun 14, 2023

So my question is: in what scenario can you generically construct a namespace-merged l query like you're talking about without knowing anything about the vocabulary? In other words, the prefixed l tag fixes ambiguity, but you don't know a priori if a given namespace is prefixed or not. So you have to have a list of valid labels within a namespace, either explicitly (the client is coupled to the namespace, or there's a namespace definition document somewhere) or implicitly (by keeping track of labels that have been seen for a given namespace).

I really feel like we're over-thinking this. If clarity is required, bulk tagging across multiple namespaces should just be done using multiple events. Can we just go with that? I admire your thoroughness, but it feels like you're inventing new edge cases in an effort to create the perfect spec, which isn't going to happen in any event, rather than being practical.

NIPs are absolutely meant to be both prescriptive and exhaustive

This is the W3C way, not the nostr way. Nostr is permissionless, do it how you want, and reconcile differences later. The implementation is the standard, not the spec. Just wait until people start crafting deliberately malformed events.

@s3x-jay
Copy link
Copy Markdown

s3x-jay commented Jun 14, 2023

It's simply more efficient for your use-case to use namespace>label.

I’ve been working with a variety of coding systems/vocabularies for 20-30 years. Every one I’ve encountered benefits from what I’m talking about.

I have asked repeatedly for a good example one one that doesn’t and haven’t gotten any specific examples.

@Gruruya
Copy link
Copy Markdown

Gruruya commented Jun 14, 2023

Yeah you did?

Semisol
Semisol previously approved these changes Jun 14, 2023
@Semisol Semisol dismissed their stale review June 14, 2023 22:20

I should probably review some of the comments

@s3x-jay
Copy link
Copy Markdown

s3x-jay commented Jun 14, 2023

So my question is: in what scenario can you generically construct a namespace-merged l query like you're talking about without knowing anything about the vocabulary?

I agree which is why I was initially pushing for everything to be prefixed then (when there was pushback) figured a note saying that well-defined coding systems (especially industry standards) assume prefixing.

bulk tagging across multiple namespaces should just be done using multiple events. Can we just go with that?

The database admin in me balks at the additional db records, but given how tags are indexed, I’m not sure if it’s as big of a problem as I might think it is.

The problem is labeling at the time of publishing. It would mean only one namespace can be used.

Otherwise, sure.

Just wait until people start crafting deliberately malformed events.

Trust me - that’s a big concern of mine.

@staab
Copy link
Copy Markdown
Member Author

staab commented Jun 14, 2023

Trust me - that’s a big concern of mine.

Me too, should be fun 😉

@tyiu
Copy link
Copy Markdown
Contributor

tyiu commented Jun 16, 2023

I read the proposal a few times but I'm not sure if I fully understand it, especially around label queries and how namespaces play into it. It might be useful to see examples of how NIP-12 queries would work with this.

@staab
Copy link
Copy Markdown
Member Author

staab commented Jun 16, 2023

You can see my implementation of relay reviews here, which is a nice concrete example. Namespaces exist to disambiguate between similar labels being used for different purposes, and to point to an authority or convention that is the basis for the label semantics. l and L are separate so you can query by label only (to query multiple namespaces at once at the risk of ambiguity), namespace only (to get all labels for a given vocabular), or both at once (for maximum precision). There are some edge cases @s3x-jay has pointed out having to do with clients tagging with multiple clashing namespaces at once, but they can be solved with some client-side filtering and/or not mixing namespaces with creating an event.

@staab
Copy link
Copy Markdown
Member Author

staab commented Jun 17, 2023

@fiatjaf would you mind merging this? @tyiu is planning to use it for calendar events as well.

@fiatjaf
Copy link
Copy Markdown
Member

fiatjaf commented Jun 17, 2023

I came here to ask if this was in a mergeable state. Are the nos.social people onboard with it too in its current form?

@s3x-jay
Copy link
Copy Markdown

s3x-jay commented Jun 17, 2023

I came here to ask if this was in a mergeable state. Are the nos.social people onboard with it too in its current form?

I’m not technically part of the NOS team, but build 51 of NOS (available since yesterday) uses 32 + 69 for content reporting. I haven’t had a chance to study how NOS’ implementation works exactly but 32’s current form seems “good enough” to me personally.

I’m currently reworking 69 to reflect the changes from 68 -> 32.

@staab
Copy link
Copy Markdown
Member Author

staab commented Jun 17, 2023

Just pushed a small update to remove some redundant/exotic examples. I think this is good to go.

@earonesty
Copy link
Copy Markdown
Contributor

earonesty commented Jun 17, 2023

All right I'm just still going to use the "l" tag on my channel creation. This NIP allows for self-labelling, which is cool.

Copy link
Copy Markdown
Collaborator

@mplorentz mplorentz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks good to me. We have shipped a basic report UI in Nos using this format. It will definitely go through some more iterations but this NIP has everything we need.

I do wish the convention of embedding the namespace in the string with the label (i.e. ["l", "MOD>NS", "MOD"]) had made it into the NIP, but we're just going to do it anyway and it won't break anything for others. I see that this did make it in at the bottom. Thanks for pointing that out @s3x-jay.

@fiatjaf fiatjaf merged commit 3893fa7 into nostr-protocol:master Jun 20, 2023
@AtlantisPleb AtlantisPleb mentioned this pull request Jun 20, 2023
@AtlantisPleb
Copy link
Copy Markdown
Contributor

Cool, great work! We'll implement this in Arcade.

Yes this supersedes my placeholder NIP-32 from #46, closed that.

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.