Build query-backed task tracker default template

Add shared colored tags, native tag/status filters, cursor-paged task and
completion views, estimated-hour aggregates and repeat-after-completion actions.
Keep task views independently renderable and isolate component styling.

Cover immutable fresh-template/additive checks, real PostgreSQL/orch package
actions and query watches, and wide/narrow browser layouts. Accept documented
hyphenated query budget names in the capability lexer.

Template publication/default selection pending installation AWS SSO renewal;
no live workspace data or deployment configuration changed.
This commit is contained in:
Timothy J. Aveni
2026-09-17 23:05:35 -07:00
parent 5a611bbc9b
commit a05f58f7fe
8 changed files with 1670 additions and 1592 deletions
+6
View File
@@ -408,6 +408,9 @@ identifier
| POLL
| RPC
| QUERYABLE
| RESULT_BYTES
| RPC_CALLS
| DEADLINE_MS
;
stringLiteral
@@ -415,6 +418,9 @@ stringLiteral
;
WORKSPACE: 'workspace';
RESULT_BYTES: 'result-bytes';
RPC_CALLS: 'rpc-calls';
DEADLINE_MS: 'deadline-ms';
QUERY: 'query';
SPECIALIZE: 'specialize';
ROOT: 'root';
File diff suppressed because one or more lines are too long
@@ -1,253 +1,259 @@
WORKSPACE=1
QUERY=2
SPECIALIZE=3
ROOT=4
DOCUMENT=5
FRAGMENTS=6
VIEW=7
MAX=8
ALLOW=9
POLL=10
QUERYABLE=11
RPC=12
QUERY_REASON=13
TYPE=14
OBJECT=15
STORABLE=16
IMPLEMENTS=17
REF=18
FRAGMENT=19
IMPORT=20
EXTERNAL=21
ATOM=22
INTERFACE=23
INTERFACES=24
PACKAGE=25
VALUE=26
RELATION=27
OPERATION=28
FUNCTION=29
CONSTRUCTOR=30
CONSTRUCTS=31
INPUT=32
CONFORM=33
AS=34
BIND=35
STATIC=36
TO=37
PRIVATE=38
SHARED=39
STATE=40
EDGE=41
PROJECTION=42
WITH=43
USING=44
VIA=45
MATERIALIZE=46
IF=47
ABSENT=48
ON=49
POLICY=50
DEFAULT=51
SOURCE=52
REPOSITORY=53
COMMIT=54
REVISION=55
SEMANTIC_MAJOR=56
ON_DELETE=57
RETAIN_OTHER=58
KEYED=59
PUBLIC_TRAVERSAL=60
ID=61
DOC=62
MODE=63
EMITS=64
RECEIVER=65
REQUIRES=66
ANY=67
GET=68
SET=69
WATCH=70
START=71
STOP=72
READ=73
WRITE=74
RESOLVE=75
CONNECT=76
DISCONNECT=77
CALL=78
WATCH_START=79
WATCH_STOP=80
SUBSCRIBE=81
UNSUBSCRIBE=82
OPTIMISTIC_REGISTER=83
CRDT=84
OPTIONAL_ONE=85
EXACTLY_ONE=86
MANY_UNIQUE=87
MANY=88
ORDERED=89
UNIT=90
WATCH_HANDLE=91
MESSAGE=92
ATOM_REF=93
INTERFACE_REF=94
OPTIONAL=95
LIST=96
RECORD=97
BOOL=98
BYTES=99
DOUBLE=100
INT32=101
INT64=102
STRING=103
UINT32=104
UINT64=105
TRUE=106
FALSE=107
NULL=108
ARROW=109
COLON=110
SEMI=111
COMMA=112
DOT=113
LBRACE=114
RBRACE=115
LBRACK=116
RBRACK=117
LPAREN=118
RPAREN=119
LT=120
GT=121
AMP=122
EQUAL=123
INTEGER=124
JSON_NUMBER=125
IDENTIFIER=126
STRING_LITERAL=127
LINE_COMMENT=128
BLOCK_COMMENT=129
WS=130
RESULT_BYTES=2
RPC_CALLS=3
DEADLINE_MS=4
QUERY=5
SPECIALIZE=6
ROOT=7
DOCUMENT=8
FRAGMENTS=9
VIEW=10
MAX=11
ALLOW=12
POLL=13
QUERYABLE=14
RPC=15
QUERY_REASON=16
TYPE=17
OBJECT=18
STORABLE=19
IMPLEMENTS=20
REF=21
FRAGMENT=22
IMPORT=23
EXTERNAL=24
ATOM=25
INTERFACE=26
INTERFACES=27
PACKAGE=28
VALUE=29
RELATION=30
OPERATION=31
FUNCTION=32
CONSTRUCTOR=33
CONSTRUCTS=34
INPUT=35
CONFORM=36
AS=37
BIND=38
STATIC=39
TO=40
PRIVATE=41
SHARED=42
STATE=43
EDGE=44
PROJECTION=45
WITH=46
USING=47
VIA=48
MATERIALIZE=49
IF=50
ABSENT=51
ON=52
POLICY=53
DEFAULT=54
SOURCE=55
REPOSITORY=56
COMMIT=57
REVISION=58
SEMANTIC_MAJOR=59
ON_DELETE=60
RETAIN_OTHER=61
KEYED=62
PUBLIC_TRAVERSAL=63
ID=64
DOC=65
MODE=66
EMITS=67
RECEIVER=68
REQUIRES=69
ANY=70
GET=71
SET=72
WATCH=73
START=74
STOP=75
READ=76
WRITE=77
RESOLVE=78
CONNECT=79
DISCONNECT=80
CALL=81
WATCH_START=82
WATCH_STOP=83
SUBSCRIBE=84
UNSUBSCRIBE=85
OPTIMISTIC_REGISTER=86
CRDT=87
OPTIONAL_ONE=88
EXACTLY_ONE=89
MANY_UNIQUE=90
MANY=91
ORDERED=92
UNIT=93
WATCH_HANDLE=94
MESSAGE=95
ATOM_REF=96
INTERFACE_REF=97
OPTIONAL=98
LIST=99
RECORD=100
BOOL=101
BYTES=102
DOUBLE=103
INT32=104
INT64=105
STRING=106
UINT32=107
UINT64=108
TRUE=109
FALSE=110
NULL=111
ARROW=112
COLON=113
SEMI=114
COMMA=115
DOT=116
LBRACE=117
RBRACE=118
LBRACK=119
RBRACK=120
LPAREN=121
RPAREN=122
LT=123
GT=124
AMP=125
EQUAL=126
INTEGER=127
JSON_NUMBER=128
IDENTIFIER=129
STRING_LITERAL=130
LINE_COMMENT=131
BLOCK_COMMENT=132
WS=133
'workspace'=1
'query'=2
'specialize'=3
'root'=4
'document'=5
'fragments'=6
'view'=7
'max'=8
'allow'=9
'poll'=10
'queryable'=11
'rpc'=12
'query-reason'=13
'type'=14
'object'=15
'storable'=16
'implements'=17
'ref'=18
'fragment'=19
'import'=20
'external'=21
'atom'=22
'interface'=23
'interfaces'=24
'package'=25
'value'=26
'relation'=27
'operation'=28
'function'=29
'constructor'=30
'constructs'=31
'input'=32
'conform'=33
'as'=34
'bind'=35
'static'=36
'to'=37
'private'=38
'shared'=39
'state'=40
'edge'=41
'projection'=42
'with'=43
'using'=44
'via'=45
'materialize'=46
'if'=47
'absent'=48
'on'=49
'policy'=50
'default'=51
'source'=52
'repository'=53
'commit'=54
'revision'=55
'semantic-major'=56
'on-delete'=57
'retain-other'=58
'keyed'=59
'public-traversal'=60
'id'=61
'doc'=62
'mode'=63
'emits'=64
'receiver'=65
'requires'=66
'any'=67
'get'=68
'set'=69
'watch'=70
'start'=71
'stop'=72
'read'=73
'write'=74
'resolve'=75
'connect'=76
'disconnect'=77
'call'=78
'watch-start'=79
'watch-stop'=80
'subscribe'=81
'unsubscribe'=82
'optimistic-register'=83
'crdt'=84
'optional-one'=85
'exactly-one'=86
'many-unique'=87
'many'=88
'ordered'=89
'unit'=90
'watch-handle'=91
'message'=92
'atom-ref'=93
'interface-ref'=94
'optional'=95
'list'=96
'record'=97
'bool'=98
'bytes'=99
'double'=100
'int32'=101
'int64'=102
'string'=103
'uint32'=104
'uint64'=105
'true'=106
'false'=107
'null'=108
'->'=109
':'=110
';'=111
','=112
'.'=113
'{'=114
'}'=115
'['=116
']'=117
'('=118
')'=119
'<'=120
'>'=121
'&'=122
'='=123
'result-bytes'=2
'rpc-calls'=3
'deadline-ms'=4
'query'=5
'specialize'=6
'root'=7
'document'=8
'fragments'=9
'view'=10
'max'=11
'allow'=12
'poll'=13
'queryable'=14
'rpc'=15
'query-reason'=16
'type'=17
'object'=18
'storable'=19
'implements'=20
'ref'=21
'fragment'=22
'import'=23
'external'=24
'atom'=25
'interface'=26
'interfaces'=27
'package'=28
'value'=29
'relation'=30
'operation'=31
'function'=32
'constructor'=33
'constructs'=34
'input'=35
'conform'=36
'as'=37
'bind'=38
'static'=39
'to'=40
'private'=41
'shared'=42
'state'=43
'edge'=44
'projection'=45
'with'=46
'using'=47
'via'=48
'materialize'=49
'if'=50
'absent'=51
'on'=52
'policy'=53
'default'=54
'source'=55
'repository'=56
'commit'=57
'revision'=58
'semantic-major'=59
'on-delete'=60
'retain-other'=61
'keyed'=62
'public-traversal'=63
'id'=64
'doc'=65
'mode'=66
'emits'=67
'receiver'=68
'requires'=69
'any'=70
'get'=71
'set'=72
'watch'=73
'start'=74
'stop'=75
'read'=76
'write'=77
'resolve'=78
'connect'=79
'disconnect'=80
'call'=81
'watch-start'=82
'watch-stop'=83
'subscribe'=84
'unsubscribe'=85
'optimistic-register'=86
'crdt'=87
'optional-one'=88
'exactly-one'=89
'many-unique'=90
'many'=91
'ordered'=92
'unit'=93
'watch-handle'=94
'message'=95
'atom-ref'=96
'interface-ref'=97
'optional'=98
'list'=99
'record'=100
'bool'=101
'bytes'=102
'double'=103
'int32'=104
'int64'=105
'string'=106
'uint32'=107
'uint64'=108
'true'=109
'false'=110
'null'=111
'->'=112
':'=113
';'=114
','=115
'.'=116
'{'=117
'}'=118
'['=119
']'=120
'('=121
')'=122
'<'=123
'>'=124
'&'=125
'='=126
File diff suppressed because one or more lines are too long
@@ -1,253 +1,259 @@
WORKSPACE=1
QUERY=2
SPECIALIZE=3
ROOT=4
DOCUMENT=5
FRAGMENTS=6
VIEW=7
MAX=8
ALLOW=9
POLL=10
QUERYABLE=11
RPC=12
QUERY_REASON=13
TYPE=14
OBJECT=15
STORABLE=16
IMPLEMENTS=17
REF=18
FRAGMENT=19
IMPORT=20
EXTERNAL=21
ATOM=22
INTERFACE=23
INTERFACES=24
PACKAGE=25
VALUE=26
RELATION=27
OPERATION=28
FUNCTION=29
CONSTRUCTOR=30
CONSTRUCTS=31
INPUT=32
CONFORM=33
AS=34
BIND=35
STATIC=36
TO=37
PRIVATE=38
SHARED=39
STATE=40
EDGE=41
PROJECTION=42
WITH=43
USING=44
VIA=45
MATERIALIZE=46
IF=47
ABSENT=48
ON=49
POLICY=50
DEFAULT=51
SOURCE=52
REPOSITORY=53
COMMIT=54
REVISION=55
SEMANTIC_MAJOR=56
ON_DELETE=57
RETAIN_OTHER=58
KEYED=59
PUBLIC_TRAVERSAL=60
ID=61
DOC=62
MODE=63
EMITS=64
RECEIVER=65
REQUIRES=66
ANY=67
GET=68
SET=69
WATCH=70
START=71
STOP=72
READ=73
WRITE=74
RESOLVE=75
CONNECT=76
DISCONNECT=77
CALL=78
WATCH_START=79
WATCH_STOP=80
SUBSCRIBE=81
UNSUBSCRIBE=82
OPTIMISTIC_REGISTER=83
CRDT=84
OPTIONAL_ONE=85
EXACTLY_ONE=86
MANY_UNIQUE=87
MANY=88
ORDERED=89
UNIT=90
WATCH_HANDLE=91
MESSAGE=92
ATOM_REF=93
INTERFACE_REF=94
OPTIONAL=95
LIST=96
RECORD=97
BOOL=98
BYTES=99
DOUBLE=100
INT32=101
INT64=102
STRING=103
UINT32=104
UINT64=105
TRUE=106
FALSE=107
NULL=108
ARROW=109
COLON=110
SEMI=111
COMMA=112
DOT=113
LBRACE=114
RBRACE=115
LBRACK=116
RBRACK=117
LPAREN=118
RPAREN=119
LT=120
GT=121
AMP=122
EQUAL=123
INTEGER=124
JSON_NUMBER=125
IDENTIFIER=126
STRING_LITERAL=127
LINE_COMMENT=128
BLOCK_COMMENT=129
WS=130
RESULT_BYTES=2
RPC_CALLS=3
DEADLINE_MS=4
QUERY=5
SPECIALIZE=6
ROOT=7
DOCUMENT=8
FRAGMENTS=9
VIEW=10
MAX=11
ALLOW=12
POLL=13
QUERYABLE=14
RPC=15
QUERY_REASON=16
TYPE=17
OBJECT=18
STORABLE=19
IMPLEMENTS=20
REF=21
FRAGMENT=22
IMPORT=23
EXTERNAL=24
ATOM=25
INTERFACE=26
INTERFACES=27
PACKAGE=28
VALUE=29
RELATION=30
OPERATION=31
FUNCTION=32
CONSTRUCTOR=33
CONSTRUCTS=34
INPUT=35
CONFORM=36
AS=37
BIND=38
STATIC=39
TO=40
PRIVATE=41
SHARED=42
STATE=43
EDGE=44
PROJECTION=45
WITH=46
USING=47
VIA=48
MATERIALIZE=49
IF=50
ABSENT=51
ON=52
POLICY=53
DEFAULT=54
SOURCE=55
REPOSITORY=56
COMMIT=57
REVISION=58
SEMANTIC_MAJOR=59
ON_DELETE=60
RETAIN_OTHER=61
KEYED=62
PUBLIC_TRAVERSAL=63
ID=64
DOC=65
MODE=66
EMITS=67
RECEIVER=68
REQUIRES=69
ANY=70
GET=71
SET=72
WATCH=73
START=74
STOP=75
READ=76
WRITE=77
RESOLVE=78
CONNECT=79
DISCONNECT=80
CALL=81
WATCH_START=82
WATCH_STOP=83
SUBSCRIBE=84
UNSUBSCRIBE=85
OPTIMISTIC_REGISTER=86
CRDT=87
OPTIONAL_ONE=88
EXACTLY_ONE=89
MANY_UNIQUE=90
MANY=91
ORDERED=92
UNIT=93
WATCH_HANDLE=94
MESSAGE=95
ATOM_REF=96
INTERFACE_REF=97
OPTIONAL=98
LIST=99
RECORD=100
BOOL=101
BYTES=102
DOUBLE=103
INT32=104
INT64=105
STRING=106
UINT32=107
UINT64=108
TRUE=109
FALSE=110
NULL=111
ARROW=112
COLON=113
SEMI=114
COMMA=115
DOT=116
LBRACE=117
RBRACE=118
LBRACK=119
RBRACK=120
LPAREN=121
RPAREN=122
LT=123
GT=124
AMP=125
EQUAL=126
INTEGER=127
JSON_NUMBER=128
IDENTIFIER=129
STRING_LITERAL=130
LINE_COMMENT=131
BLOCK_COMMENT=132
WS=133
'workspace'=1
'query'=2
'specialize'=3
'root'=4
'document'=5
'fragments'=6
'view'=7
'max'=8
'allow'=9
'poll'=10
'queryable'=11
'rpc'=12
'query-reason'=13
'type'=14
'object'=15
'storable'=16
'implements'=17
'ref'=18
'fragment'=19
'import'=20
'external'=21
'atom'=22
'interface'=23
'interfaces'=24
'package'=25
'value'=26
'relation'=27
'operation'=28
'function'=29
'constructor'=30
'constructs'=31
'input'=32
'conform'=33
'as'=34
'bind'=35
'static'=36
'to'=37
'private'=38
'shared'=39
'state'=40
'edge'=41
'projection'=42
'with'=43
'using'=44
'via'=45
'materialize'=46
'if'=47
'absent'=48
'on'=49
'policy'=50
'default'=51
'source'=52
'repository'=53
'commit'=54
'revision'=55
'semantic-major'=56
'on-delete'=57
'retain-other'=58
'keyed'=59
'public-traversal'=60
'id'=61
'doc'=62
'mode'=63
'emits'=64
'receiver'=65
'requires'=66
'any'=67
'get'=68
'set'=69
'watch'=70
'start'=71
'stop'=72
'read'=73
'write'=74
'resolve'=75
'connect'=76
'disconnect'=77
'call'=78
'watch-start'=79
'watch-stop'=80
'subscribe'=81
'unsubscribe'=82
'optimistic-register'=83
'crdt'=84
'optional-one'=85
'exactly-one'=86
'many-unique'=87
'many'=88
'ordered'=89
'unit'=90
'watch-handle'=91
'message'=92
'atom-ref'=93
'interface-ref'=94
'optional'=95
'list'=96
'record'=97
'bool'=98
'bytes'=99
'double'=100
'int32'=101
'int64'=102
'string'=103
'uint32'=104
'uint64'=105
'true'=106
'false'=107
'null'=108
'->'=109
':'=110
';'=111
','=112
'.'=113
'{'=114
'}'=115
'['=116
']'=117
'('=118
')'=119
'<'=120
'>'=121
'&'=122
'='=123
'result-bytes'=2
'rpc-calls'=3
'deadline-ms'=4
'query'=5
'specialize'=6
'root'=7
'document'=8
'fragments'=9
'view'=10
'max'=11
'allow'=12
'poll'=13
'queryable'=14
'rpc'=15
'query-reason'=16
'type'=17
'object'=18
'storable'=19
'implements'=20
'ref'=21
'fragment'=22
'import'=23
'external'=24
'atom'=25
'interface'=26
'interfaces'=27
'package'=28
'value'=29
'relation'=30
'operation'=31
'function'=32
'constructor'=33
'constructs'=34
'input'=35
'conform'=36
'as'=37
'bind'=38
'static'=39
'to'=40
'private'=41
'shared'=42
'state'=43
'edge'=44
'projection'=45
'with'=46
'using'=47
'via'=48
'materialize'=49
'if'=50
'absent'=51
'on'=52
'policy'=53
'default'=54
'source'=55
'repository'=56
'commit'=57
'revision'=58
'semantic-major'=59
'on-delete'=60
'retain-other'=61
'keyed'=62
'public-traversal'=63
'id'=64
'doc'=65
'mode'=66
'emits'=67
'receiver'=68
'requires'=69
'any'=70
'get'=71
'set'=72
'watch'=73
'start'=74
'stop'=75
'read'=76
'write'=77
'resolve'=78
'connect'=79
'disconnect'=80
'call'=81
'watch-start'=82
'watch-stop'=83
'subscribe'=84
'unsubscribe'=85
'optimistic-register'=86
'crdt'=87
'optional-one'=88
'exactly-one'=89
'many-unique'=90
'many'=91
'ordered'=92
'unit'=93
'watch-handle'=94
'message'=95
'atom-ref'=96
'interface-ref'=97
'optional'=98
'list'=99
'record'=100
'bool'=101
'bytes'=102
'double'=103
'int32'=104
'int64'=105
'string'=106
'uint32'=107
'uint64'=108
'true'=109
'false'=110
'null'=111
'->'=112
':'=113
';'=114
','=115
'.'=116
'{'=117
'}'=118
'['=119
']'=120
'('=121
')'=122
'<'=123
'>'=124
'&'=125
'='=126
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+3
View File
@@ -42,6 +42,9 @@ const pkg = resource(`import interface Tasks; import interface Task;
package Reports id "reports" revision "reports@1" {
query Report id "report" root Tasks document "report.graphql" operation "Report" {
max rows 50;
max result-bytes 1048576;
max rpc-calls 100;
max deadline-ms 10000;
view TaskObject as Task;
allow Task.score aggregate "Bounded aggregation fixture";
allow Task.score predicate "Bounded aggregation fixture";