Furthermore, some methods will not modify that object, but an object it sends a message to. In the scope of the original method, it is transactional. So a) keep a separate mark from ReadOnly for RequiresTransaction, b) do a graph copy for the candidate changes, c) send the message to the copy, d) if a WriteSemaphore is accessed, auto enter a copy transaction, send modificationDetected: to the eventualContext, mark it transactional and next invocation, enter an initial copy transaction and rollback: on Exception.

For the HymnTrinitySessionProtocol, have 3 replicationStrategies:
• DedicatedOneAtATime • <1 conn each as primary, reserve, inMaintenance>
• FirstPastThePost • <concurrent replicated comms>
• Quorum • <promises resolved from a minimum quorum of connections>


••• rabbit ❤️‍🔥🐰




On Fri, Jul 14, 2023 at 12:24, rabbit <rabbit@callistohouse.org> wrote:
I’ve got my desktop up and running and so I attempted to define a WriteSemaphore, owned by the NearRef, by securedHash. This ensures the obj has the same securedHash and resolution, that’s asking for a #critical:for:. #critical:for:. It’s actual Semaphore is then #critical: with a block that will check obj isReadOnly,  then beWritableObject, then run the method that modifies, then #ensure: obj beReadOnly. The idea for type heuristics is that a first attempt at a message send, by a Neighbor or Far ref occurs without the WriteSemaphore on first attempt and if the ModificationException occurs, mark the subjects ClassType’s MessageRecord as ReadOnly := false, then eventually send to its NearRef, which will attempt its message send and get a ModificationException and learn itself ReadOnly = false. As well, use the subject’s WriteSemaphore to make a real modification. Add this selector to a class side method #writableMethods. Now we know.

••• rabbit ❤️‍🔥🐰




On Thu, Jul 13, 2023 at 10:31, rabbit <rabbit@callistohouse.org> wrote:
I fried my laptop by spilling my ready to drink café con leche all over. Elbows and precarious places! My desktop is unplugged so I’ll get that up.

In the meantime, I’ve been getting super high and doing the art. Here are my notes…who is saying I am in any way diminished? I do my best work, in the Spirit.

•••

••• Kittens •••
KittyOracle
KittyCommander
KittyLitter
BoxOfKittens <FarIntroducer>

A Neighbor learns. As immediate data access is allowed from a shared memory object, it is ReadOnly. If a ModificationException occurs, change the Stub method to forwarding. Determine whether to flip the Neighbor to a NearPromise.
Graph walking for #passByCopy of #passByReference, w Neighbor substitution.
#securedHash of #identityHash is OID in LocalKittyOracle’s etSpace
#oidHash is the 2nd hash of the securedHash, identity in Neighbors, Far.
WriteSemaphore waits on Oracle’s registered object’s Semaphore for critical access, inside object is marked Writable, modifications made and back to ReadOnly.

••• Networking •••
eventualContext with Question out to the remote pending Send. The 4th Estate, a 4th wire.

Each Protocol describes 
• set of MessageHeaders
• name
• oid
• stateMachine 
• sending / processing protocol
• Plugs into GateKeeper
•••> Anonymous Classes <Unknown> can convert between from a ClassType, to a Tuple and back, with Stub generation

<
    #ClassType
    !! <ClassName
        !! ASN1UTF8String
        !! Exportable {true|false}>>
    !! <IVarRecords 
        !! #SequenceOfIVarRecord 
        !! <IVarRecord
            !! IVarName
            !! ClassTypeName
            !! ASN1Type>>
    !! <MethodRecords
        !! #SequenceOfMethodRecord
        !! <#MethodRecord
                !! MethodName
                !! ReturnClassTypeName
                !! ReadOnly>
    >
>

••• Hierarchy •••
Whisper • generalized & pluggable with a Protocol.
• <Gate 
    !! Gozer 
    !! GateKeeper 
    !! KeyMaster>
Layer5Session
• EndpointThunks
•••> InMemoryThunk
•••> SocketThunk
•••> PipeThunk
•••> Bluetooth
•••> RF Transceiver 
•••> SATCOM…
• SessionProtocols to rendezvous with EncryptionProtocols
    •••> InMemory
    •••> Clear
    •••> PARROTTalk v3.6, v3.7, v3.9
    •••> SSL
    •••> SSH
    •••> Signal, one day
    •••> SP-ADS

Layer6Presentation • Presentation layer manages stack and installs correct encoderThunk, using a Session.
• Far
• Hymn
• Kafka

•••

    Don’t be afraid to start over again.
    This time you’re not starting from scratch.
    You’re starting from experience.

•••

Crypto Feature list:
•••> All Promises <Near ! Neighbor ! Far>
•••> BoxOfKittens <FarIntroducer> 
•••••••> Kitty <NeighborIntroducer>
•••••••> KittyOracle
•••••••> KittyCommander
•••••••> KittyUI
•••••••> KittyLitter, per HyperCore
•••> All of ParrotTalk <v3.6 ! v3.7 ! v3.9>
•••> Whisper framework
•••> ProtocolStateCompiler
•••> TraceMonitor
•••> ELinda
•••> robust security assets
•••••••> Ciphers (symmetric and asymmetric)
•••••••> HashFunctions
•••••••> SecureRandoms
•••••••> Key Exchanges
•••••••> Signatures
•••••••> security encodings 
<FEC !! Archive !! PBE !! PasswordExtenders>
•••••••> ASN1 Streams, with substitution ability during graph walking.
•••> Networking Protocols:
•••••••> Whisper <Framework>

•••••••> Hymn <Layer6>
•••••••> Far <Layer 6>
•••••••> Kafka <Layer 6>

•••••••> InMemory <Layer 5>
•••••••> InDaClear <Layer 5>
•••••••> EParrotTalk <Layer 5>
•••••••> SP-ADS <Layer 5>
•••••••> SSH <Layer 5>
•••••••> SSL <Layer 5>
•••••••> Signal <Layer 5>






••• rabbit ❤️‍🔥🐰




On Mon, Jul 10, 2023 at 23:21, rabbit <rabbit@callistohouse.org> wrote:
I’m also going to offer access to the eventualContext of a Promise, whether Local, Neighbot or Far. Offer Revolution and ping / status, remote event registration on the EventuaMessageSend. 

With readOnlyMarks added to the AnonymousStructure encoded object, #passByCopy we have:

     <className !! IVarsNames !! ASN1TypeDescription !!  MethodNames !!  ReadOnlyMarks>, Object serialized by this ASN1>, 6 arity.

With direct read access to a local kitty Near access to cached / copied data, when a method not marked as readOnly is sent remotely to a different kitty cat, I will flip the “Near Access” to cache data to off, thus converting the Near reference to the cached data into a NearPromise, queuing access in the msgBuffer of this sort of Promise, until completion of the write, depending on policy. 

I’d love to read about #beReadOnly but I cannot find it. I’d also like to have the vm send eventual events when state changes, like <self changed: iVarName>, thus triggerEvent:. With a BeSilent, this feature could be turned on and off.

••• rabbit ❤️‍🔥🐰




On Mon, Jul 10, 2023 at 22:25, rabbit via Cuis-dev <cuis-dev@lists.cuis.st> wrote:
Well it’s been a weekend. At one point I was starting the BoxOfKittens and the image froze uninterruptably. Heh. It not freezing but I’ve tangled something. I’ve been engaged in very aggressive sculpting and I totally lost it along my way. What would I say? Some highlights…

• added #when:then: to ProtoObject to do Linda tuple matching of the whenTestTuple then: runs the thenReactor. And added Linda protocol there too, so any objects can do tuple matching. 
•••> arity
•••> Linda match: converts any object to a tuple of its fields, then match:s with the test tuple.
• mass conversion of what was Session hierarchy to Gozer.
• defining a ClassType to describe a <class name !! method names !! readOnlyMarks> (IVars go into a tuple, methods into a ClassType. I’m going to use one of the Available types to pass an anonymous object, along with ASN1 string notation of structure of the Type, a method interface and the object serialized all. So Java and such can talk it with ASN1. Ubiquitous.

<className !! IVarsNames !! ASN1TypeDescription !!  MethodNames !!  Object serialized by this ASN1>, 5 arity.

I like building analogs and describing a story, BoxOfKittens :) , so for teleport comms it’s GhostBusters! Session is Gozer, there are many that come through a Gate, the Server. These are not at all different between different uses. They’re invariant in class and operations, only difference is the GateKeeper, a different one for each different Protocol, ParrotTalk, SSL, SSH, Signal, TLS 1.2. Whisper, Far, Probe, and now InMemory and a #Clear protocol and GateKeeper. Every Protocol of communication has a unique GateaKeeper. I’m hoping to unify all Protocols ti use the existing Gate and Gozer and KeyMaster, though a different KeyMaster is possible.

The opening and bringing forth another GozerStayPuff is the obligation of the GateKeeper, the Operation classes. ParrotTalk v3.6, v3.7, v3.9 all have different categories, whith their protocol rendezvous messages, carefully defined in ASN1.

There are also Sessions, GateKeepers, in layer 5 <ParrotTalks, InMemory> and different keepers in layer 6: <Far, NeighborGateKeeper, Hymn>. 

Hymn will have Gozers to establish replication and bridging. It also will use group protocol to share encryption for replication. This leads to collaboration. We will explore ideas of dynamic demand access multiple access with  establishing collaboration groups called a Hymn. As concurrent resources are gathered, Singers can offer resources to solve problems through parallelism. Audience participation. Hymn conducting all the way from the Sisters to the Orchestra to the Choir. Kittens the whole lot of em.

We shall see.

••• rabbit ❤️‍🔥🐰




On Sun, Jul 9, 2023 at 11:55, rabbit via Cuis-dev <cuis-dev@lists.cuis.st> wrote:

Hey, I am a touch frustrated. Recovered with <49>. The code I wrote to generate classes and methods has been corrupting my image, or rather mucking to the changes. I was having old code versions being loaded and breaking bad. I was publishing a lot of garbage because when running the BoxOfKittens, I was generating several SharedNears, now called Neighbors. This subclass generation and the method compilation is being done it the following methods...I am just going to leave it turned off for now and stay focused on my objective. It is an example of corruption occurring, if that helps anyone. If one could tell me how to better generate these artifacts, that would be outstanding!•

•••

The #buildOnClass is called from a class creation method

buildOnClass: eClazz

|refClass |
refClass := self stubClass
subclass: (eClazz name, 'Stub') asSymbol
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: self userClassCategoryString.

"Copy all methods, up to Object, to the new refClass, with redirectMessage forwarding."
self copyMethodsToClass: refClass fromClass: eClazz upToClass: Object.

^ refClass

•••
copyMethodsToClass: refClass fromClass: valueClazz upToClass: rootClass


| arguments classes newMethodString |
"Collect classes to contribute message protocol."
classes := valueClazz allSuperclasses select: [ :clazz | (Object ~~ rootClass) and: [ Object inheritsFrom: clazz] ].

"contribute message protocols."
classes do: [:thisClazz |
thisClazz methodDictionary keysAndValuesDo: [:selector :method |
arguments := method tempNames first: method numArgs.
newMethodString := self buildForwardingMethod: selector contents arguments: arguments.
Compiler
compile: newMethodString
environment: refClass environment
notifying: nil
trailer: method trailer
ifFail: [nil]]].

•••
buildForwardingMethod: selector arguments: arguments

| argumentString selectorStream |
argumentString := ((arguments inject: ''writeStream into: [:stream :argument | stream nextPutAll: argument, ' ']) contents).
selectorStream := '' writeStream.
(selector subStrings: $:) with: arguments do: [:keyword :argument | selectorStream nextPutAll: keyword, ': ', argument, ' '].
^ selectorStream contents, '

^self redirectMessage: (Message selector: ', selector asSymbol printString, ' arguments: #{', argumentString, '}).'
Alright then,
--
••• rabbit ❤️‍🔥🐰