<commit_before># whawty.groups storage schema

The whawty.groups store consists of a directory structure which stores
group membership and user meta data in files and symlinks.
The directory structure looks like this (path names are relative to the
base directory:

    users/
      username        ; yaml(?) file which contains user meta data:
      nicoo           ;   firstname, lastname, mail, ....
      equinox         ;
      fredl           ;
    groups/
      groupa/
        equinox.user  ; symlink to user file in users directory
        nicoo.user    ; symlink to user file in users directory
      groupb/
        groupa.group  ; symlink to group directory
        fredl.user    ; symlink to user file in users directory

Usernames must only contain the following characters: [-_.@A-Za-z0-9]

A whawty.groups agent must be configurable to add an implicit group for
any username. Only the user which has the same name as this group should
be a member of that group.
This membership information must not be stored in the directory but be
generated for group membershop queries.<commit_msg>add requirements for membership loops<commit_after># whawty.groups storage schema

The whawty.groups store consists of a directory structure which stores
group membership and user meta data in files and symlinks.
The directory structure looks like this (path names are relative to the
base directory:

    users/
      username        ; yaml(?) file which contains user meta data:
      nicoo           ;   firstname, lastname, mail, ....
      equinox         ;
      fredl           ;
    groups/
      groupa/
        equinox.user  ; symlink to user file in users directory
        nicoo.user    ; symlink to user file in users directory
      groupb/
        groupa.group  ; symlink to group directory
        fredl.user    ; symlink to user file in users directory

Usernames must only contain the following characters: [-_.@A-Za-z0-9]

A whawty.groups agent must be configurable to add an implicit group for
any username. Only the user which has the same name as this group should
be a member of that group.
This membership information must not be stored in the directory but be
generated for group membershop queries.

Obviously the storage schema allows to store membership loops. An compliant
agent must be resilient against these situations and in case it detects a
loop print a warning to it's log.
{'fraction_non_alphanumeric': 0.04192611041926111, 'fraction_numerical': 0.0016604400166044002, 'mean_word_length': 2.783359497645212, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6147924', 'n_tokens_mistral': 612, 'n_tokens_neox': 601, 'n_words': 318}